n8n-editor-ui 1.34.1 → 1.34.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.turbo/turbo-build.log +63 -63
  2. package/dist/assets/{AuthView-94aQ7z4H.js → AuthView-TLL7d7nz.js} +2 -2
  3. package/dist/assets/{AuthView-94aQ7z4H.js.map → AuthView-TLL7d7nz.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-A5WBrohY.js → CanvasControls-QMz-txwk.js} +2 -2
  5. package/dist/assets/{CanvasControls-A5WBrohY.js.map → CanvasControls-QMz-txwk.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-wsEhj8cy.js → ChangePasswordView-BpG2Rx4d.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-wsEhj8cy.js.map → ChangePasswordView-BpG2Rx4d.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-XvPjL77I.js → CollectionParameter-jdGzYeqj.js} +2 -2
  9. package/dist/assets/CollectionParameter-jdGzYeqj.js.map +1 -0
  10. package/dist/assets/{CredentialsView-0XJMAGhU.js → CredentialsView-kiuFxEVH.js} +2 -2
  11. package/dist/assets/{CredentialsView-0XJMAGhU.js.map → CredentialsView-kiuFxEVH.js.map} +1 -1
  12. package/dist/assets/{ExecutionFilter-bhanFEvf.js → ExecutionFilter-V1l-9ps5.js} +2 -2
  13. package/dist/assets/{ExecutionFilter-bhanFEvf.js.map → ExecutionFilter-V1l-9ps5.js.map} +1 -1
  14. package/dist/assets/{ExecutionPreview-OlIAVmt8.js → ExecutionPreview-MPwJjWY4.js} +2 -2
  15. package/dist/assets/{ExecutionPreview-OlIAVmt8.js.map → ExecutionPreview-MPwJjWY4.js.map} +1 -1
  16. package/dist/assets/{ExecutionsInfoAccordion-8y0XuFEi.js → ExecutionsInfoAccordion-H3fj26pu.js} +2 -2
  17. package/dist/assets/{ExecutionsInfoAccordion-8y0XuFEi.js.map → ExecutionsInfoAccordion-H3fj26pu.js.map} +1 -1
  18. package/dist/assets/{ExecutionsLandingPage-S5UN8vIw.js → ExecutionsLandingPage-7qAKHfBe.js} +2 -2
  19. package/dist/assets/{ExecutionsLandingPage-S5UN8vIw.js.map → ExecutionsLandingPage-7qAKHfBe.js.map} +1 -1
  20. package/dist/assets/{ExecutionsList-BU7_tq5x.js → ExecutionsList-Y9rsGvqE.js} +2 -2
  21. package/dist/assets/{ExecutionsList-BU7_tq5x.js.map → ExecutionsList-Y9rsGvqE.js.map} +1 -1
  22. package/dist/assets/{ExecutionsView-aBSDNhOw.js → ExecutionsView-hi5NLYKp.js} +2 -2
  23. package/dist/assets/{ExecutionsView-aBSDNhOw.js.map → ExecutionsView-hi5NLYKp.js.map} +1 -1
  24. package/dist/assets/{ForgotMyPasswordView-y5xFculD.js → ForgotMyPasswordView-ho6gQT6y.js} +2 -2
  25. package/dist/assets/{ForgotMyPasswordView-y5xFculD.js.map → ForgotMyPasswordView-ho6gQT6y.js.map} +1 -1
  26. package/dist/assets/{MainHeader-dPdeQhkH.js → MainHeader-JVxjOJwJ.js} +2 -2
  27. package/dist/assets/{MainHeader-dPdeQhkH.js.map → MainHeader-JVxjOJwJ.js.map} +1 -1
  28. package/dist/assets/{MainSidebar-5wv4Ntz3.js → MainSidebar-h-btynOF.js} +2 -2
  29. package/dist/assets/{MainSidebar-5wv4Ntz3.js.map → MainSidebar-h-btynOF.js.map} +1 -1
  30. package/dist/assets/{NodeCreation-vCHQm0aM.js → NodeCreation--SFXDuf-.js} +3 -3
  31. package/dist/assets/{NodeCreation-vCHQm0aM.js.map → NodeCreation--SFXDuf-.js.map} +1 -1
  32. package/dist/assets/{NodeCreator-Qi3ajhnf.js → NodeCreator-ns8j677p.js} +2 -2
  33. package/dist/assets/{NodeCreator-Qi3ajhnf.js.map → NodeCreator-ns8j677p.js.map} +1 -1
  34. package/dist/assets/{NodeList-bi4nWtpD.js → NodeList-f2AyrOck.js} +2 -2
  35. package/dist/assets/{NodeList-bi4nWtpD.js.map → NodeList-f2AyrOck.js.map} +1 -1
  36. package/dist/assets/{NodeView-oDPyzajr.js → NodeView-7yZJ9OMj.js} +4 -4
  37. package/dist/assets/NodeView-7yZJ9OMj.js.map +1 -0
  38. package/dist/assets/NodeView-pdKhF5kg.css +1 -0
  39. package/dist/assets/{RunDataAi-DJiuZFJ2.js → RunDataAi-PNu5uqz6.js} +2 -2
  40. package/dist/assets/{RunDataAi-DJiuZFJ2.js.map → RunDataAi-PNu5uqz6.js.map} +1 -1
  41. package/dist/assets/{RunDataJson-9PUFQ2iv.js → RunDataJson-s5yVk7VC.js} +3 -3
  42. package/dist/assets/{RunDataJson-9PUFQ2iv.js.map → RunDataJson-s5yVk7VC.js.map} +1 -1
  43. package/dist/assets/{RunDataJsonActions-4HpuK2F9.js → RunDataJsonActions-VSs2XNyt.js} +2 -2
  44. package/dist/assets/{RunDataJsonActions-4HpuK2F9.js.map → RunDataJsonActions-VSs2XNyt.js.map} +1 -1
  45. package/dist/assets/{RunDataSchema-ezXA1IRJ.js → RunDataSchema-WeaaXm2i.js} +2 -2
  46. package/dist/assets/{RunDataSchema-ezXA1IRJ.js.map → RunDataSchema-WeaaXm2i.js.map} +1 -1
  47. package/dist/assets/{RunDataTable-fjkHn30C.js → RunDataTable-2YR4xl8i.js} +2 -2
  48. package/dist/assets/{RunDataTable-fjkHn30C.js.map → RunDataTable-2YR4xl8i.js.map} +1 -1
  49. package/dist/assets/{SamlOnboarding-yIx-rRda.js → SamlOnboarding-0ds_5hgl.js} +2 -2
  50. package/dist/assets/{SamlOnboarding-yIx-rRda.js.map → SamlOnboarding-0ds_5hgl.js.map} +1 -1
  51. package/dist/assets/{SettingsApiView-EZ0nAdDr.js → SettingsApiView-ZNTmBDeh.js} +2 -2
  52. package/dist/assets/{SettingsApiView-EZ0nAdDr.js.map → SettingsApiView-ZNTmBDeh.js.map} +1 -1
  53. package/dist/assets/{SettingsCommunityNodesView-GY7HDfXP.js → SettingsCommunityNodesView-YGybEb0Q.js} +2 -2
  54. package/dist/assets/{SettingsCommunityNodesView-GY7HDfXP.js.map → SettingsCommunityNodesView-YGybEb0Q.js.map} +1 -1
  55. package/dist/assets/{SettingsExternalSecrets-XjmxCmxV.js → SettingsExternalSecrets-V6XKdflH.js} +2 -2
  56. package/dist/assets/{SettingsExternalSecrets-XjmxCmxV.js.map → SettingsExternalSecrets-V6XKdflH.js.map} +1 -1
  57. package/dist/assets/{SettingsFakeDoorView-pVOCkUpk.js → SettingsFakeDoorView-RT3jHFTZ.js} +2 -2
  58. package/dist/assets/{SettingsFakeDoorView-pVOCkUpk.js.map → SettingsFakeDoorView-RT3jHFTZ.js.map} +1 -1
  59. package/dist/assets/{SettingsLdapView-447rSrxc.js → SettingsLdapView-lVhJpXDn.js} +2 -2
  60. package/dist/assets/{SettingsLdapView-447rSrxc.js.map → SettingsLdapView-lVhJpXDn.js.map} +1 -1
  61. package/dist/assets/{SettingsLogStreamingView-bUhYaLuP.js → SettingsLogStreamingView-hWjeVuyC.js} +2 -2
  62. package/dist/assets/{SettingsLogStreamingView-bUhYaLuP.js.map → SettingsLogStreamingView-hWjeVuyC.js.map} +1 -1
  63. package/dist/assets/{SettingsSourceControl-QbgpyFeh.js → SettingsSourceControl-XOku0dYa.js} +2 -2
  64. package/dist/assets/{SettingsSourceControl-QbgpyFeh.js.map → SettingsSourceControl-XOku0dYa.js.map} +1 -1
  65. package/dist/assets/{SettingsSso-1YVWObhc.js → SettingsSso-FfUWpkMk.js} +2 -2
  66. package/dist/assets/{SettingsSso-1YVWObhc.js.map → SettingsSso-FfUWpkMk.js.map} +1 -1
  67. package/dist/assets/{SettingsUsageAndPlan-RXRRDXy4.js → SettingsUsageAndPlan-bhK5h4Fc.js} +2 -2
  68. package/dist/assets/{SettingsUsageAndPlan-RXRRDXy4.js.map → SettingsUsageAndPlan-bhK5h4Fc.js.map} +1 -1
  69. package/dist/assets/{SettingsUsersView-eHaVB_6L.js → SettingsUsersView-wSBhrK4z.js} +2 -2
  70. package/dist/assets/{SettingsUsersView-eHaVB_6L.js.map → SettingsUsersView-wSBhrK4z.js.map} +1 -1
  71. package/dist/assets/{SettingsView-JVUkQw0d.js → SettingsView-k7YCmGxR.js} +2 -2
  72. package/dist/assets/{SettingsView-JVUkQw0d.js.map → SettingsView-k7YCmGxR.js.map} +1 -1
  73. package/dist/assets/{SetupView-fQzty7Gp.js → SetupView-q1H9bzQn.js} +2 -2
  74. package/dist/assets/{SetupView-fQzty7Gp.js.map → SetupView-q1H9bzQn.js.map} +1 -1
  75. package/dist/assets/{SetupWorkflowCredentialsButton-OiOkf-hI.js → SetupWorkflowCredentialsButton-MXDnpOlJ.js} +2 -2
  76. package/dist/assets/{SetupWorkflowCredentialsButton-OiOkf-hI.js.map → SetupWorkflowCredentialsButton-MXDnpOlJ.js.map} +1 -1
  77. package/dist/assets/{SetupWorkflowFromTemplateView-ckehDOej.js → SetupWorkflowFromTemplateView-0HgnF8Wk.js} +2 -2
  78. package/dist/assets/{SetupWorkflowFromTemplateView-ckehDOej.js.map → SetupWorkflowFromTemplateView-0HgnF8Wk.js.map} +1 -1
  79. package/dist/assets/{SigninView-6kvI5K04.js → SigninView-ZtC3HJKC.js} +2 -2
  80. package/dist/assets/{SigninView-6kvI5K04.js.map → SigninView-ZtC3HJKC.js.map} +1 -1
  81. package/dist/assets/{SignupView-USh4Ng3q.js → SignupView-9jLlb4-m.js} +2 -2
  82. package/dist/assets/{SignupView-USh4Ng3q.js.map → SignupView-9jLlb4-m.js.map} +1 -1
  83. package/dist/assets/{TemplateDetails-tXvyDDVg.js → TemplateDetails-w7x_Vgw_.js} +2 -2
  84. package/dist/assets/{TemplateDetails-tXvyDDVg.js.map → TemplateDetails-w7x_Vgw_.js.map} +1 -1
  85. package/dist/assets/{TemplateList-rsNRt0qZ.js → TemplateList-0nuqWVBy.js} +2 -2
  86. package/dist/assets/{TemplateList-rsNRt0qZ.js.map → TemplateList-0nuqWVBy.js.map} +1 -1
  87. package/dist/assets/{TemplatesCollectionView-lXJ9U359.js → TemplatesCollectionView-Z9UtKR-g.js} +2 -2
  88. package/dist/assets/{TemplatesCollectionView-lXJ9U359.js.map → TemplatesCollectionView-Z9UtKR-g.js.map} +1 -1
  89. package/dist/assets/{TemplatesInfoCarousel-P2HZ4dOz.js → TemplatesInfoCarousel-N3l1eTTG.js} +2 -2
  90. package/dist/assets/{TemplatesInfoCarousel-P2HZ4dOz.js.map → TemplatesInfoCarousel-N3l1eTTG.js.map} +1 -1
  91. package/dist/assets/{TemplatesSearchView-FN7reyfg.js → TemplatesSearchView-wkSt7PFf.js} +2 -2
  92. package/dist/assets/{TemplatesSearchView-FN7reyfg.js.map → TemplatesSearchView-wkSt7PFf.js.map} +1 -1
  93. package/dist/assets/{TemplatesWorkflowView-iRU7xCpM.js → TemplatesWorkflowView-epjsTDT4.js} +2 -2
  94. package/dist/assets/{TemplatesWorkflowView-iRU7xCpM.js.map → TemplatesWorkflowView-epjsTDT4.js.map} +1 -1
  95. package/dist/assets/{VariablesView-pWnSAbjy.js → VariablesView-mj7tvP3Z.js} +2 -2
  96. package/dist/assets/{VariablesView-pWnSAbjy.js.map → VariablesView-mj7tvP3Z.js.map} +1 -1
  97. package/dist/assets/{WorkerView-8rB6MB_M.js → WorkerView-urDpqCfL.js} +2 -2
  98. package/dist/assets/{WorkerView-8rB6MB_M.js.map → WorkerView-urDpqCfL.js.map} +1 -1
  99. package/dist/assets/{WorkflowActivator-hF9F5zIs.js → WorkflowActivator-2LVSrBU4.js} +2 -2
  100. package/dist/assets/{WorkflowActivator-hF9F5zIs.js.map → WorkflowActivator-2LVSrBU4.js.map} +1 -1
  101. package/dist/assets/{WorkflowHistory-gHQbqUXH.js → WorkflowHistory-4SEsxR0t.js} +2 -2
  102. package/dist/assets/{WorkflowHistory-gHQbqUXH.js.map → WorkflowHistory-4SEsxR0t.js.map} +1 -1
  103. package/dist/assets/{WorkflowOnboardingView-VpQ3P8b_.js → WorkflowOnboardingView-27zExcdN.js} +2 -2
  104. package/dist/assets/{WorkflowOnboardingView-VpQ3P8b_.js.map → WorkflowOnboardingView-27zExcdN.js.map} +1 -1
  105. package/dist/assets/{WorkflowsView-bfxfJsmW.js → WorkflowsView-rICV14FU.js} +2 -2
  106. package/dist/assets/{WorkflowsView-bfxfJsmW.js.map → WorkflowsView-rICV14FU.js.map} +1 -1
  107. package/dist/assets/{cloud-f74z4VKj.js → cloud-8u4ixH3T.js} +2 -2
  108. package/dist/assets/{cloud-f74z4VKj.js.map → cloud-8u4ixH3T.js.map} +1 -1
  109. package/dist/assets/{index-vdh5hVg3.js → index-4C1AxeXk.js} +4 -4
  110. package/dist/assets/{index-vdh5hVg3.js.map → index-4C1AxeXk.js.map} +1 -1
  111. package/dist/assets/index-PmN852am.css +1 -0
  112. package/dist/assets/{pushConnection-j2REJYmc.js → pushConnection-kCBulx2c.js} +2 -2
  113. package/dist/assets/{pushConnection-j2REJYmc.js.map → pushConnection-kCBulx2c.js.map} +1 -1
  114. package/dist/assets/{templateActions-iSfFOAhF.js → templateActions-tZeqnIph.js} +2 -2
  115. package/dist/assets/{templateActions-iSfFOAhF.js.map → templateActions-tZeqnIph.js.map} +1 -1
  116. package/dist/assets/{useExecutionDebugging-s7lAeIqB.js → useExecutionDebugging-eQjp4txV.js} +2 -2
  117. package/dist/assets/{useExecutionDebugging-s7lAeIqB.js.map → useExecutionDebugging-eQjp4txV.js.map} +1 -1
  118. package/dist/assets/{workflowActivate-SIKKLz8V.js → workflowActivate-6jCh92f_.js} +2 -2
  119. package/dist/assets/{workflowActivate-SIKKLz8V.js.map → workflowActivate-6jCh92f_.js.map} +1 -1
  120. package/dist/index.html +2 -2
  121. package/package.json +1 -1
  122. package/dist/assets/CollectionParameter-XvPjL77I.js.map +0 -1
  123. package/dist/assets/NodeView-FjGatqri.css +0 -1
  124. package/dist/assets/NodeView-oDPyzajr.js.map +0 -1
  125. package/dist/assets/index-suVg9RiN.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MainSidebar-5wv4Ntz3.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/components/ExecutionsUsage.vue","../../src/api/ctas.ts","../../src/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore.ts","../../src/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue","../../src/components/MainSidebarSourceControl.vue","../../src/components/MainSidebar.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style['gift-icon']\">\n\t\t<font-awesome-icon icon=\"gift\" />\n\t\t<div :class=\"$style['notification']\">\n\t\t\t<div></div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.gift-icon {\n\tdisplay: flex;\n\tposition: relative;\n\n\tsvg {\n\t\tmargin-right: 0 !important;\n\t}\n\n\t.notification {\n\t\theight: 0.47em;\n\t\twidth: 0.47em;\n\t\tborder-radius: 50%;\n\t\tcolor: $gift-notification-active-color;\n\t\tposition: absolute;\n\t\tbackground-color: $gift-notification-outer-color;\n\t\tright: -0.3em;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttop: -0.148em;\n\n\t\tdiv {\n\t\t\theight: 0.36em;\n\t\t\twidth: 0.36em;\n\t\t\tbackground-color: $gift-notification-inner-color;\n\t\t\tborder-radius: 50%;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<div v-if=\"isTrialExpired\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\" color=\"danger\">\n\t\t\t\t{{ locale.baseText('executionUsage.expired.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-else-if=\"!isTrialExpired && trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<i18n-t tag=\"span\" keypath=\"executionUsage.currentUsage\">\n\t\t\t\t<template #text>\n\t\t\t\t\t<n8n-text size=\"small\" color=\"text-dark\">\n\t\t\t\t\t\t{{ locale.baseText('executionUsage.currentUsage.text') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t\t<template #count>\n\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"warning\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tlocale.baseText('executionUsage.currentUsage.count', {\n\t\t\t\t\t\t\t\tadjustToNumber: daysLeftOnTrial || 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div v-else-if=\"!trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\">\n\t\t\t\t{{ locale.baseText('executionUsage.ranOutOfExecutions.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-if=\"!isTrialExpired\" :class=\"$style.usageCounter\">\n\t\t\t<div :class=\"$style.progressBarDiv\">\n\t\t\t\t<progress\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\ttrialHasExecutionsLeft ? $style.progressBarSuccess : $style.progressBarDanger,\n\t\t\t\t\t\t$style.progressBar,\n\t\t\t\t\t]\"\n\t\t\t\t\t:value=\"currentExecutionsWithThreshold\"\n\t\t\t\t\t:max=\"maxExecutions\"\n\t\t\t\t></progress>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.executionsCountSection\">\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">\n\t\t\t\t\t{{ currentExecutions }}/{{ maxExecutions }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">{{\n\t\t\t\t\tlocale.baseText('executionUsage.label.executions')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div :class=\"$style.upgradeButtonSection\">\n\t\t\t<n8n-button\n\t\t\t\t:label=\"locale.baseText('executionUsage.button.upgrade')\"\n\t\t\t\tsize=\"xmini\"\n\t\t\t\ticon=\"gem\"\n\t\t\t\ttype=\"success\"\n\t\t\t\t:block=\"true\"\n\t\t\t\t@click=\"onUpgradeClicked\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { i18n as locale } from '@/plugins/i18n';\nimport { DateTime } from 'luxon';\nimport type { CloudPlanAndUsageData } from '@/Interface';\nimport { computed } from 'vue';\nimport { useUIStore } from '@/stores/ui.store';\n\nconst PROGRESS_BAR_MINIMUM_THRESHOLD = 8;\n\nconst props = defineProps<{ cloudPlanData: CloudPlanAndUsageData | null }>();\n\nconst now = DateTime.utc();\n\nconst daysLeftOnTrial = computed(() => {\n\tconst { days = 0 } = getPlanExpirationDate().diff(now, ['days']).toObject();\n\treturn Math.ceil(days);\n});\n\nconst isTrialExpired = computed(() => {\n\tif (!props.cloudPlanData?.expirationDate) return false;\n\tconst trialEndsAt = DateTime.fromISO(props.cloudPlanData.expirationDate);\n\treturn now.toMillis() > trialEndsAt.toMillis();\n});\n\nconst getPlanExpirationDate = () => DateTime.fromISO(props?.cloudPlanData?.expirationDate ?? '');\n\nconst trialHasExecutionsLeft = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\treturn props.cloudPlanData.usage.executions < props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst currentExecutions = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\treturn usedExecutions > executionsQuota ? executionsQuota : usedExecutions;\n});\n\nconst currentExecutionsWithThreshold = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\tconst threshold = (PROGRESS_BAR_MINIMUM_THRESHOLD * executionsQuota) / 100;\n\treturn usedExecutions < threshold ? threshold : usedExecutions;\n});\n\nconst maxExecutions = computed(() => {\n\tif (!props.cloudPlanData?.monthlyExecutionsLimit) return 0;\n\treturn props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst onUpgradeClicked = () => {\n\tvoid useUIStore().goToUpgrade('canvas-nav', 'upgrade-canvas-nav', 'redirect');\n};\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.progressBarDiv {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.progressBar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-webkit-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-moz-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n\n.progressBarSuccess::-moz-progress-bar {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarSuccess::-webkit-progress-value {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-webkit-progress-value {\n\tbackground: var(--color-danger);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-moz-progress-bar {\n\tbackground: var(--color-danger);\n}\n\n.usageText {\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-s);\n\tmargin-top: var(--spacing-xs);\n\tline-height: var(--spacing-xs);\n}\n\n.usageCounter {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-top: var(--spacing-2xs);\n\tfont-size: var(--font-size-3xs);\n}\n\n.danger {\n\tcolor: var(--color-danger);\n}\n\n.executionsCountSection {\n\tmargin-left: var(--spacing-xs);\n}\n\n.upgradeButtonSection {\n\tmargin: var(--spacing-s);\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\n\nexport async function getBecomeCreatorCta(context: IRestApiContext): Promise<boolean> {\n\tconst response = await get(context.baseUrl, '/cta/become-creator');\n\n\treturn response;\n}\n","import { DateTime } from 'luxon';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\nimport { STORES } from '@/constants';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useStorage } from '@/composables/useStorage';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { getBecomeCreatorCta } from '@/api/ctas';\n\nconst LOCAL_STORAGE_KEY = 'N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT';\nconst RESHOW_DISMISSED_AFTER_DAYS = 30;\nconst POLL_INTERVAL_IN_MS = 15 * 60 * 1000; // 15 minutes\n\nexport const useBecomeTemplateCreatorStore = defineStore(STORES.BECOME_TEMPLATE_CREATOR, () => {\n\tconst cloudPlanStore = useCloudPlanStore();\n\tconst rootStore = useRootStore();\n\n\t//#region State\n\n\tconst dismissedAt = useStorage(LOCAL_STORAGE_KEY);\n\tconst ctaMeetsCriteria = ref(false);\n\tconst monitorCtasTimer = ref<ReturnType<typeof setInterval> | null>(null);\n\n\t//#endregion State\n\n\t//#region Computed\n\n\tconst isDismissed = computed(() => {\n\t\treturn dismissedAt.value ? !hasEnoughTimePassedSinceDismissal(dismissedAt.value) : false;\n\t});\n\n\tconst showBecomeCreatorCta = computed(() => {\n\t\treturn ctaMeetsCriteria.value && !cloudPlanStore.userIsTrialing && !isDismissed.value;\n\t});\n\n\t//#endregion Computed\n\n\t//#region Actions\n\n\tconst dismissCta = () => {\n\t\tdismissedAt.value = DateTime.now().toISO();\n\t};\n\n\tconst fetchBecomeCreatorCta = async () => {\n\t\tconst becomeCreatorCta = await getBecomeCreatorCta(rootStore.getRestApiContext);\n\n\t\tctaMeetsCriteria.value = becomeCreatorCta;\n\t};\n\n\tconst fetchUserCtasIfNeeded = async () => {\n\t\tif (isDismissed.value || cloudPlanStore.userIsTrialing || ctaMeetsCriteria.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait fetchBecomeCreatorCta();\n\t};\n\n\tconst startMonitoringCta = () => {\n\t\tif (monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial check after 1s so we don't bombard the API immediately during startup\n\t\tsetTimeout(fetchUserCtasIfNeeded, 1000);\n\n\t\tmonitorCtasTimer.value = setInterval(fetchUserCtasIfNeeded, POLL_INTERVAL_IN_MS);\n\t};\n\n\tconst stopMonitoringCta = () => {\n\t\tif (!monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearInterval(monitorCtasTimer.value);\n\t\tmonitorCtasTimer.value = null;\n\t};\n\n\t//#endregion Actions\n\n\treturn {\n\t\tshowBecomeCreatorCta,\n\t\tdismissCta,\n\t\tstartMonitoringCta,\n\t\tstopMonitoringCta,\n\t};\n});\n\nfunction hasEnoughTimePassedSinceDismissal(dismissedAt: string) {\n\tconst reshowAtTime = DateTime.fromISO(dismissedAt).plus({\n\t\tdays: RESHOW_DISMISSED_AFTER_DAYS,\n\t});\n\n\treturn reshowAtTime <= DateTime.now();\n}\n","<script setup lang=\"ts\">\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useBecomeTemplateCreatorStore } from './becomeTemplateCreatorStore';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\nconst store = useBecomeTemplateCreatorStore();\nconst telemetry = useTelemetry();\n\nconst onClick = () => {\n\ttelemetry.track('User clicked become creator CTA');\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"store.showBecomeCreatorCta\"\n\t\t:class=\"$style.container\"\n\t\tdata-test-id=\"become-template-creator-cta\"\n\t>\n\t\t<div :class=\"$style.textAndCloseButton\">\n\t\t\t<p :class=\"$style.text\">\n\t\t\t\t{{ i18n.baseText('becomeCreator.text') }}\n\t\t\t</p>\n\n\t\t\t<button\n\t\t\t\t:class=\"$style.closeButton\"\n\t\t\t\tdata-test-id=\"close-become-template-creator-cta\"\n\t\t\t\t@click=\"store.dismissCta()\"\n\t\t\t>\n\t\t\t\t<n8n-icon icon=\"times\" size=\"xsmall\" :title=\"i18n.baseText('generic.close')\" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<n8n-button\n\t\t\t:class=\"$style.becomeCreatorButton\"\n\t\t\t:label=\"i18n.baseText('becomeCreator.buttonText')\"\n\t\t\tsize=\"xmini\"\n\t\t\ttype=\"secondary\"\n\t\t\telement=\"a\"\n\t\t\thref=\"https://creators.n8n.io/hub\"\n\t\t\ttarget=\"_blank\"\n\t\t\t@click=\"onClick\"\n\t\t/>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.textAndCloseButton {\n\tdisplay: flex;\n\tmargin-top: var(--spacing-xs);\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-2xs);\n}\n\n.text {\n\tflex: 1;\n\tfont-size: var(--font-size-3xs);\n\tline-height: var(--font-line-height-compact);\n}\n\n.closeButton {\n\tflex: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: var(--spacing-2xs);\n\theight: var(--spacing-2xs);\n\tborder: none;\n\tcolor: var(--color-text-light);\n\tbackground-color: transparent;\n\tcursor: pointer;\n}\n\n.becomeCreatorButton {\n\tmargin: var(--spacing-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { useI18n } from '@/composables/useI18n';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { SOURCE_CONTROL_PULL_MODAL_KEY, SOURCE_CONTROL_PUSH_MODAL_KEY, VIEWS } from '@/constants';\nimport type { SourceControlAggregatedFile } from '../Interface';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\n\nconst props = defineProps<{\n\tisCollapsed: boolean;\n}>();\n\nconst responseStatuses = {\n\tCONFLICT: 409,\n};\n\nconst router = useRouter();\nconst loadingService = useLoadingService();\nconst uiStore = useUIStore();\nconst sourceControlStore = useSourceControlStore();\nconst toast = useToast();\nconst i18n = useI18n();\n\nconst eventBus = createEventBus();\nconst tooltipOpenDelay = ref(300);\n\nconst currentBranch = computed(() => {\n\treturn sourceControlStore.preferences.branchName;\n});\nconst sourceControlAvailable = computed(\n\t() =>\n\t\tsourceControlStore.isEnterpriseSourceControlEnabled &&\n\t\thasPermission(['rbac'], { rbac: { scope: 'sourceControl:manage' } }),\n);\n\nasync function pushWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.checkingForChanges'));\n\ttry {\n\t\tconst status = await sourceControlStore.getAggregatedStatus();\n\n\t\tuiStore.openModalWithData({\n\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\tdata: { eventBus, status },\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('error'));\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nasync function pullWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.pull'));\n\n\ttry {\n\t\tconst status: SourceControlAggregatedFile[] =\n\t\t\t((await sourceControlStore.pullWorkfolder(\n\t\t\t\tfalse,\n\t\t\t)) as unknown as SourceControlAggregatedFile[]) || [];\n\n\t\tconst statusWithoutLocallyCreatedWorkflows = status.filter((file) => {\n\t\t\treturn !(file.type === 'workflow' && file.status === 'created' && file.location === 'local');\n\t\t});\n\t\tif (statusWithoutLocallyCreatedWorkflows.length === 0) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.upToDate.title'),\n\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.upToDate.description'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.success.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\tconst incompleteFileTypes = ['variables', 'credential'];\n\t\t\tconst hasVariablesOrCredentials = (status || []).some((file) => {\n\t\t\t\treturn incompleteFileTypes.includes(file.type);\n\t\t\t});\n\n\t\t\tif (hasVariablesOrCredentials) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\ttoast.showMessage({\n\t\t\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.oneLastStep.description'),\n\t\t\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.oneLastStep.title'),\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tsourceControlEventBus.emit('pull');\n\t} catch (error) {\n\t\tconst errorResponse = error.response;\n\n\t\tif (errorResponse?.status === responseStatuses.CONFLICT) {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: SOURCE_CONTROL_PULL_MODAL_KEY,\n\t\t\t\tdata: { eventBus, status: errorResponse.data.data },\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showError(error, 'Error');\n\t\t}\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nconst goToSourceControlSetup = async () => {\n\tawait router.push({ name: VIEWS.SOURCE_CONTROL });\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"sourceControlAvailable\"\n\t\t:class=\"{\n\t\t\t[$style.sync]: true,\n\t\t\t[$style.collapsed]: isCollapsed,\n\t\t\t[$style.isConnected]: sourceControlStore.isEnterpriseSourceControlEnabled,\n\t\t}\"\n\t\t:style=\"{ borderLeftColor: sourceControlStore.preferences.branchColor }\"\n\t\tdata-test-id=\"main-sidebar-source-control\"\n\t>\n\t\t<div\n\t\t\tv-if=\"sourceControlStore.preferences.connected && sourceControlStore.preferences.branchName\"\n\t\t\t:class=\"$style.connected\"\n\t\t\tdata-test-id=\"main-sidebar-source-control-connected\"\n\t\t>\n\t\t\t<span :class=\"$style.branchName\">\n\t\t\t\t<n8n-icon icon=\"code-branch\" />\n\t\t\t\t{{ currentBranch }}\n\t\t\t</span>\n\t\t\t<div :class=\"{ 'pt-xs': !isCollapsed }\">\n\t\t\t\t<n8n-tooltip :disabled=\"!isCollapsed\" :show-after=\"tooltipOpenDelay\" placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.pull') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'mr-2xs': !isCollapsed,\n\t\t\t\t\t\t\t'mb-2xs': isCollapsed && !sourceControlStore.preferences.branchReadOnly,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\ticon=\"arrow-down\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.pull')\"\n\t\t\t\t\t\t@click=\"pullWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-if=\"!sourceControlStore.preferences.branchReadOnly\"\n\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t:show-after=\"tooltipOpenDelay\"\n\t\t\t\t\tplacement=\"right\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.push') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.push')\"\n\t\t\t\t\t\ticon=\"arrow-up\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t@click=\"pushWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.sync {\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 calc(var(--spacing-2xs) * -1);\n\tbackground: var(--color-background-light);\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tfont-size: var(--font-size-2xs);\n\n\t&.isConnected {\n\t\tpadding-left: var(--spacing-m);\n\t\tborder-left: var(--spacing-3xs) var(--border-style-base) var(--color-foreground-base);\n\n\t\t&.collapsed {\n\t\t\tpadding-left: var(--spacing-xs);\n\t\t}\n\t}\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n\n\tbutton {\n\t\tfont-size: var(--font-size-3xs);\n\t}\n}\n\n.branchName {\n\twhite-space: normal;\n\tline-break: anywhere;\n}\n\n.collapsed {\n\ttext-align: center;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n\n\t.connected {\n\t\t> span {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n</style>\n","<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</template>\n\n\t\t\t<template #beforeLowerMenu>\n\t\t\t\t<BecomeTemplateCreatorCta v-if=\"fullyExpanded && !userIsTrialing\" />\n\t\t\t\t<ExecutionsUsage\n\t\t\t\t\tv-if=\"fullyExpanded && userIsTrialing\"\n\t\t\t\t\t:cloud-plan-data=\"currentPlanAndUsageData\"\n\t\t\t/></template>\n\t\t\t<template #menuSuffix>\n\t\t\t\t<div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"hasVersionUpdates\"\n\t\t\t\t\t\tdata-test-id=\"version-updates-panel-button\"\n\t\t\t\t\t\t:class=\"$style.updates\"\n\t\t\t\t\t\t@click=\"openUpdatesPanel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div :class=\"$style.giftContainer\">\n\t\t\t\t\t\t\t<GiftNotificationIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<n8n-text\n\t\t\t\t\t\t\t:class=\"{ ['ml-xs']: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ nextVersions.length > 99 ? '99+' : nextVersions.length }} update{{\n\t\t\t\t\t\t\t\tnextVersions.length > 1 ? 's' : ''\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<MainSidebarSourceControl :is-collapsed=\"isCollapsed\" />\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"showUserArea\" #footer>\n\t\t\t\t<div :class=\"$style.userArea\">\n\t\t\t\t\t<div class=\"ml-3xs\" data-test-id=\"main-sidebar-user-menu\">\n\t\t\t\t\t\t<!-- This dropdown is only enabled when sidebar is collapsed -->\n\t\t\t\t\t\t<el-dropdown\n\t\t\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\t\t\t@command=\"onUserActionToggle\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :class=\"{ [$style.avatar]: true, ['clickable']: isCollapsed }\">\n\t\t\t\t\t\t\t\t<n8n-avatar\n\t\t\t\t\t\t\t\t\t:first-name=\"usersStore.currentUser.firstName\"\n\t\t\t\t\t\t\t\t\t:last-name=\"usersStore.currentUser.lastName\"\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<template #dropdown>\n\t\t\t\t\t\t\t\t<el-dropdown-menu>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"settings\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('settings') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"logout\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('auth.signout') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t</el-dropdown-menu>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</el-dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"{ ['ml-2xs']: true, [$style.userName]: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"text-dark\">{{\n\t\t\t\t\t\t\tusersStore.currentUser.fullName\n\t\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div :class=\"{ [$style.userActions]: true, [$style.expanded]: fullyExpanded }\">\n\t\t\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\t\t\t:items=\"userMenuItems\"\n\t\t\t\t\t\t\tplacement=\"top-start\"\n\t\t\t\t\t\t\tdata-test-id=\"user-menu\"\n\t\t\t\t\t\t\t@select=\"onUserActionToggle\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-menu>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { CloudPlanAndUsageData, IExecutionResponse, IMenuItem, IVersion } from '@/Interface';\nimport GiftNotificationIcon from './GiftNotificationIcon.vue';\n\nimport { useMessage } from '@/composables/useMessage';\nimport { ABOUT_MODAL_KEY, VERSIONS_MODAL_KEY, VIEWS } from '@/constants';\nimport { userHelpers } from '@/mixins/userHelpers';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useVersionsStore } from '@/stores/versions.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport ExecutionsUsage from '@/components/ExecutionsUsage.vue';\nimport BecomeTemplateCreatorCta from '@/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useBecomeTemplateCreatorStore } from '@/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tExecutionsUsage,\n\t\tMainSidebarSourceControl,\n\t\tBecomeTemplateCreatorCta,\n\t},\n\tmixins: [userHelpers],\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tcallDebounced,\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbasePath: '',\n\t\t\tfullyExpanded: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsersStore,\n\t\t\tuseVersionsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseCloudPlanStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseBecomeTemplateCreatorStore,\n\t\t\tuseTemplatesStore,\n\t\t),\n\t\tlogoPath(): string {\n\t\t\treturn this.basePath + (this.isCollapsed ? 'static/logo/collapsed.svg' : this.uiStore.logo);\n\t\t},\n\t\thasVersionUpdates(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.settingsStore.settings.releaseChannel === 'stable' &&\n\t\t\t\tthis.versionsStore.hasVersionUpdates\n\t\t\t);\n\t\t},\n\t\tnextVersions(): IVersion[] {\n\t\t\treturn this.versionsStore.nextVersions;\n\t\t},\n\t\tisCollapsed(): boolean {\n\t\t\treturn this.uiStore.sidebarMenuCollapsed;\n\t\t},\n\t\tcanUserAccessSettings(): boolean {\n\t\t\tconst accessibleRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\treturn accessibleRoute !== null;\n\t\t},\n\t\tshowUserArea(): boolean {\n\t\t\treturn hasPermission(['authenticated']);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tuserMenuItems(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'logout',\n\t\t\t\t\tlabel: this.$locale.baseText('auth.signout'),\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tmainMenuItems(): IMenuItem[] {\n\t\t\tconst items: IMenuItem[] = [];\n\n\t\t\tconst workflows: IMenuItem = {\n\t\t\t\tid: 'workflows',\n\t\t\t\ticon: 'network-wired',\n\t\t\t\tlabel: this.$locale.baseText('mainSidebar.workflows'),\n\t\t\t\tposition: 'top',\n\t\t\t\troute: { to: { name: VIEWS.WORKFLOWS } },\n\t\t\t\tsecondaryIcon: this.sourceControlStore.preferences.branchReadOnly\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: 'lock',\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tcontent: this.$locale.baseText('mainSidebar.workflows.readOnlyEnv.tooltip'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t }\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\tconst defaultSettingsRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\tconst regularItems: IMenuItem[] = [\n\t\t\t\tworkflows,\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: 'top',\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: 'top',\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.getWebsiteTemplateRepositoryURL,\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: 'credentials',\n\t\t\t\t\ticon: 'key',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.credentials'),\n\t\t\t\t\tcustomIconSize: 'medium',\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\troute: { to: { name: VIEWS.CREDENTIALS } },\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: 'top',\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: 'top',\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: 'cloud-admin',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tlabel: 'Admin Panel',\n\t\t\t\t\ticon: 'home',\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\tid: 'settings',\n\t\t\t\t\ticon: 'cog',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable: this.canUserAccessSettings && this.usersStore.currentUser !== null,\n\t\t\t\t\tactivateOnRouteNames: [VIEWS.USERS_SETTINGS, VIEWS.API_SETTINGS, VIEWS.PERSONAL_SETTINGS],\n\t\t\t\t\troute: { to: defaultSettingsRoute },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'help',\n\t\t\t\t\ticon: 'question',\n\t\t\t\t\tlabel: 'Help',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'quickstart',\n\t\t\t\t\t\t\ticon: 'video',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.quickstart'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'docs',\n\t\t\t\t\t\t\ticon: 'book',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.documentation'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'forum',\n\t\t\t\t\t\t\ticon: 'users',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.forum'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'examples',\n\t\t\t\t\t\t\ticon: 'graduation-cap',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.course'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'about',\n\t\t\t\t\t\t\ticon: 'info',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.aboutN8n'),\n\t\t\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn [...items, ...regularItems];\n\t\t},\n\t\tuserIsTrialing(): boolean {\n\t\t\treturn this.cloudPlanStore.userIsTrialing;\n\t\t},\n\t\tcurrentPlanAndUsageData(): CloudPlanAndUsageData | null {\n\t\t\tconst planData = this.cloudPlanStore.currentPlanData;\n\t\t\tconst usage = this.cloudPlanStore.currentUsageData;\n\t\t\tif (!planData || !usage) return null;\n\t\t\treturn {\n\t\t\t\t...planData,\n\t\t\t\tusage,\n\t\t\t};\n\t\t},\n\t},\n\tasync mounted() {\n\t\tthis.basePath = this.rootStore.baseUrl;\n\t\tif (this.$refs.user) {\n\t\t\tvoid this.externalHooks.run('mainSidebar.mounted', {\n\t\t\t\tuserRef: this.$refs.user as Element,\n\t\t\t});\n\t\t}\n\n\t\tvoid this.$nextTick(() => {\n\t\t\tif (window.innerWidth < 900 || this.uiStore.isNodeView) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t} else {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = false;\n\t\t\t}\n\n\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t});\n\n\t\tthis.becomeTemplateCreatorStore.startMonitoringCta();\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\tthis.becomeTemplateCreatorStore.stopMonitoringCta();\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\ttrackHelpItemClick(itemType: string) {\n\t\t\tthis.$telemetry.track('User clicked help resource', {\n\t\t\t\ttype: itemType,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\ttrackTemplatesClick() {\n\t\t\tthis.$telemetry.track('User clicked on templates', {});\n\t\t},\n\t\tasync onUserActionToggle(action: string) {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'logout':\n\t\t\t\t\tthis.onLogout();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'settings':\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.PERSONAL_SETTINGS });\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tonLogout() {\n\t\t\tvoid this.$router.push({ name: VIEWS.SIGNOUT });\n\t\t},\n\t\ttoggleCollapse() {\n\t\t\tthis.uiStore.toggleSidebarMenuCollapse();\n\t\t\t// When expanding, delay showing some element to ensure smooth animation\n\t\t\tif (!this.isCollapsed) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t\t}, 300);\n\t\t\t} else {\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t\topenUpdatesPanel() {\n\t\t\tthis.uiStore.openModal(VERSIONS_MODAL_KEY);\n\t\t},\n\t\tasync handleSelect(key: string) {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'templates':\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled &&\n\t\t\t\t\t\t!this.templatesStore.hasCustomTemplatesHost\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.trackTemplatesClick();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'about': {\n\t\t\t\t\tthis.trackHelpItemClick('about');\n\t\t\t\t\tthis.uiStore.openModal(ABOUT_MODAL_KEY);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'cloud-admin': {\n\t\t\t\t\tvoid this.cloudPlanStore.redirectToDashboard();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'quickstart':\n\t\t\t\tcase 'docs':\n\t\t\t\tcase 'forum':\n\t\t\t\tcase 'examples': {\n\t\t\t\t\tthis.trackHelpItemClick(key);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tfindFirstAccessibleSettingsRoute() {\n\t\t\tconst settingsRoutes = this.$router\n\t\t\t\t.getRoutes()\n\t\t\t\t.find((route) => route.path === '/settings')!\n\t\t\t\t.children.map((route) => route.name ?? '');\n\n\t\t\tlet defaultSettingsRoute = { name: VIEWS.USERS_SETTINGS };\n\t\t\tfor (const route of settingsRoutes) {\n\t\t\t\tif (this.canUserAccessRouteByName(route.toString())) {\n\t\t\t\t\tdefaultSettingsRoute = {\n\t\t\t\t\t\tname: route.toString() as VIEWS,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn defaultSettingsRoute;\n\t\t},\n\t\tonResize(event: UIEvent) {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 100 }, event);\n\t\t},\n\t\tasync onResizeEnd(event: UIEvent) {\n\t\t\tconst browserWidth = (event.target as Window).outerWidth;\n\t\t\tawait this.checkWidthAndAdjustSidebar(browserWidth);\n\t\t},\n\t\tasync checkWidthAndAdjustSidebar(width: number) {\n\t\t\tif (width < 900) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t\tawait this.$nextTick();\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.sideMenu {\n\tposition: relative;\n\theight: 100%;\n\tborder-right: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\ttransition: width 150ms ease-in-out;\n\twidth: $sidebar-expanded-width;\n\t.logo {\n\t\theight: $header-height;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding: var(--spacing-xs);\n\n\t\timg {\n\t\t\tposition: relative;\n\t\t\tleft: 1px;\n\t\t\theight: 20px;\n\t\t}\n\t}\n\n\t&.sideMenuCollapsed {\n\t\twidth: $sidebar-width;\n\n\t\t.logo img {\n\t\t\tleft: 0;\n\t\t}\n\t}\n}\n\n.sideMenuCollapseButton {\n\tposition: absolute;\n\tright: -10px;\n\ttop: 50%;\n\tz-index: 999;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tcolor: var(--color-text-base);\n\tbackground-color: var(--color-foreground-xlight);\n\twidth: 20px;\n\theight: 20px;\n\tborder: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-radius: 50%;\n\n\t&:hover {\n\t\tcolor: var(--color-primary-shade-1);\n\t}\n}\n\n.updates {\n\tdisplay: flex;\n\talign-items: center;\n\tcursor: pointer;\n\tpadding: var(--spacing-2xs) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 0;\n\n\tsvg {\n\t\tcolor: var(--color-text-base) !important;\n\t}\n\tspan {\n\t\tdisplay: none;\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n\n\t&:hover {\n\t\t&,\n\t\t& svg {\n\t\t\tcolor: var(--color-text-dark) !important;\n\t\t}\n\t}\n}\n\n.userArea {\n\tdisplay: flex;\n\tpadding: var(--spacing-xs);\n\talign-items: center;\n\theight: 60px;\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\n\t.userName {\n\t\tdisplay: none;\n\t\toverflow: hidden;\n\t\twidth: 100px;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\n\t\tspan {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t.userActions {\n\t\tdisplay: none;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n}\n\n@media screen and (max-height: 470px) {\n\t:global(#help) {\n\t\tdisplay: none;\n\t}\n}\n</style>\n"],"names":["_hoisted_2","_openBlock","_createVNode","_component_font_awesome_icon","_normalizeClass","_ctx","PROGRESS_BAR_MINIMUM_THRESHOLD","props","__props","now","DateTime","daysLeftOnTrial","computed","days","getPlanExpirationDate","isTrialExpired","_a","trialEndsAt","trialHasExecutionsLeft","currentExecutions","usedExecutions","executionsQuota","currentExecutionsWithThreshold","threshold","maxExecutions","onUpgradeClicked","useUIStore","getBecomeCreatorCta","context","get","LOCAL_STORAGE_KEY","RESHOW_DISMISSED_AFTER_DAYS","POLL_INTERVAL_IN_MS","useBecomeTemplateCreatorStore","defineStore","STORES","cloudPlanStore","useCloudPlanStore","rootStore","useRootStore","dismissedAt","useStorage","ctaMeetsCriteria","ref","monitorCtasTimer","isDismissed","hasEnoughTimePassedSinceDismissal","showBecomeCreatorCta","dismissCta","fetchBecomeCreatorCta","becomeCreatorCta","fetchUserCtasIfNeeded","i18n","useI18n","store","telemetry","useTelemetry","onClick","responseStatuses","useRouter","loadingService","useLoadingService","uiStore","sourceControlStore","useSourceControlStore","toast","useToast","eventBus","createEventBus","tooltipOpenDelay","currentBranch","sourceControlAvailable","hasPermission","pushWorkfolder","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","pullWorkfolder","file","incompleteFileTypes","nextTick","sourceControlEventBus","errorResponse","SOURCE_CONTROL_PULL_MODAL_KEY","_sfc_main","defineComponent","GiftNotificationIcon","ExecutionsUsage","MainSidebarSourceControl","BecomeTemplateCreatorCta","userHelpers","ctx","externalHooks","useExternalHooks","callDebounced","useDebounce","useMessage","mapStores","useSettingsStore","useUsersStore","useVersionsStore","useWorkflowsStore","useTemplatesStore","items","workflows","VIEWS","defaultSettingsRoute","regularItems","planData","usage","itemType","action","VERSIONS_MODAL_KEY","key","ABOUT_MODAL_KEY","settingsRoutes","route","event","browserWidth","width","_hoisted_1","_resolveComponent","_createElementBlock","$style","_createElementVNode","isCollapsed","_cache","args","_createBlock","_component_n8n_icon","handleSelect","_createSlots","_withCtx","fullyExpanded","userIsTrialing","currentPlanAndUsageData","_createCommentVNode","hasVersionUpdates","_component_GiftNotificationIcon","_component_n8n_text","_createTextVNode","_toDisplayString","showUserArea","_component_el_dropdown","onUserActionToggle","_component_el_dropdown_menu","_component_el_dropdown_item","$locale","_component_n8n_avatar","_component_n8n_action_dropdown"],"mappings":"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"}
1
+ {"version":3,"file":"MainSidebar-h-btynOF.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/components/ExecutionsUsage.vue","../../src/api/ctas.ts","../../src/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore.ts","../../src/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue","../../src/components/MainSidebarSourceControl.vue","../../src/components/MainSidebar.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style['gift-icon']\">\n\t\t<font-awesome-icon icon=\"gift\" />\n\t\t<div :class=\"$style['notification']\">\n\t\t\t<div></div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.gift-icon {\n\tdisplay: flex;\n\tposition: relative;\n\n\tsvg {\n\t\tmargin-right: 0 !important;\n\t}\n\n\t.notification {\n\t\theight: 0.47em;\n\t\twidth: 0.47em;\n\t\tborder-radius: 50%;\n\t\tcolor: $gift-notification-active-color;\n\t\tposition: absolute;\n\t\tbackground-color: $gift-notification-outer-color;\n\t\tright: -0.3em;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttop: -0.148em;\n\n\t\tdiv {\n\t\t\theight: 0.36em;\n\t\t\twidth: 0.36em;\n\t\t\tbackground-color: $gift-notification-inner-color;\n\t\t\tborder-radius: 50%;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<div v-if=\"isTrialExpired\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\" color=\"danger\">\n\t\t\t\t{{ locale.baseText('executionUsage.expired.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-else-if=\"!isTrialExpired && trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<i18n-t tag=\"span\" keypath=\"executionUsage.currentUsage\">\n\t\t\t\t<template #text>\n\t\t\t\t\t<n8n-text size=\"small\" color=\"text-dark\">\n\t\t\t\t\t\t{{ locale.baseText('executionUsage.currentUsage.text') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t\t<template #count>\n\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"warning\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tlocale.baseText('executionUsage.currentUsage.count', {\n\t\t\t\t\t\t\t\tadjustToNumber: daysLeftOnTrial || 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div v-else-if=\"!trialHasExecutionsLeft\" :class=\"$style.usageText\">\n\t\t\t<n8n-text size=\"small\">\n\t\t\t\t{{ locale.baseText('executionUsage.ranOutOfExecutions.text') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div v-if=\"!isTrialExpired\" :class=\"$style.usageCounter\">\n\t\t\t<div :class=\"$style.progressBarDiv\">\n\t\t\t\t<progress\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\ttrialHasExecutionsLeft ? $style.progressBarSuccess : $style.progressBarDanger,\n\t\t\t\t\t\t$style.progressBar,\n\t\t\t\t\t]\"\n\t\t\t\t\t:value=\"currentExecutionsWithThreshold\"\n\t\t\t\t\t:max=\"maxExecutions\"\n\t\t\t\t></progress>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.executionsCountSection\">\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">\n\t\t\t\t\t{{ currentExecutions }}/{{ maxExecutions }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-text size=\"xsmall\" :color=\"trialHasExecutionsLeft ? 'text-dark' : 'danger'\">{{\n\t\t\t\t\tlocale.baseText('executionUsage.label.executions')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div :class=\"$style.upgradeButtonSection\">\n\t\t\t<n8n-button\n\t\t\t\t:label=\"locale.baseText('executionUsage.button.upgrade')\"\n\t\t\t\tsize=\"xmini\"\n\t\t\t\ticon=\"gem\"\n\t\t\t\ttype=\"success\"\n\t\t\t\t:block=\"true\"\n\t\t\t\t@click=\"onUpgradeClicked\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { i18n as locale } from '@/plugins/i18n';\nimport { DateTime } from 'luxon';\nimport type { CloudPlanAndUsageData } from '@/Interface';\nimport { computed } from 'vue';\nimport { useUIStore } from '@/stores/ui.store';\n\nconst PROGRESS_BAR_MINIMUM_THRESHOLD = 8;\n\nconst props = defineProps<{ cloudPlanData: CloudPlanAndUsageData | null }>();\n\nconst now = DateTime.utc();\n\nconst daysLeftOnTrial = computed(() => {\n\tconst { days = 0 } = getPlanExpirationDate().diff(now, ['days']).toObject();\n\treturn Math.ceil(days);\n});\n\nconst isTrialExpired = computed(() => {\n\tif (!props.cloudPlanData?.expirationDate) return false;\n\tconst trialEndsAt = DateTime.fromISO(props.cloudPlanData.expirationDate);\n\treturn now.toMillis() > trialEndsAt.toMillis();\n});\n\nconst getPlanExpirationDate = () => DateTime.fromISO(props?.cloudPlanData?.expirationDate ?? '');\n\nconst trialHasExecutionsLeft = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\treturn props.cloudPlanData.usage.executions < props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst currentExecutions = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\treturn usedExecutions > executionsQuota ? executionsQuota : usedExecutions;\n});\n\nconst currentExecutionsWithThreshold = computed(() => {\n\tif (!props.cloudPlanData?.usage) return 0;\n\tconst usedExecutions = props.cloudPlanData.usage.executions;\n\tconst executionsQuota = props.cloudPlanData.monthlyExecutionsLimit;\n\tconst threshold = (PROGRESS_BAR_MINIMUM_THRESHOLD * executionsQuota) / 100;\n\treturn usedExecutions < threshold ? threshold : usedExecutions;\n});\n\nconst maxExecutions = computed(() => {\n\tif (!props.cloudPlanData?.monthlyExecutionsLimit) return 0;\n\treturn props.cloudPlanData.monthlyExecutionsLimit;\n});\n\nconst onUpgradeClicked = () => {\n\tvoid useUIStore().goToUpgrade('canvas-nav', 'upgrade-canvas-nav', 'redirect');\n};\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.progressBarDiv {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.progressBar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-webkit-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n.progressBar::-moz-progress-bar {\n\twidth: 62.4px;\n\tborder: 0;\n\theight: 5px;\n\tborder-radius: 20px;\n\tbackground-color: var(--color-foreground-base);\n}\n\n.progressBarSuccess::-moz-progress-bar {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarSuccess::-webkit-progress-value {\n\tbackground: var(--color-foreground-xdark);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-webkit-progress-value {\n\tbackground: var(--color-danger);\n\tborder-radius: 20px;\n}\n\n.progressBarDanger::-moz-progress-bar {\n\tbackground: var(--color-danger);\n}\n\n.usageText {\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-s);\n\tmargin-top: var(--spacing-xs);\n\tline-height: var(--spacing-xs);\n}\n\n.usageCounter {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-top: var(--spacing-2xs);\n\tfont-size: var(--font-size-3xs);\n}\n\n.danger {\n\tcolor: var(--color-danger);\n}\n\n.executionsCountSection {\n\tmargin-left: var(--spacing-xs);\n}\n\n.upgradeButtonSection {\n\tmargin: var(--spacing-s);\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\n\nexport async function getBecomeCreatorCta(context: IRestApiContext): Promise<boolean> {\n\tconst response = await get(context.baseUrl, '/cta/become-creator');\n\n\treturn response;\n}\n","import { DateTime } from 'luxon';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\nimport { STORES } from '@/constants';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useStorage } from '@/composables/useStorage';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { getBecomeCreatorCta } from '@/api/ctas';\n\nconst LOCAL_STORAGE_KEY = 'N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT';\nconst RESHOW_DISMISSED_AFTER_DAYS = 30;\nconst POLL_INTERVAL_IN_MS = 15 * 60 * 1000; // 15 minutes\n\nexport const useBecomeTemplateCreatorStore = defineStore(STORES.BECOME_TEMPLATE_CREATOR, () => {\n\tconst cloudPlanStore = useCloudPlanStore();\n\tconst rootStore = useRootStore();\n\n\t//#region State\n\n\tconst dismissedAt = useStorage(LOCAL_STORAGE_KEY);\n\tconst ctaMeetsCriteria = ref(false);\n\tconst monitorCtasTimer = ref<ReturnType<typeof setInterval> | null>(null);\n\n\t//#endregion State\n\n\t//#region Computed\n\n\tconst isDismissed = computed(() => {\n\t\treturn dismissedAt.value ? !hasEnoughTimePassedSinceDismissal(dismissedAt.value) : false;\n\t});\n\n\tconst showBecomeCreatorCta = computed(() => {\n\t\treturn ctaMeetsCriteria.value && !cloudPlanStore.userIsTrialing && !isDismissed.value;\n\t});\n\n\t//#endregion Computed\n\n\t//#region Actions\n\n\tconst dismissCta = () => {\n\t\tdismissedAt.value = DateTime.now().toISO();\n\t};\n\n\tconst fetchBecomeCreatorCta = async () => {\n\t\tconst becomeCreatorCta = await getBecomeCreatorCta(rootStore.getRestApiContext);\n\n\t\tctaMeetsCriteria.value = becomeCreatorCta;\n\t};\n\n\tconst fetchUserCtasIfNeeded = async () => {\n\t\tif (isDismissed.value || cloudPlanStore.userIsTrialing || ctaMeetsCriteria.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait fetchBecomeCreatorCta();\n\t};\n\n\tconst startMonitoringCta = () => {\n\t\tif (monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial check after 1s so we don't bombard the API immediately during startup\n\t\tsetTimeout(fetchUserCtasIfNeeded, 1000);\n\n\t\tmonitorCtasTimer.value = setInterval(fetchUserCtasIfNeeded, POLL_INTERVAL_IN_MS);\n\t};\n\n\tconst stopMonitoringCta = () => {\n\t\tif (!monitorCtasTimer.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearInterval(monitorCtasTimer.value);\n\t\tmonitorCtasTimer.value = null;\n\t};\n\n\t//#endregion Actions\n\n\treturn {\n\t\tshowBecomeCreatorCta,\n\t\tdismissCta,\n\t\tstartMonitoringCta,\n\t\tstopMonitoringCta,\n\t};\n});\n\nfunction hasEnoughTimePassedSinceDismissal(dismissedAt: string) {\n\tconst reshowAtTime = DateTime.fromISO(dismissedAt).plus({\n\t\tdays: RESHOW_DISMISSED_AFTER_DAYS,\n\t});\n\n\treturn reshowAtTime <= DateTime.now();\n}\n","<script setup lang=\"ts\">\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useBecomeTemplateCreatorStore } from './becomeTemplateCreatorStore';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\nconst store = useBecomeTemplateCreatorStore();\nconst telemetry = useTelemetry();\n\nconst onClick = () => {\n\ttelemetry.track('User clicked become creator CTA');\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"store.showBecomeCreatorCta\"\n\t\t:class=\"$style.container\"\n\t\tdata-test-id=\"become-template-creator-cta\"\n\t>\n\t\t<div :class=\"$style.textAndCloseButton\">\n\t\t\t<p :class=\"$style.text\">\n\t\t\t\t{{ i18n.baseText('becomeCreator.text') }}\n\t\t\t</p>\n\n\t\t\t<button\n\t\t\t\t:class=\"$style.closeButton\"\n\t\t\t\tdata-test-id=\"close-become-template-creator-cta\"\n\t\t\t\t@click=\"store.dismissCta()\"\n\t\t\t>\n\t\t\t\t<n8n-icon icon=\"times\" size=\"xsmall\" :title=\"i18n.baseText('generic.close')\" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<n8n-button\n\t\t\t:class=\"$style.becomeCreatorButton\"\n\t\t\t:label=\"i18n.baseText('becomeCreator.buttonText')\"\n\t\t\tsize=\"xmini\"\n\t\t\ttype=\"secondary\"\n\t\t\telement=\"a\"\n\t\t\thref=\"https://creators.n8n.io/hub\"\n\t\t\ttarget=\"_blank\"\n\t\t\t@click=\"onClick\"\n\t\t/>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: var(--color-background-light);\n\tborder: var(--border-base);\n\tborder-right: 0;\n}\n\n.textAndCloseButton {\n\tdisplay: flex;\n\tmargin-top: var(--spacing-xs);\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-2xs);\n}\n\n.text {\n\tflex: 1;\n\tfont-size: var(--font-size-3xs);\n\tline-height: var(--font-line-height-compact);\n}\n\n.closeButton {\n\tflex: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: var(--spacing-2xs);\n\theight: var(--spacing-2xs);\n\tborder: none;\n\tcolor: var(--color-text-light);\n\tbackground-color: transparent;\n\tcursor: pointer;\n}\n\n.becomeCreatorButton {\n\tmargin: var(--spacing-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { useI18n } from '@/composables/useI18n';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { SOURCE_CONTROL_PULL_MODAL_KEY, SOURCE_CONTROL_PUSH_MODAL_KEY, VIEWS } from '@/constants';\nimport type { SourceControlAggregatedFile } from '../Interface';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\n\nconst props = defineProps<{\n\tisCollapsed: boolean;\n}>();\n\nconst responseStatuses = {\n\tCONFLICT: 409,\n};\n\nconst router = useRouter();\nconst loadingService = useLoadingService();\nconst uiStore = useUIStore();\nconst sourceControlStore = useSourceControlStore();\nconst toast = useToast();\nconst i18n = useI18n();\n\nconst eventBus = createEventBus();\nconst tooltipOpenDelay = ref(300);\n\nconst currentBranch = computed(() => {\n\treturn sourceControlStore.preferences.branchName;\n});\nconst sourceControlAvailable = computed(\n\t() =>\n\t\tsourceControlStore.isEnterpriseSourceControlEnabled &&\n\t\thasPermission(['rbac'], { rbac: { scope: 'sourceControl:manage' } }),\n);\n\nasync function pushWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.checkingForChanges'));\n\ttry {\n\t\tconst status = await sourceControlStore.getAggregatedStatus();\n\n\t\tuiStore.openModalWithData({\n\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\tdata: { eventBus, status },\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('error'));\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nasync function pullWorkfolder() {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(i18n.baseText('settings.sourceControl.loading.pull'));\n\n\ttry {\n\t\tconst status: SourceControlAggregatedFile[] =\n\t\t\t((await sourceControlStore.pullWorkfolder(\n\t\t\t\tfalse,\n\t\t\t)) as unknown as SourceControlAggregatedFile[]) || [];\n\n\t\tconst statusWithoutLocallyCreatedWorkflows = status.filter((file) => {\n\t\t\treturn !(file.type === 'workflow' && file.status === 'created' && file.location === 'local');\n\t\t});\n\t\tif (statusWithoutLocallyCreatedWorkflows.length === 0) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.upToDate.title'),\n\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.upToDate.description'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.success.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\tconst incompleteFileTypes = ['variables', 'credential'];\n\t\t\tconst hasVariablesOrCredentials = (status || []).some((file) => {\n\t\t\t\treturn incompleteFileTypes.includes(file.type);\n\t\t\t});\n\n\t\t\tif (hasVariablesOrCredentials) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\ttoast.showMessage({\n\t\t\t\t\t\tmessage: i18n.baseText('settings.sourceControl.pull.oneLastStep.description'),\n\t\t\t\t\t\ttitle: i18n.baseText('settings.sourceControl.pull.oneLastStep.title'),\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tsourceControlEventBus.emit('pull');\n\t} catch (error) {\n\t\tconst errorResponse = error.response;\n\n\t\tif (errorResponse?.status === responseStatuses.CONFLICT) {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: SOURCE_CONTROL_PULL_MODAL_KEY,\n\t\t\t\tdata: { eventBus, status: errorResponse.data.data },\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showError(error, 'Error');\n\t\t}\n\t} finally {\n\t\tloadingService.stopLoading();\n\t\tloadingService.setLoadingText(i18n.baseText('genericHelpers.loading'));\n\t}\n}\n\nconst goToSourceControlSetup = async () => {\n\tawait router.push({ name: VIEWS.SOURCE_CONTROL });\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"sourceControlAvailable\"\n\t\t:class=\"{\n\t\t\t[$style.sync]: true,\n\t\t\t[$style.collapsed]: isCollapsed,\n\t\t\t[$style.isConnected]: sourceControlStore.isEnterpriseSourceControlEnabled,\n\t\t}\"\n\t\t:style=\"{ borderLeftColor: sourceControlStore.preferences.branchColor }\"\n\t\tdata-test-id=\"main-sidebar-source-control\"\n\t>\n\t\t<div\n\t\t\tv-if=\"sourceControlStore.preferences.connected && sourceControlStore.preferences.branchName\"\n\t\t\t:class=\"$style.connected\"\n\t\t\tdata-test-id=\"main-sidebar-source-control-connected\"\n\t\t>\n\t\t\t<span :class=\"$style.branchName\">\n\t\t\t\t<n8n-icon icon=\"code-branch\" />\n\t\t\t\t{{ currentBranch }}\n\t\t\t</span>\n\t\t\t<div :class=\"{ 'pt-xs': !isCollapsed }\">\n\t\t\t\t<n8n-tooltip :disabled=\"!isCollapsed\" :show-after=\"tooltipOpenDelay\" placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.pull') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'mr-2xs': !isCollapsed,\n\t\t\t\t\t\t\t'mb-2xs': isCollapsed && !sourceControlStore.preferences.branchReadOnly,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\ticon=\"arrow-down\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.pull')\"\n\t\t\t\t\t\t@click=\"pullWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-if=\"!sourceControlStore.preferences.branchReadOnly\"\n\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t:show-after=\"tooltipOpenDelay\"\n\t\t\t\t\tplacement=\"right\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ i18n.baseText('settings.sourceControl.button.push') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t:square=\"isCollapsed\"\n\t\t\t\t\t\t:label=\"isCollapsed ? '' : i18n.baseText('settings.sourceControl.button.push')\"\n\t\t\t\t\t\ticon=\"arrow-up\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t@click=\"pushWorkfolder\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.sync {\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 calc(var(--spacing-2xs) * -1);\n\tbackground: var(--color-background-light);\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tfont-size: var(--font-size-2xs);\n\n\t&.isConnected {\n\t\tpadding-left: var(--spacing-m);\n\t\tborder-left: var(--spacing-3xs) var(--border-style-base) var(--color-foreground-base);\n\n\t\t&.collapsed {\n\t\t\tpadding-left: var(--spacing-xs);\n\t\t}\n\t}\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n\n\tbutton {\n\t\tfont-size: var(--font-size-3xs);\n\t}\n}\n\n.branchName {\n\twhite-space: normal;\n\tline-break: anywhere;\n}\n\n.collapsed {\n\ttext-align: center;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n\n\t.connected {\n\t\t> span {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n</style>\n","<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</template>\n\n\t\t\t<template #beforeLowerMenu>\n\t\t\t\t<BecomeTemplateCreatorCta v-if=\"fullyExpanded && !userIsTrialing\" />\n\t\t\t\t<ExecutionsUsage\n\t\t\t\t\tv-if=\"fullyExpanded && userIsTrialing\"\n\t\t\t\t\t:cloud-plan-data=\"currentPlanAndUsageData\"\n\t\t\t/></template>\n\t\t\t<template #menuSuffix>\n\t\t\t\t<div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"hasVersionUpdates\"\n\t\t\t\t\t\tdata-test-id=\"version-updates-panel-button\"\n\t\t\t\t\t\t:class=\"$style.updates\"\n\t\t\t\t\t\t@click=\"openUpdatesPanel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div :class=\"$style.giftContainer\">\n\t\t\t\t\t\t\t<GiftNotificationIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<n8n-text\n\t\t\t\t\t\t\t:class=\"{ ['ml-xs']: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ nextVersions.length > 99 ? '99+' : nextVersions.length }} update{{\n\t\t\t\t\t\t\t\tnextVersions.length > 1 ? 's' : ''\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<MainSidebarSourceControl :is-collapsed=\"isCollapsed\" />\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"showUserArea\" #footer>\n\t\t\t\t<div :class=\"$style.userArea\">\n\t\t\t\t\t<div class=\"ml-3xs\" data-test-id=\"main-sidebar-user-menu\">\n\t\t\t\t\t\t<!-- This dropdown is only enabled when sidebar is collapsed -->\n\t\t\t\t\t\t<el-dropdown\n\t\t\t\t\t\t\t:disabled=\"!isCollapsed\"\n\t\t\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\t\t\t@command=\"onUserActionToggle\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :class=\"{ [$style.avatar]: true, ['clickable']: isCollapsed }\">\n\t\t\t\t\t\t\t\t<n8n-avatar\n\t\t\t\t\t\t\t\t\t:first-name=\"usersStore.currentUser.firstName\"\n\t\t\t\t\t\t\t\t\t:last-name=\"usersStore.currentUser.lastName\"\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<template #dropdown>\n\t\t\t\t\t\t\t\t<el-dropdown-menu>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"settings\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('settings') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t\t<el-dropdown-item command=\"logout\">\n\t\t\t\t\t\t\t\t\t\t{{ $locale.baseText('auth.signout') }}\n\t\t\t\t\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t\t\t\t</el-dropdown-menu>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</el-dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"{ ['ml-2xs']: true, [$style.userName]: true, [$style.expanded]: fullyExpanded }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\" color=\"text-dark\">{{\n\t\t\t\t\t\t\tusersStore.currentUser.fullName\n\t\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div :class=\"{ [$style.userActions]: true, [$style.expanded]: fullyExpanded }\">\n\t\t\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\t\t\t:items=\"userMenuItems\"\n\t\t\t\t\t\t\tplacement=\"top-start\"\n\t\t\t\t\t\t\tdata-test-id=\"user-menu\"\n\t\t\t\t\t\t\t@select=\"onUserActionToggle\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-menu>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { CloudPlanAndUsageData, IExecutionResponse, IMenuItem, IVersion } from '@/Interface';\nimport GiftNotificationIcon from './GiftNotificationIcon.vue';\n\nimport { useMessage } from '@/composables/useMessage';\nimport { ABOUT_MODAL_KEY, VERSIONS_MODAL_KEY, VIEWS } from '@/constants';\nimport { userHelpers } from '@/mixins/userHelpers';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useCloudPlanStore } from '@/stores/cloudPlan.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useVersionsStore } from '@/stores/versions.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport ExecutionsUsage from '@/components/ExecutionsUsage.vue';\nimport BecomeTemplateCreatorCta from '@/components/BecomeTemplateCreatorCta/BecomeTemplateCreatorCta.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useBecomeTemplateCreatorStore } from '@/components/BecomeTemplateCreatorCta/becomeTemplateCreatorStore';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tExecutionsUsage,\n\t\tMainSidebarSourceControl,\n\t\tBecomeTemplateCreatorCta,\n\t},\n\tmixins: [userHelpers],\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tcallDebounced,\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbasePath: '',\n\t\t\tfullyExpanded: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsersStore,\n\t\t\tuseVersionsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseCloudPlanStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseBecomeTemplateCreatorStore,\n\t\t\tuseTemplatesStore,\n\t\t),\n\t\tlogoPath(): string {\n\t\t\treturn this.basePath + (this.isCollapsed ? 'static/logo/collapsed.svg' : this.uiStore.logo);\n\t\t},\n\t\thasVersionUpdates(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.settingsStore.settings.releaseChannel === 'stable' &&\n\t\t\t\tthis.versionsStore.hasVersionUpdates\n\t\t\t);\n\t\t},\n\t\tnextVersions(): IVersion[] {\n\t\t\treturn this.versionsStore.nextVersions;\n\t\t},\n\t\tisCollapsed(): boolean {\n\t\t\treturn this.uiStore.sidebarMenuCollapsed;\n\t\t},\n\t\tcanUserAccessSettings(): boolean {\n\t\t\tconst accessibleRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\treturn accessibleRoute !== null;\n\t\t},\n\t\tshowUserArea(): boolean {\n\t\t\treturn hasPermission(['authenticated']);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tuserMenuItems(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'logout',\n\t\t\t\t\tlabel: this.$locale.baseText('auth.signout'),\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tmainMenuItems(): IMenuItem[] {\n\t\t\tconst items: IMenuItem[] = [];\n\n\t\t\tconst workflows: IMenuItem = {\n\t\t\t\tid: 'workflows',\n\t\t\t\ticon: 'network-wired',\n\t\t\t\tlabel: this.$locale.baseText('mainSidebar.workflows'),\n\t\t\t\tposition: 'top',\n\t\t\t\troute: { to: { name: VIEWS.WORKFLOWS } },\n\t\t\t\tsecondaryIcon: this.sourceControlStore.preferences.branchReadOnly\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: 'lock',\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tcontent: this.$locale.baseText('mainSidebar.workflows.readOnlyEnv.tooltip'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t }\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\tconst defaultSettingsRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\tconst regularItems: IMenuItem[] = [\n\t\t\t\tworkflows,\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: 'top',\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: 'top',\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.getWebsiteTemplateRepositoryURL,\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: 'credentials',\n\t\t\t\t\ticon: 'key',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.credentials'),\n\t\t\t\t\tcustomIconSize: 'medium',\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\troute: { to: { name: VIEWS.CREDENTIALS } },\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: 'top',\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: 'top',\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: 'cloud-admin',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tlabel: 'Admin Panel',\n\t\t\t\t\ticon: 'home',\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\tid: 'settings',\n\t\t\t\t\ticon: 'cog',\n\t\t\t\t\tlabel: this.$locale.baseText('settings'),\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tavailable: this.canUserAccessSettings && this.usersStore.currentUser !== null,\n\t\t\t\t\tactivateOnRouteNames: [VIEWS.USERS_SETTINGS, VIEWS.API_SETTINGS, VIEWS.PERSONAL_SETTINGS],\n\t\t\t\t\troute: { to: defaultSettingsRoute },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'help',\n\t\t\t\t\ticon: 'question',\n\t\t\t\t\tlabel: 'Help',\n\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'quickstart',\n\t\t\t\t\t\t\ticon: 'video',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.quickstart'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'docs',\n\t\t\t\t\t\t\ticon: 'book',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.documentation'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'forum',\n\t\t\t\t\t\t\ticon: 'users',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.forum'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'examples',\n\t\t\t\t\t\t\ticon: 'graduation-cap',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.helpMenuItems.course'),\n\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'about',\n\t\t\t\t\t\t\ticon: 'info',\n\t\t\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.aboutN8n'),\n\t\t\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn [...items, ...regularItems];\n\t\t},\n\t\tuserIsTrialing(): boolean {\n\t\t\treturn this.cloudPlanStore.userIsTrialing;\n\t\t},\n\t\tcurrentPlanAndUsageData(): CloudPlanAndUsageData | null {\n\t\t\tconst planData = this.cloudPlanStore.currentPlanData;\n\t\t\tconst usage = this.cloudPlanStore.currentUsageData;\n\t\t\tif (!planData || !usage) return null;\n\t\t\treturn {\n\t\t\t\t...planData,\n\t\t\t\tusage,\n\t\t\t};\n\t\t},\n\t},\n\tasync mounted() {\n\t\tthis.basePath = this.rootStore.baseUrl;\n\t\tif (this.$refs.user) {\n\t\t\tvoid this.externalHooks.run('mainSidebar.mounted', {\n\t\t\t\tuserRef: this.$refs.user as Element,\n\t\t\t});\n\t\t}\n\n\t\tvoid this.$nextTick(() => {\n\t\t\tif (window.innerWidth < 900 || this.uiStore.isNodeView) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t} else {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = false;\n\t\t\t}\n\n\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t});\n\n\t\tthis.becomeTemplateCreatorStore.startMonitoringCta();\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\tthis.becomeTemplateCreatorStore.stopMonitoringCta();\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\ttrackHelpItemClick(itemType: string) {\n\t\t\tthis.$telemetry.track('User clicked help resource', {\n\t\t\t\ttype: itemType,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\ttrackTemplatesClick() {\n\t\t\tthis.$telemetry.track('User clicked on templates', {});\n\t\t},\n\t\tasync onUserActionToggle(action: string) {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'logout':\n\t\t\t\t\tthis.onLogout();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'settings':\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.PERSONAL_SETTINGS });\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tonLogout() {\n\t\t\tvoid this.$router.push({ name: VIEWS.SIGNOUT });\n\t\t},\n\t\ttoggleCollapse() {\n\t\t\tthis.uiStore.toggleSidebarMenuCollapse();\n\t\t\t// When expanding, delay showing some element to ensure smooth animation\n\t\t\tif (!this.isCollapsed) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t\t}, 300);\n\t\t\t} else {\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t\topenUpdatesPanel() {\n\t\t\tthis.uiStore.openModal(VERSIONS_MODAL_KEY);\n\t\t},\n\t\tasync handleSelect(key: string) {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'templates':\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.settingsStore.isTemplatesEnabled &&\n\t\t\t\t\t\t!this.templatesStore.hasCustomTemplatesHost\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.trackTemplatesClick();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'about': {\n\t\t\t\t\tthis.trackHelpItemClick('about');\n\t\t\t\t\tthis.uiStore.openModal(ABOUT_MODAL_KEY);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'cloud-admin': {\n\t\t\t\t\tvoid this.cloudPlanStore.redirectToDashboard();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'quickstart':\n\t\t\t\tcase 'docs':\n\t\t\t\tcase 'forum':\n\t\t\t\tcase 'examples': {\n\t\t\t\t\tthis.trackHelpItemClick(key);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tfindFirstAccessibleSettingsRoute() {\n\t\t\tconst settingsRoutes = this.$router\n\t\t\t\t.getRoutes()\n\t\t\t\t.find((route) => route.path === '/settings')!\n\t\t\t\t.children.map((route) => route.name ?? '');\n\n\t\t\tlet defaultSettingsRoute = { name: VIEWS.USERS_SETTINGS };\n\t\t\tfor (const route of settingsRoutes) {\n\t\t\t\tif (this.canUserAccessRouteByName(route.toString())) {\n\t\t\t\t\tdefaultSettingsRoute = {\n\t\t\t\t\t\tname: route.toString() as VIEWS,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn defaultSettingsRoute;\n\t\t},\n\t\tonResize(event: UIEvent) {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 100 }, event);\n\t\t},\n\t\tasync onResizeEnd(event: UIEvent) {\n\t\t\tconst browserWidth = (event.target as Window).outerWidth;\n\t\t\tawait this.checkWidthAndAdjustSidebar(browserWidth);\n\t\t},\n\t\tasync checkWidthAndAdjustSidebar(width: number) {\n\t\t\tif (width < 900) {\n\t\t\t\tthis.uiStore.sidebarMenuCollapsed = true;\n\t\t\t\tawait this.$nextTick();\n\t\t\t\tthis.fullyExpanded = !this.isCollapsed;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.sideMenu {\n\tposition: relative;\n\theight: 100%;\n\tborder-right: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\ttransition: width 150ms ease-in-out;\n\twidth: $sidebar-expanded-width;\n\t.logo {\n\t\theight: $header-height;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding: var(--spacing-xs);\n\n\t\timg {\n\t\t\tposition: relative;\n\t\t\tleft: 1px;\n\t\t\theight: 20px;\n\t\t}\n\t}\n\n\t&.sideMenuCollapsed {\n\t\twidth: $sidebar-width;\n\n\t\t.logo img {\n\t\t\tleft: 0;\n\t\t}\n\t}\n}\n\n.sideMenuCollapseButton {\n\tposition: absolute;\n\tright: -10px;\n\ttop: 50%;\n\tz-index: 999;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tcolor: var(--color-text-base);\n\tbackground-color: var(--color-foreground-xlight);\n\twidth: 20px;\n\theight: 20px;\n\tborder: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-radius: 50%;\n\n\t&:hover {\n\t\tcolor: var(--color-primary-shade-1);\n\t}\n}\n\n.updates {\n\tdisplay: flex;\n\talign-items: center;\n\tcursor: pointer;\n\tpadding: var(--spacing-2xs) var(--spacing-l);\n\tmargin: var(--spacing-2xs) 0 0;\n\n\tsvg {\n\t\tcolor: var(--color-text-base) !important;\n\t}\n\tspan {\n\t\tdisplay: none;\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n\n\t&:hover {\n\t\t&,\n\t\t& svg {\n\t\t\tcolor: var(--color-text-dark) !important;\n\t\t}\n\t}\n}\n\n.userArea {\n\tdisplay: flex;\n\tpadding: var(--spacing-xs);\n\talign-items: center;\n\theight: 60px;\n\tborder-top: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\n\t.userName {\n\t\tdisplay: none;\n\t\toverflow: hidden;\n\t\twidth: 100px;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\n\t\tspan {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t.userActions {\n\t\tdisplay: none;\n\n\t\t&.expanded {\n\t\t\tdisplay: initial;\n\t\t}\n\t}\n}\n\n@media screen and (max-height: 470px) {\n\t:global(#help) {\n\t\tdisplay: none;\n\t}\n}\n</style>\n"],"names":["_hoisted_2","_openBlock","_createVNode","_component_font_awesome_icon","_normalizeClass","_ctx","PROGRESS_BAR_MINIMUM_THRESHOLD","props","__props","now","DateTime","daysLeftOnTrial","computed","days","getPlanExpirationDate","isTrialExpired","_a","trialEndsAt","trialHasExecutionsLeft","currentExecutions","usedExecutions","executionsQuota","currentExecutionsWithThreshold","threshold","maxExecutions","onUpgradeClicked","useUIStore","getBecomeCreatorCta","context","get","LOCAL_STORAGE_KEY","RESHOW_DISMISSED_AFTER_DAYS","POLL_INTERVAL_IN_MS","useBecomeTemplateCreatorStore","defineStore","STORES","cloudPlanStore","useCloudPlanStore","rootStore","useRootStore","dismissedAt","useStorage","ctaMeetsCriteria","ref","monitorCtasTimer","isDismissed","hasEnoughTimePassedSinceDismissal","showBecomeCreatorCta","dismissCta","fetchBecomeCreatorCta","becomeCreatorCta","fetchUserCtasIfNeeded","i18n","useI18n","store","telemetry","useTelemetry","onClick","responseStatuses","useRouter","loadingService","useLoadingService","uiStore","sourceControlStore","useSourceControlStore","toast","useToast","eventBus","createEventBus","tooltipOpenDelay","currentBranch","sourceControlAvailable","hasPermission","pushWorkfolder","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","pullWorkfolder","file","incompleteFileTypes","nextTick","sourceControlEventBus","errorResponse","SOURCE_CONTROL_PULL_MODAL_KEY","_sfc_main","defineComponent","GiftNotificationIcon","ExecutionsUsage","MainSidebarSourceControl","BecomeTemplateCreatorCta","userHelpers","ctx","externalHooks","useExternalHooks","callDebounced","useDebounce","useMessage","mapStores","useSettingsStore","useUsersStore","useVersionsStore","useWorkflowsStore","useTemplatesStore","items","workflows","VIEWS","defaultSettingsRoute","regularItems","planData","usage","itemType","action","VERSIONS_MODAL_KEY","key","ABOUT_MODAL_KEY","settingsRoutes","route","event","browserWidth","width","_hoisted_1","_resolveComponent","_createElementBlock","$style","_createElementVNode","isCollapsed","_cache","args","_createBlock","_component_n8n_icon","handleSelect","_createSlots","_withCtx","fullyExpanded","userIsTrialing","currentPlanAndUsageData","_createCommentVNode","hasVersionUpdates","_component_GiftNotificationIcon","_component_n8n_text","_createTextVNode","_toDisplayString","showUserArea","_component_el_dropdown","onUserActionToggle","_component_el_dropdown_menu","_component_el_dropdown_item","$locale","_component_n8n_avatar","_component_n8n_action_dropdown"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  function __vite__mapDeps(indexes) {
2
2
  if (!__vite__mapDeps.viteFileDeps) {
3
- __vite__mapDeps.viteFileDeps = ["assets/NodeCreator-Qi3ajhnf.js","assets/n8n-G5ZIZCy5.js","assets/vendor-VXT4wwt2.js","assets/lodash-es-xYzII6mS.js","assets/axios-s2RMMPhA.js","assets/flatted-jPn12Tq4.js","assets/esprima-next-ulPLCZ1Z.js","assets/luxon-ZRIU05qF.js","assets/pinia-UPmhnKmF.js","assets/@vueuse/core-4MtarU7n.js","assets/uuid-McvpxQtQ.js","assets/vue-i18n-ZIlZf-IE.js","assets/@n8n/permissions-8yMqUF1Y.js","assets/n8n-bK37G-YZ.css","assets/NodeView-oDPyzajr.js","assets/@jsplumb/core-MKwKlGip.js","assets/@jsplumb/util-DR0SB56A.js","assets/@jsplumb/common-Q5_tv_GT.js","assets/index-vdh5hVg3.js","assets/@n8n/codemirror-lang-sql-A8tNeQAo.js","assets/@lezer/common-1hBQ1gIF.js","assets/prettier-s3fE3Qyr.js","assets/@jsplumb/connector-bezier-3dWY17R5.js","assets/@jsplumb/browser-ui-AlqFM-P6.js","assets/codemirror-lang-html-n8n-aqAgigXU.js","assets/codemirror-lang-n8n-expression-7tlJbTJw.js","assets/fast-json-stable-stringify-4gflVid-.js","assets/timeago.js--Bumj2r9.js","assets/qrcode.vue-t9lCVWTj.js","assets/vue3-touch-events-_RfbPMOD.js","assets/chart.js-JtqvIvkt.js","assets/index-suVg9RiN.css","assets/useExecutionDebugging-s7lAeIqB.js","assets/file-saver-7fKiBHqp.js","assets/vue-json-pretty-c0xb0mJ1.js","assets/RunDataAi-DJiuZFJ2.js","assets/RunDataAi-B6oRAQZq.css","assets/dateFormatter-7nt2saFg.js","assets/workflowActivate-SIKKLz8V.js","assets/collaboration.store-zPDg5IkG.js","assets/NodeView-FjGatqri.css","assets/NodeCreator-Wbbs7M47.css"]
3
+ __vite__mapDeps.viteFileDeps = ["assets/NodeCreator-ns8j677p.js","assets/n8n-G5ZIZCy5.js","assets/vendor-VXT4wwt2.js","assets/lodash-es-xYzII6mS.js","assets/axios-s2RMMPhA.js","assets/flatted-jPn12Tq4.js","assets/esprima-next-ulPLCZ1Z.js","assets/luxon-ZRIU05qF.js","assets/pinia-UPmhnKmF.js","assets/@vueuse/core-4MtarU7n.js","assets/uuid-McvpxQtQ.js","assets/vue-i18n-ZIlZf-IE.js","assets/@n8n/permissions-8yMqUF1Y.js","assets/n8n-bK37G-YZ.css","assets/NodeView-7yZJ9OMj.js","assets/@jsplumb/core-MKwKlGip.js","assets/@jsplumb/util-DR0SB56A.js","assets/@jsplumb/common-Q5_tv_GT.js","assets/index-4C1AxeXk.js","assets/@n8n/codemirror-lang-sql-A8tNeQAo.js","assets/@lezer/common-1hBQ1gIF.js","assets/prettier-s3fE3Qyr.js","assets/@jsplumb/connector-bezier-3dWY17R5.js","assets/@jsplumb/browser-ui-AlqFM-P6.js","assets/codemirror-lang-html-n8n-aqAgigXU.js","assets/codemirror-lang-n8n-expression-7tlJbTJw.js","assets/fast-json-stable-stringify-4gflVid-.js","assets/timeago.js--Bumj2r9.js","assets/qrcode.vue-t9lCVWTj.js","assets/vue3-touch-events-_RfbPMOD.js","assets/chart.js-JtqvIvkt.js","assets/index-PmN852am.css","assets/useExecutionDebugging-eQjp4txV.js","assets/file-saver-7fKiBHqp.js","assets/vue-json-pretty-c0xb0mJ1.js","assets/RunDataAi-PNu5uqz6.js","assets/RunDataAi-B6oRAQZq.css","assets/dateFormatter-7nt2saFg.js","assets/workflowActivate-6jCh92f_.js","assets/collaboration.store-zPDg5IkG.js","assets/NodeView-pdKhF5kg.css","assets/NodeCreator-Wbbs7M47.css"]
4
4
  }
5
5
  return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
6
6
  }
7
- import{fy as g,b8 as B,ap as D,g3 as x,g4 as M,ah as $,eO as G,b as V,v as I,a8 as W,a2 as U,b9 as K,y as z,q as H,dc as F,eU as Q,g5 as X,g6 as q,g7 as J,g8 as Z,u as ee,cJ as te,g9 as oe,ga as ne,_ as se}from"./n8n-G5ZIZCy5.js";import{K as L,aQ as re}from"./index-vdh5hVg3.js";import{u as Y,t as ae,s as ce}from"./NodeView-oDPyzajr.js";import{e as ie,a as de,v as le,P as ue,a6 as pe,f as k,h as R,y as T,i as j,K as N,E as w,H as _e,D as fe,u as Ne,aw as ye,au as Ce}from"./vendor-VXT4wwt2.js";const Ee=()=>{const A=Y(),l=de(),S=[g.PLUS_ENDPOINT,g.NODE_CONNECTION_ACTION,g.NODE_CONNECTION_DROP],m=ie(()=>({actions:(l==null?void 0:l.proxy.$locale.baseText("nodeCreator.actionsCategory.actions"))??"",triggers:(l==null?void 0:l.proxy.$locale.baseText("nodeCreator.actionsCategory.triggers"))??""}));function _(e){const t=[U,K];return A.mergedNodes.filter(o=>t.some(s=>s===o.name)).map(o=>{const s=ae(o,e,"action");if(s.type==="action"){const r=`nodeCreator.actionsPlaceholderNode.${o.name.replace("n8n-nodes-base.","")}`,d=l==null?void 0:l.proxy.$locale.baseText(r);d!==r&&(s.properties.displayName=d)}return s})}function f(e,t){return e.filter(n=>n.type==="action"&&n.properties.codex.categories.includes(t))}function O(e){var c,r,d,u;const t=ce([...e]),n=new Set;for(const i of t){if(i.type!=="action")continue;const p=(r=(c=i.properties)==null?void 0:c.codex)==null?void 0:r.label;n.add(p)}if(n.size<=1)return t;const o=new Map;for(let i=0;i<t.length;i++){const p=t[i];if(p.type!=="action")continue;const E=(u=(d=p.properties)==null?void 0:d.codex)==null?void 0:u.label;o.has(E)||o.set(E,i)}let s=0;for(const i of n){const p={uuid:i,type:"label",key:i,subcategory:t[0].key,properties:{key:i}},E=o.get(i)+s;t.splice(E,0,p),s++}return t}function y(e,t,n=!0){const o=f(e,t);return n?O(o):o}function b(e){const t=e.displayOptions,n=Object.keys((t==null?void 0:t.show)||{}).reduce((o,s)=>{var c,r;return o[s]=(r=(c=t==null?void 0:t.show)==null?void 0:c[s])==null?void 0:r[0],o},{});return{name:e.displayName,key:e.name,value:{...e.values,...n}}}function v(e){const{selectedView:t,openSource:n}=Y(),{workflowTriggerNodes:o}=I(),s=e.some(i=>z().isTriggerNode(i.type)),c=o.length>0,r=t===Q,d=e.every(i=>i.type===H);return!S.includes(n)&&!s&&!c&&r&&!d}function P(e){const{allNodes:t}=I(),n=[X,q,J,Z,x],o=t.find(c=>[F,D].includes(c.type))===void 0;return e.some(c=>n.includes(c.type))&&o}function C(e){if(e.length===0)return{nodes:[],connections:[]};const t=[],n=[],o=e.find(s=>s.type!==B);return o&&(o.openDetail=!0),P(e)?(e.unshift({type:D,isAutoAdd:!0}),n.push({from:{nodeIndex:0},to:{nodeIndex:1}})):v(e)&&(e.unshift({type:B,isAutoAdd:!0}),n.push({from:{nodeIndex:0},to:{nodeIndex:1}})),e.forEach((s,c)=>{switch(s.type===x&&(s.type=M),t.push(s),s.type){case $:{const r=c,d=r+1;t.push({type:G,isAutoAdd:!0,name:V.baseText("nodeView.replaceMe")}),n.push({from:{nodeIndex:r,outputIndex:1},to:{nodeIndex:d}},{from:{nodeIndex:d},to:{nodeIndex:r}});break}}}),{nodes:t,connections:n}}function h(e,t,n=""){const{$onAction:o}=I(),s=o(({name:c,after:r,store:{setLastNodeParameters:d},args:u})=>{c!=="addNode"||u[0].type!==e.key||r(()=>{d(e),t&&a(e,t,n),s()})});return s}function a(e,t,n){const o={node_type:e.key,action:e.name,source_mode:n.toLowerCase(),resource:e.value.resource||""};W().run("nodeCreateList.addAction",o),t==null||t.trackNodesPanel("nodeCreateList.addAction",o)}return{actionsCategoryLocales:m,getPlaceholderTriggerActions:_,parseCategoryActions:y,getAddedNodesAndConnections:C,getActionData:b,setAddedNodeActionParameters:h}},Te=le({__name:"NodeCreation",props:{nodeViewScale:{},createNodeActive:{type:Boolean,default:!1}},emits:["addNodes","toggleNodeCreator"],setup(A,{emit:l}){const S=Ce(async()=>await te(()=>import("./NodeCreator-Qi3ajhnf.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]))),m=A,_=l,f=ue({showStickyButton:!1}),O=ee(),{getAddedNodesAndConnections:y}=Ee();function b(a){const e=a.target;f.showStickyButton=!0;const t=n=>{if(e){const o=e.getBoundingClientRect(),s=o.height,c=o.width,r=o.left,d=r+c,u=o.top,i=u+s;n.pageX>r&&n.pageX<d&&n.pageY>u&&n.pageY<i||(f.showStickyButton=!1,document.removeEventListener("mousemove",t,!1))}};document.addEventListener("mousemove",t,!1)}function v(){_("toggleNodeCreator",{source:g.ADD_NODE_BUTTON,createNodeActive:!0})}function P(){document.activeElement&&document.activeElement.blur();const a=[...O.nodeViewOffsetPosition],e=re(m.nodeViewScale,a);e[0]-=oe/2,e[1]-=ne/2,_("addNodes",y([{type:H,position:e}]))}function C(){_("toggleNodeCreator",{createNodeActive:!1})}function h(a){_("addNodes",y(a.map(e=>({type:e})))),C()}return(a,e)=>{const t=pe("n8n-icon-button");return k(),R("div",null,[a.createNodeActive?_e("",!0):(k(),R("div",{key:0,class:T([a.$style.nodeButtonsWrapper,f.showStickyButton?a.$style.noEvents:""]),onMouseenter:b},[j("div",{class:T(a.$style.nodeCreatorButton),"data-test-id":"node-creator-plus-button"},[N(L,{label:a.$locale.baseText("nodeView.openNodesPanel"),shortcut:{keys:["Tab"]},placement:"left"},{default:w(()=>[N(t,{size:"xlarge",icon:"plus",type:"tertiary",class:T(a.$style.nodeCreatorPlus),onClick:v},null,8,["class"])]),_:1},8,["label"]),j("div",{class:T([a.$style.addStickyButton,f.showStickyButton?a.$style.visibleButton:""]),"data-test-id":"add-sticky-button",onClick:P},[N(L,{label:a.$locale.baseText("nodeView.addStickyHint"),shortcut:{keys:["s"],shiftKey:!0},placement:"left"},{default:w(()=>[N(t,{type:"tertiary",icon:["far","note-sticky"]})]),_:1},8,["label"])],2)],2)],34)),(k(),fe(ye,null,{default:w(()=>[N(Ne(S),{active:a.createNodeActive,onNodeTypeSelected:h,onCloseNodeCreator:C},null,8,["active"])]),_:1}))])}}}),ge="_nodeButtonsWrapper_tvjju_1",Ae="_addStickyButton_tvjju_10",Se="_visibleButton_tvjju_17",me="_noEvents_tvjju_22",Oe="_nodeCreatorButton_tvjju_26",be="_nodeCreatorPlus_tvjju_43",ve={nodeButtonsWrapper:ge,addStickyButton:Ae,visibleButton:Se,noEvents:me,nodeCreatorButton:Oe,nodeCreatorPlus:be},Pe={$style:ve},he=se(Te,[["__cssModules",Pe]]),De=Object.freeze(Object.defineProperty({__proto__:null,default:he},Symbol.toStringTag,{value:"Module"}));export{De as N,Ee as u};
8
- //# sourceMappingURL=NodeCreation-vCHQm0aM.js.map
7
+ import{fy as g,b8 as B,ap as D,g3 as x,g4 as M,ah as $,eO as G,b as V,v as I,a8 as W,a2 as U,b9 as K,y as z,q as H,dc as F,eU as Q,g5 as X,g6 as q,g7 as J,g8 as Z,u as ee,cJ as te,g9 as oe,ga as ne,_ as se}from"./n8n-G5ZIZCy5.js";import{K as L,aQ as re}from"./index-4C1AxeXk.js";import{u as Y,t as ae,s as ce}from"./NodeView-7yZJ9OMj.js";import{e as ie,a as de,v as le,P as ue,a6 as pe,f as k,h as R,y as T,i as j,K as N,E as w,H as _e,D as fe,u as Ne,aw as ye,au as Ce}from"./vendor-VXT4wwt2.js";const Ee=()=>{const A=Y(),l=de(),S=[g.PLUS_ENDPOINT,g.NODE_CONNECTION_ACTION,g.NODE_CONNECTION_DROP],m=ie(()=>({actions:(l==null?void 0:l.proxy.$locale.baseText("nodeCreator.actionsCategory.actions"))??"",triggers:(l==null?void 0:l.proxy.$locale.baseText("nodeCreator.actionsCategory.triggers"))??""}));function _(e){const t=[U,K];return A.mergedNodes.filter(o=>t.some(s=>s===o.name)).map(o=>{const s=ae(o,e,"action");if(s.type==="action"){const r=`nodeCreator.actionsPlaceholderNode.${o.name.replace("n8n-nodes-base.","")}`,d=l==null?void 0:l.proxy.$locale.baseText(r);d!==r&&(s.properties.displayName=d)}return s})}function f(e,t){return e.filter(n=>n.type==="action"&&n.properties.codex.categories.includes(t))}function O(e){var c,r,d,u;const t=ce([...e]),n=new Set;for(const i of t){if(i.type!=="action")continue;const p=(r=(c=i.properties)==null?void 0:c.codex)==null?void 0:r.label;n.add(p)}if(n.size<=1)return t;const o=new Map;for(let i=0;i<t.length;i++){const p=t[i];if(p.type!=="action")continue;const E=(u=(d=p.properties)==null?void 0:d.codex)==null?void 0:u.label;o.has(E)||o.set(E,i)}let s=0;for(const i of n){const p={uuid:i,type:"label",key:i,subcategory:t[0].key,properties:{key:i}},E=o.get(i)+s;t.splice(E,0,p),s++}return t}function y(e,t,n=!0){const o=f(e,t);return n?O(o):o}function b(e){const t=e.displayOptions,n=Object.keys((t==null?void 0:t.show)||{}).reduce((o,s)=>{var c,r;return o[s]=(r=(c=t==null?void 0:t.show)==null?void 0:c[s])==null?void 0:r[0],o},{});return{name:e.displayName,key:e.name,value:{...e.values,...n}}}function v(e){const{selectedView:t,openSource:n}=Y(),{workflowTriggerNodes:o}=I(),s=e.some(i=>z().isTriggerNode(i.type)),c=o.length>0,r=t===Q,d=e.every(i=>i.type===H);return!S.includes(n)&&!s&&!c&&r&&!d}function P(e){const{allNodes:t}=I(),n=[X,q,J,Z,x],o=t.find(c=>[F,D].includes(c.type))===void 0;return e.some(c=>n.includes(c.type))&&o}function C(e){if(e.length===0)return{nodes:[],connections:[]};const t=[],n=[],o=e.find(s=>s.type!==B);return o&&(o.openDetail=!0),P(e)?(e.unshift({type:D,isAutoAdd:!0}),n.push({from:{nodeIndex:0},to:{nodeIndex:1}})):v(e)&&(e.unshift({type:B,isAutoAdd:!0}),n.push({from:{nodeIndex:0},to:{nodeIndex:1}})),e.forEach((s,c)=>{switch(s.type===x&&(s.type=M),t.push(s),s.type){case $:{const r=c,d=r+1;t.push({type:G,isAutoAdd:!0,name:V.baseText("nodeView.replaceMe")}),n.push({from:{nodeIndex:r,outputIndex:1},to:{nodeIndex:d}},{from:{nodeIndex:d},to:{nodeIndex:r}});break}}}),{nodes:t,connections:n}}function h(e,t,n=""){const{$onAction:o}=I(),s=o(({name:c,after:r,store:{setLastNodeParameters:d},args:u})=>{c!=="addNode"||u[0].type!==e.key||r(()=>{d(e),t&&a(e,t,n),s()})});return s}function a(e,t,n){const o={node_type:e.key,action:e.name,source_mode:n.toLowerCase(),resource:e.value.resource||""};W().run("nodeCreateList.addAction",o),t==null||t.trackNodesPanel("nodeCreateList.addAction",o)}return{actionsCategoryLocales:m,getPlaceholderTriggerActions:_,parseCategoryActions:y,getAddedNodesAndConnections:C,getActionData:b,setAddedNodeActionParameters:h}},Te=le({__name:"NodeCreation",props:{nodeViewScale:{},createNodeActive:{type:Boolean,default:!1}},emits:["addNodes","toggleNodeCreator"],setup(A,{emit:l}){const S=Ce(async()=>await te(()=>import("./NodeCreator-ns8j677p.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]))),m=A,_=l,f=ue({showStickyButton:!1}),O=ee(),{getAddedNodesAndConnections:y}=Ee();function b(a){const e=a.target;f.showStickyButton=!0;const t=n=>{if(e){const o=e.getBoundingClientRect(),s=o.height,c=o.width,r=o.left,d=r+c,u=o.top,i=u+s;n.pageX>r&&n.pageX<d&&n.pageY>u&&n.pageY<i||(f.showStickyButton=!1,document.removeEventListener("mousemove",t,!1))}};document.addEventListener("mousemove",t,!1)}function v(){_("toggleNodeCreator",{source:g.ADD_NODE_BUTTON,createNodeActive:!0})}function P(){document.activeElement&&document.activeElement.blur();const a=[...O.nodeViewOffsetPosition],e=re(m.nodeViewScale,a);e[0]-=oe/2,e[1]-=ne/2,_("addNodes",y([{type:H,position:e}]))}function C(){_("toggleNodeCreator",{createNodeActive:!1})}function h(a){_("addNodes",y(a.map(e=>({type:e})))),C()}return(a,e)=>{const t=pe("n8n-icon-button");return k(),R("div",null,[a.createNodeActive?_e("",!0):(k(),R("div",{key:0,class:T([a.$style.nodeButtonsWrapper,f.showStickyButton?a.$style.noEvents:""]),onMouseenter:b},[j("div",{class:T(a.$style.nodeCreatorButton),"data-test-id":"node-creator-plus-button"},[N(L,{label:a.$locale.baseText("nodeView.openNodesPanel"),shortcut:{keys:["Tab"]},placement:"left"},{default:w(()=>[N(t,{size:"xlarge",icon:"plus",type:"tertiary",class:T(a.$style.nodeCreatorPlus),onClick:v},null,8,["class"])]),_:1},8,["label"]),j("div",{class:T([a.$style.addStickyButton,f.showStickyButton?a.$style.visibleButton:""]),"data-test-id":"add-sticky-button",onClick:P},[N(L,{label:a.$locale.baseText("nodeView.addStickyHint"),shortcut:{keys:["s"],shiftKey:!0},placement:"left"},{default:w(()=>[N(t,{type:"tertiary",icon:["far","note-sticky"]})]),_:1},8,["label"])],2)],2)],34)),(k(),fe(ye,null,{default:w(()=>[N(Ne(S),{active:a.createNodeActive,onNodeTypeSelected:h,onCloseNodeCreator:C},null,8,["active"])]),_:1}))])}}}),ge="_nodeButtonsWrapper_tvjju_1",Ae="_addStickyButton_tvjju_10",Se="_visibleButton_tvjju_17",me="_noEvents_tvjju_22",Oe="_nodeCreatorButton_tvjju_26",be="_nodeCreatorPlus_tvjju_43",ve={nodeButtonsWrapper:ge,addStickyButton:Ae,visibleButton:Se,noEvents:me,nodeCreatorButton:Oe,nodeCreatorPlus:be},Pe={$style:ve},he=se(Te,[["__cssModules",Pe]]),De=Object.freeze(Object.defineProperty({__proto__:null,default:he},Symbol.toStringTag,{value:"Module"}));export{De as N,Ee as u};
8
+ //# sourceMappingURL=NodeCreation--SFXDuf-.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["useActions","nodeCreatorStore","useNodeCreatorStore","instance","getCurrentInstance","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","_d","_c","insertedLabels","newLabel","insertIndex","parseCategoryActions","actions","withLabels","filteredActions","getActionData","actionItem","displayOptions","displayConditions","acc","showCondition","shouldPrependManualTrigger","addedNodes","selectedView","openSource","workflowTriggerNodes","useWorkflowsStore","hasTrigger","useNodeTypesStore","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","i18n","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 { getCurrentInstance, 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';\nimport { i18n } from '@/plugins/i18n';\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';\n\nexport const useActions = () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst instance = getCurrentInstance();\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: instance?.proxy.$locale.baseText('nodeCreator.actionsCategory.actions') ?? '',\n\t\t\ttriggers: instance?.proxy.$locale.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 = instance?.proxy.$locale.baseText(localeKey) as string;\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)! + insertedLabels;\n\t\t\textendedActions.splice(insertIndex, 0, newLabel);\n\t\t\tinsertedLabels++;\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\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}\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@nodeTypeSelected=\"nodeTypeSelected\"\n\t\t\t\t@closeNodeCreator=\"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\tborder-color: var(--color-button-node-creator-hover-border-font);\n\t\t\tcolor: var(--color-button-node-creator-hover-border-font);\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-vCHQm0aM.js"}
1
+ {"version":3,"mappings":"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","names":["useActions","nodeCreatorStore","useNodeCreatorStore","instance","getCurrentInstance","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","_d","_c","insertedLabels","newLabel","insertIndex","parseCategoryActions","actions","withLabels","filteredActions","getActionData","actionItem","displayOptions","displayConditions","acc","showCondition","shouldPrependManualTrigger","addedNodes","selectedView","openSource","workflowTriggerNodes","useWorkflowsStore","hasTrigger","useNodeTypesStore","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","i18n","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 { getCurrentInstance, 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';\nimport { i18n } from '@/plugins/i18n';\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';\n\nexport const useActions = () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst instance = getCurrentInstance();\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: instance?.proxy.$locale.baseText('nodeCreator.actionsCategory.actions') ?? '',\n\t\t\ttriggers: instance?.proxy.$locale.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 = instance?.proxy.$locale.baseText(localeKey) as string;\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)! + insertedLabels;\n\t\t\textendedActions.splice(insertIndex, 0, newLabel);\n\t\t\tinsertedLabels++;\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\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}\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@nodeTypeSelected=\"nodeTypeSelected\"\n\t\t\t\t@closeNodeCreator=\"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\tborder-color: var(--color-button-node-creator-hover-border-font);\n\t\t\tcolor: var(--color-button-node-creator-hover-border-font);\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--SFXDuf-.js"}