n8n-editor-ui 1.48.0 → 1.48.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 (156) hide show
  1. package/.turbo/turbo-build.log +79 -79
  2. package/dist/assets/{AuthView-Cfnovems.js → AuthView-DeM_7KeR.js} +2 -2
  3. package/dist/assets/{AuthView-Cfnovems.js.map → AuthView-DeM_7KeR.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-Dis0UJTc.js → CanvasControls-BarjtIlw.js} +2 -2
  5. package/dist/assets/{CanvasControls-Dis0UJTc.js.map → CanvasControls-BarjtIlw.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-CFVFfkrj.js → ChangePasswordView-BsVhSf9z.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-CFVFfkrj.js.map → ChangePasswordView-BsVhSf9z.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-BKwsDV7i.js → CollectionParameter-ruqgU7kr.js} +2 -2
  9. package/dist/assets/CollectionParameter-ruqgU7kr.js.map +1 -0
  10. package/dist/assets/{CredentialsView-D-Gs1CW_.js → CredentialsView-CEWMy0O7.js} +2 -2
  11. package/dist/assets/{CredentialsView-D-Gs1CW_.js.map → CredentialsView-CEWMy0O7.js.map} +1 -1
  12. package/dist/assets/{ErrorView-B9fsIgpd.js → ErrorView-i1G_7Vnl.js} +2 -2
  13. package/dist/assets/{ErrorView-B9fsIgpd.js.map → ErrorView-i1G_7Vnl.js.map} +1 -1
  14. package/dist/assets/{ExecutionsFilter-Bp-2hjm2.js → ExecutionsFilter-8p_qD50I.js} +2 -2
  15. package/dist/assets/{ExecutionsFilter-Bp-2hjm2.js.map → ExecutionsFilter-8p_qD50I.js.map} +1 -1
  16. package/dist/assets/{ExecutionsView-CaF0x9T5.js → ExecutionsView-Bw4zWCsi.js} +2 -2
  17. package/dist/assets/{ExecutionsView-CaF0x9T5.js.map → ExecutionsView-Bw4zWCsi.js.map} +1 -1
  18. package/dist/assets/{ForgotMyPasswordView-C6mthrk9.js → ForgotMyPasswordView-xpgEo3Ld.js} +2 -2
  19. package/dist/assets/{ForgotMyPasswordView-C6mthrk9.js.map → ForgotMyPasswordView-xpgEo3Ld.js.map} +1 -1
  20. package/dist/assets/{MainHeader-Cq4gEd6q.js → MainHeader-BckwBOk-.js} +2 -2
  21. package/dist/assets/{MainHeader-Cq4gEd6q.js.map → MainHeader-BckwBOk-.js.map} +1 -1
  22. package/dist/assets/{MainSidebar-5O6ikbgz.js → MainSidebar-Cs4qBbtI.js} +2 -2
  23. package/dist/assets/{MainSidebar-5O6ikbgz.js.map → MainSidebar-Cs4qBbtI.js.map} +1 -1
  24. package/dist/assets/{NodeCreation-Ddbdc92L.js → NodeCreation-CicljMw4.js} +3 -3
  25. package/dist/assets/{NodeCreation-Ddbdc92L.js.map → NodeCreation-CicljMw4.js.map} +1 -1
  26. package/dist/assets/{NodeCreator-DCRSsCDa.js → NodeCreator-B_seYieX.js} +2 -2
  27. package/dist/assets/{NodeCreator-DCRSsCDa.js.map → NodeCreator-B_seYieX.js.map} +1 -1
  28. package/dist/assets/NodeDetailsView-uX6Ox6-p.js +4 -0
  29. package/dist/assets/NodeDetailsView-uX6Ox6-p.js.map +1 -0
  30. package/dist/assets/{NodeView-ZNm7_dIP.css → NodeView-B1741gUJ.css} +1 -1
  31. package/dist/assets/{NodeView-DHiWHy1x.js → NodeView-dhEa5JeF.js} +3 -3
  32. package/dist/assets/NodeView-dhEa5JeF.js.map +1 -0
  33. package/dist/assets/NodeView.v2-BTnhsVQt.js +3 -0
  34. package/dist/assets/{NodeView.v2-Ces_FOmN.js.map → NodeView.v2-BTnhsVQt.js.map} +1 -1
  35. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BrrHv_OT.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-DrgXuCbj.js} +2 -2
  36. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BrrHv_OT.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-DrgXuCbj.js.map} +1 -1
  37. package/dist/assets/{ProjectSettings-DwtXe_N9.js → ProjectSettings-H_vMYteG.js} +2 -2
  38. package/dist/assets/{ProjectSettings-DwtXe_N9.js.map → ProjectSettings-H_vMYteG.js.map} +1 -1
  39. package/dist/assets/{ProjectTabs-DY8rNWak.js → ProjectTabs-CBgK4uTk.js} +2 -2
  40. package/dist/assets/{ProjectTabs-DY8rNWak.js.map → ProjectTabs-CBgK4uTk.js.map} +1 -1
  41. package/dist/assets/{PushConnectionTracker-BodK8d2Q.js → PushConnectionTracker-CaBlBm3C.js} +2 -2
  42. package/dist/assets/{PushConnectionTracker-BodK8d2Q.js.map → PushConnectionTracker-CaBlBm3C.js.map} +1 -1
  43. package/dist/assets/{ResourcesListLayout-qK7zTnkk.js → ResourcesListLayout-DqfRSMy0.js} +2 -2
  44. package/dist/assets/{ResourcesListLayout-qK7zTnkk.js.map → ResourcesListLayout-DqfRSMy0.js.map} +1 -1
  45. package/dist/assets/{RunDataAi-CQWIq0sA.js → RunDataAi-BRDcniUj.js} +2 -2
  46. package/dist/assets/{RunDataAi-CQWIq0sA.js.map → RunDataAi-BRDcniUj.js.map} +1 -1
  47. package/dist/assets/{RunDataJson-DV2qWwIx.js → RunDataJson-CJg6rq7p.js} +3 -3
  48. package/dist/assets/{RunDataJson-DV2qWwIx.js.map → RunDataJson-CJg6rq7p.js.map} +1 -1
  49. package/dist/assets/{RunDataJsonActions-D9BQabwD.js → RunDataJsonActions-DtpaWP51.js} +2 -2
  50. package/dist/assets/{RunDataJsonActions-D9BQabwD.js.map → RunDataJsonActions-DtpaWP51.js.map} +1 -1
  51. package/dist/assets/{RunDataSchema-CEbOE_wk.js → RunDataSchema-CH1XRzPV.js} +2 -2
  52. package/dist/assets/{RunDataSchema-CEbOE_wk.js.map → RunDataSchema-CH1XRzPV.js.map} +1 -1
  53. package/dist/assets/{RunDataSearch-BIoMsNXa.js → RunDataSearch-CtzUEG0k.js} +2 -2
  54. package/dist/assets/{RunDataSearch-BIoMsNXa.js.map → RunDataSearch-CtzUEG0k.js.map} +1 -1
  55. package/dist/assets/{RunDataTable-DRwDl7l_.js → RunDataTable-Bwwqtg2e.js} +2 -2
  56. package/dist/assets/{RunDataTable-DRwDl7l_.js.map → RunDataTable-Bwwqtg2e.js.map} +1 -1
  57. package/dist/assets/{SamlOnboarding-B7CMPcIO.js → SamlOnboarding-C8J1wO2_.js} +2 -2
  58. package/dist/assets/{SamlOnboarding-B7CMPcIO.js.map → SamlOnboarding-C8J1wO2_.js.map} +1 -1
  59. package/dist/assets/{SettingsApiView-2o3tSk6F.js → SettingsApiView-CFZYL9SM.js} +2 -2
  60. package/dist/assets/{SettingsApiView-2o3tSk6F.js.map → SettingsApiView-CFZYL9SM.js.map} +1 -1
  61. package/dist/assets/{SettingsCommunityNodesView-DtFVlTax.js → SettingsCommunityNodesView-BJygUgC4.js} +2 -2
  62. package/dist/assets/{SettingsCommunityNodesView-DtFVlTax.js.map → SettingsCommunityNodesView-BJygUgC4.js.map} +1 -1
  63. package/dist/assets/{SettingsExternalSecrets-b3iC5CUl.js → SettingsExternalSecrets-Dvrb_hHi.js} +2 -2
  64. package/dist/assets/{SettingsExternalSecrets-b3iC5CUl.js.map → SettingsExternalSecrets-Dvrb_hHi.js.map} +1 -1
  65. package/dist/assets/{SettingsFakeDoorView-BDqufqIU.js → SettingsFakeDoorView-BAi6oJnj.js} +2 -2
  66. package/dist/assets/{SettingsFakeDoorView-BDqufqIU.js.map → SettingsFakeDoorView-BAi6oJnj.js.map} +1 -1
  67. package/dist/assets/{SettingsLdapView-KAZZv8gN.js → SettingsLdapView-BMSWqnQ9.js} +2 -2
  68. package/dist/assets/{SettingsLdapView-KAZZv8gN.js.map → SettingsLdapView-BMSWqnQ9.js.map} +1 -1
  69. package/dist/assets/{SettingsLogStreamingView-BQB24Jd7.js → SettingsLogStreamingView-HusCnCf9.js} +2 -2
  70. package/dist/assets/{SettingsLogStreamingView-BQB24Jd7.js.map → SettingsLogStreamingView-HusCnCf9.js.map} +1 -1
  71. package/dist/assets/{SettingsPersonalView-BucAs1ZA.js → SettingsPersonalView-CJLyPtEQ.js} +2 -2
  72. package/dist/assets/{SettingsPersonalView-BucAs1ZA.js.map → SettingsPersonalView-CJLyPtEQ.js.map} +1 -1
  73. package/dist/assets/{SettingsSourceControl-iph73y14.js → SettingsSourceControl-DEfa_Jc9.js} +2 -2
  74. package/dist/assets/{SettingsSourceControl-iph73y14.js.map → SettingsSourceControl-DEfa_Jc9.js.map} +1 -1
  75. package/dist/assets/{SettingsSso-dhn_J94r.js → SettingsSso-QPRaZWWj.js} +2 -2
  76. package/dist/assets/{SettingsSso-dhn_J94r.js.map → SettingsSso-QPRaZWWj.js.map} +1 -1
  77. package/dist/assets/{SettingsUsageAndPlan-UVZXvMB0.js → SettingsUsageAndPlan-CRnR3ZSO.js} +2 -2
  78. package/dist/assets/{SettingsUsageAndPlan-UVZXvMB0.js.map → SettingsUsageAndPlan-CRnR3ZSO.js.map} +1 -1
  79. package/dist/assets/{SettingsUsersView-D7RGgFQd.js → SettingsUsersView-DZFKtn1k.js} +2 -2
  80. package/dist/assets/{SettingsUsersView-D7RGgFQd.js.map → SettingsUsersView-DZFKtn1k.js.map} +1 -1
  81. package/dist/assets/{SettingsView-B162yoGp.js → SettingsView-DNVOn5WZ.js} +2 -2
  82. package/dist/assets/{SettingsView-B162yoGp.js.map → SettingsView-DNVOn5WZ.js.map} +1 -1
  83. package/dist/assets/{SetupView-njSOn-8-.js → SetupView-DotzeMGc.js} +2 -2
  84. package/dist/assets/{SetupView-njSOn-8-.js.map → SetupView-DotzeMGc.js.map} +1 -1
  85. package/dist/assets/{SetupWorkflowCredentialsButton-D6kdzcAr.js → SetupWorkflowCredentialsButton-B5QDECym.js} +2 -2
  86. package/dist/assets/{SetupWorkflowCredentialsButton-D6kdzcAr.js.map → SetupWorkflowCredentialsButton-B5QDECym.js.map} +1 -1
  87. package/dist/assets/{SetupWorkflowFromTemplateView-BG4CefMq.js → SetupWorkflowFromTemplateView-Cret3KQc.js} +2 -2
  88. package/dist/assets/{SetupWorkflowFromTemplateView-BG4CefMq.js.map → SetupWorkflowFromTemplateView-Cret3KQc.js.map} +1 -1
  89. package/dist/assets/{SigninView-CDnvthma.js → SigninView-C-e__nLi.js} +2 -2
  90. package/dist/assets/{SigninView-CDnvthma.js.map → SigninView-C-e__nLi.js.map} +1 -1
  91. package/dist/assets/{SignoutView-CGC8CP2R.js → SignoutView-BnQGk2l9.js} +2 -2
  92. package/dist/assets/{SignoutView-CGC8CP2R.js.map → SignoutView-BnQGk2l9.js.map} +1 -1
  93. package/dist/assets/{SignupView-DzjytZkS.js → SignupView-CXd-UXXE.js} +2 -2
  94. package/dist/assets/{SignupView-DzjytZkS.js.map → SignupView-CXd-UXXE.js.map} +1 -1
  95. package/dist/assets/{TemplateDetails-1Y3PVQer.js → TemplateDetails-d7bjG-lc.js} +2 -2
  96. package/dist/assets/{TemplateDetails-1Y3PVQer.js.map → TemplateDetails-d7bjG-lc.js.map} +1 -1
  97. package/dist/assets/{TemplateList-BAk7Min6.js → TemplateList-B-UGoryh.js} +2 -2
  98. package/dist/assets/{TemplateList-BAk7Min6.js.map → TemplateList-B-UGoryh.js.map} +1 -1
  99. package/dist/assets/{TemplatesCollectionView-B7-6TTfO.js → TemplatesCollectionView-C3NLN4r4.js} +2 -2
  100. package/dist/assets/{TemplatesCollectionView-B7-6TTfO.js.map → TemplatesCollectionView-C3NLN4r4.js.map} +1 -1
  101. package/dist/assets/{TemplatesSearchView-DbRpG5Mr.js → TemplatesSearchView-d6JOZHQV.js} +2 -2
  102. package/dist/assets/{TemplatesSearchView-DbRpG5Mr.js.map → TemplatesSearchView-d6JOZHQV.js.map} +1 -1
  103. package/dist/assets/{TemplatesView-COyKdRm2.js → TemplatesView-CWeiRxEd.js} +2 -2
  104. package/dist/assets/{TemplatesView-COyKdRm2.js.map → TemplatesView-CWeiRxEd.js.map} +1 -1
  105. package/dist/assets/{TemplatesWorkflowView-CIeAGGeu.js → TemplatesWorkflowView-BnHhke9R.js} +2 -2
  106. package/dist/assets/{TemplatesWorkflowView-CIeAGGeu.js.map → TemplatesWorkflowView-BnHhke9R.js.map} +1 -1
  107. package/dist/assets/{VariablesView-BWE4aH2w.js → VariablesView-HRSOjl6h.js} +2 -2
  108. package/dist/assets/{VariablesView-BWE4aH2w.js.map → VariablesView-HRSOjl6h.js.map} +1 -1
  109. package/dist/assets/{WorkerView-9f3_1jpS.js → WorkerView-BoBwGroS.js} +2 -2
  110. package/dist/assets/{WorkerView-9f3_1jpS.js.map → WorkerView-BoBwGroS.js.map} +1 -1
  111. package/dist/assets/{WorkflowActivator-B6RfdJ_9.js → WorkflowActivator-b_Aa-Z_t.js} +2 -2
  112. package/dist/assets/{WorkflowActivator-B6RfdJ_9.js.map → WorkflowActivator-b_Aa-Z_t.js.map} +1 -1
  113. package/dist/assets/{WorkflowExecutionsInfoAccordion-BluokbL6.js → WorkflowExecutionsInfoAccordion-B5WHuoYD.js} +2 -2
  114. package/dist/assets/{WorkflowExecutionsInfoAccordion-BluokbL6.js.map → WorkflowExecutionsInfoAccordion-B5WHuoYD.js.map} +1 -1
  115. package/dist/assets/{WorkflowExecutionsLandingPage-DNfzEsWQ.js → WorkflowExecutionsLandingPage-D5D2gCKQ.js} +2 -2
  116. package/dist/assets/{WorkflowExecutionsLandingPage-DNfzEsWQ.js.map → WorkflowExecutionsLandingPage-D5D2gCKQ.js.map} +1 -1
  117. package/dist/assets/{WorkflowExecutionsPreview-DAmDAF-W.js → WorkflowExecutionsPreview-CQgNc11q.js} +2 -2
  118. package/dist/assets/{WorkflowExecutionsPreview-DAmDAF-W.js.map → WorkflowExecutionsPreview-CQgNc11q.js.map} +1 -1
  119. package/dist/assets/{WorkflowExecutionsView-pwPLba8F.js → WorkflowExecutionsView-CR-bru7r.js} +2 -2
  120. package/dist/assets/{WorkflowExecutionsView-pwPLba8F.js.map → WorkflowExecutionsView-CR-bru7r.js.map} +1 -1
  121. package/dist/assets/{WorkflowHistory-Dxo17Hrn.js → WorkflowHistory-DZ-HRVUW.js} +2 -2
  122. package/dist/assets/{WorkflowHistory-Dxo17Hrn.js.map → WorkflowHistory-DZ-HRVUW.js.map} +1 -1
  123. package/dist/assets/{WorkflowOnboardingView-BBidrsf7.js → WorkflowOnboardingView-DOIdULx-.js} +2 -2
  124. package/dist/assets/{WorkflowOnboardingView-BBidrsf7.js.map → WorkflowOnboardingView-DOIdULx-.js.map} +1 -1
  125. package/dist/assets/{WorkflowPreview-OBQIslyy.js → WorkflowPreview-3iPlzE4s.js} +2 -2
  126. package/dist/assets/{WorkflowPreview-OBQIslyy.js.map → WorkflowPreview-3iPlzE4s.js.map} +1 -1
  127. package/dist/assets/{WorkflowsView-CODAAPom.js → WorkflowsView-Ch9-zyDd.js} +2 -2
  128. package/dist/assets/{WorkflowsView-CODAAPom.js.map → WorkflowsView-Ch9-zyDd.js.map} +1 -1
  129. package/dist/assets/{cloud-b1t6vFlo.js → cloud-PFRUu9iS.js} +2 -2
  130. package/dist/assets/{cloud-b1t6vFlo.js.map → cloud-PFRUu9iS.js.map} +1 -1
  131. package/dist/assets/{collaboration.store-C5F_y2IO.js → collaboration.store-CV20HjQm.js} +2 -2
  132. package/dist/assets/{collaboration.store-C5F_y2IO.js.map → collaboration.store-CV20HjQm.js.map} +1 -1
  133. package/dist/assets/{index-DATiCTBk.js → index-BjbCeTcj.js} +105 -105
  134. package/dist/assets/index-BjbCeTcj.js.map +1 -0
  135. package/dist/assets/{nodeCreator.store-BHeYrLWf.js → nodeCreator.store-LPbO-Os0.js} +2 -2
  136. package/dist/assets/{nodeCreator.store-BHeYrLWf.js.map → nodeCreator.store-LPbO-Os0.js.map} +1 -1
  137. package/dist/assets/{templateActions-C33KdEJM.js → templateActions-BZ9bA7ql.js} +2 -2
  138. package/dist/assets/{templateActions-C33KdEJM.js.map → templateActions-BZ9bA7ql.js.map} +1 -1
  139. package/dist/assets/{useExecutionDebugging-DejsFiYr.js → useExecutionDebugging-L_wm2gVK.js} +2 -2
  140. package/dist/assets/{useExecutionDebugging-DejsFiYr.js.map → useExecutionDebugging-L_wm2gVK.js.map} +1 -1
  141. package/dist/assets/{useExecutionHelpers-DrZ09ZbE.js → useExecutionHelpers-th1spplL.js} +2 -2
  142. package/dist/assets/{useExecutionHelpers-DrZ09ZbE.js.map → useExecutionHelpers-th1spplL.js.map} +1 -1
  143. package/dist/assets/{usePushConnection-qF8q4o13.js → usePushConnection-DsZw7iUE.js} +2 -2
  144. package/dist/assets/{usePushConnection-qF8q4o13.js.map → usePushConnection-DsZw7iUE.js.map} +1 -1
  145. package/dist/assets/{useUserHelpers-Dn-199Fi.js → useUserHelpers-lyQUjtql.js} +2 -2
  146. package/dist/assets/{useUserHelpers-Dn-199Fi.js.map → useUserHelpers-lyQUjtql.js.map} +1 -1
  147. package/dist/assets/{useWorkflowActivate-MNrM98NZ.js → useWorkflowActivate-DTmbKEGl.js} +2 -2
  148. package/dist/assets/{useWorkflowActivate-MNrM98NZ.js.map → useWorkflowActivate-DTmbKEGl.js.map} +1 -1
  149. package/dist/index.html +1 -1
  150. package/package.json +1 -1
  151. package/dist/assets/CollectionParameter-BKwsDV7i.js.map +0 -1
  152. package/dist/assets/NodeDetailsView-j5ZU-3Ol.js +0 -4
  153. package/dist/assets/NodeDetailsView-j5ZU-3Ol.js.map +0 -1
  154. package/dist/assets/NodeView-DHiWHy1x.js.map +0 -1
  155. package/dist/assets/NodeView.v2-Ces_FOmN.js +0 -3
  156. package/dist/assets/index-DATiCTBk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MainSidebar-5O6ikbgz.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/api/ctas.ts","../../src/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore.ts","../../src/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue","../../src/components/MainSidebarSourceControl.vue","../../src/components/Projects/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","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/root.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.restApiContext);\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 { createEventBus } from 'n8n-design-system/utils';\nimport { useI18n } from '@/composables/useI18n';\nimport { hasPermission } from '@/utils/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 } from '@/constants';\nimport type { SourceControlAggregatedFile } from '../Interface';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\n\ndefineProps<{\n\tisCollapsed: boolean;\n}>();\n\nconst responseStatuses = {\n\tCONFLICT: 409,\n};\n\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</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 '@/stores/projects.store';\nimport type { ProjectListItem } from '@/types/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</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 { 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 { useUserHelpers } from '@/composables/useUserHelpers';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useRootStore } from '@/stores/root.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 BecomeTemplateCreatorCta from '@/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/utils/rbac/permissions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useBecomeTemplateCreatorStore } from '@/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore';\nimport ProjectNavigation from '@/components/Projects/ProjectNavigation.vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tMainSidebarSourceControl,\n\t\tBecomeTemplateCreatorCta,\n\t\tProjectNavigation,\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { callDebounced } = useDebounce();\n\t\tconst router = useRouter();\n\t\tconst route = useRoute();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tcallDebounced,\n\t\t\t...useMessage(),\n\t\t\t...useUserHelpers(router, route),\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\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\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: 'help',\n\t\t\t\t\ticon: 'question',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.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;\n\t\t},\n\t\tuserIsTrialing(): boolean {\n\t\t\treturn this.cloudPlanStore.userIsTrialing;\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\tthis.uiStore.sidebarMenuCollapsed = window.innerWidth < 900;\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\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","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","computed","hasEnoughTimePassedSinceDismissal","showBecomeCreatorCta","dismissCta","DateTime","fetchBecomeCreatorCta","becomeCreatorCta","fetchUserCtasIfNeeded","i18n","useI18n","store","telemetry","useTelemetry","onClick","responseStatuses","loadingService","useLoadingService","uiStore","useUIStore","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","props","__props","router","useRouter","locale","projectsStore","useProjectsStore","isCreatingProject","isComponentMounted","home","VIEWS","addProject","getProjectMenuItem","project","homeClicked","projectClicked","addProjectClicked","newProject","displayProjects","p","a","b","goToUpgrade","onMounted","_sfc_main","defineComponent","GiftNotificationIcon","MainSidebarSourceControl","BecomeTemplateCreatorCta","ProjectNavigation","externalHooks","useExternalHooks","callDebounced","useDebounce","route","useRoute","useMessage","useUserHelpers","mapStores","useSettingsStore","useUsersStore","useVersionsStore","useWorkflowsStore","useTemplatesStore","itemType","_a","action","VERSIONS_MODAL_KEY","key","ABOUT_MODAL_KEY","event","browserWidth","width","_hoisted_1","_resolveComponent","_createElementBlock","$style","_createElementVNode","isCollapsed","_cache","args","_createBlock","_component_n8n_icon","handleSelect","_createSlots","_withCtx","_component_ProjectNavigation","_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-Cs4qBbtI.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/api/ctas.ts","../../src/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore.ts","../../src/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue","../../src/components/MainSidebarSourceControl.vue","../../src/components/Projects/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","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/root.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.restApiContext);\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 { createEventBus } from 'n8n-design-system/utils';\nimport { useI18n } from '@/composables/useI18n';\nimport { hasPermission } from '@/utils/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 } from '@/constants';\nimport type { SourceControlAggregatedFile } from '../Interface';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\n\ndefineProps<{\n\tisCollapsed: boolean;\n}>();\n\nconst responseStatuses = {\n\tCONFLICT: 409,\n};\n\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</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 '@/stores/projects.store';\nimport type { ProjectListItem } from '@/types/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</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 { 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 { useUserHelpers } from '@/composables/useUserHelpers';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useRootStore } from '@/stores/root.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 BecomeTemplateCreatorCta from '@/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/utils/rbac/permissions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useBecomeTemplateCreatorStore } from '@/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore';\nimport ProjectNavigation from '@/components/Projects/ProjectNavigation.vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tMainSidebarSourceControl,\n\t\tBecomeTemplateCreatorCta,\n\t\tProjectNavigation,\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { callDebounced } = useDebounce();\n\t\tconst router = useRouter();\n\t\tconst route = useRoute();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tcallDebounced,\n\t\t\t...useMessage(),\n\t\t\t...useUserHelpers(router, route),\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\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\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: 'help',\n\t\t\t\t\ticon: 'question',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.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;\n\t\t},\n\t\tuserIsTrialing(): boolean {\n\t\t\treturn this.cloudPlanStore.userIsTrialing;\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\tthis.uiStore.sidebarMenuCollapsed = window.innerWidth < 900;\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\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","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","computed","hasEnoughTimePassedSinceDismissal","showBecomeCreatorCta","dismissCta","DateTime","fetchBecomeCreatorCta","becomeCreatorCta","fetchUserCtasIfNeeded","i18n","useI18n","store","telemetry","useTelemetry","onClick","responseStatuses","loadingService","useLoadingService","uiStore","useUIStore","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","props","__props","router","useRouter","locale","projectsStore","useProjectsStore","isCreatingProject","isComponentMounted","home","VIEWS","addProject","getProjectMenuItem","project","homeClicked","projectClicked","addProjectClicked","newProject","displayProjects","p","a","b","goToUpgrade","onMounted","_sfc_main","defineComponent","GiftNotificationIcon","MainSidebarSourceControl","BecomeTemplateCreatorCta","ProjectNavigation","externalHooks","useExternalHooks","callDebounced","useDebounce","route","useRoute","useMessage","useUserHelpers","mapStores","useSettingsStore","useUsersStore","useVersionsStore","useWorkflowsStore","useTemplatesStore","itemType","_a","action","VERSIONS_MODAL_KEY","key","ABOUT_MODAL_KEY","event","browserWidth","width","_hoisted_1","_resolveComponent","_createElementBlock","$style","_createElementVNode","isCollapsed","_cache","args","_createBlock","_component_n8n_icon","handleSelect","_createSlots","_withCtx","_component_ProjectNavigation","_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-DCRSsCDa.js","assets/index-DATiCTBk.js","assets/vendor-Dv5OeN6t.js","assets/pinia-DJNDmPLG.js","assets/n8n-CX_-_IN5.js","assets/axios-Mm4CS0gO.js","assets/esprima-next-nhoSXAeq.js","assets/luxon-CLwAIbs0.js","assets/lodash-es-CZ1inz46.js","assets/n8n-C4uNEd0H.css","assets/flatted-DN8lQ2XG.js","assets/@vueuse/core-BBHtM40w.js","assets/@n8n/permissions-BxxteU-C.js","assets/dateformat-CZXI82nZ.js","assets/vue-i18n-Delvyc9x.js","assets/uuid-SoommWqA.js","assets/@n8n/codemirror-lang-sql-DBO6T13I.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-CWDO6_kP.js","assets/@n8n/codemirror-lang-Dl0FW_KM.js","assets/fast-json-stable-stringify-CqoWQPIV.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-B_aZs84i.css","assets/nodeCreator.store-BHeYrLWf.js","assets/NodeCreator-CUn9v_Je.css"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
2
- import{e as V,_ as $}from"./n8n-CX_-_IN5.js";import{aM as A,x as U,ar as D,aU as x,eh as L,ei as K,cB as j,ak as q,j as B,a2 as z,c8 as F,ca as X,a3 as R,N as W,aT as Q,b1 as Z,ej as J,ek as ee,el as te,em as oe,e as ne,aG as Y,en as se,eo as re,ep as ae}from"./index-DATiCTBk.js";import{u as M,t as ie,s as ce}from"./nodeCreator.store-BHeYrLWf.js";import{e as de,G as le,Z as ue,ag as pe,l as v,m as G,I as g,p as H,U as y,O as w,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 I(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 b(e){return e.length===2?R().isTriggerNode(e[0].type):!1}function P(e){const{selectedView:t,openSource:o}=M(),{workflowTriggerNodes:n}=B(),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}=B(),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}})):b(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}=B(),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:I,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-DCRSsCDa.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]))),h=m,_=p,f=ue({showStickyButton:!1}),O=ne(),{getAddedNodesAndConnections:C}=Ce();function I(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 b(){_("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 v(),G("div",null,[a.createNodeActive?_e("",!0):(v(),G("div",{key:0,class:g([a.$style.nodeButtonsWrapper,f.showStickyButton?a.$style.noEvents:""]),onMouseenter:I},[H("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:w(()=>[y(e,{size:"xlarge",icon:"plus",type:"tertiary",class:g(a.$style.nodeCreatorPlus),onClick:b},null,8,["class"])]),_:1},8,["label"]),H("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:w(()=>[y(e,{type:"tertiary",icon:["far","note-sticky"]})]),_:1},8,["label"])],2)],2)],34)),(v(),fe(Te,null,{default:w(()=>[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",Ie={nodeButtonsWrapper:ge,addStickyButton:Ae,visibleButton:me,noEvents:Se,nodeCreatorButton:he,nodeCreatorPlus:Oe},be={$style:Ie},Pe=$(Ee,[["__cssModules",be]]),De=Object.freeze(Object.defineProperty({__proto__:null,default:Pe},Symbol.toStringTag,{value:"Module"}));export{De as N,Ce as u};
3
- //# sourceMappingURL=NodeCreation-Ddbdc92L.js.map
1
+ const __vite__fileDeps=["assets/NodeCreator-B_seYieX.js","assets/index-BjbCeTcj.js","assets/vendor-Dv5OeN6t.js","assets/pinia-DJNDmPLG.js","assets/n8n-CX_-_IN5.js","assets/axios-Mm4CS0gO.js","assets/esprima-next-nhoSXAeq.js","assets/luxon-CLwAIbs0.js","assets/lodash-es-CZ1inz46.js","assets/n8n-C4uNEd0H.css","assets/flatted-DN8lQ2XG.js","assets/@vueuse/core-BBHtM40w.js","assets/@n8n/permissions-BxxteU-C.js","assets/dateformat-CZXI82nZ.js","assets/vue-i18n-Delvyc9x.js","assets/uuid-SoommWqA.js","assets/@n8n/codemirror-lang-sql-DBO6T13I.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-CWDO6_kP.js","assets/@n8n/codemirror-lang-Dl0FW_KM.js","assets/fast-json-stable-stringify-CqoWQPIV.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-B_aZs84i.css","assets/nodeCreator.store-LPbO-Os0.js","assets/NodeCreator-CUn9v_Je.css"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
2
+ import{e as V,_ as $}from"./n8n-CX_-_IN5.js";import{aM as A,x as U,ar as D,aU as x,eh as L,ei as K,cB as j,ak as q,j as B,a2 as z,c8 as F,ca as X,a3 as R,N as W,aT as Q,b1 as Z,ej as J,ek as ee,el as te,em as oe,e as ne,aG as Y,en as se,eo as re,ep as ae}from"./index-BjbCeTcj.js";import{u as M,t as ie,s as ce}from"./nodeCreator.store-LPbO-Os0.js";import{e as de,G as le,Z as ue,ag as pe,l as v,m as G,I as g,p as H,U as y,O as w,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 I(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 b(e){return e.length===2?R().isTriggerNode(e[0].type):!1}function P(e){const{selectedView:t,openSource:o}=M(),{workflowTriggerNodes:n}=B(),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}=B(),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}})):b(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}=B(),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:I,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-B_seYieX.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]))),h=m,_=p,f=ue({showStickyButton:!1}),O=ne(),{getAddedNodesAndConnections:C}=Ce();function I(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 b(){_("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 v(),G("div",null,[a.createNodeActive?_e("",!0):(v(),G("div",{key:0,class:g([a.$style.nodeButtonsWrapper,f.showStickyButton?a.$style.noEvents:""]),onMouseenter:I},[H("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:w(()=>[y(e,{size:"xlarge",icon:"plus",type:"tertiary",class:g(a.$style.nodeCreatorPlus),onClick:b},null,8,["class"])]),_:1},8,["label"]),H("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:w(()=>[y(e,{type:"tertiary",icon:["far","note-sticky"]})]),_:1},8,["label"])],2)],2)],34)),(v(),fe(Te,null,{default:w(()=>[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",Ie={nodeButtonsWrapper:ge,addStickyButton:Ae,visibleButton:me,noEvents:Se,nodeCreatorButton:he,nodeCreatorPlus:Oe},be={$style:Ie},Pe=$(Ee,[["__cssModules",be]]),De=Object.freeze(Object.defineProperty({__proto__:null,default:Pe},Symbol.toStringTag,{value:"Module"}));export{De as N,Ce as u};
3
+ //# sourceMappingURL=NodeCreation-CicljMw4.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-Ddbdc92L.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-CicljMw4.js"}