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":"MainSidebar-D0hPq1hI.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/components/executions/ExecutionsUsage.vue","../../src/api/ctas.ts","../../src/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore.ts","../../src/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue","../../src/components/MainSidebarSourceControl.vue","../../src/features/projects/components/ProjectNavigation.vue","../../src/components/MainSidebar.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style['gift-icon']\">\n\t\t<font-awesome-icon icon=\"gift\" />\n\t\t<div :class=\"$style['notification']\">\n\t\t\t<div></div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.gift-icon {\n\tdisplay: flex;\n\tposition: relative;\n\n\tsvg {\n\t\tmargin-right: 0 !important;\n\t}\n\n\t.notification {\n\t\theight: 0.47em;\n\t\twidth: 0.47em;\n\t\tborder-radius: 50%;\n\t\tcolor: $gift-notification-active-color;\n\t\tposition: absolute;\n\t\tbackground-color: $gift-notification-outer-color;\n\t\tright: -0.3em;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttop: -0.148em;\n\n\t\tdiv {\n\t\t\theight: 0.36em;\n\t\t\twidth: 0.36em;\n\t\t\tbackground-color: $gift-notification-inner-color;\n\t\t\tborder-radius: 50%;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<div v-if=\"isTrialExpired\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\" color=\"danger\">\n\t\t\t\t{{ locale.baseText('executionUsage.expired.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-else-if=\"!isTrialExpired && trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<i18n-t tag=\"span\" keypath=\"executionUsage.currentUsage\">\n\t\t\t\t<template #text>\n\t\t\t\t\t<n8n-text size=\"small\" color=\"text-dark\">\n\t\t\t\t\t\t{{ locale.baseText('executionUsage.currentUsage.text') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t\t<template #count>\n\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"warning\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tlocale.baseText('executionUsage.currentUsage.count', {\n\t\t\t\t\t\t\t\tadjustToNumber: daysLeftOnTrial || 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div v-else-if=\"!trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\">\n\t\t\t\t{{ locale.baseText('executionUsage.ranOutOfExecutions.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-if=\"!isTrialExpired\" :class=\"$style.usageCounter\">\n\t\t\t<div :class=\"$style.progressBarDiv\">\n\t\t\t\t<progress\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\ttrialHasExecutionsLeft ? $style.progressBarSuccess : $style.progressBarDanger,\n\t\t\t\t\t\t$style.progressBar,\n\t\t\t\t\t]\"\n\t\t\t\t\t:value=\"currentExecutionsWithThreshold\"\n\t\t\t\t\t:max=\"maxExecutions\"\n\t\t\t\t></progress>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.executionsCountSection\">\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">\n\t\t\t\t\t{{ currentExecutions }}/{{ maxExecutions }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">{{\n\t\t\t\t\tlocale.baseText('executionUsage.label.executions')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div :class=\"$style.upgradeButtonSection\">\n\t\t\t<n8n-button\n\t\t\t\t:label=\"locale.baseText('executionUsage.button.upgrade')\"\n\t\t\t\tsize=\"xmini\"\n\t\t\t\ticon=\"gem\"\n\t\t\t\ttype=\"success\"\n\t\t\t\t:block=\"true\"\n\t\t\t\t@click=\"onUpgradeClicked\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { i18n as locale } from '@/plugins/i18n';\nimport { DateTime } from 'luxon';\nimport type { CloudPlanAndUsageData } from '@/Interface';\nimport { computed } from 'vue';\nimport { useUIStore } from '@/stores/ui.store';\n\nconst PROGRESS_BAR_MINIMUM_THRESHOLD = 8;\n\nconst props = defineProps<{ cloudPlanData: CloudPlanAndUsageData | null }>();\n\nconst now = DateTime.utc();\n\nconst daysLeftOnTrial = computed(() => {\n\tconst { days = 0 } = getPlanExpirationDate().diff(now, ['days']).toObject();\n\treturn Math.ceil(days);\n});\n\nconst isTrialExpired = computed(() => {\n\tif (!props.cloudPlanData?.expirationDate) return false;\n\tconst trialEndsAt = DateTime.fromISO(props.cloudPlanData.expirationDate);\n\treturn now.toMillis() > trialEndsAt.toMillis();\n});\n\nconst getPlanExpirationDate = () => DateTime.fromISO(props?.cloudPlanData?.expirationDate ?? '');\n\nconst trialHasExecutionsLeft = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\treturn props.cloudPlanData.usage.executions < props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst currentExecutions = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\treturn usedExecutions > executionsQuota ? executionsQuota : usedExecutions;\n});\n\nconst currentExecutionsWithThreshold = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\tconst threshold = (PROGRESS_BAR_MINIMUM_THRESHOLD * executionsQuota) / 100;\n\treturn usedExecutions < threshold ? threshold : usedExecutions;\n});\n\nconst maxExecutions = computed(() => {\n\tif (!props.cloudPlanData?.monthlyExecutionsLimit) return 0;\n\treturn props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst onUpgradeClicked = () => {\n\tvoid useUIStore().goToUpgrade('canvas-nav', 'upgrade-canvas-nav', 'redirect');\n};\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.progressBarDiv {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.progressBar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-webkit-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-moz-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n\n.progressBarSuccess::-moz-progress-bar {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarSuccess::-webkit-progress-value {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-webkit-progress-value {\n\tbackground: var(--color-danger);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-moz-progress-bar {\n\tbackground: var(--color-danger);\n}\n\n.usageText {\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-s);\n\tmargin-top: var(--spacing-xs);\n\tline-height: var(--spacing-xs);\n}\n\n.usageCounter {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-top: var(--spacing-2xs);\n\tfont-size: var(--font-size-3xs);\n}\n\n.danger {\n\tcolor: var(--color-danger);\n}\n\n.executionsCountSection {\n\tmargin-left: var(--spacing-xs);\n}\n\n.upgradeButtonSection {\n\tmargin: var(--spacing-s);\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\n\nexport async function getBecomeCreatorCta(context: IRestApiContext): Promise<boolean> {\n\tconst response = await get(context.baseUrl, '/cta/become-creator');\n\n\treturn response;\n}\n","import { DateTime } from 'luxon';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\nimport { STORES } from '@/constants';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useStorage } from '@/composables/useStorage';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { getBecomeCreatorCta } from '@/api/ctas';\n\nconst LOCAL_STORAGE_KEY = 'N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT';\nconst RESHOW_DISMISSED_AFTER_DAYS = 30;\nconst POLL_INTERVAL_IN_MS = 15 * 60 * 1000; // 15 minutes\n\nexport const useBecomeTemplateCreatorStore = defineStore(STORES.BECOME_TEMPLATE_CREATOR, () => {\n\tconst cloudPlanStore = useCloudPlanStore();\n\tconst rootStore = useRootStore();\n\n\t//#region State\n\n\tconst dismissedAt = useStorage(LOCAL_STORAGE_KEY);\n\tconst ctaMeetsCriteria = ref(false);\n\tconst monitorCtasTimer = ref<ReturnType<typeof setInterval> | null>(null);\n\n\t//#endregion State\n\n\t//#region Computed\n\n\tconst isDismissed = computed(() => {\n\t\treturn dismissedAt.value ? !hasEnoughTimePassedSinceDismissal(dismissedAt.value) : false;\n\t});\n\n\tconst showBecomeCreatorCta = computed(() => {\n\t\treturn ctaMeetsCriteria.value && !cloudPlanStore.userIsTrialing && !isDismissed.value;\n\t});\n\n\t//#endregion Computed\n\n\t//#region Actions\n\n\tconst dismissCta = () => {\n\t\tdismissedAt.value = DateTime.now().toISO();\n\t};\n\n\tconst fetchBecomeCreatorCta = async () => {\n\t\tconst becomeCreatorCta = await getBecomeCreatorCta(rootStore.getRestApiContext);\n\n\t\tctaMeetsCriteria.value = becomeCreatorCta;\n\t};\n\n\tconst fetchUserCtasIfNeeded = async () => {\n\t\tif (isDismissed.value || cloudPlanStore.userIsTrialing || ctaMeetsCriteria.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait fetchBecomeCreatorCta();\n\t};\n\n\tconst startMonitoringCta = () => {\n\t\tif (monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial check after 1s so we don't bombard the API immediately during startup\n\t\tsetTimeout(fetchUserCtasIfNeeded, 1000);\n\n\t\tmonitorCtasTimer.value = setInterval(fetchUserCtasIfNeeded, POLL_INTERVAL_IN_MS);\n\t};\n\n\tconst stopMonitoringCta = () => {\n\t\tif (!monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearInterval(monitorCtasTimer.value);\n\t\tmonitorCtasTimer.value = null;\n\t};\n\n\t//#endregion Actions\n\n\treturn {\n\t\tshowBecomeCreatorCta,\n\t\tdismissCta,\n\t\tstartMonitoringCta,\n\t\tstopMonitoringCta,\n\t};\n});\n\nfunction hasEnoughTimePassedSinceDismissal(dismissedAt: string) {\n\tconst reshowAtTime = DateTime.fromISO(dismissedAt).plus({\n\t\tdays: RESHOW_DISMISSED_AFTER_DAYS,\n\t});\n\n\treturn reshowAtTime <= DateTime.now();\n}\n","<script setup lang=\"ts\">\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useBecomeTemplateCreatorStore } from './becomeTemplateCreatorStore';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\nconst store = useBecomeTemplateCreatorStore();\nconst telemetry = useTelemetry();\n\nconst onClick = () => {\n\ttelemetry.track('User clicked become creator CTA');\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"store.showBecomeCreatorCta\"\n\t\t:class=\"$style.container\"\n\t\tdata-test-id=\"become-template-creator-cta\"\n\t>\n\t\t<div :class=\"$style.textAndCloseButton\">\n\t\t\t<p :class=\"$style.text\">\n\t\t\t\t{{ i18n.baseText('becomeCreator.text') }}\n\t\t\t</p>\n\n\t\t\t<button\n\t\t\t\t:class=\"$style.closeButton\"\n\t\t\t\tdata-test-id=\"close-become-template-creator-cta\"\n\t\t\t\t@click=\"store.dismissCta()\"\n\t\t\t>\n\t\t\t\t<n8n-icon icon=\"times\" size=\"xsmall\" :title=\"i18n.baseText('generic.close')\" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<n8n-button\n\t\t\t:class=\"$style.becomeCreatorButton\"\n\t\t\t:label=\"i18n.baseText('becomeCreator.buttonText')\"\n\t\t\tsize=\"xmini\"\n\t\t\ttype=\"secondary\"\n\t\t\telement=\"a\"\n\t\t\thref=\"https://creators.n8n.io/hub\"\n\t\t\ttarget=\"_blank\"\n\t\t\t@click=\"onClick\"\n\t\t/>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.textAndCloseButton {\n\tdisplay: flex;\n\tmargin-top: var(--spacing-xs);\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-2xs);\n}\n\n.text {\n\tflex: 1;\n\tfont-size: var(--font-size-3xs);\n\tline-height: var(--font-line-height-compact);\n}\n\n.closeButton {\n\tflex: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: var(--spacing-2xs);\n\theight: var(--spacing-2xs);\n\tborder: none;\n\tcolor: var(--color-text-light);\n\tbackground-color: transparent;\n\tcursor: pointer;\n}\n\n.becomeCreatorButton {\n\tmargin: var(--spacing-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { useI18n } from '@/composables/useI18n';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { SOURCE_CONTROL_PULL_MODAL_KEY, SOURCE_CONTROL_PUSH_MODAL_KEY, VIEWS } from '@/constants';\nimport type { SourceControlAggregatedFile } from '../Interface';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\n\nconst props = defineProps<{\n\tisCollapsed: boolean;\n}>();\n\nconst responseStatuses = {\n\tCONFLICT: 409,\n};\n\nconst router = useRouter();\nconst loadingService = useLoadingService();\nconst uiStore = useUIStore();\nconst sourceControlStore = useSourceControlStore();\nconst toast = useToast();\nconst i18n = useI18n();\n\nconst eventBus = createEventBus();\nconst tooltipOpenDelay = ref(300);\n\nconst currentBranch = computed(() => {\n\treturn sourceControlStore.preferences.branchName;\n});\nconst sourceControlAvailable = computed(\n\t() =>\n\t\tsourceControlStore.isEnterpriseSourceControlEnabled &&\n\t\thasPermission(['rbac'], { rbac: { scope: 'sourceControl:manage' } }),\n);\n\nasync function pushWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.checkingForChanges'));\n\ttry {\n\t\tconst status = await sourceControlStore.getAggregatedStatus();\n\n\t\tuiStore.openModalWithData({\n\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\tdata: { eventBus, status },\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('error'));\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nasync function pullWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.pull'));\n\n\ttry {\n\t\tconst status: SourceControlAggregatedFile[] =\n\t\t\t((await sourceControlStore.pullWorkfolder(\n\t\t\t\tfalse,\n\t\t\t)) as unknown as SourceControlAggregatedFile[]) || [];\n\n\t\tconst statusWithoutLocallyCreatedWorkflows = status.filter((file) => {\n\t\t\treturn !(file.type === 'workflow' && file.status === 'created' && file.location === 'local');\n\t\t});\n\t\tif (statusWithoutLocallyCreatedWorkflows.length === 0) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.upToDate.title'),\n\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.upToDate.description'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.success.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\tconst incompleteFileTypes = ['variables', 'credential'];\n\t\t\tconst hasVariablesOrCredentials = (status || []).some((file) => {\n\t\t\t\treturn incompleteFileTypes.includes(file.type);\n\t\t\t});\n\n\t\t\tif (hasVariablesOrCredentials) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\ttoast.showMessage({\n\t\t\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.oneLastStep.description'),\n\t\t\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.oneLastStep.title'),\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tsourceControlEventBus.emit('pull');\n\t} catch (error) {\n\t\tconst errorResponse = error.response;\n\n\t\tif (errorResponse?.status === responseStatuses.CONFLICT) {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: SOURCE_CONTROL_PULL_MODAL_KEY,\n\t\t\t\tdata: { eventBus, status: errorResponse.data.data },\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showError(error, 'Error');\n\t\t}\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nconst goToSourceControlSetup = async () => {\n\tawait router.push({ name: VIEWS.SOURCE_CONTROL });\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"sourceControlAvailable\"\n\t\t:class=\"{\n\t\t\t[$style.sync]: true,\n\t\t\t[$style.collapsed]: isCollapsed,\n\t\t\t[$style.isConnected]: sourceControlStore.isEnterpriseSourceControlEnabled,\n\t\t}\"\n\t\t:style=\"{ borderLeftColor: sourceControlStore.preferences.branchColor }\"\n\t\tdata-test-id=\"main-sidebar-source-control\"\n\t>\n\t\t<div\n\t\t\tv-if=\"sourceControlStore.preferences.connected && sourceControlStore.preferences.branchName\"\n\t\t\t:class=\"$style.connected\"\n\t\t\tdata-test-id=\"main-sidebar-source-control-connected\"\n\t\t>\n\t\t\t<span :class=\"$style.branchName\">\n\t\t\t\t<n8n-icon icon=\"code-branch\" />\n\t\t\t\t{{ currentBranch }}\n\t\t\t</span>\n\t\t\t<div :class=\"{ 'pt-xs': !isCollapsed }\">\n\t\t\t\t<n8n-tooltip :disabled=\"!isCollapsed\" :show-after=\"tooltipOpenDelay\" placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.pull') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'mr-2xs': !isCollapsed,\n\t\t\t\t\t\t\t'mb-2xs': isCollapsed && !sourceControlStore.preferences.branchReadOnly,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\ticon=\"arrow-down\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.pull')\"\n\t\t\t\t\t\t@click=\"pullWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-if=\"!sourceControlStore.preferences.branchReadOnly\"\n\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t:show-after=\"tooltipOpenDelay\"\n\t\t\t\t\tplacement=\"right\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.push') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.push')\"\n\t\t\t\t\t\ticon=\"arrow-up\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t@click=\"pushWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.sync {\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 calc(var(--spacing-2xs) * -1);\n\tbackground: var(--color-background-light);\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tfont-size: var(--font-size-2xs);\n\n\t&.isConnected {\n\t\tpadding-left: var(--spacing-m);\n\t\tborder-left: var(--spacing-3xs) var(--border-style-base) var(--color-foreground-base);\n\n\t\t&.collapsed {\n\t\t\tpadding-left: var(--spacing-xs);\n\t\t}\n\t}\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n\n\tbutton {\n\t\tfont-size: var(--font-size-3xs);\n\t}\n}\n\n.branchName {\n\twhite-space: normal;\n\tline-break: anywhere;\n}\n\n.collapsed {\n\ttext-align: center;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n\n\t.connected {\n\t\t> span {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, nextTick } from 'vue';\nimport { useRouter } from 'vue-router';\nimport type { IMenuItem } from 'n8n-design-system/types';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS } from '@/constants';\nimport { useProjectsStore } from '@/features/projects/projects.store';\nimport type { ProjectListItem } from '@/features/projects/projects.types';\nimport { useToast } from '@/composables/useToast';\nimport { useUIStore } from '@/stores/ui.store';\n\ntype Props = {\n\tcollapsed: boolean;\n\tplanName?: string;\n};\n\nconst props = defineProps<Props>();\n\nconst router = useRouter();\nconst locale = useI18n();\nconst toast = useToast();\nconst projectsStore = useProjectsStore();\nconst uiStore = useUIStore();\n\nconst isCreatingProject = ref(false);\nconst isComponentMounted = ref(false);\nconst home = computed<IMenuItem>(() => ({\n\tid: 'home',\n\tlabel: locale.baseText('projects.menu.home'),\n\ticon: 'home',\n\troute: {\n\t\tto: { name: VIEWS.HOMEPAGE },\n\t},\n}));\nconst addProject = computed<IMenuItem>(() => ({\n\tid: 'addProject',\n\tlabel: locale.baseText('projects.menu.addProject'),\n\ticon: 'plus',\n\tdisabled:\n\t\t!isComponentMounted.value || isCreatingProject.value || !projectsStore.canCreateProjects,\n\tisLoading: isCreatingProject.value,\n}));\n\nconst getProjectMenuItem = (project: ProjectListItem) => ({\n\tid: project.id,\n\tlabel: project.name,\n\troute: {\n\t\tto: {\n\t\t\tname: VIEWS.PROJECTS_WORKFLOWS,\n\t\t\tparams: { projectId: project.id },\n\t\t},\n\t},\n});\n\nconst homeClicked = () => {};\nconst projectClicked = () => {};\nconst addProjectClicked = async () => {\n\tisCreatingProject.value = true;\n\n\ttry {\n\t\tconst newProject = await projectsStore.createProject({\n\t\t\tname: locale.baseText('projects.settings.newProjectName'),\n\t\t});\n\t\tawait router.push({ name: VIEWS.PROJECT_SETTINGS, params: { projectId: newProject.id } });\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('projects.settings.save.successful.title', {\n\t\t\t\tinterpolate: { projectName: newProject.name ?? '' },\n\t\t\t}),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('projects.error.title'));\n\t} finally {\n\t\tisCreatingProject.value = false;\n\t}\n};\n\nconst displayProjects = computed(() => {\n\treturn projectsStore.myProjects\n\t\t.filter((p) => p.type === 'team')\n\t\t.toSorted((a, b) => {\n\t\t\tif (!a.name || !b.name) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (a.name > b.name) {\n\t\t\t\treturn 1;\n\t\t\t} else if (a.name < b.name) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n});\n\nconst goToUpgrade = async () => {\n\tawait uiStore.goToUpgrade('rbac', 'upgrade-rbac');\n};\n\nonMounted(async () => {\n\tawait nextTick();\n\tisComponentMounted.value = true;\n});\n</script>\n\n<template>\n\t<div :class=\"$style.projects\">\n\t\t<ElMenu :collapse=\"props.collapsed\" class=\"home\">\n\t\t\t<N8nMenuItem\n\t\t\t\t:item=\"home\"\n\t\t\t\t:compact=\"props.collapsed\"\n\t\t\t\t:handle-select=\"homeClicked\"\n\t\t\t\t:active-tab=\"projectsStore.projectNavActiveId\"\n\t\t\t\tmode=\"tabs\"\n\t\t\t\tdata-test-id=\"project-home-menu-item\"\n\t\t\t/>\n\t\t</ElMenu>\n\t\t<hr\n\t\t\tv-if=\"\n\t\t\t\tdisplayProjects.length ||\n\t\t\t\t(projectsStore.hasPermissionToCreateProjects && projectsStore.teamProjectsAvailable)\n\t\t\t\"\n\t\t\tclass=\"mt-m mb-m\"\n\t\t/>\n\t\t<ElMenu v-if=\"displayProjects.length\" :collapse=\"props.collapsed\" :class=\"$style.projectItems\">\n\t\t\t<N8nMenuItem\n\t\t\t\tv-for=\"project in displayProjects\"\n\t\t\t\t:key=\"project.id\"\n\t\t\t\t:item=\"getProjectMenuItem(project)\"\n\t\t\t\t:compact=\"props.collapsed\"\n\t\t\t\t:handle-select=\"projectClicked\"\n\t\t\t\t:active-tab=\"projectsStore.projectNavActiveId\"\n\t\t\t\tmode=\"tabs\"\n\t\t\t\tdata-test-id=\"project-menu-item\"\n\t\t\t/>\n\t\t</ElMenu>\n\t\t<N8nTooltip placement=\"right\" :disabled=\"projectsStore.canCreateProjects\">\n\t\t\t<ElMenu\n\t\t\t\tv-if=\"projectsStore.hasPermissionToCreateProjects && projectsStore.teamProjectsAvailable\"\n\t\t\t\t:collapse=\"props.collapsed\"\n\t\t\t\tclass=\"pl-xs pr-xs\"\n\t\t\t>\n\t\t\t\t<N8nMenuItem\n\t\t\t\t\t:item=\"addProject\"\n\t\t\t\t\t:compact=\"props.collapsed\"\n\t\t\t\t\t:handle-select=\"addProjectClicked\"\n\t\t\t\t\tmode=\"tabs\"\n\t\t\t\t\tdata-test-id=\"add-project-menu-item\"\n\t\t\t\t/>\n\t\t\t</ElMenu>\n\t\t\t<template #content>\n\t\t\t\t<i18n-t keypath=\"projects.create.limitReached\">\n\t\t\t\t\t<template #planName>{{ props.planName }}</template>\n\t\t\t\t\t<template #limit>\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tlocale.baseText('projects.create.limit', {\n\t\t\t\t\t\t\t\tadjustToNumber: projectsStore.teamProjectsLimit,\n\t\t\t\t\t\t\t\tinterpolate: { num: String(projectsStore.teamProjectsLimit) },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #link>\n\t\t\t\t\t\t<a :class=\"$style.upgradeLink\" href=\"#\" @click=\"goToUpgrade\">\n\t\t\t\t\t\t\t{{ locale.baseText('projects.create.limitReached.link') }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t</template>\n\t\t</N8nTooltip>\n\t\t<hr\n\t\t\tv-if=\"\n\t\t\t\tdisplayProjects.length ||\n\t\t\t\t(projectsStore.hasPermissionToCreateProjects && projectsStore.teamProjectsAvailable)\n\t\t\t\"\n\t\t\tclass=\"mt-m mb-m\"\n\t\t/>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.projects {\n\tdisplay: grid;\n\tgrid-auto-rows: auto;\n\twidth: 100%;\n\toverflow: hidden;\n\talign-items: start;\n}\n\n.projectItems {\n\theight: 100%;\n\tpadding: 0 var(--spacing-xs) var(--spacing-s);\n\toverflow: auto;\n}\n\n.upgradeLink {\n\tcolor: var(--color-primary);\n\tcursor: pointer;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.home {\n\tpadding: 0 var(--spacing-xs);\n\n\t:deep(.el-menu-item) {\n\t\tpadding: var(--spacing-m) var(--spacing-xs) !important;\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tid=\"side-menu\"\n\t\t:class=\"{\n\t\t\t['side-menu']: true,\n\t\t\t[$style.sideMenu]: true,\n\t\t\t[$style.sideMenuCollapsed]: isCollapsed,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tid=\"collapse-change-button\"\n\t\t\t:class=\"['clickable', $style.sideMenuCollapseButton]\"\n\t\t\t@click=\"toggleCollapse\"\n\t\t>\n\t\t\t<n8n-icon v-if=\"isCollapsed\" icon=\"chevron-right\" size=\"xsmall\" class=\"ml-5xs\" />\n\t\t\t<n8n-icon v-else icon=\"chevron-left\" size=\"xsmall\" class=\"mr-5xs\" />\n\t\t</div>\n\t\t<n8n-menu :items=\"mainMenuItems\" :collapsed=\"isCollapsed\" @select=\"handleSelect\">\n\t\t\t<template #header>\n\t\t\t\t<div :class=\"$style.logo\">\n\t\t\t\t\t<img :src=\"logoPath\" data-test-id=\"n8n-logo\" :class=\"$style.icon\" alt=\"n8n\" />\n\t\t\t\t</div>\n\t\t\t\t<ProjectNavigation\n\t\t\t\t\t:collapsed=\"isCollapsed\"\n\t\t\t\t\t:plan-name=\"cloudPlanStore.currentPlanData?.displayName\"\n\t\t\t\t/>\n\t\t\t</template>\n\n\t\t\t<template #beforeLowerMenu>\n\t\t\t\t<BecomeTemplateCreatorCta v-if=\"fullyExpanded && !userIsTrialing\" />\n\t\t\t\t<ExecutionsUsage\n\t\t\t\t\tv-if=\"fullyExpanded && userIsTrialing\"\n\t\t\t\t\t:cloud-plan-data=\"currentPlanAndUsageData\"\n\t\t\t/></template>\n\t\t\t<template #menuSuffix>\n\t\t\t\t<div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"hasVersionUpdates\"\n\t\t\t\t\t\tdata-test-id=\"version-updates-panel-button\"\n\t\t\t\t\t\t:class=\"$style.updates\"\n\t\t\t\t\t\t@click=\"openUpdatesPanel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div :class=\"$style.giftContainer\">\n\t\t\t\t\t\t\t<GiftNotificationIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<n8n-text\n\t\t\t\t\t\t\t:class=\"{ ['ml-xs']: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ nextVersions.length > 99 ? '99+' : nextVersions.length }} update{{\n\t\t\t\t\t\t\t\tnextVersions.length > 1 ? 's' : ''\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<MainSidebarSourceControl :is-collapsed=\"isCollapsed\" />\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"showUserArea\" #footer>\n\t\t\t\t<div :class=\"$style.userArea\">\n\t\t\t\t\t<div class=\"ml-3xs\" data-test-id=\"main-sidebar-user-menu\">\n\t\t\t\t\t\t<!-- This dropdown is only enabled when sidebar is collapsed -->\n\t\t\t\t\t\t<el-dropdown\n\t\t\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\t\t\t@command=\"onUserActionToggle\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :class=\"{ [$style.avatar]: true, ['clickable']: isCollapsed }\">\n\t\t\t\t\t\t\t\t<n8n-avatar\n\t\t\t\t\t\t\t\t\t:first-name=\"usersStore.currentUser?.firstName\"\n\t\t\t\t\t\t\t\t\t:last-name=\"usersStore.currentUser?.lastName\"\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<template #dropdown>\n\t\t\t\t\t\t\t\t<el-dropdown-menu>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"settings\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('settings') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"logout\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('auth.signout') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t</el-dropdown-menu>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</el-dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"{ ['ml-2xs']: true, [$style.userName]: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"text-dark\">{{\n\t\t\t\t\t\t\tusersStore.currentUser?.fullName\n\t\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div :class=\"{ [$style.userActions]: true, [$style.expanded]: fullyExpanded }\">\n\t\t\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\t\t\t:items=\"userMenuItems\"\n\t\t\t\t\t\t\tplacement=\"top-start\"\n\t\t\t\t\t\t\tdata-test-id=\"user-menu\"\n\t\t\t\t\t\t\t@select=\"onUserActionToggle\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-menu>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { CloudPlanAndUsageData, IExecutionResponse, IMenuItem, IVersion } from '@/Interface';\nimport GiftNotificationIcon from './GiftNotificationIcon.vue';\n\nimport { useMessage } from '@/composables/useMessage';\nimport { ABOUT_MODAL_KEY, VERSIONS_MODAL_KEY, VIEWS } from '@/constants';\nimport { userHelpers } from '@/mixins/userHelpers';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useVersionsStore } from '@/stores/versions.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport ExecutionsUsage from '@/components/executions/ExecutionsUsage.vue';\nimport BecomeTemplateCreatorCta from '@/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useBecomeTemplateCreatorStore } from '@/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore';\nimport ProjectNavigation from '@/features/projects/components/ProjectNavigation.vue';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tExecutionsUsage,\n\t\tMainSidebarSourceControl,\n\t\tBecomeTemplateCreatorCta,\n\t\tProjectNavigation,\n\t},\n\tmixins: [userHelpers],\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tcallDebounced,\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbasePath: '',\n\t\t\tfullyExpanded: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsersStore,\n\t\t\tuseVersionsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseCloudPlanStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseBecomeTemplateCreatorStore,\n\t\t\tuseTemplatesStore,\n\t\t),\n\t\tlogoPath(): string {\n\t\t\treturn this.basePath + (this.isCollapsed ? 'static/logo/collapsed.svg' : this.uiStore.logo);\n\t\t},\n\t\thasVersionUpdates(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.settingsStore.settings.releaseChannel === 'stable' &&\n\t\t\t\tthis.versionsStore.hasVersionUpdates\n\t\t\t);\n\t\t},\n\t\tnextVersions(): IVersion[] {\n\t\t\treturn this.versionsStore.nextVersions;\n\t\t},\n\t\tisCollapsed(): boolean {\n\t\t\treturn this.uiStore.sidebarMenuCollapsed;\n\t\t},\n\t\tcanUserAccessSettings(): boolean {\n\t\t\tconst accessibleRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\treturn accessibleRoute !== null;\n\t\t},\n\t\tshowUserArea(): boolean {\n\t\t\treturn hasPermission(['authenticated']);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tuserMenuItems(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'logout',\n\t\t\t\t\tlabel: this.$locale.baseText('auth.signout'),\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tmainMenuItems(): IMenuItem[] {\n\t\t\tconst items: IMenuItem[] = [];\n\n\t\t\tconst defaultSettingsRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\tconst regularItems: IMenuItem[] = [\n\t\t\t\t{\n\t\t\t\t\tid: 'cloud-admin',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tlabel: 'Admin Panel',\n\t\t\t\t\ticon: 'cloud',\n\t\t\t\t\tavailable: this.settingsStore.isCloudDeployment && hasPermission(['instanceOwner']),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Link to in-app templates, available if custom templates are enabled\n\t\t\t\t\tid: 'templates',\n\t\t\t\t\ticon: 'box-open',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.templates'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable:\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled && this.templatesStore.hasCustomTemplatesHost,\n\t\t\t\t\troute: { to: { name: VIEWS.TEMPLATES } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Link to website templates, available if custom templates are not enabled\n\t\t\t\t\tid: 'templates',\n\t\t\t\t\ticon: 'box-open',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.templates'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable:\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled && !this.templatesStore.hasCustomTemplatesHost,\n\t\t\t\t\tlink: {\n\t\t\t\t\t\thref: this.templatesStore.websiteTemplateRepositoryURL,\n\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'variables',\n\t\t\t\t\ticon: 'variable',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.variables'),\n\t\t\t\t\tcustomIconSize: 'medium',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\troute: { to: { name: VIEWS.VARIABLES } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'executions',\n\t\t\t\t\ticon: 'tasks',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.executions'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\troute: { to: { name: VIEWS.EXECUTIONS } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\ticon: 'cog',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable: this.canUserAccessSettings && this.usersStore.currentUser !== null,\n\t\t\t\t\tactivateOnRouteNames: [VIEWS.USERS_SETTINGS, VIEWS.API_SETTINGS, VIEWS.PERSONAL_SETTINGS],\n\t\t\t\t\troute: { to: defaultSettingsRoute },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'help',\n\t\t\t\t\ticon: 'question',\n\t\t\t\t\tlabel: 'Help',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'quickstart',\n\t\t\t\t\t\t\ticon: 'video',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.quickstart'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'docs',\n\t\t\t\t\t\t\ticon: 'book',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.documentation'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'forum',\n\t\t\t\t\t\t\ticon: 'users',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.forum'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'examples',\n\t\t\t\t\t\t\ticon: 'graduation-cap',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.course'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'about',\n\t\t\t\t\t\t\ticon: 'info',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.aboutN8n'),\n\t\t\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn [...items, ...regularItems];\n\t\t},\n\t\tuserIsTrialing(): boolean {\n\t\t\treturn this.cloudPlanStore.userIsTrialing;\n\t\t},\n\t\tcurrentPlanAndUsageData(): CloudPlanAndUsageData | null {\n\t\t\tconst planData = this.cloudPlanStore.currentPlanData;\n\t\t\tconst usage = this.cloudPlanStore.currentUsageData;\n\t\t\tif (!planData || !usage) return null;\n\t\t\treturn {\n\t\t\t\t...planData,\n\t\t\t\tusage,\n\t\t\t};\n\t\t},\n\t},\n\tasync mounted() {\n\t\tthis.basePath = this.rootStore.baseUrl;\n\t\tif (this.$refs.user) {\n\t\t\tvoid this.externalHooks.run('mainSidebar.mounted', {\n\t\t\t\tuserRef: this.$refs.user as Element,\n\t\t\t});\n\t\t}\n\n\t\tvoid this.$nextTick(() => {\n\t\t\tif (window.innerWidth < 900 || this.uiStore.isNodeView) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t} else {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = false;\n\t\t\t}\n\n\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t});\n\n\t\tthis.becomeTemplateCreatorStore.startMonitoringCta();\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\tthis.becomeTemplateCreatorStore.stopMonitoringCta();\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\ttrackHelpItemClick(itemType: string) {\n\t\t\tthis.$telemetry.track('User clicked help resource', {\n\t\t\t\ttype: itemType,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\ttrackTemplatesClick() {\n\t\t\tthis.$telemetry.track('User clicked on templates', {\n\t\t\t\trole: this.usersStore.currentUserCloudInfo?.role,\n\t\t\t\tactive_workflow_count: this.workflowsStore.activeWorkflows.length,\n\t\t\t});\n\t\t},\n\t\tasync onUserActionToggle(action: string) {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'logout':\n\t\t\t\t\tthis.onLogout();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'settings':\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.PERSONAL_SETTINGS });\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tonLogout() {\n\t\t\tvoid this.$router.push({ name: VIEWS.SIGNOUT });\n\t\t},\n\t\ttoggleCollapse() {\n\t\t\tthis.uiStore.toggleSidebarMenuCollapse();\n\t\t\t// When expanding, delay showing some element to ensure smooth animation\n\t\t\tif (!this.isCollapsed) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t\t}, 300);\n\t\t\t} else {\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t\topenUpdatesPanel() {\n\t\t\tthis.uiStore.openModal(VERSIONS_MODAL_KEY);\n\t\t},\n\t\tasync handleSelect(key: string) {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'templates':\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled &&\n\t\t\t\t\t\t!this.templatesStore.hasCustomTemplatesHost\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.trackTemplatesClick();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'about': {\n\t\t\t\t\tthis.trackHelpItemClick('about');\n\t\t\t\t\tthis.uiStore.openModal(ABOUT_MODAL_KEY);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'cloud-admin': {\n\t\t\t\t\tvoid this.cloudPlanStore.redirectToDashboard();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'quickstart':\n\t\t\t\tcase 'docs':\n\t\t\t\tcase 'forum':\n\t\t\t\tcase 'examples': {\n\t\t\t\t\tthis.trackHelpItemClick(key);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tfindFirstAccessibleSettingsRoute() {\n\t\t\tconst settingsRoutes = this.$router\n\t\t\t\t.getRoutes()\n\t\t\t\t.find((route) => route.path === '/settings')\n\t\t\t\t?.children.map((route) => route.name ?? '');\n\n\t\t\tlet defaultSettingsRoute = { name: VIEWS.USERS_SETTINGS };\n\t\t\tfor (const route of settingsRoutes ?? []) {\n\t\t\t\tif (this.canUserAccessRouteByName(route.toString())) {\n\t\t\t\t\tdefaultSettingsRoute = {\n\t\t\t\t\t\tname: route.toString() as VIEWS,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn defaultSettingsRoute;\n\t\t},\n\t\tonResize(event: UIEvent) {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 100 }, event);\n\t\t},\n\t\tasync onResizeEnd(event: UIEvent) {\n\t\t\tconst browserWidth = (event.target as Window).outerWidth;\n\t\t\tawait this.checkWidthAndAdjustSidebar(browserWidth);\n\t\t},\n\t\tasync checkWidthAndAdjustSidebar(width: number) {\n\t\t\tif (width < 900) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t\tawait this.$nextTick();\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.sideMenu {\n\tposition: relative;\n\theight: 100%;\n\tborder-right: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\ttransition: width 150ms ease-in-out;\n\twidth: $sidebar-expanded-width;\n\t.logo {\n\t\theight: $header-height;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding: var(--spacing-xs);\n\n\t\timg {\n\t\t\tposition: relative;\n\t\t\tleft: 1px;\n\t\t\theight: 20px;\n\t\t}\n\t}\n\n\t&.sideMenuCollapsed {\n\t\twidth: $sidebar-width;\n\n\t\t.logo img {\n\t\t\tleft: 0;\n\t\t}\n\t}\n}\n\n.sideMenuCollapseButton {\n\tposition: absolute;\n\tright: -10px;\n\ttop: 50%;\n\tz-index: 999;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tcolor: var(--color-text-base);\n\tbackground-color: var(--color-foreground-xlight);\n\twidth: 20px;\n\theight: 20px;\n\tborder: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-radius: 50%;\n\n\t&:hover {\n\t\tcolor: var(--color-primary-shade-1);\n\t}\n}\n\n.updates {\n\tdisplay: flex;\n\talign-items: center;\n\tcursor: pointer;\n\tpadding: var(--spacing-2xs) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 0;\n\n\tsvg {\n\t\tcolor: var(--color-text-base) !important;\n\t}\n\tspan {\n\t\tdisplay: none;\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n\n\t&:hover {\n\t\t&,\n\t\t& svg {\n\t\t\tcolor: var(--color-text-dark) !important;\n\t\t}\n\t}\n}\n\n.userArea {\n\tdisplay: flex;\n\tpadding: var(--spacing-xs);\n\talign-items: center;\n\theight: 60px;\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\n\t.userName {\n\t\tdisplay: none;\n\t\toverflow: hidden;\n\t\twidth: 100px;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\n\t\tspan {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t.userActions {\n\t\tdisplay: none;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n}\n\n@media screen and (max-height: 470px) {\n\t:global(#help) {\n\t\tdisplay: none;\n\t}\n}\n</style>\n"],"names":["_hoisted_2","_openBlock","_createVNode","_component_font_awesome_icon","_normalizeClass","_ctx","PROGRESS_BAR_MINIMUM_THRESHOLD","props","__props","now","DateTime","daysLeftOnTrial","computed","days","getPlanExpirationDate","isTrialExpired","_a","trialEndsAt","trialHasExecutionsLeft","currentExecutions","usedExecutions","executionsQuota","currentExecutionsWithThreshold","threshold","maxExecutions","onUpgradeClicked","useUIStore","getBecomeCreatorCta","context","get","LOCAL_STORAGE_KEY","RESHOW_DISMISSED_AFTER_DAYS","POLL_INTERVAL_IN_MS","useBecomeTemplateCreatorStore","defineStore","STORES","cloudPlanStore","useCloudPlanStore","rootStore","useRootStore","dismissedAt","useStorage","ctaMeetsCriteria","ref","monitorCtasTimer","isDismissed","hasEnoughTimePassedSinceDismissal","showBecomeCreatorCta","dismissCta","fetchBecomeCreatorCta","becomeCreatorCta","fetchUserCtasIfNeeded","i18n","useI18n","store","telemetry","useTelemetry","onClick","responseStatuses","useRouter","loadingService","useLoadingService","uiStore","sourceControlStore","useSourceControlStore","toast","useToast","eventBus","createEventBus","tooltipOpenDelay","currentBranch","sourceControlAvailable","hasPermission","pushWorkfolder","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","pullWorkfolder","file","incompleteFileTypes","nextTick","sourceControlEventBus","errorResponse","SOURCE_CONTROL_PULL_MODAL_KEY","router","locale","projectsStore","useProjectsStore","isCreatingProject","isComponentMounted","home","VIEWS","addProject","getProjectMenuItem","project","homeClicked","projectClicked","addProjectClicked","newProject","displayProjects","p","a","b","goToUpgrade","onMounted","_sfc_main","defineComponent","GiftNotificationIcon","ExecutionsUsage","MainSidebarSourceControl","BecomeTemplateCreatorCta","ProjectNavigation","userHelpers","externalHooks","useExternalHooks","callDebounced","useDebounce","useMessage","mapStores","useSettingsStore","useUsersStore","useVersionsStore","useWorkflowsStore","useTemplatesStore","items","defaultSettingsRoute","regularItems","planData","usage","itemType","action","VERSIONS_MODAL_KEY","key","ABOUT_MODAL_KEY","settingsRoutes","route","event","browserWidth","width","_hoisted_1","_resolveComponent","_createElementBlock","$style","_createElementVNode","isCollapsed","_cache","args","_createBlock","_component_n8n_icon","handleSelect","_createSlots","_withCtx","_component_ProjectNavigation","fullyExpanded","userIsTrialing","currentPlanAndUsageData","_createCommentVNode","hasVersionUpdates","_component_GiftNotificationIcon","_component_n8n_text","_createTextVNode","_toDisplayString","showUserArea","_component_el_dropdown","onUserActionToggle","_component_el_dropdown_menu","_component_el_dropdown_item","$locale","_component_n8n_avatar","_b","_component_n8n_action_dropdown"],"mappings":"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"}
1
+ {"version":3,"file":"MainSidebar-CAwsaKp9.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/components/executions/ExecutionsUsage.vue","../../src/api/ctas.ts","../../src/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore.ts","../../src/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue","../../src/components/MainSidebarSourceControl.vue","../../src/features/projects/components/ProjectNavigation.vue","../../src/components/MainSidebar.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style['gift-icon']\">\n\t\t<font-awesome-icon icon=\"gift\" />\n\t\t<div :class=\"$style['notification']\">\n\t\t\t<div></div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.gift-icon {\n\tdisplay: flex;\n\tposition: relative;\n\n\tsvg {\n\t\tmargin-right: 0 !important;\n\t}\n\n\t.notification {\n\t\theight: 0.47em;\n\t\twidth: 0.47em;\n\t\tborder-radius: 50%;\n\t\tcolor: $gift-notification-active-color;\n\t\tposition: absolute;\n\t\tbackground-color: $gift-notification-outer-color;\n\t\tright: -0.3em;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttop: -0.148em;\n\n\t\tdiv {\n\t\t\theight: 0.36em;\n\t\t\twidth: 0.36em;\n\t\t\tbackground-color: $gift-notification-inner-color;\n\t\t\tborder-radius: 50%;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<div v-if=\"isTrialExpired\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\" color=\"danger\">\n\t\t\t\t{{ locale.baseText('executionUsage.expired.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-else-if=\"!isTrialExpired && trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<i18n-t tag=\"span\" keypath=\"executionUsage.currentUsage\">\n\t\t\t\t<template #text>\n\t\t\t\t\t<n8n-text size=\"small\" color=\"text-dark\">\n\t\t\t\t\t\t{{ locale.baseText('executionUsage.currentUsage.text') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t\t<template #count>\n\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"warning\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tlocale.baseText('executionUsage.currentUsage.count', {\n\t\t\t\t\t\t\t\tadjustToNumber: daysLeftOnTrial || 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div v-else-if=\"!trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\">\n\t\t\t\t{{ locale.baseText('executionUsage.ranOutOfExecutions.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-if=\"!isTrialExpired\" :class=\"$style.usageCounter\">\n\t\t\t<div :class=\"$style.progressBarDiv\">\n\t\t\t\t<progress\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\ttrialHasExecutionsLeft ? $style.progressBarSuccess : $style.progressBarDanger,\n\t\t\t\t\t\t$style.progressBar,\n\t\t\t\t\t]\"\n\t\t\t\t\t:value=\"currentExecutionsWithThreshold\"\n\t\t\t\t\t:max=\"maxExecutions\"\n\t\t\t\t></progress>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.executionsCountSection\">\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">\n\t\t\t\t\t{{ currentExecutions }}/{{ maxExecutions }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">{{\n\t\t\t\t\tlocale.baseText('executionUsage.label.executions')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div :class=\"$style.upgradeButtonSection\">\n\t\t\t<n8n-button\n\t\t\t\t:label=\"locale.baseText('executionUsage.button.upgrade')\"\n\t\t\t\tsize=\"xmini\"\n\t\t\t\ticon=\"gem\"\n\t\t\t\ttype=\"success\"\n\t\t\t\t:block=\"true\"\n\t\t\t\t@click=\"onUpgradeClicked\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { i18n as locale } from '@/plugins/i18n';\nimport { DateTime } from 'luxon';\nimport type { CloudPlanAndUsageData } from '@/Interface';\nimport { computed } from 'vue';\nimport { useUIStore } from '@/stores/ui.store';\n\nconst PROGRESS_BAR_MINIMUM_THRESHOLD = 8;\n\nconst props = defineProps<{ cloudPlanData: CloudPlanAndUsageData | null }>();\n\nconst now = DateTime.utc();\n\nconst daysLeftOnTrial = computed(() => {\n\tconst { days = 0 } = getPlanExpirationDate().diff(now, ['days']).toObject();\n\treturn Math.ceil(days);\n});\n\nconst isTrialExpired = computed(() => {\n\tif (!props.cloudPlanData?.expirationDate) return false;\n\tconst trialEndsAt = DateTime.fromISO(props.cloudPlanData.expirationDate);\n\treturn now.toMillis() > trialEndsAt.toMillis();\n});\n\nconst getPlanExpirationDate = () => DateTime.fromISO(props?.cloudPlanData?.expirationDate ?? '');\n\nconst trialHasExecutionsLeft = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\treturn props.cloudPlanData.usage.executions < props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst currentExecutions = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\treturn usedExecutions > executionsQuota ? executionsQuota : usedExecutions;\n});\n\nconst currentExecutionsWithThreshold = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\tconst threshold = (PROGRESS_BAR_MINIMUM_THRESHOLD * executionsQuota) / 100;\n\treturn usedExecutions < threshold ? threshold : usedExecutions;\n});\n\nconst maxExecutions = computed(() => {\n\tif (!props.cloudPlanData?.monthlyExecutionsLimit) return 0;\n\treturn props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst onUpgradeClicked = () => {\n\tvoid useUIStore().goToUpgrade('canvas-nav', 'upgrade-canvas-nav', 'redirect');\n};\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.progressBarDiv {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.progressBar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-webkit-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-moz-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n\n.progressBarSuccess::-moz-progress-bar {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarSuccess::-webkit-progress-value {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-webkit-progress-value {\n\tbackground: var(--color-danger);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-moz-progress-bar {\n\tbackground: var(--color-danger);\n}\n\n.usageText {\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-s);\n\tmargin-top: var(--spacing-xs);\n\tline-height: var(--spacing-xs);\n}\n\n.usageCounter {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-top: var(--spacing-2xs);\n\tfont-size: var(--font-size-3xs);\n}\n\n.danger {\n\tcolor: var(--color-danger);\n}\n\n.executionsCountSection {\n\tmargin-left: var(--spacing-xs);\n}\n\n.upgradeButtonSection {\n\tmargin: var(--spacing-s);\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\n\nexport async function getBecomeCreatorCta(context: IRestApiContext): Promise<boolean> {\n\tconst response = await get(context.baseUrl, '/cta/become-creator');\n\n\treturn response;\n}\n","import { DateTime } from 'luxon';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\nimport { STORES } from '@/constants';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useStorage } from '@/composables/useStorage';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { getBecomeCreatorCta } from '@/api/ctas';\n\nconst LOCAL_STORAGE_KEY = 'N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT';\nconst RESHOW_DISMISSED_AFTER_DAYS = 30;\nconst POLL_INTERVAL_IN_MS = 15 * 60 * 1000; // 15 minutes\n\nexport const useBecomeTemplateCreatorStore = defineStore(STORES.BECOME_TEMPLATE_CREATOR, () => {\n\tconst cloudPlanStore = useCloudPlanStore();\n\tconst rootStore = useRootStore();\n\n\t//#region State\n\n\tconst dismissedAt = useStorage(LOCAL_STORAGE_KEY);\n\tconst ctaMeetsCriteria = ref(false);\n\tconst monitorCtasTimer = ref<ReturnType<typeof setInterval> | null>(null);\n\n\t//#endregion State\n\n\t//#region Computed\n\n\tconst isDismissed = computed(() => {\n\t\treturn dismissedAt.value ? !hasEnoughTimePassedSinceDismissal(dismissedAt.value) : false;\n\t});\n\n\tconst showBecomeCreatorCta = computed(() => {\n\t\treturn ctaMeetsCriteria.value && !cloudPlanStore.userIsTrialing && !isDismissed.value;\n\t});\n\n\t//#endregion Computed\n\n\t//#region Actions\n\n\tconst dismissCta = () => {\n\t\tdismissedAt.value = DateTime.now().toISO();\n\t};\n\n\tconst fetchBecomeCreatorCta = async () => {\n\t\tconst becomeCreatorCta = await getBecomeCreatorCta(rootStore.getRestApiContext);\n\n\t\tctaMeetsCriteria.value = becomeCreatorCta;\n\t};\n\n\tconst fetchUserCtasIfNeeded = async () => {\n\t\tif (isDismissed.value || cloudPlanStore.userIsTrialing || ctaMeetsCriteria.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait fetchBecomeCreatorCta();\n\t};\n\n\tconst startMonitoringCta = () => {\n\t\tif (monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial check after 1s so we don't bombard the API immediately during startup\n\t\tsetTimeout(fetchUserCtasIfNeeded, 1000);\n\n\t\tmonitorCtasTimer.value = setInterval(fetchUserCtasIfNeeded, POLL_INTERVAL_IN_MS);\n\t};\n\n\tconst stopMonitoringCta = () => {\n\t\tif (!monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearInterval(monitorCtasTimer.value);\n\t\tmonitorCtasTimer.value = null;\n\t};\n\n\t//#endregion Actions\n\n\treturn {\n\t\tshowBecomeCreatorCta,\n\t\tdismissCta,\n\t\tstartMonitoringCta,\n\t\tstopMonitoringCta,\n\t};\n});\n\nfunction hasEnoughTimePassedSinceDismissal(dismissedAt: string) {\n\tconst reshowAtTime = DateTime.fromISO(dismissedAt).plus({\n\t\tdays: RESHOW_DISMISSED_AFTER_DAYS,\n\t});\n\n\treturn reshowAtTime <= DateTime.now();\n}\n","<script setup lang=\"ts\">\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useBecomeTemplateCreatorStore } from './becomeTemplateCreatorStore';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\nconst store = useBecomeTemplateCreatorStore();\nconst telemetry = useTelemetry();\n\nconst onClick = () => {\n\ttelemetry.track('User clicked become creator CTA');\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"store.showBecomeCreatorCta\"\n\t\t:class=\"$style.container\"\n\t\tdata-test-id=\"become-template-creator-cta\"\n\t>\n\t\t<div :class=\"$style.textAndCloseButton\">\n\t\t\t<p :class=\"$style.text\">\n\t\t\t\t{{ i18n.baseText('becomeCreator.text') }}\n\t\t\t</p>\n\n\t\t\t<button\n\t\t\t\t:class=\"$style.closeButton\"\n\t\t\t\tdata-test-id=\"close-become-template-creator-cta\"\n\t\t\t\t@click=\"store.dismissCta()\"\n\t\t\t>\n\t\t\t\t<n8n-icon icon=\"times\" size=\"xsmall\" :title=\"i18n.baseText('generic.close')\" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<n8n-button\n\t\t\t:class=\"$style.becomeCreatorButton\"\n\t\t\t:label=\"i18n.baseText('becomeCreator.buttonText')\"\n\t\t\tsize=\"xmini\"\n\t\t\ttype=\"secondary\"\n\t\t\telement=\"a\"\n\t\t\thref=\"https://creators.n8n.io/hub\"\n\t\t\ttarget=\"_blank\"\n\t\t\t@click=\"onClick\"\n\t\t/>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.textAndCloseButton {\n\tdisplay: flex;\n\tmargin-top: var(--spacing-xs);\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-2xs);\n}\n\n.text {\n\tflex: 1;\n\tfont-size: var(--font-size-3xs);\n\tline-height: var(--font-line-height-compact);\n}\n\n.closeButton {\n\tflex: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: var(--spacing-2xs);\n\theight: var(--spacing-2xs);\n\tborder: none;\n\tcolor: var(--color-text-light);\n\tbackground-color: transparent;\n\tcursor: pointer;\n}\n\n.becomeCreatorButton {\n\tmargin: var(--spacing-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { useI18n } from '@/composables/useI18n';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { SOURCE_CONTROL_PULL_MODAL_KEY, SOURCE_CONTROL_PUSH_MODAL_KEY, VIEWS } from '@/constants';\nimport type { SourceControlAggregatedFile } from '../Interface';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\n\nconst props = defineProps<{\n\tisCollapsed: boolean;\n}>();\n\nconst responseStatuses = {\n\tCONFLICT: 409,\n};\n\nconst router = useRouter();\nconst loadingService = useLoadingService();\nconst uiStore = useUIStore();\nconst sourceControlStore = useSourceControlStore();\nconst toast = useToast();\nconst i18n = useI18n();\n\nconst eventBus = createEventBus();\nconst tooltipOpenDelay = ref(300);\n\nconst currentBranch = computed(() => {\n\treturn sourceControlStore.preferences.branchName;\n});\nconst sourceControlAvailable = computed(\n\t() =>\n\t\tsourceControlStore.isEnterpriseSourceControlEnabled &&\n\t\thasPermission(['rbac'], { rbac: { scope: 'sourceControl:manage' } }),\n);\n\nasync function pushWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.checkingForChanges'));\n\ttry {\n\t\tconst status = await sourceControlStore.getAggregatedStatus();\n\n\t\tuiStore.openModalWithData({\n\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\tdata: { eventBus, status },\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('error'));\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nasync function pullWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.pull'));\n\n\ttry {\n\t\tconst status: SourceControlAggregatedFile[] =\n\t\t\t((await sourceControlStore.pullWorkfolder(\n\t\t\t\tfalse,\n\t\t\t)) as unknown as SourceControlAggregatedFile[]) || [];\n\n\t\tconst statusWithoutLocallyCreatedWorkflows = status.filter((file) => {\n\t\t\treturn !(file.type === 'workflow' && file.status === 'created' && file.location === 'local');\n\t\t});\n\t\tif (statusWithoutLocallyCreatedWorkflows.length === 0) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.upToDate.title'),\n\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.upToDate.description'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.success.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\tconst incompleteFileTypes = ['variables', 'credential'];\n\t\t\tconst hasVariablesOrCredentials = (status || []).some((file) => {\n\t\t\t\treturn incompleteFileTypes.includes(file.type);\n\t\t\t});\n\n\t\t\tif (hasVariablesOrCredentials) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\ttoast.showMessage({\n\t\t\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.oneLastStep.description'),\n\t\t\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.oneLastStep.title'),\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tsourceControlEventBus.emit('pull');\n\t} catch (error) {\n\t\tconst errorResponse = error.response;\n\n\t\tif (errorResponse?.status === responseStatuses.CONFLICT) {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: SOURCE_CONTROL_PULL_MODAL_KEY,\n\t\t\t\tdata: { eventBus, status: errorResponse.data.data },\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showError(error, 'Error');\n\t\t}\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nconst goToSourceControlSetup = async () => {\n\tawait router.push({ name: VIEWS.SOURCE_CONTROL });\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"sourceControlAvailable\"\n\t\t:class=\"{\n\t\t\t[$style.sync]: true,\n\t\t\t[$style.collapsed]: isCollapsed,\n\t\t\t[$style.isConnected]: sourceControlStore.isEnterpriseSourceControlEnabled,\n\t\t}\"\n\t\t:style=\"{ borderLeftColor: sourceControlStore.preferences.branchColor }\"\n\t\tdata-test-id=\"main-sidebar-source-control\"\n\t>\n\t\t<div\n\t\t\tv-if=\"sourceControlStore.preferences.connected && sourceControlStore.preferences.branchName\"\n\t\t\t:class=\"$style.connected\"\n\t\t\tdata-test-id=\"main-sidebar-source-control-connected\"\n\t\t>\n\t\t\t<span :class=\"$style.branchName\">\n\t\t\t\t<n8n-icon icon=\"code-branch\" />\n\t\t\t\t{{ currentBranch }}\n\t\t\t</span>\n\t\t\t<div :class=\"{ 'pt-xs': !isCollapsed }\">\n\t\t\t\t<n8n-tooltip :disabled=\"!isCollapsed\" :show-after=\"tooltipOpenDelay\" placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.pull') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'mr-2xs': !isCollapsed,\n\t\t\t\t\t\t\t'mb-2xs': isCollapsed && !sourceControlStore.preferences.branchReadOnly,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\ticon=\"arrow-down\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.pull')\"\n\t\t\t\t\t\t@click=\"pullWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-if=\"!sourceControlStore.preferences.branchReadOnly\"\n\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t:show-after=\"tooltipOpenDelay\"\n\t\t\t\t\tplacement=\"right\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.push') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.push')\"\n\t\t\t\t\t\ticon=\"arrow-up\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t@click=\"pushWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.sync {\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 calc(var(--spacing-2xs) * -1);\n\tbackground: var(--color-background-light);\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tfont-size: var(--font-size-2xs);\n\n\t&.isConnected {\n\t\tpadding-left: var(--spacing-m);\n\t\tborder-left: var(--spacing-3xs) var(--border-style-base) var(--color-foreground-base);\n\n\t\t&.collapsed {\n\t\t\tpadding-left: var(--spacing-xs);\n\t\t}\n\t}\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n\n\tbutton {\n\t\tfont-size: var(--font-size-3xs);\n\t}\n}\n\n.branchName {\n\twhite-space: normal;\n\tline-break: anywhere;\n}\n\n.collapsed {\n\ttext-align: center;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n\n\t.connected {\n\t\t> span {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, nextTick } from 'vue';\nimport { useRouter } from 'vue-router';\nimport type { IMenuItem } from 'n8n-design-system/types';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS } from '@/constants';\nimport { useProjectsStore } from '@/features/projects/projects.store';\nimport type { ProjectListItem } from '@/features/projects/projects.types';\nimport { useToast } from '@/composables/useToast';\nimport { useUIStore } from '@/stores/ui.store';\n\ntype Props = {\n\tcollapsed: boolean;\n\tplanName?: string;\n};\n\nconst props = defineProps<Props>();\n\nconst router = useRouter();\nconst locale = useI18n();\nconst toast = useToast();\nconst projectsStore = useProjectsStore();\nconst uiStore = useUIStore();\n\nconst isCreatingProject = ref(false);\nconst isComponentMounted = ref(false);\nconst home = computed<IMenuItem>(() => ({\n\tid: 'home',\n\tlabel: locale.baseText('projects.menu.home'),\n\ticon: 'home',\n\troute: {\n\t\tto: { name: VIEWS.HOMEPAGE },\n\t},\n}));\nconst addProject = computed<IMenuItem>(() => ({\n\tid: 'addProject',\n\tlabel: locale.baseText('projects.menu.addProject'),\n\ticon: 'plus',\n\tdisabled:\n\t\t!isComponentMounted.value || isCreatingProject.value || !projectsStore.canCreateProjects,\n\tisLoading: isCreatingProject.value,\n}));\n\nconst getProjectMenuItem = (project: ProjectListItem) => ({\n\tid: project.id,\n\tlabel: project.name,\n\troute: {\n\t\tto: {\n\t\t\tname: VIEWS.PROJECTS_WORKFLOWS,\n\t\t\tparams: { projectId: project.id },\n\t\t},\n\t},\n});\n\nconst homeClicked = () => {};\nconst projectClicked = () => {};\nconst addProjectClicked = async () => {\n\tisCreatingProject.value = true;\n\n\ttry {\n\t\tconst newProject = await projectsStore.createProject({\n\t\t\tname: locale.baseText('projects.settings.newProjectName'),\n\t\t});\n\t\tawait router.push({ name: VIEWS.PROJECT_SETTINGS, params: { projectId: newProject.id } });\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('projects.settings.save.successful.title', {\n\t\t\t\tinterpolate: { projectName: newProject.name ?? '' },\n\t\t\t}),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('projects.error.title'));\n\t} finally {\n\t\tisCreatingProject.value = false;\n\t}\n};\n\nconst displayProjects = computed(() => {\n\treturn projectsStore.myProjects\n\t\t.filter((p) => p.type === 'team')\n\t\t.toSorted((a, b) => {\n\t\t\tif (!a.name || !b.name) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (a.name > b.name) {\n\t\t\t\treturn 1;\n\t\t\t} else if (a.name < b.name) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n});\n\nconst goToUpgrade = async () => {\n\tawait uiStore.goToUpgrade('rbac', 'upgrade-rbac');\n};\n\nonMounted(async () => {\n\tawait nextTick();\n\tisComponentMounted.value = true;\n});\n</script>\n\n<template>\n\t<div :class=\"$style.projects\">\n\t\t<ElMenu :collapse=\"props.collapsed\" class=\"home\">\n\t\t\t<N8nMenuItem\n\t\t\t\t:item=\"home\"\n\t\t\t\t:compact=\"props.collapsed\"\n\t\t\t\t:handle-select=\"homeClicked\"\n\t\t\t\t:active-tab=\"projectsStore.projectNavActiveId\"\n\t\t\t\tmode=\"tabs\"\n\t\t\t\tdata-test-id=\"project-home-menu-item\"\n\t\t\t/>\n\t\t</ElMenu>\n\t\t<hr\n\t\t\tv-if=\"\n\t\t\t\tdisplayProjects.length ||\n\t\t\t\t(projectsStore.hasPermissionToCreateProjects && projectsStore.teamProjectsAvailable)\n\t\t\t\"\n\t\t\tclass=\"mt-m mb-m\"\n\t\t/>\n\t\t<ElMenu v-if=\"displayProjects.length\" :collapse=\"props.collapsed\" :class=\"$style.projectItems\">\n\t\t\t<N8nMenuItem\n\t\t\t\tv-for=\"project in displayProjects\"\n\t\t\t\t:key=\"project.id\"\n\t\t\t\t:item=\"getProjectMenuItem(project)\"\n\t\t\t\t:compact=\"props.collapsed\"\n\t\t\t\t:handle-select=\"projectClicked\"\n\t\t\t\t:active-tab=\"projectsStore.projectNavActiveId\"\n\t\t\t\tmode=\"tabs\"\n\t\t\t\tdata-test-id=\"project-menu-item\"\n\t\t\t/>\n\t\t</ElMenu>\n\t\t<N8nTooltip placement=\"right\" :disabled=\"projectsStore.canCreateProjects\">\n\t\t\t<ElMenu\n\t\t\t\tv-if=\"projectsStore.hasPermissionToCreateProjects && projectsStore.teamProjectsAvailable\"\n\t\t\t\t:collapse=\"props.collapsed\"\n\t\t\t\tclass=\"pl-xs pr-xs\"\n\t\t\t>\n\t\t\t\t<N8nMenuItem\n\t\t\t\t\t:item=\"addProject\"\n\t\t\t\t\t:compact=\"props.collapsed\"\n\t\t\t\t\t:handle-select=\"addProjectClicked\"\n\t\t\t\t\tmode=\"tabs\"\n\t\t\t\t\tdata-test-id=\"add-project-menu-item\"\n\t\t\t\t/>\n\t\t\t</ElMenu>\n\t\t\t<template #content>\n\t\t\t\t<i18n-t keypath=\"projects.create.limitReached\">\n\t\t\t\t\t<template #planName>{{ props.planName }}</template>\n\t\t\t\t\t<template #limit>\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tlocale.baseText('projects.create.limit', {\n\t\t\t\t\t\t\t\tadjustToNumber: projectsStore.teamProjectsLimit,\n\t\t\t\t\t\t\t\tinterpolate: { num: String(projectsStore.teamProjectsLimit) },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #link>\n\t\t\t\t\t\t<a :class=\"$style.upgradeLink\" href=\"#\" @click=\"goToUpgrade\">\n\t\t\t\t\t\t\t{{ locale.baseText('projects.create.limitReached.link') }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t</template>\n\t\t</N8nTooltip>\n\t\t<hr\n\t\t\tv-if=\"\n\t\t\t\tdisplayProjects.length ||\n\t\t\t\t(projectsStore.hasPermissionToCreateProjects && projectsStore.teamProjectsAvailable)\n\t\t\t\"\n\t\t\tclass=\"mt-m mb-m\"\n\t\t/>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.projects {\n\tdisplay: grid;\n\tgrid-auto-rows: auto;\n\twidth: 100%;\n\toverflow: hidden;\n\talign-items: start;\n}\n\n.projectItems {\n\theight: 100%;\n\tpadding: 0 var(--spacing-xs) var(--spacing-s);\n\toverflow: auto;\n}\n\n.upgradeLink {\n\tcolor: var(--color-primary);\n\tcursor: pointer;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.home {\n\tpadding: 0 var(--spacing-xs);\n\n\t:deep(.el-menu-item) {\n\t\tpadding: var(--spacing-m) var(--spacing-xs) !important;\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tid=\"side-menu\"\n\t\t:class=\"{\n\t\t\t['side-menu']: true,\n\t\t\t[$style.sideMenu]: true,\n\t\t\t[$style.sideMenuCollapsed]: isCollapsed,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tid=\"collapse-change-button\"\n\t\t\t:class=\"['clickable', $style.sideMenuCollapseButton]\"\n\t\t\t@click=\"toggleCollapse\"\n\t\t>\n\t\t\t<n8n-icon v-if=\"isCollapsed\" icon=\"chevron-right\" size=\"xsmall\" class=\"ml-5xs\" />\n\t\t\t<n8n-icon v-else icon=\"chevron-left\" size=\"xsmall\" class=\"mr-5xs\" />\n\t\t</div>\n\t\t<n8n-menu :items=\"mainMenuItems\" :collapsed=\"isCollapsed\" @select=\"handleSelect\">\n\t\t\t<template #header>\n\t\t\t\t<div :class=\"$style.logo\">\n\t\t\t\t\t<img :src=\"logoPath\" data-test-id=\"n8n-logo\" :class=\"$style.icon\" alt=\"n8n\" />\n\t\t\t\t</div>\n\t\t\t\t<ProjectNavigation\n\t\t\t\t\t:collapsed=\"isCollapsed\"\n\t\t\t\t\t:plan-name=\"cloudPlanStore.currentPlanData?.displayName\"\n\t\t\t\t/>\n\t\t\t</template>\n\n\t\t\t<template #beforeLowerMenu>\n\t\t\t\t<BecomeTemplateCreatorCta v-if=\"fullyExpanded && !userIsTrialing\" />\n\t\t\t\t<ExecutionsUsage\n\t\t\t\t\tv-if=\"fullyExpanded && userIsTrialing\"\n\t\t\t\t\t:cloud-plan-data=\"currentPlanAndUsageData\"\n\t\t\t/></template>\n\t\t\t<template #menuSuffix>\n\t\t\t\t<div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"hasVersionUpdates\"\n\t\t\t\t\t\tdata-test-id=\"version-updates-panel-button\"\n\t\t\t\t\t\t:class=\"$style.updates\"\n\t\t\t\t\t\t@click=\"openUpdatesPanel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div :class=\"$style.giftContainer\">\n\t\t\t\t\t\t\t<GiftNotificationIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<n8n-text\n\t\t\t\t\t\t\t:class=\"{ ['ml-xs']: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ nextVersions.length > 99 ? '99+' : nextVersions.length }} update{{\n\t\t\t\t\t\t\t\tnextVersions.length > 1 ? 's' : ''\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<MainSidebarSourceControl :is-collapsed=\"isCollapsed\" />\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"showUserArea\" #footer>\n\t\t\t\t<div :class=\"$style.userArea\">\n\t\t\t\t\t<div class=\"ml-3xs\" data-test-id=\"main-sidebar-user-menu\">\n\t\t\t\t\t\t<!-- This dropdown is only enabled when sidebar is collapsed -->\n\t\t\t\t\t\t<el-dropdown\n\t\t\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\t\t\t@command=\"onUserActionToggle\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :class=\"{ [$style.avatar]: true, ['clickable']: isCollapsed }\">\n\t\t\t\t\t\t\t\t<n8n-avatar\n\t\t\t\t\t\t\t\t\t:first-name=\"usersStore.currentUser?.firstName\"\n\t\t\t\t\t\t\t\t\t:last-name=\"usersStore.currentUser?.lastName\"\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<template #dropdown>\n\t\t\t\t\t\t\t\t<el-dropdown-menu>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"settings\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('settings') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"logout\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('auth.signout') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t</el-dropdown-menu>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</el-dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"{ ['ml-2xs']: true, [$style.userName]: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"text-dark\">{{\n\t\t\t\t\t\t\tusersStore.currentUser?.fullName\n\t\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div :class=\"{ [$style.userActions]: true, [$style.expanded]: fullyExpanded }\">\n\t\t\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\t\t\t:items=\"userMenuItems\"\n\t\t\t\t\t\t\tplacement=\"top-start\"\n\t\t\t\t\t\t\tdata-test-id=\"user-menu\"\n\t\t\t\t\t\t\t@select=\"onUserActionToggle\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-menu>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { CloudPlanAndUsageData, IExecutionResponse, IMenuItem, IVersion } from '@/Interface';\nimport GiftNotificationIcon from './GiftNotificationIcon.vue';\n\nimport { useMessage } from '@/composables/useMessage';\nimport { ABOUT_MODAL_KEY, VERSIONS_MODAL_KEY, VIEWS } from '@/constants';\nimport { userHelpers } from '@/mixins/userHelpers';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useVersionsStore } from '@/stores/versions.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport ExecutionsUsage from '@/components/executions/ExecutionsUsage.vue';\nimport BecomeTemplateCreatorCta from '@/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useBecomeTemplateCreatorStore } from '@/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore';\nimport ProjectNavigation from '@/features/projects/components/ProjectNavigation.vue';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tExecutionsUsage,\n\t\tMainSidebarSourceControl,\n\t\tBecomeTemplateCreatorCta,\n\t\tProjectNavigation,\n\t},\n\tmixins: [userHelpers],\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tcallDebounced,\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbasePath: '',\n\t\t\tfullyExpanded: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsersStore,\n\t\t\tuseVersionsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseCloudPlanStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseBecomeTemplateCreatorStore,\n\t\t\tuseTemplatesStore,\n\t\t),\n\t\tlogoPath(): string {\n\t\t\treturn this.basePath + (this.isCollapsed ? 'static/logo/collapsed.svg' : this.uiStore.logo);\n\t\t},\n\t\thasVersionUpdates(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.settingsStore.settings.releaseChannel === 'stable' &&\n\t\t\t\tthis.versionsStore.hasVersionUpdates\n\t\t\t);\n\t\t},\n\t\tnextVersions(): IVersion[] {\n\t\t\treturn this.versionsStore.nextVersions;\n\t\t},\n\t\tisCollapsed(): boolean {\n\t\t\treturn this.uiStore.sidebarMenuCollapsed;\n\t\t},\n\t\tcanUserAccessSettings(): boolean {\n\t\t\tconst accessibleRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\treturn accessibleRoute !== null;\n\t\t},\n\t\tshowUserArea(): boolean {\n\t\t\treturn hasPermission(['authenticated']);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tuserMenuItems(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'logout',\n\t\t\t\t\tlabel: this.$locale.baseText('auth.signout'),\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tmainMenuItems(): IMenuItem[] {\n\t\t\tconst items: IMenuItem[] = [];\n\n\t\t\tconst defaultSettingsRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\tconst regularItems: IMenuItem[] = [\n\t\t\t\t{\n\t\t\t\t\tid: 'cloud-admin',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tlabel: 'Admin Panel',\n\t\t\t\t\ticon: 'cloud',\n\t\t\t\t\tavailable: this.settingsStore.isCloudDeployment && hasPermission(['instanceOwner']),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Link to in-app templates, available if custom templates are enabled\n\t\t\t\t\tid: 'templates',\n\t\t\t\t\ticon: 'box-open',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.templates'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable:\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled && this.templatesStore.hasCustomTemplatesHost,\n\t\t\t\t\troute: { to: { name: VIEWS.TEMPLATES } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Link to website templates, available if custom templates are not enabled\n\t\t\t\t\tid: 'templates',\n\t\t\t\t\ticon: 'box-open',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.templates'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable:\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled && !this.templatesStore.hasCustomTemplatesHost,\n\t\t\t\t\tlink: {\n\t\t\t\t\t\thref: this.templatesStore.websiteTemplateRepositoryURL,\n\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'variables',\n\t\t\t\t\ticon: 'variable',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.variables'),\n\t\t\t\t\tcustomIconSize: 'medium',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\troute: { to: { name: VIEWS.VARIABLES } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'executions',\n\t\t\t\t\ticon: 'tasks',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.executions'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\troute: { to: { name: VIEWS.EXECUTIONS } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\ticon: 'cog',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable: this.canUserAccessSettings && this.usersStore.currentUser !== null,\n\t\t\t\t\tactivateOnRouteNames: [VIEWS.USERS_SETTINGS, VIEWS.API_SETTINGS, VIEWS.PERSONAL_SETTINGS],\n\t\t\t\t\troute: { to: defaultSettingsRoute },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'help',\n\t\t\t\t\ticon: 'question',\n\t\t\t\t\tlabel: 'Help',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'quickstart',\n\t\t\t\t\t\t\ticon: 'video',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.quickstart'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'docs',\n\t\t\t\t\t\t\ticon: 'book',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.documentation'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'forum',\n\t\t\t\t\t\t\ticon: 'users',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.forum'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'examples',\n\t\t\t\t\t\t\ticon: 'graduation-cap',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.course'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'about',\n\t\t\t\t\t\t\ticon: 'info',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.aboutN8n'),\n\t\t\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn [...items, ...regularItems];\n\t\t},\n\t\tuserIsTrialing(): boolean {\n\t\t\treturn this.cloudPlanStore.userIsTrialing;\n\t\t},\n\t\tcurrentPlanAndUsageData(): CloudPlanAndUsageData | null {\n\t\t\tconst planData = this.cloudPlanStore.currentPlanData;\n\t\t\tconst usage = this.cloudPlanStore.currentUsageData;\n\t\t\tif (!planData || !usage) return null;\n\t\t\treturn {\n\t\t\t\t...planData,\n\t\t\t\tusage,\n\t\t\t};\n\t\t},\n\t},\n\tasync mounted() {\n\t\tthis.basePath = this.rootStore.baseUrl;\n\t\tif (this.$refs.user) {\n\t\t\tvoid this.externalHooks.run('mainSidebar.mounted', {\n\t\t\t\tuserRef: this.$refs.user as Element,\n\t\t\t});\n\t\t}\n\n\t\tvoid this.$nextTick(() => {\n\t\t\tif (window.innerWidth < 900 || this.uiStore.isNodeView) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t} else {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = false;\n\t\t\t}\n\n\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t});\n\n\t\tthis.becomeTemplateCreatorStore.startMonitoringCta();\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\tthis.becomeTemplateCreatorStore.stopMonitoringCta();\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\ttrackHelpItemClick(itemType: string) {\n\t\t\tthis.$telemetry.track('User clicked help resource', {\n\t\t\t\ttype: itemType,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\ttrackTemplatesClick() {\n\t\t\tthis.$telemetry.track('User clicked on templates', {\n\t\t\t\trole: this.usersStore.currentUserCloudInfo?.role,\n\t\t\t\tactive_workflow_count: this.workflowsStore.activeWorkflows.length,\n\t\t\t});\n\t\t},\n\t\tasync onUserActionToggle(action: string) {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'logout':\n\t\t\t\t\tthis.onLogout();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'settings':\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.PERSONAL_SETTINGS });\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tonLogout() {\n\t\t\tvoid this.$router.push({ name: VIEWS.SIGNOUT });\n\t\t},\n\t\ttoggleCollapse() {\n\t\t\tthis.uiStore.toggleSidebarMenuCollapse();\n\t\t\t// When expanding, delay showing some element to ensure smooth animation\n\t\t\tif (!this.isCollapsed) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t\t}, 300);\n\t\t\t} else {\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t\topenUpdatesPanel() {\n\t\t\tthis.uiStore.openModal(VERSIONS_MODAL_KEY);\n\t\t},\n\t\tasync handleSelect(key: string) {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'templates':\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled &&\n\t\t\t\t\t\t!this.templatesStore.hasCustomTemplatesHost\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.trackTemplatesClick();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'about': {\n\t\t\t\t\tthis.trackHelpItemClick('about');\n\t\t\t\t\tthis.uiStore.openModal(ABOUT_MODAL_KEY);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'cloud-admin': {\n\t\t\t\t\tvoid this.cloudPlanStore.redirectToDashboard();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'quickstart':\n\t\t\t\tcase 'docs':\n\t\t\t\tcase 'forum':\n\t\t\t\tcase 'examples': {\n\t\t\t\t\tthis.trackHelpItemClick(key);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tfindFirstAccessibleSettingsRoute() {\n\t\t\tconst settingsRoutes = this.$router\n\t\t\t\t.getRoutes()\n\t\t\t\t.find((route) => route.path === '/settings')\n\t\t\t\t?.children.map((route) => route.name ?? '');\n\n\t\t\tlet defaultSettingsRoute = { name: VIEWS.USERS_SETTINGS };\n\t\t\tfor (const route of settingsRoutes ?? []) {\n\t\t\t\tif (this.canUserAccessRouteByName(route.toString())) {\n\t\t\t\t\tdefaultSettingsRoute = {\n\t\t\t\t\t\tname: route.toString() as VIEWS,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn defaultSettingsRoute;\n\t\t},\n\t\tonResize(event: UIEvent) {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 100 }, event);\n\t\t},\n\t\tasync onResizeEnd(event: UIEvent) {\n\t\t\tconst browserWidth = (event.target as Window).outerWidth;\n\t\t\tawait this.checkWidthAndAdjustSidebar(browserWidth);\n\t\t},\n\t\tasync checkWidthAndAdjustSidebar(width: number) {\n\t\t\tif (width < 900) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t\tawait this.$nextTick();\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.sideMenu {\n\tposition: relative;\n\theight: 100%;\n\tborder-right: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\ttransition: width 150ms ease-in-out;\n\twidth: $sidebar-expanded-width;\n\t.logo {\n\t\theight: $header-height;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding: var(--spacing-xs);\n\n\t\timg {\n\t\t\tposition: relative;\n\t\t\tleft: 1px;\n\t\t\theight: 20px;\n\t\t}\n\t}\n\n\t&.sideMenuCollapsed {\n\t\twidth: $sidebar-width;\n\n\t\t.logo img {\n\t\t\tleft: 0;\n\t\t}\n\t}\n}\n\n.sideMenuCollapseButton {\n\tposition: absolute;\n\tright: -10px;\n\ttop: 50%;\n\tz-index: 999;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tcolor: var(--color-text-base);\n\tbackground-color: var(--color-foreground-xlight);\n\twidth: 20px;\n\theight: 20px;\n\tborder: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-radius: 50%;\n\n\t&:hover {\n\t\tcolor: var(--color-primary-shade-1);\n\t}\n}\n\n.updates {\n\tdisplay: flex;\n\talign-items: center;\n\tcursor: pointer;\n\tpadding: var(--spacing-2xs) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 0;\n\n\tsvg {\n\t\tcolor: var(--color-text-base) !important;\n\t}\n\tspan {\n\t\tdisplay: none;\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n\n\t&:hover {\n\t\t&,\n\t\t& svg {\n\t\t\tcolor: var(--color-text-dark) !important;\n\t\t}\n\t}\n}\n\n.userArea {\n\tdisplay: flex;\n\tpadding: var(--spacing-xs);\n\talign-items: center;\n\theight: 60px;\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\n\t.userName {\n\t\tdisplay: none;\n\t\toverflow: hidden;\n\t\twidth: 100px;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\n\t\tspan {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t.userActions {\n\t\tdisplay: none;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n}\n\n@media screen and (max-height: 470px) {\n\t:global(#help) {\n\t\tdisplay: none;\n\t}\n}\n</style>\n"],"names":["_hoisted_2","_openBlock","_createVNode","_component_font_awesome_icon","_normalizeClass","_ctx","PROGRESS_BAR_MINIMUM_THRESHOLD","props","__props","now","DateTime","daysLeftOnTrial","computed","days","getPlanExpirationDate","isTrialExpired","_a","trialEndsAt","trialHasExecutionsLeft","currentExecutions","usedExecutions","executionsQuota","currentExecutionsWithThreshold","threshold","maxExecutions","onUpgradeClicked","useUIStore","getBecomeCreatorCta","context","get","LOCAL_STORAGE_KEY","RESHOW_DISMISSED_AFTER_DAYS","POLL_INTERVAL_IN_MS","useBecomeTemplateCreatorStore","defineStore","STORES","cloudPlanStore","useCloudPlanStore","rootStore","useRootStore","dismissedAt","useStorage","ctaMeetsCriteria","ref","monitorCtasTimer","isDismissed","hasEnoughTimePassedSinceDismissal","showBecomeCreatorCta","dismissCta","fetchBecomeCreatorCta","becomeCreatorCta","fetchUserCtasIfNeeded","i18n","useI18n","store","telemetry","useTelemetry","onClick","responseStatuses","useRouter","loadingService","useLoadingService","uiStore","sourceControlStore","useSourceControlStore","toast","useToast","eventBus","createEventBus","tooltipOpenDelay","currentBranch","sourceControlAvailable","hasPermission","pushWorkfolder","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","pullWorkfolder","file","incompleteFileTypes","nextTick","sourceControlEventBus","errorResponse","SOURCE_CONTROL_PULL_MODAL_KEY","router","locale","projectsStore","useProjectsStore","isCreatingProject","isComponentMounted","home","VIEWS","addProject","getProjectMenuItem","project","homeClicked","projectClicked","addProjectClicked","newProject","displayProjects","p","a","b","goToUpgrade","onMounted","_sfc_main","defineComponent","GiftNotificationIcon","ExecutionsUsage","MainSidebarSourceControl","BecomeTemplateCreatorCta","ProjectNavigation","userHelpers","externalHooks","useExternalHooks","callDebounced","useDebounce","useMessage","mapStores","useSettingsStore","useUsersStore","useVersionsStore","useWorkflowsStore","useTemplatesStore","items","defaultSettingsRoute","regularItems","planData","usage","itemType","action","VERSIONS_MODAL_KEY","key","ABOUT_MODAL_KEY","settingsRoutes","route","event","browserWidth","width","_hoisted_1","_resolveComponent","_createElementBlock","$style","_createElementVNode","isCollapsed","_cache","args","_createBlock","_component_n8n_icon","handleSelect","_createSlots","_withCtx","_component_ProjectNavigation","fullyExpanded","userIsTrialing","currentPlanAndUsageData","_createCommentVNode","hasVersionUpdates","_component_GiftNotificationIcon","_component_n8n_text","_createTextVNode","_toDisplayString","showUserArea","_component_el_dropdown","onUserActionToggle","_component_el_dropdown_menu","_component_el_dropdown_item","$locale","_component_n8n_avatar","_b","_component_n8n_action_dropdown"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- const __vite__fileDeps=["assets/NodeCreator-CTyp0oWz.js","assets/index-DeNtBxiT.js","assets/vendor-Dv5OeN6t.js","assets/pinia-BAhPp3pQ.js","assets/n8n-B6cfQsVX.js","assets/axios-Mm4CS0gO.js","assets/esprima-next-nhoSXAeq.js","assets/luxon-CLwAIbs0.js","assets/lodash-es-BxV-E8rt.js","assets/n8n-Dbo88Vem.css","assets/flatted-DN8lQ2XG.js","assets/@vueuse/core-9E8Shwsg.js","assets/@n8n/permissions-BxxteU-C.js","assets/dateformat-B9ocXky7.js","assets/vue-i18n-Delvyc9x.js","assets/uuid-SoommWqA.js","assets/@n8n/codemirror-lang-sql-x14jMqbG.js","assets/@lezer/common-B6ct0j_v.js","assets/prettier-bS6l4Vb1.js","assets/@jsplumb/util-DS-9vq_E.js","assets/@jsplumb/core-CVBraiyY.js","assets/@jsplumb/common-CF-b-6-M.js","assets/@jsplumb/connector-bezier-BGU0Ovbw.js","assets/@jsplumb/browser-ui-BVF2KoJK.js","assets/codemirror-lang-html-n8n-DcTmlMkf.js","assets/@n8n/codemirror-lang-Qkdx7NoQ.js","assets/fast-json-stable-stringify-LluJPcs3.js","assets/timeago.js-CiyKClrF.js","assets/qrcode.vue-BGkPba5A.js","assets/vue3-touch-events-mV0oX_Sl.js","assets/chart.js-343vZi4M.js","assets/index-C2bc09x9.css","assets/nodeCreator.store-D1MAzn2w.js","assets/useViewStacks-D8rg90P0.js","assets/NodeCreator-CUn9v_Je.css"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
2
- import{e as V,_ as $}from"./n8n-B6cfQsVX.js";import{br as A,w as U,am as D,ai as x,ed as L,ee as K,dU as j,b8 as q,j as v,a3 as z,an as F,dv as X,a4 as R,L as W,bv as Q,bD as Z,ef as J,eg as ee,eh as te,ei as oe,i as ne,bn as Y,ej as se,ek as re,el as ae}from"./index-DeNtBxiT.js";import{u as M,t as ie,b as ce}from"./nodeCreator.store-D1MAzn2w.js";import{e as de,G as le,Z as ue,ag as pe,l as w,m as H,I as g,p as G,U as y,O as B,R as _e,M as fe,u as Ne,aM as Te,aK as ye}from"./vendor-Dv5OeN6t.js";const Ce=()=>{const m=M(),p=U(),S=[A.PLUS_ENDPOINT,A.NODE_CONNECTION_ACTION,A.NODE_CONNECTION_DROP],h=de(()=>({actions:p.baseText("nodeCreator.actionsCategory.actions")??"",triggers:p.baseText("nodeCreator.actionsCategory.triggers")??""}));function _(e){const t=[F,X];return m.mergedNodes.filter(n=>t.some(s=>s===n.name)).map(n=>{const s=ie(n,e,"action");if(s.type==="action"){const i=`nodeCreator.actionsPlaceholderNode.${n.name.replace("n8n-nodes-base.","")}`,d=p.baseText(i);d!==i&&(s.properties.displayName=d)}return s})}function f(e,t){return e.filter(o=>o.type==="action"&&o.properties.codex.categories.includes(t))}function O(e){var r,i,d,u;const t=ce([...e]),o=new Set;for(const c of t){if(c.type!=="action")continue;const N=(i=(r=c.properties)==null?void 0:r.codex)==null?void 0:i.label;o.add(N)}if(o.size<=1)return t;const n=new Map;for(let c=0;c<t.length;c++){const N=t[c];if(N.type!=="action")continue;const T=(u=(d=N.properties)==null?void 0:d.codex)==null?void 0:u.label;n.has(T)||n.set(T,c)}let s=0;for(const c of o){const N={uuid:c,type:"label",key:c,subcategory:t[0].key,properties:{key:c}},T=n.get(c);T!==void 0&&(t.splice(T+s,0,N),s++)}return t}function C(e,t,o=!0){const n=f(e,t);return o?O(n):n}function b(e){const t=e.displayOptions,o=Object.keys((t==null?void 0:t.show)??{}).reduce((n,s)=>{var r,i;return n[s]=(i=(r=t==null?void 0:t.show)==null?void 0:r[s])==null?void 0:i[0],n},{});return{name:e.displayName,key:e.name,value:{...e.values,...o}}}function I(e){return e.length===2?R().isTriggerNode(e[0].type):!1}function P(e){const{selectedView:t,openSource:o}=M(),{workflowTriggerNodes:n}=v(),s=e.some(c=>R().isTriggerNode(c.type)),r=n.length>0,i=t===Z,d=e.every(c=>c.type===W);return!S.includes(o)&&!s&&!r&&i&&!d}function E(e){const{allNodes:t}=v(),o=[J,ee,te,oe,L],n=t.find(r=>[Q,x].includes(r.type))===void 0;return e.some(r=>o.includes(r.type))&&n}function k(e){if(e.length===0)return{nodes:[],connections:[]};const t=[],o=[],n=e.find(s=>s.type!==D);return n&&(n.openDetail=!0),E(e)?(e.unshift({type:x,isAutoAdd:!0}),o.push({from:{nodeIndex:0},to:{nodeIndex:1}})):P(e)?(e.unshift({type:D,isAutoAdd:!0}),o.push({from:{nodeIndex:0},to:{nodeIndex:1}})):I(e)&&o.push({from:{nodeIndex:0},to:{nodeIndex:1}}),e.forEach((s,r)=>{switch(s.type===L&&(s.type=K),t.push(s),s.type){case j:{const i=r,d=i+1;t.push({type:q,isAutoAdd:!0,name:p.baseText("nodeView.replaceMe")}),o.push({from:{nodeIndex:i,outputIndex:1},to:{nodeIndex:d}},{from:{nodeIndex:d},to:{nodeIndex:i}});break}}}),{nodes:t,connections:o}}function a(e,t,o=""){const{$onAction:n}=v(),s=n(({name:r,after:i,store:{setLastNodeParameters:d},args:u})=>{r!=="addNode"||u[0].type!==e.key||i(()=>{d(e),t&&l(e,t,o),s()})});return s}function l(e,t,o){const n={node_type:e.key,action:e.name,source_mode:o.toLowerCase(),resource:e.value.resource||""};z().run("nodeCreateList.addAction",n),t==null||t.trackNodesPanel("nodeCreateList.addAction",n)}return{actionsCategoryLocales:h,getPlaceholderTriggerActions:_,parseCategoryActions:C,getAddedNodesAndConnections:k,getActionData:b,setAddedNodeActionParameters:a}},Ee=le({__name:"NodeCreation",props:{nodeViewScale:{},createNodeActive:{type:Boolean,default:!1}},emits:["addNodes","toggleNodeCreator"],setup(m,{emit:p}){const S=ye(async()=>await V(()=>import("./NodeCreator-CTyp0oWz.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]))),h=m,_=p,f=ue({showStickyButton:!1}),O=ne(),{getAddedNodesAndConnections:C}=Ce();function b(a){const l=a.target;f.showStickyButton=!0;const e=t=>{if(l){const o=l.getBoundingClientRect(),n=o.height,s=o.width,r=o.left,i=r+s,d=o.top,u=d+n;t.pageX>r&&t.pageX<i&&t.pageY>d&&t.pageY<u||(f.showStickyButton=!1,document.removeEventListener("mousemove",e,!1))}};document.addEventListener("mousemove",e,!1)}function I(){_("toggleNodeCreator",{source:A.ADD_NODE_BUTTON,createNodeActive:!0})}function P(){document.activeElement&&document.activeElement.blur();const a=[...O.nodeViewOffsetPosition],l=se(h.nodeViewScale,a);l[0]-=re/2,l[1]-=ae/2,_("addNodes",C([{type:W,position:l}]))}function E(){_("toggleNodeCreator",{createNodeActive:!1})}function k(a){_("addNodes",C(a.map(l=>({type:l})))),E()}return(a,l)=>{const e=pe("n8n-icon-button");return w(),H("div",null,[a.createNodeActive?_e("",!0):(w(),H("div",{key:0,class:g([a.$style.nodeButtonsWrapper,f.showStickyButton?a.$style.noEvents:""]),onMouseenter:b},[G("div",{class:g(a.$style.nodeCreatorButton),"data-test-id":"node-creator-plus-button"},[y(Y,{label:a.$locale.baseText("nodeView.openNodesPanel"),shortcut:{keys:["Tab"]},placement:"left"},{default:B(()=>[y(e,{size:"xlarge",icon:"plus",type:"tertiary",class:g(a.$style.nodeCreatorPlus),onClick:I},null,8,["class"])]),_:1},8,["label"]),G("div",{class:g([a.$style.addStickyButton,f.showStickyButton?a.$style.visibleButton:""]),"data-test-id":"add-sticky-button",onClick:P},[y(Y,{label:a.$locale.baseText("nodeView.addStickyHint"),shortcut:{keys:["s"],shiftKey:!0},placement:"left"},{default:B(()=>[y(e,{type:"tertiary",icon:["far","note-sticky"]})]),_:1},8,["label"])],2)],2)],34)),(w(),fe(Te,null,{default:B(()=>[y(Ne(S),{active:a.createNodeActive,onNodeTypeSelected:k,onCloseNodeCreator:E},null,8,["active"])]),_:1}))])}}}),ge="_nodeButtonsWrapper_1hql8_1",Ae="_addStickyButton_1hql8_10",me="_visibleButton_1hql8_17",Se="_noEvents_1hql8_22",he="_nodeCreatorButton_1hql8_26",Oe="_nodeCreatorPlus_1hql8_43",be={nodeButtonsWrapper:ge,addStickyButton:Ae,visibleButton:me,noEvents:Se,nodeCreatorButton:he,nodeCreatorPlus:Oe},Ie={$style:be},Pe=$(Ee,[["__cssModules",Ie]]),De=Object.freeze(Object.defineProperty({__proto__:null,default:Pe},Symbol.toStringTag,{value:"Module"}));export{De as N,Ce as u};
3
- //# sourceMappingURL=NodeCreation-Dv1vHhp7.js.map
1
+ const __vite__fileDeps=["assets/NodeCreator-CRVECYnB.js","assets/index-DEwaaDne.js","assets/vendor-Dv5OeN6t.js","assets/pinia-BAhPp3pQ.js","assets/n8n-B6cfQsVX.js","assets/axios-Mm4CS0gO.js","assets/esprima-next-nhoSXAeq.js","assets/luxon-CLwAIbs0.js","assets/lodash-es-BxV-E8rt.js","assets/n8n-Dbo88Vem.css","assets/flatted-DN8lQ2XG.js","assets/@vueuse/core-9E8Shwsg.js","assets/@n8n/permissions-BxxteU-C.js","assets/dateformat-B9ocXky7.js","assets/vue-i18n-Delvyc9x.js","assets/uuid-SoommWqA.js","assets/@n8n/codemirror-lang-sql-x14jMqbG.js","assets/@lezer/common-B6ct0j_v.js","assets/prettier-bS6l4Vb1.js","assets/@jsplumb/util-DS-9vq_E.js","assets/@jsplumb/core-CVBraiyY.js","assets/@jsplumb/common-CF-b-6-M.js","assets/@jsplumb/connector-bezier-BGU0Ovbw.js","assets/@jsplumb/browser-ui-BVF2KoJK.js","assets/codemirror-lang-html-n8n-DcTmlMkf.js","assets/@n8n/codemirror-lang-Qkdx7NoQ.js","assets/fast-json-stable-stringify-LluJPcs3.js","assets/timeago.js-CiyKClrF.js","assets/qrcode.vue-BGkPba5A.js","assets/vue3-touch-events-mV0oX_Sl.js","assets/chart.js-343vZi4M.js","assets/index-C2bc09x9.css","assets/nodeCreator.store-DR3dfsvW.js","assets/useViewStacks-BSagsijV.js","assets/NodeCreator-CUn9v_Je.css"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
2
+ import{e as V,_ as $}from"./n8n-B6cfQsVX.js";import{br as A,w as U,am as D,ai as x,ed as L,ee as K,dU as j,b8 as q,j as v,a3 as z,an as F,dv as X,a4 as R,L as W,bv as Q,bD as Z,ef as J,eg as ee,eh as te,ei as oe,i as ne,bn as Y,ej as se,ek as re,el as ae}from"./index-DEwaaDne.js";import{u as M,t as ie,b as ce}from"./nodeCreator.store-DR3dfsvW.js";import{e as de,G as le,Z as ue,ag as pe,l as w,m as H,I as g,p as G,U as y,O as B,R as _e,M as fe,u as Ne,aM as Te,aK as ye}from"./vendor-Dv5OeN6t.js";const Ce=()=>{const m=M(),p=U(),S=[A.PLUS_ENDPOINT,A.NODE_CONNECTION_ACTION,A.NODE_CONNECTION_DROP],h=de(()=>({actions:p.baseText("nodeCreator.actionsCategory.actions")??"",triggers:p.baseText("nodeCreator.actionsCategory.triggers")??""}));function _(e){const t=[F,X];return m.mergedNodes.filter(n=>t.some(s=>s===n.name)).map(n=>{const s=ie(n,e,"action");if(s.type==="action"){const i=`nodeCreator.actionsPlaceholderNode.${n.name.replace("n8n-nodes-base.","")}`,d=p.baseText(i);d!==i&&(s.properties.displayName=d)}return s})}function f(e,t){return e.filter(o=>o.type==="action"&&o.properties.codex.categories.includes(t))}function O(e){var r,i,d,u;const t=ce([...e]),o=new Set;for(const c of t){if(c.type!=="action")continue;const N=(i=(r=c.properties)==null?void 0:r.codex)==null?void 0:i.label;o.add(N)}if(o.size<=1)return t;const n=new Map;for(let c=0;c<t.length;c++){const N=t[c];if(N.type!=="action")continue;const T=(u=(d=N.properties)==null?void 0:d.codex)==null?void 0:u.label;n.has(T)||n.set(T,c)}let s=0;for(const c of o){const N={uuid:c,type:"label",key:c,subcategory:t[0].key,properties:{key:c}},T=n.get(c);T!==void 0&&(t.splice(T+s,0,N),s++)}return t}function C(e,t,o=!0){const n=f(e,t);return o?O(n):n}function b(e){const t=e.displayOptions,o=Object.keys((t==null?void 0:t.show)??{}).reduce((n,s)=>{var r,i;return n[s]=(i=(r=t==null?void 0:t.show)==null?void 0:r[s])==null?void 0:i[0],n},{});return{name:e.displayName,key:e.name,value:{...e.values,...o}}}function I(e){return e.length===2?R().isTriggerNode(e[0].type):!1}function P(e){const{selectedView:t,openSource:o}=M(),{workflowTriggerNodes:n}=v(),s=e.some(c=>R().isTriggerNode(c.type)),r=n.length>0,i=t===Z,d=e.every(c=>c.type===W);return!S.includes(o)&&!s&&!r&&i&&!d}function E(e){const{allNodes:t}=v(),o=[J,ee,te,oe,L],n=t.find(r=>[Q,x].includes(r.type))===void 0;return e.some(r=>o.includes(r.type))&&n}function k(e){if(e.length===0)return{nodes:[],connections:[]};const t=[],o=[],n=e.find(s=>s.type!==D);return n&&(n.openDetail=!0),E(e)?(e.unshift({type:x,isAutoAdd:!0}),o.push({from:{nodeIndex:0},to:{nodeIndex:1}})):P(e)?(e.unshift({type:D,isAutoAdd:!0}),o.push({from:{nodeIndex:0},to:{nodeIndex:1}})):I(e)&&o.push({from:{nodeIndex:0},to:{nodeIndex:1}}),e.forEach((s,r)=>{switch(s.type===L&&(s.type=K),t.push(s),s.type){case j:{const i=r,d=i+1;t.push({type:q,isAutoAdd:!0,name:p.baseText("nodeView.replaceMe")}),o.push({from:{nodeIndex:i,outputIndex:1},to:{nodeIndex:d}},{from:{nodeIndex:d},to:{nodeIndex:i}});break}}}),{nodes:t,connections:o}}function a(e,t,o=""){const{$onAction:n}=v(),s=n(({name:r,after:i,store:{setLastNodeParameters:d},args:u})=>{r!=="addNode"||u[0].type!==e.key||i(()=>{d(e),t&&l(e,t,o),s()})});return s}function l(e,t,o){const n={node_type:e.key,action:e.name,source_mode:o.toLowerCase(),resource:e.value.resource||""};z().run("nodeCreateList.addAction",n),t==null||t.trackNodesPanel("nodeCreateList.addAction",n)}return{actionsCategoryLocales:h,getPlaceholderTriggerActions:_,parseCategoryActions:C,getAddedNodesAndConnections:k,getActionData:b,setAddedNodeActionParameters:a}},Ee=le({__name:"NodeCreation",props:{nodeViewScale:{},createNodeActive:{type:Boolean,default:!1}},emits:["addNodes","toggleNodeCreator"],setup(m,{emit:p}){const S=ye(async()=>await V(()=>import("./NodeCreator-CRVECYnB.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]))),h=m,_=p,f=ue({showStickyButton:!1}),O=ne(),{getAddedNodesAndConnections:C}=Ce();function b(a){const l=a.target;f.showStickyButton=!0;const e=t=>{if(l){const o=l.getBoundingClientRect(),n=o.height,s=o.width,r=o.left,i=r+s,d=o.top,u=d+n;t.pageX>r&&t.pageX<i&&t.pageY>d&&t.pageY<u||(f.showStickyButton=!1,document.removeEventListener("mousemove",e,!1))}};document.addEventListener("mousemove",e,!1)}function I(){_("toggleNodeCreator",{source:A.ADD_NODE_BUTTON,createNodeActive:!0})}function P(){document.activeElement&&document.activeElement.blur();const a=[...O.nodeViewOffsetPosition],l=se(h.nodeViewScale,a);l[0]-=re/2,l[1]-=ae/2,_("addNodes",C([{type:W,position:l}]))}function E(){_("toggleNodeCreator",{createNodeActive:!1})}function k(a){_("addNodes",C(a.map(l=>({type:l})))),E()}return(a,l)=>{const e=pe("n8n-icon-button");return w(),H("div",null,[a.createNodeActive?_e("",!0):(w(),H("div",{key:0,class:g([a.$style.nodeButtonsWrapper,f.showStickyButton?a.$style.noEvents:""]),onMouseenter:b},[G("div",{class:g(a.$style.nodeCreatorButton),"data-test-id":"node-creator-plus-button"},[y(Y,{label:a.$locale.baseText("nodeView.openNodesPanel"),shortcut:{keys:["Tab"]},placement:"left"},{default:B(()=>[y(e,{size:"xlarge",icon:"plus",type:"tertiary",class:g(a.$style.nodeCreatorPlus),onClick:I},null,8,["class"])]),_:1},8,["label"]),G("div",{class:g([a.$style.addStickyButton,f.showStickyButton?a.$style.visibleButton:""]),"data-test-id":"add-sticky-button",onClick:P},[y(Y,{label:a.$locale.baseText("nodeView.addStickyHint"),shortcut:{keys:["s"],shiftKey:!0},placement:"left"},{default:B(()=>[y(e,{type:"tertiary",icon:["far","note-sticky"]})]),_:1},8,["label"])],2)],2)],34)),(w(),fe(Te,null,{default:B(()=>[y(Ne(S),{active:a.createNodeActive,onNodeTypeSelected:k,onCloseNodeCreator:E},null,8,["active"])]),_:1}))])}}}),ge="_nodeButtonsWrapper_1hql8_1",Ae="_addStickyButton_1hql8_10",me="_visibleButton_1hql8_17",Se="_noEvents_1hql8_22",he="_nodeCreatorButton_1hql8_26",Oe="_nodeCreatorPlus_1hql8_43",be={nodeButtonsWrapper:ge,addStickyButton:Ae,visibleButton:me,noEvents:Se,nodeCreatorButton:he,nodeCreatorPlus:Oe},Ie={$style:be},Pe=$(Ee,[["__cssModules",Ie]]),De=Object.freeze(Object.defineProperty({__proto__:null,default:Pe},Symbol.toStringTag,{value:"Module"}));export{De as N,Ce as u};
3
+ //# sourceMappingURL=NodeCreation-DHuCOx3T.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["useActions","nodeCreatorStore","useNodeCreatorStore","i18n","useI18n","singleNodeOpenSources","NODE_CREATOR_OPEN_SOURCES","actionsCategoryLocales","computed","getPlaceholderTriggerActions","subcategory","nodes","WEBHOOK_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","node","n","transformed","transformNodeType","localeKey","overwriteLocale","filterActionsCategory","items","category","item","injectActionsLabels","extendedActions","sortNodeCreateElements","labelsSet","action","label","_b","_a","firstIndexMap","i","_d","_c","insertedLabels","newLabel","insertIndex","parseCategoryActions","actions","withLabels","filteredActions","getActionData","actionItem","displayOptions","displayConditions","acc","showCondition","shouldConnectWithExistingTrigger","addedNodes","useNodeTypesStore","shouldPrependManualTrigger","selectedView","openSource","workflowTriggerNodes","useWorkflowsStore","hasTrigger","workflowContainsTrigger","isTriggerPanel","TRIGGER_NODE_CREATOR_VIEW","onlyStickyNodes","STICKY_NODE_TYPE","shouldPrependChatTrigger","allNodes","COMPATIBLE_CHAT_NODES","QA_CHAIN_NODE_TYPE","AGENT_NODE_TYPE","BASIC_CHAIN_NODE_TYPE","OPEN_AI_ASSISTANT_NODE_TYPE","OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE","isChatTriggerMissing","MANUAL_CHAT_TRIGGER_NODE_TYPE","CHAT_TRIGGER_NODE_TYPE","getAddedNodesAndConnections","connections","nodeToAutoOpen","MANUAL_TRIGGER_NODE_TYPE","index","OPEN_AI_NODE_TYPE","SPLIT_IN_BATCHES_NODE_TYPE","splitInBatchesIndex","noOpIndex","NO_OP_NODE_TYPE","setAddedNodeActionParameters","telemetry","rootView","onWorkflowStoreAction","storeWatcher","name","after","setLastNodeParameters","args","trackActionSelected","payload","useExternalHooks","NodeCreator","defineAsyncComponent","__vitePreload","props","__props","emit","__emit","state","reactive","uiStore","useUIStore","onCreateMenuHoverIn","mouseinEvent","buttonsWrapper","moveCallback","mousemoveEvent","wrapperBounds","wrapperH","wrapperW","wrapperLeftNear","wrapperLeftFar","wrapperTopNear","wrapperTopFar","openNodeCreator","addStickyNote","offset","position","getMidCanvasPosition","DEFAULT_STICKY_WIDTH","DEFAULT_STICKY_HEIGHT","closeNodeCreator","nodeTypeSelected","nodeTypes","type"],"ignoreList":[],"sources":["../../src/components/Node/NodeCreator/composables/useActions.ts","../../src/components/Node/NodeCreation.vue"],"sourcesContent":["import { computed } from 'vue';\nimport type { IDataObject, INodeParameters } from 'n8n-workflow';\nimport type {\n\tActionTypeDescription,\n\tAddedNode,\n\tAddedNodeConnection,\n\tAddedNodesAndConnections,\n\tINodeCreateElement,\n\tIUpdateInformation,\n\tLabelCreateElement,\n} from '@/Interface';\nimport {\n\tAGENT_NODE_TYPE,\n\tBASIC_CHAIN_NODE_TYPE,\n\tCHAT_TRIGGER_NODE_TYPE,\n\tMANUAL_CHAT_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tNO_OP_NODE_TYPE,\n\tOPEN_AI_ASSISTANT_NODE_TYPE,\n\tOPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE,\n\tOPEN_AI_NODE_TYPE,\n\tQA_CHAIN_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tSPLIT_IN_BATCHES_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tWEBHOOK_NODE_TYPE,\n} from '@/constants';\n\nimport type { BaseTextKey } from '@/plugins/i18n';\nimport type { Telemetry } from '@/plugins/telemetry';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nimport { sortNodeCreateElements, transformNodeType } from '../utils';\nimport { useI18n } from '@/composables/useI18n';\n\nexport const useActions = () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst i18n = useI18n();\n\n\tconst singleNodeOpenSources = [\n\t\tNODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t];\n\n\tconst actionsCategoryLocales = computed(() => {\n\t\treturn {\n\t\t\tactions: i18n.baseText('nodeCreator.actionsCategory.actions') ?? '',\n\t\t\ttriggers: i18n.baseText('nodeCreator.actionsCategory.triggers') ?? '',\n\t\t};\n\t});\n\n\tfunction getPlaceholderTriggerActions(subcategory: string) {\n\t\tconst nodes = [WEBHOOK_NODE_TYPE, SCHEDULE_TRIGGER_NODE_TYPE];\n\n\t\tconst matchedNodeTypes = nodeCreatorStore.mergedNodes\n\t\t\t.filter((node) => nodes.some((n) => n === node.name))\n\t\t\t.map((node) => {\n\t\t\t\tconst transformed = transformNodeType(node, subcategory, 'action');\n\n\t\t\t\tif (transformed.type === 'action') {\n\t\t\t\t\tconst nameBase = node.name.replace('n8n-nodes-base.', '');\n\t\t\t\t\tconst localeKey = `nodeCreator.actionsPlaceholderNode.${nameBase}` as BaseTextKey;\n\t\t\t\t\tconst overwriteLocale = i18n.baseText(localeKey);\n\n\t\t\t\t\t// If the locale key is not the same as the node name, it means it contain a translation\n\t\t\t\t\t// and we should use it\n\t\t\t\t\tif (overwriteLocale !== localeKey) {\n\t\t\t\t\t\ttransformed.properties.displayName = overwriteLocale;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn transformed;\n\t\t\t});\n\n\t\treturn matchedNodeTypes;\n\t}\n\n\tfunction filterActionsCategory(items: INodeCreateElement[], category: string) {\n\t\treturn items.filter(\n\t\t\t(item) => item.type === 'action' && item.properties.codex.categories.includes(category),\n\t\t);\n\t}\n\n\tfunction injectActionsLabels(items: INodeCreateElement[]): INodeCreateElement[] {\n\t\tconst extendedActions = sortNodeCreateElements([...items]);\n\t\tconst labelsSet = new Set<string>();\n\n\t\t// Collect unique labels\n\t\tfor (const action of extendedActions) {\n\t\t\tif (action.type !== 'action') continue;\n\t\t\tconst label = action.properties?.codex?.label;\n\t\t\tlabelsSet.add(label);\n\t\t}\n\n\t\tif (labelsSet.size <= 1) return extendedActions;\n\n\t\t// Create a map to store the first index of each label\n\t\tconst firstIndexMap = new Map<string, number>();\n\n\t\t// Iterate through the extendedActions to find the first index of each label\n\t\tfor (let i = 0; i < extendedActions.length; i++) {\n\t\t\tconst action = extendedActions[i];\n\t\t\tif (action.type !== 'action') continue;\n\t\t\tconst label = action.properties?.codex?.label;\n\t\t\tif (!firstIndexMap.has(label)) {\n\t\t\t\tfirstIndexMap.set(label, i);\n\t\t\t}\n\t\t}\n\n\t\t// Keep track of the number of inserted labels\n\t\tlet insertedLabels = 0;\n\n\t\t// Create and insert new label objects at the first index of each label\n\t\tfor (const label of labelsSet) {\n\t\t\tconst newLabel: LabelCreateElement = {\n\t\t\t\tuuid: label,\n\t\t\t\ttype: 'label',\n\t\t\t\tkey: label,\n\t\t\t\tsubcategory: extendedActions[0].key,\n\t\t\t\tproperties: {\n\t\t\t\t\tkey: label,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst insertIndex = firstIndexMap.get(label);\n\t\t\tif (insertIndex !== undefined) {\n\t\t\t\textendedActions.splice(insertIndex + insertedLabels, 0, newLabel);\n\t\t\t\tinsertedLabels++;\n\t\t\t}\n\t\t}\n\n\t\treturn extendedActions;\n\t}\n\n\tfunction parseCategoryActions(\n\t\tactions: INodeCreateElement[],\n\t\tcategory: string,\n\t\twithLabels = true,\n\t) {\n\t\tconst filteredActions = filterActionsCategory(actions, category);\n\t\tif (withLabels) return injectActionsLabels(filteredActions);\n\t\treturn filteredActions;\n\t}\n\n\tfunction getActionData(actionItem: ActionTypeDescription): IUpdateInformation {\n\t\tconst displayOptions = actionItem.displayOptions;\n\n\t\tconst displayConditions = Object.keys(displayOptions?.show ?? {}).reduce(\n\t\t\t(acc: IDataObject, showCondition: string) => {\n\t\t\t\tacc[showCondition] = displayOptions?.show?.[showCondition]?.[0];\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{},\n\t\t);\n\n\t\treturn {\n\t\t\tname: actionItem.displayName,\n\t\t\tkey: actionItem.name,\n\t\t\tvalue: { ...actionItem.values, ...displayConditions } as INodeParameters,\n\t\t};\n\t}\n\n\t/**\n\t * Checks if added nodes contain trigger followed by another node\n\t * In this case, we should connect the trigger with the following node\n\t */\n\tfunction shouldConnectWithExistingTrigger(addedNodes: AddedNode[]): boolean {\n\t\tif (addedNodes.length === 2) {\n\t\t\tconst isTriggerNode = useNodeTypesStore().isTriggerNode(addedNodes[0].type);\n\t\t\treturn isTriggerNode;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction shouldPrependManualTrigger(addedNodes: AddedNode[]): boolean {\n\t\tconst { selectedView, openSource } = useNodeCreatorStore();\n\t\tconst { workflowTriggerNodes } = useWorkflowsStore();\n\t\tconst hasTrigger = addedNodes.some((node) => useNodeTypesStore().isTriggerNode(node.type));\n\t\tconst workflowContainsTrigger = workflowTriggerNodes.length > 0;\n\t\tconst isTriggerPanel = selectedView === TRIGGER_NODE_CREATOR_VIEW;\n\t\tconst onlyStickyNodes = addedNodes.every((node) => node.type === STICKY_NODE_TYPE);\n\n\t\t// If the node creator was opened from the plus endpoint, node connection action, or node connection drop\n\t\t// then we do not want to append the manual trigger\n\t\tconst isSingleNodeOpenSource = singleNodeOpenSources.includes(openSource);\n\t\treturn (\n\t\t\t!isSingleNodeOpenSource &&\n\t\t\t!hasTrigger &&\n\t\t\t!workflowContainsTrigger &&\n\t\t\tisTriggerPanel &&\n\t\t\t!onlyStickyNodes\n\t\t);\n\t}\n\tfunction shouldPrependChatTrigger(addedNodes: AddedNode[]): boolean {\n\t\tconst { allNodes } = useWorkflowsStore();\n\n\t\tconst COMPATIBLE_CHAT_NODES = [\n\t\t\tQA_CHAIN_NODE_TYPE,\n\t\t\tAGENT_NODE_TYPE,\n\t\t\tBASIC_CHAIN_NODE_TYPE,\n\t\t\tOPEN_AI_ASSISTANT_NODE_TYPE,\n\t\t\tOPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE,\n\t\t];\n\n\t\tconst isChatTriggerMissing =\n\t\t\tallNodes.find((node) =>\n\t\t\t\t[MANUAL_CHAT_TRIGGER_NODE_TYPE, CHAT_TRIGGER_NODE_TYPE].includes(node.type),\n\t\t\t) === undefined;\n\t\tconst isCompatibleNode = addedNodes.some((node) => COMPATIBLE_CHAT_NODES.includes(node.type));\n\n\t\treturn isCompatibleNode && isChatTriggerMissing;\n\t}\n\n\tfunction getAddedNodesAndConnections(addedNodes: AddedNode[]): AddedNodesAndConnections {\n\t\tif (addedNodes.length === 0) {\n\t\t\treturn { nodes: [], connections: [] };\n\t\t}\n\n\t\tconst nodes: AddedNode[] = [];\n\t\tconst connections: AddedNodeConnection[] = [];\n\n\t\tconst nodeToAutoOpen = addedNodes.find((node) => node.type !== MANUAL_TRIGGER_NODE_TYPE);\n\n\t\tif (nodeToAutoOpen) {\n\t\t\tnodeToAutoOpen.openDetail = true;\n\t\t}\n\n\t\tif (shouldPrependChatTrigger(addedNodes)) {\n\t\t\taddedNodes.unshift({ type: CHAT_TRIGGER_NODE_TYPE, isAutoAdd: true });\n\t\t\tconnections.push({\n\t\t\t\tfrom: { nodeIndex: 0 },\n\t\t\t\tto: { nodeIndex: 1 },\n\t\t\t});\n\t\t} else if (shouldPrependManualTrigger(addedNodes)) {\n\t\t\taddedNodes.unshift({ type: MANUAL_TRIGGER_NODE_TYPE, isAutoAdd: true });\n\t\t\tconnections.push({\n\t\t\t\tfrom: { nodeIndex: 0 },\n\t\t\t\tto: { nodeIndex: 1 },\n\t\t\t});\n\t\t} else if (shouldConnectWithExistingTrigger(addedNodes)) {\n\t\t\tconnections.push({\n\t\t\t\tfrom: { nodeIndex: 0 },\n\t\t\t\tto: { nodeIndex: 1 },\n\t\t\t});\n\t\t}\n\n\t\taddedNodes.forEach((node, index) => {\n\t\t\tif (node.type === OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE) {\n\t\t\t\tnode.type = OPEN_AI_NODE_TYPE;\n\t\t\t}\n\n\t\t\tnodes.push(node);\n\n\t\t\tswitch (node.type) {\n\t\t\t\tcase SPLIT_IN_BATCHES_NODE_TYPE: {\n\t\t\t\t\tconst splitInBatchesIndex = index;\n\t\t\t\t\tconst noOpIndex = splitInBatchesIndex + 1;\n\t\t\t\t\tnodes.push({\n\t\t\t\t\t\ttype: NO_OP_NODE_TYPE,\n\t\t\t\t\t\tisAutoAdd: true,\n\t\t\t\t\t\tname: i18n.baseText('nodeView.replaceMe'),\n\t\t\t\t\t});\n\t\t\t\t\tconnections.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfrom: { nodeIndex: splitInBatchesIndex, outputIndex: 1 },\n\t\t\t\t\t\t\tto: { nodeIndex: noOpIndex },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfrom: { nodeIndex: noOpIndex },\n\t\t\t\t\t\t\tto: { nodeIndex: splitInBatchesIndex },\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn { nodes, connections };\n\t}\n\n\t// Hook into addNode action to set the last node parameters & track the action selected\n\tfunction setAddedNodeActionParameters(\n\t\taction: IUpdateInformation,\n\t\ttelemetry?: Telemetry,\n\t\trootView = '',\n\t) {\n\t\tconst { $onAction: onWorkflowStoreAction } = useWorkflowsStore();\n\t\tconst storeWatcher = onWorkflowStoreAction(\n\t\t\t({ name, after, store: { setLastNodeParameters }, args }) => {\n\t\t\t\tif (name !== 'addNode' || args[0].type !== action.key) return;\n\t\t\t\tafter(() => {\n\t\t\t\t\tsetLastNodeParameters(action);\n\t\t\t\t\tif (telemetry) trackActionSelected(action, telemetry, rootView);\n\t\t\t\t\t// Unsubscribe from the store watcher\n\t\t\t\t\tstoreWatcher();\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\treturn storeWatcher;\n\t}\n\n\tfunction trackActionSelected(action: IUpdateInformation, telemetry: Telemetry, rootView: string) {\n\t\tconst payload = {\n\t\t\tnode_type: action.key,\n\t\t\taction: action.name,\n\t\t\tsource_mode: rootView.toLowerCase(),\n\t\t\tresource: (action.value as INodeParameters).resource || '',\n\t\t};\n\t\tvoid useExternalHooks().run('nodeCreateList.addAction', payload);\n\t\ttelemetry?.trackNodesPanel('nodeCreateList.addAction', payload);\n\t}\n\n\treturn {\n\t\tactionsCategoryLocales,\n\t\tgetPlaceholderTriggerActions,\n\t\tparseCategoryActions,\n\t\tgetAddedNodesAndConnections,\n\t\tgetActionData,\n\t\tsetAddedNodeActionParameters,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { defineAsyncComponent, reactive } from 'vue';\nimport { getMidCanvasPosition } from '@/utils/nodeViewUtils';\nimport {\n\tDEFAULT_STICKY_HEIGHT,\n\tDEFAULT_STICKY_WIDTH,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport type { AddedNodesAndConnections, ToggleNodeCreatorOptions } from '@/Interface';\nimport { useActions } from './NodeCreator/composables/useActions';\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\n\ntype Props = {\n\tnodeViewScale: number;\n\tcreateNodeActive?: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nconst NodeCreator = defineAsyncComponent(\n\tasync () => await import('@/components/Node/NodeCreator/NodeCreator.vue'),\n);\n\nconst props = withDefaults(defineProps<Props>(), {\n\tcreateNodeActive: false,\n});\n\nconst emit = defineEmits<{\n\t(event: 'addNodes', value: AddedNodesAndConnections): void;\n\t(event: 'toggleNodeCreator', value: ToggleNodeCreatorOptions): void;\n}>();\n\nconst state = reactive({\n\tshowStickyButton: false,\n});\n\nconst uiStore = useUIStore();\n\nconst { getAddedNodesAndConnections } = useActions();\n\nfunction onCreateMenuHoverIn(mouseinEvent: MouseEvent) {\n\tconst buttonsWrapper = mouseinEvent.target as Element;\n\n\t// Once the popup menu is hovered, it's pointer events are disabled so it's not interfering with element underneath it.\n\tstate.showStickyButton = true;\n\tconst moveCallback = (mousemoveEvent: MouseEvent) => {\n\t\tif (buttonsWrapper) {\n\t\t\tconst wrapperBounds = buttonsWrapper.getBoundingClientRect();\n\t\t\tconst wrapperH = wrapperBounds.height;\n\t\t\tconst wrapperW = wrapperBounds.width;\n\t\t\tconst wrapperLeftNear = wrapperBounds.left;\n\t\t\tconst wrapperLeftFar = wrapperLeftNear + wrapperW;\n\t\t\tconst wrapperTopNear = wrapperBounds.top;\n\t\t\tconst wrapperTopFar = wrapperTopNear + wrapperH;\n\t\t\tconst inside =\n\t\t\t\tmousemoveEvent.pageX > wrapperLeftNear &&\n\t\t\t\tmousemoveEvent.pageX < wrapperLeftFar &&\n\t\t\t\tmousemoveEvent.pageY > wrapperTopNear &&\n\t\t\t\tmousemoveEvent.pageY < wrapperTopFar;\n\t\t\tif (!inside) {\n\t\t\t\tstate.showStickyButton = false;\n\t\t\t\tdocument.removeEventListener('mousemove', moveCallback, false);\n\t\t\t}\n\t\t}\n\t};\n\tdocument.addEventListener('mousemove', moveCallback, false);\n}\n\nfunction openNodeCreator() {\n\temit('toggleNodeCreator', {\n\t\tsource: NODE_CREATOR_OPEN_SOURCES.ADD_NODE_BUTTON,\n\t\tcreateNodeActive: true,\n\t});\n}\n\nfunction addStickyNote() {\n\tif (document.activeElement) {\n\t\t(document.activeElement as HTMLElement).blur();\n\t}\n\n\tconst offset: [number, number] = [...uiStore.nodeViewOffsetPosition];\n\n\tconst position = getMidCanvasPosition(props.nodeViewScale, offset);\n\tposition[0] -= DEFAULT_STICKY_WIDTH / 2;\n\tposition[1] -= DEFAULT_STICKY_HEIGHT / 2;\n\n\temit('addNodes', getAddedNodesAndConnections([{ type: STICKY_NODE_TYPE, position }]));\n}\n\nfunction closeNodeCreator() {\n\temit('toggleNodeCreator', { createNodeActive: false });\n}\n\nfunction nodeTypeSelected(nodeTypes: string[]) {\n\temit('addNodes', getAddedNodesAndConnections(nodeTypes.map((type) => ({ type }))));\n\tcloseNodeCreator();\n}\n</script>\n\n<template>\n\t<div>\n\t\t<div\n\t\t\tv-if=\"!createNodeActive\"\n\t\t\t:class=\"[$style.nodeButtonsWrapper, state.showStickyButton ? $style.noEvents : '']\"\n\t\t\t@mouseenter=\"onCreateMenuHoverIn\"\n\t\t>\n\t\t\t<div :class=\"$style.nodeCreatorButton\" data-test-id=\"node-creator-plus-button\">\n\t\t\t\t<KeyboardShortcutTooltip\n\t\t\t\t\t:label=\"$locale.baseText('nodeView.openNodesPanel')\"\n\t\t\t\t\t:shortcut=\"{ keys: ['Tab'] }\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\tsize=\"xlarge\"\n\t\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:class=\"$style.nodeCreatorPlus\"\n\t\t\t\t\t\t@click=\"openNodeCreator\"\n\t\t\t\t\t/>\n\t\t\t\t</KeyboardShortcutTooltip>\n\t\t\t\t<div\n\t\t\t\t\t:class=\"[$style.addStickyButton, state.showStickyButton ? $style.visibleButton : '']\"\n\t\t\t\t\tdata-test-id=\"add-sticky-button\"\n\t\t\t\t\t@click=\"addStickyNote\"\n\t\t\t\t>\n\t\t\t\t\t<KeyboardShortcutTooltip\n\t\t\t\t\t\t:label=\"$locale.baseText('nodeView.addStickyHint')\"\n\t\t\t\t\t\t:shortcut=\"{ keys: ['s'], shiftKey: true }\"\n\t\t\t\t\t\tplacement=\"left\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-icon-button type=\"tertiary\" :icon=\"['far', 'note-sticky']\" />\n\t\t\t\t\t</KeyboardShortcutTooltip>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<Suspense>\n\t\t\t<NodeCreator\n\t\t\t\t:active=\"createNodeActive\"\n\t\t\t\t@node-type-selected=\"nodeTypeSelected\"\n\t\t\t\t@close-node-creator=\"closeNodeCreator\"\n\t\t\t/>\n\t\t</Suspense>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.nodeButtonsWrapper {\n\tposition: absolute;\n\twidth: 150px;\n\theight: 200px;\n\ttop: 0;\n\tright: 0;\n\tdisplay: flex;\n}\n\n.addStickyButton {\n\tmargin-top: var(--spacing-2xs);\n\topacity: 0;\n\ttransition: 0.1s;\n\ttransition-timing-function: linear;\n}\n\n.visibleButton {\n\topacity: 1;\n\tpointer-events: all;\n}\n\n.noEvents {\n\tpointer-events: none;\n}\n\n.nodeCreatorButton {\n\tposition: absolute;\n\ttext-align: center;\n\ttop: var(--spacing-l);\n\tright: var(--spacing-l);\n\tpointer-events: all !important;\n\n\tbutton {\n\t\tborder-color: var(--color-button-node-creator-border-font);\n\t\tcolor: var(--color-button-node-creator-border-font);\n\n\t\t&:hover {\n\t\t\tcolor: var(--color-button-node-creator-hover-font);\n\t\t\tborder-color: var(--color-button-node-creator-hover-border);\n\t\t\tbackground: var(--color-button-node-creator-background);\n\t\t}\n\t}\n}\n.nodeCreatorPlus {\n\tborder-width: 2px;\n\tborder-radius: var(--border-radius-base);\n\twidth: 36px;\n\theight: 36px;\n}\n</style>\n"],"file":"assets/NodeCreation-Dv1vHhp7.js"}
1
+ {"version":3,"mappings":"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","names":["useActions","nodeCreatorStore","useNodeCreatorStore","i18n","useI18n","singleNodeOpenSources","NODE_CREATOR_OPEN_SOURCES","actionsCategoryLocales","computed","getPlaceholderTriggerActions","subcategory","nodes","WEBHOOK_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","node","n","transformed","transformNodeType","localeKey","overwriteLocale","filterActionsCategory","items","category","item","injectActionsLabels","extendedActions","sortNodeCreateElements","labelsSet","action","label","_b","_a","firstIndexMap","i","_d","_c","insertedLabels","newLabel","insertIndex","parseCategoryActions","actions","withLabels","filteredActions","getActionData","actionItem","displayOptions","displayConditions","acc","showCondition","shouldConnectWithExistingTrigger","addedNodes","useNodeTypesStore","shouldPrependManualTrigger","selectedView","openSource","workflowTriggerNodes","useWorkflowsStore","hasTrigger","workflowContainsTrigger","isTriggerPanel","TRIGGER_NODE_CREATOR_VIEW","onlyStickyNodes","STICKY_NODE_TYPE","shouldPrependChatTrigger","allNodes","COMPATIBLE_CHAT_NODES","QA_CHAIN_NODE_TYPE","AGENT_NODE_TYPE","BASIC_CHAIN_NODE_TYPE","OPEN_AI_ASSISTANT_NODE_TYPE","OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE","isChatTriggerMissing","MANUAL_CHAT_TRIGGER_NODE_TYPE","CHAT_TRIGGER_NODE_TYPE","getAddedNodesAndConnections","connections","nodeToAutoOpen","MANUAL_TRIGGER_NODE_TYPE","index","OPEN_AI_NODE_TYPE","SPLIT_IN_BATCHES_NODE_TYPE","splitInBatchesIndex","noOpIndex","NO_OP_NODE_TYPE","setAddedNodeActionParameters","telemetry","rootView","onWorkflowStoreAction","storeWatcher","name","after","setLastNodeParameters","args","trackActionSelected","payload","useExternalHooks","NodeCreator","defineAsyncComponent","__vitePreload","props","__props","emit","__emit","state","reactive","uiStore","useUIStore","onCreateMenuHoverIn","mouseinEvent","buttonsWrapper","moveCallback","mousemoveEvent","wrapperBounds","wrapperH","wrapperW","wrapperLeftNear","wrapperLeftFar","wrapperTopNear","wrapperTopFar","openNodeCreator","addStickyNote","offset","position","getMidCanvasPosition","DEFAULT_STICKY_WIDTH","DEFAULT_STICKY_HEIGHT","closeNodeCreator","nodeTypeSelected","nodeTypes","type"],"ignoreList":[],"sources":["../../src/components/Node/NodeCreator/composables/useActions.ts","../../src/components/Node/NodeCreation.vue"],"sourcesContent":["import { computed } from 'vue';\nimport type { IDataObject, INodeParameters } from 'n8n-workflow';\nimport type {\n\tActionTypeDescription,\n\tAddedNode,\n\tAddedNodeConnection,\n\tAddedNodesAndConnections,\n\tINodeCreateElement,\n\tIUpdateInformation,\n\tLabelCreateElement,\n} from '@/Interface';\nimport {\n\tAGENT_NODE_TYPE,\n\tBASIC_CHAIN_NODE_TYPE,\n\tCHAT_TRIGGER_NODE_TYPE,\n\tMANUAL_CHAT_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tNO_OP_NODE_TYPE,\n\tOPEN_AI_ASSISTANT_NODE_TYPE,\n\tOPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE,\n\tOPEN_AI_NODE_TYPE,\n\tQA_CHAIN_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tSPLIT_IN_BATCHES_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tWEBHOOK_NODE_TYPE,\n} from '@/constants';\n\nimport type { BaseTextKey } from '@/plugins/i18n';\nimport type { Telemetry } from '@/plugins/telemetry';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nimport { sortNodeCreateElements, transformNodeType } from '../utils';\nimport { useI18n } from '@/composables/useI18n';\n\nexport const useActions = () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst i18n = useI18n();\n\n\tconst singleNodeOpenSources = [\n\t\tNODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t];\n\n\tconst actionsCategoryLocales = computed(() => {\n\t\treturn {\n\t\t\tactions: i18n.baseText('nodeCreator.actionsCategory.actions') ?? '',\n\t\t\ttriggers: i18n.baseText('nodeCreator.actionsCategory.triggers') ?? '',\n\t\t};\n\t});\n\n\tfunction getPlaceholderTriggerActions(subcategory: string) {\n\t\tconst nodes = [WEBHOOK_NODE_TYPE, SCHEDULE_TRIGGER_NODE_TYPE];\n\n\t\tconst matchedNodeTypes = nodeCreatorStore.mergedNodes\n\t\t\t.filter((node) => nodes.some((n) => n === node.name))\n\t\t\t.map((node) => {\n\t\t\t\tconst transformed = transformNodeType(node, subcategory, 'action');\n\n\t\t\t\tif (transformed.type === 'action') {\n\t\t\t\t\tconst nameBase = node.name.replace('n8n-nodes-base.', '');\n\t\t\t\t\tconst localeKey = `nodeCreator.actionsPlaceholderNode.${nameBase}` as BaseTextKey;\n\t\t\t\t\tconst overwriteLocale = i18n.baseText(localeKey);\n\n\t\t\t\t\t// If the locale key is not the same as the node name, it means it contain a translation\n\t\t\t\t\t// and we should use it\n\t\t\t\t\tif (overwriteLocale !== localeKey) {\n\t\t\t\t\t\ttransformed.properties.displayName = overwriteLocale;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn transformed;\n\t\t\t});\n\n\t\treturn matchedNodeTypes;\n\t}\n\n\tfunction filterActionsCategory(items: INodeCreateElement[], category: string) {\n\t\treturn items.filter(\n\t\t\t(item) => item.type === 'action' && item.properties.codex.categories.includes(category),\n\t\t);\n\t}\n\n\tfunction injectActionsLabels(items: INodeCreateElement[]): INodeCreateElement[] {\n\t\tconst extendedActions = sortNodeCreateElements([...items]);\n\t\tconst labelsSet = new Set<string>();\n\n\t\t// Collect unique labels\n\t\tfor (const action of extendedActions) {\n\t\t\tif (action.type !== 'action') continue;\n\t\t\tconst label = action.properties?.codex?.label;\n\t\t\tlabelsSet.add(label);\n\t\t}\n\n\t\tif (labelsSet.size <= 1) return extendedActions;\n\n\t\t// Create a map to store the first index of each label\n\t\tconst firstIndexMap = new Map<string, number>();\n\n\t\t// Iterate through the extendedActions to find the first index of each label\n\t\tfor (let i = 0; i < extendedActions.length; i++) {\n\t\t\tconst action = extendedActions[i];\n\t\t\tif (action.type !== 'action') continue;\n\t\t\tconst label = action.properties?.codex?.label;\n\t\t\tif (!firstIndexMap.has(label)) {\n\t\t\t\tfirstIndexMap.set(label, i);\n\t\t\t}\n\t\t}\n\n\t\t// Keep track of the number of inserted labels\n\t\tlet insertedLabels = 0;\n\n\t\t// Create and insert new label objects at the first index of each label\n\t\tfor (const label of labelsSet) {\n\t\t\tconst newLabel: LabelCreateElement = {\n\t\t\t\tuuid: label,\n\t\t\t\ttype: 'label',\n\t\t\t\tkey: label,\n\t\t\t\tsubcategory: extendedActions[0].key,\n\t\t\t\tproperties: {\n\t\t\t\t\tkey: label,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst insertIndex = firstIndexMap.get(label);\n\t\t\tif (insertIndex !== undefined) {\n\t\t\t\textendedActions.splice(insertIndex + insertedLabels, 0, newLabel);\n\t\t\t\tinsertedLabels++;\n\t\t\t}\n\t\t}\n\n\t\treturn extendedActions;\n\t}\n\n\tfunction parseCategoryActions(\n\t\tactions: INodeCreateElement[],\n\t\tcategory: string,\n\t\twithLabels = true,\n\t) {\n\t\tconst filteredActions = filterActionsCategory(actions, category);\n\t\tif (withLabels) return injectActionsLabels(filteredActions);\n\t\treturn filteredActions;\n\t}\n\n\tfunction getActionData(actionItem: ActionTypeDescription): IUpdateInformation {\n\t\tconst displayOptions = actionItem.displayOptions;\n\n\t\tconst displayConditions = Object.keys(displayOptions?.show ?? {}).reduce(\n\t\t\t(acc: IDataObject, showCondition: string) => {\n\t\t\t\tacc[showCondition] = displayOptions?.show?.[showCondition]?.[0];\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{},\n\t\t);\n\n\t\treturn {\n\t\t\tname: actionItem.displayName,\n\t\t\tkey: actionItem.name,\n\t\t\tvalue: { ...actionItem.values, ...displayConditions } as INodeParameters,\n\t\t};\n\t}\n\n\t/**\n\t * Checks if added nodes contain trigger followed by another node\n\t * In this case, we should connect the trigger with the following node\n\t */\n\tfunction shouldConnectWithExistingTrigger(addedNodes: AddedNode[]): boolean {\n\t\tif (addedNodes.length === 2) {\n\t\t\tconst isTriggerNode = useNodeTypesStore().isTriggerNode(addedNodes[0].type);\n\t\t\treturn isTriggerNode;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction shouldPrependManualTrigger(addedNodes: AddedNode[]): boolean {\n\t\tconst { selectedView, openSource } = useNodeCreatorStore();\n\t\tconst { workflowTriggerNodes } = useWorkflowsStore();\n\t\tconst hasTrigger = addedNodes.some((node) => useNodeTypesStore().isTriggerNode(node.type));\n\t\tconst workflowContainsTrigger = workflowTriggerNodes.length > 0;\n\t\tconst isTriggerPanel = selectedView === TRIGGER_NODE_CREATOR_VIEW;\n\t\tconst onlyStickyNodes = addedNodes.every((node) => node.type === STICKY_NODE_TYPE);\n\n\t\t// If the node creator was opened from the plus endpoint, node connection action, or node connection drop\n\t\t// then we do not want to append the manual trigger\n\t\tconst isSingleNodeOpenSource = singleNodeOpenSources.includes(openSource);\n\t\treturn (\n\t\t\t!isSingleNodeOpenSource &&\n\t\t\t!hasTrigger &&\n\t\t\t!workflowContainsTrigger &&\n\t\t\tisTriggerPanel &&\n\t\t\t!onlyStickyNodes\n\t\t);\n\t}\n\tfunction shouldPrependChatTrigger(addedNodes: AddedNode[]): boolean {\n\t\tconst { allNodes } = useWorkflowsStore();\n\n\t\tconst COMPATIBLE_CHAT_NODES = [\n\t\t\tQA_CHAIN_NODE_TYPE,\n\t\t\tAGENT_NODE_TYPE,\n\t\t\tBASIC_CHAIN_NODE_TYPE,\n\t\t\tOPEN_AI_ASSISTANT_NODE_TYPE,\n\t\t\tOPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE,\n\t\t];\n\n\t\tconst isChatTriggerMissing =\n\t\t\tallNodes.find((node) =>\n\t\t\t\t[MANUAL_CHAT_TRIGGER_NODE_TYPE, CHAT_TRIGGER_NODE_TYPE].includes(node.type),\n\t\t\t) === undefined;\n\t\tconst isCompatibleNode = addedNodes.some((node) => COMPATIBLE_CHAT_NODES.includes(node.type));\n\n\t\treturn isCompatibleNode && isChatTriggerMissing;\n\t}\n\n\tfunction getAddedNodesAndConnections(addedNodes: AddedNode[]): AddedNodesAndConnections {\n\t\tif (addedNodes.length === 0) {\n\t\t\treturn { nodes: [], connections: [] };\n\t\t}\n\n\t\tconst nodes: AddedNode[] = [];\n\t\tconst connections: AddedNodeConnection[] = [];\n\n\t\tconst nodeToAutoOpen = addedNodes.find((node) => node.type !== MANUAL_TRIGGER_NODE_TYPE);\n\n\t\tif (nodeToAutoOpen) {\n\t\t\tnodeToAutoOpen.openDetail = true;\n\t\t}\n\n\t\tif (shouldPrependChatTrigger(addedNodes)) {\n\t\t\taddedNodes.unshift({ type: CHAT_TRIGGER_NODE_TYPE, isAutoAdd: true });\n\t\t\tconnections.push({\n\t\t\t\tfrom: { nodeIndex: 0 },\n\t\t\t\tto: { nodeIndex: 1 },\n\t\t\t});\n\t\t} else if (shouldPrependManualTrigger(addedNodes)) {\n\t\t\taddedNodes.unshift({ type: MANUAL_TRIGGER_NODE_TYPE, isAutoAdd: true });\n\t\t\tconnections.push({\n\t\t\t\tfrom: { nodeIndex: 0 },\n\t\t\t\tto: { nodeIndex: 1 },\n\t\t\t});\n\t\t} else if (shouldConnectWithExistingTrigger(addedNodes)) {\n\t\t\tconnections.push({\n\t\t\t\tfrom: { nodeIndex: 0 },\n\t\t\t\tto: { nodeIndex: 1 },\n\t\t\t});\n\t\t}\n\n\t\taddedNodes.forEach((node, index) => {\n\t\t\tif (node.type === OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE) {\n\t\t\t\tnode.type = OPEN_AI_NODE_TYPE;\n\t\t\t}\n\n\t\t\tnodes.push(node);\n\n\t\t\tswitch (node.type) {\n\t\t\t\tcase SPLIT_IN_BATCHES_NODE_TYPE: {\n\t\t\t\t\tconst splitInBatchesIndex = index;\n\t\t\t\t\tconst noOpIndex = splitInBatchesIndex + 1;\n\t\t\t\t\tnodes.push({\n\t\t\t\t\t\ttype: NO_OP_NODE_TYPE,\n\t\t\t\t\t\tisAutoAdd: true,\n\t\t\t\t\t\tname: i18n.baseText('nodeView.replaceMe'),\n\t\t\t\t\t});\n\t\t\t\t\tconnections.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfrom: { nodeIndex: splitInBatchesIndex, outputIndex: 1 },\n\t\t\t\t\t\t\tto: { nodeIndex: noOpIndex },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfrom: { nodeIndex: noOpIndex },\n\t\t\t\t\t\t\tto: { nodeIndex: splitInBatchesIndex },\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn { nodes, connections };\n\t}\n\n\t// Hook into addNode action to set the last node parameters & track the action selected\n\tfunction setAddedNodeActionParameters(\n\t\taction: IUpdateInformation,\n\t\ttelemetry?: Telemetry,\n\t\trootView = '',\n\t) {\n\t\tconst { $onAction: onWorkflowStoreAction } = useWorkflowsStore();\n\t\tconst storeWatcher = onWorkflowStoreAction(\n\t\t\t({ name, after, store: { setLastNodeParameters }, args }) => {\n\t\t\t\tif (name !== 'addNode' || args[0].type !== action.key) return;\n\t\t\t\tafter(() => {\n\t\t\t\t\tsetLastNodeParameters(action);\n\t\t\t\t\tif (telemetry) trackActionSelected(action, telemetry, rootView);\n\t\t\t\t\t// Unsubscribe from the store watcher\n\t\t\t\t\tstoreWatcher();\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\treturn storeWatcher;\n\t}\n\n\tfunction trackActionSelected(action: IUpdateInformation, telemetry: Telemetry, rootView: string) {\n\t\tconst payload = {\n\t\t\tnode_type: action.key,\n\t\t\taction: action.name,\n\t\t\tsource_mode: rootView.toLowerCase(),\n\t\t\tresource: (action.value as INodeParameters).resource || '',\n\t\t};\n\t\tvoid useExternalHooks().run('nodeCreateList.addAction', payload);\n\t\ttelemetry?.trackNodesPanel('nodeCreateList.addAction', payload);\n\t}\n\n\treturn {\n\t\tactionsCategoryLocales,\n\t\tgetPlaceholderTriggerActions,\n\t\tparseCategoryActions,\n\t\tgetAddedNodesAndConnections,\n\t\tgetActionData,\n\t\tsetAddedNodeActionParameters,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { defineAsyncComponent, reactive } from 'vue';\nimport { getMidCanvasPosition } from '@/utils/nodeViewUtils';\nimport {\n\tDEFAULT_STICKY_HEIGHT,\n\tDEFAULT_STICKY_WIDTH,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport type { AddedNodesAndConnections, ToggleNodeCreatorOptions } from '@/Interface';\nimport { useActions } from './NodeCreator/composables/useActions';\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\n\ntype Props = {\n\tnodeViewScale: number;\n\tcreateNodeActive?: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nconst NodeCreator = defineAsyncComponent(\n\tasync () => await import('@/components/Node/NodeCreator/NodeCreator.vue'),\n);\n\nconst props = withDefaults(defineProps<Props>(), {\n\tcreateNodeActive: false,\n});\n\nconst emit = defineEmits<{\n\t(event: 'addNodes', value: AddedNodesAndConnections): void;\n\t(event: 'toggleNodeCreator', value: ToggleNodeCreatorOptions): void;\n}>();\n\nconst state = reactive({\n\tshowStickyButton: false,\n});\n\nconst uiStore = useUIStore();\n\nconst { getAddedNodesAndConnections } = useActions();\n\nfunction onCreateMenuHoverIn(mouseinEvent: MouseEvent) {\n\tconst buttonsWrapper = mouseinEvent.target as Element;\n\n\t// Once the popup menu is hovered, it's pointer events are disabled so it's not interfering with element underneath it.\n\tstate.showStickyButton = true;\n\tconst moveCallback = (mousemoveEvent: MouseEvent) => {\n\t\tif (buttonsWrapper) {\n\t\t\tconst wrapperBounds = buttonsWrapper.getBoundingClientRect();\n\t\t\tconst wrapperH = wrapperBounds.height;\n\t\t\tconst wrapperW = wrapperBounds.width;\n\t\t\tconst wrapperLeftNear = wrapperBounds.left;\n\t\t\tconst wrapperLeftFar = wrapperLeftNear + wrapperW;\n\t\t\tconst wrapperTopNear = wrapperBounds.top;\n\t\t\tconst wrapperTopFar = wrapperTopNear + wrapperH;\n\t\t\tconst inside =\n\t\t\t\tmousemoveEvent.pageX > wrapperLeftNear &&\n\t\t\t\tmousemoveEvent.pageX < wrapperLeftFar &&\n\t\t\t\tmousemoveEvent.pageY > wrapperTopNear &&\n\t\t\t\tmousemoveEvent.pageY < wrapperTopFar;\n\t\t\tif (!inside) {\n\t\t\t\tstate.showStickyButton = false;\n\t\t\t\tdocument.removeEventListener('mousemove', moveCallback, false);\n\t\t\t}\n\t\t}\n\t};\n\tdocument.addEventListener('mousemove', moveCallback, false);\n}\n\nfunction openNodeCreator() {\n\temit('toggleNodeCreator', {\n\t\tsource: NODE_CREATOR_OPEN_SOURCES.ADD_NODE_BUTTON,\n\t\tcreateNodeActive: true,\n\t});\n}\n\nfunction addStickyNote() {\n\tif (document.activeElement) {\n\t\t(document.activeElement as HTMLElement).blur();\n\t}\n\n\tconst offset: [number, number] = [...uiStore.nodeViewOffsetPosition];\n\n\tconst position = getMidCanvasPosition(props.nodeViewScale, offset);\n\tposition[0] -= DEFAULT_STICKY_WIDTH / 2;\n\tposition[1] -= DEFAULT_STICKY_HEIGHT / 2;\n\n\temit('addNodes', getAddedNodesAndConnections([{ type: STICKY_NODE_TYPE, position }]));\n}\n\nfunction closeNodeCreator() {\n\temit('toggleNodeCreator', { createNodeActive: false });\n}\n\nfunction nodeTypeSelected(nodeTypes: string[]) {\n\temit('addNodes', getAddedNodesAndConnections(nodeTypes.map((type) => ({ type }))));\n\tcloseNodeCreator();\n}\n</script>\n\n<template>\n\t<div>\n\t\t<div\n\t\t\tv-if=\"!createNodeActive\"\n\t\t\t:class=\"[$style.nodeButtonsWrapper, state.showStickyButton ? $style.noEvents : '']\"\n\t\t\t@mouseenter=\"onCreateMenuHoverIn\"\n\t\t>\n\t\t\t<div :class=\"$style.nodeCreatorButton\" data-test-id=\"node-creator-plus-button\">\n\t\t\t\t<KeyboardShortcutTooltip\n\t\t\t\t\t:label=\"$locale.baseText('nodeView.openNodesPanel')\"\n\t\t\t\t\t:shortcut=\"{ keys: ['Tab'] }\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\tsize=\"xlarge\"\n\t\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:class=\"$style.nodeCreatorPlus\"\n\t\t\t\t\t\t@click=\"openNodeCreator\"\n\t\t\t\t\t/>\n\t\t\t\t</KeyboardShortcutTooltip>\n\t\t\t\t<div\n\t\t\t\t\t:class=\"[$style.addStickyButton, state.showStickyButton ? $style.visibleButton : '']\"\n\t\t\t\t\tdata-test-id=\"add-sticky-button\"\n\t\t\t\t\t@click=\"addStickyNote\"\n\t\t\t\t>\n\t\t\t\t\t<KeyboardShortcutTooltip\n\t\t\t\t\t\t:label=\"$locale.baseText('nodeView.addStickyHint')\"\n\t\t\t\t\t\t:shortcut=\"{ keys: ['s'], shiftKey: true }\"\n\t\t\t\t\t\tplacement=\"left\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-icon-button type=\"tertiary\" :icon=\"['far', 'note-sticky']\" />\n\t\t\t\t\t</KeyboardShortcutTooltip>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<Suspense>\n\t\t\t<NodeCreator\n\t\t\t\t:active=\"createNodeActive\"\n\t\t\t\t@node-type-selected=\"nodeTypeSelected\"\n\t\t\t\t@close-node-creator=\"closeNodeCreator\"\n\t\t\t/>\n\t\t</Suspense>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.nodeButtonsWrapper {\n\tposition: absolute;\n\twidth: 150px;\n\theight: 200px;\n\ttop: 0;\n\tright: 0;\n\tdisplay: flex;\n}\n\n.addStickyButton {\n\tmargin-top: var(--spacing-2xs);\n\topacity: 0;\n\ttransition: 0.1s;\n\ttransition-timing-function: linear;\n}\n\n.visibleButton {\n\topacity: 1;\n\tpointer-events: all;\n}\n\n.noEvents {\n\tpointer-events: none;\n}\n\n.nodeCreatorButton {\n\tposition: absolute;\n\ttext-align: center;\n\ttop: var(--spacing-l);\n\tright: var(--spacing-l);\n\tpointer-events: all !important;\n\n\tbutton {\n\t\tborder-color: var(--color-button-node-creator-border-font);\n\t\tcolor: var(--color-button-node-creator-border-font);\n\n\t\t&:hover {\n\t\t\tcolor: var(--color-button-node-creator-hover-font);\n\t\t\tborder-color: var(--color-button-node-creator-hover-border);\n\t\t\tbackground: var(--color-button-node-creator-background);\n\t\t}\n\t}\n}\n.nodeCreatorPlus {\n\tborder-width: 2px;\n\tborder-radius: var(--border-radius-base);\n\twidth: 36px;\n\theight: 36px;\n}\n</style>\n"],"file":"assets/NodeCreation-DHuCOx3T.js"}