n8n-editor-ui 1.19.1 → 1.19.3
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.
- package/.turbo/turbo-build.log +60 -60
- package/dist/assets/{AuthView-pnWQAK0S.js → AuthView-KzKyZSHz.js} +2 -2
- package/dist/assets/{AuthView-pnWQAK0S.js.map → AuthView-KzKyZSHz.js.map} +1 -1
- package/dist/assets/{CanvasControls-kb3__O2G.js → CanvasControls-6jR1_mnm.js} +2 -2
- package/dist/assets/{CanvasControls-kb3__O2G.js.map → CanvasControls-6jR1_mnm.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-w8ZDdsHs.js → ChangePasswordView-TW8EQPS0.js} +2 -2
- package/dist/assets/{ChangePasswordView-w8ZDdsHs.js.map → ChangePasswordView-TW8EQPS0.js.map} +1 -1
- package/dist/assets/{CredentialsView-9EPVLguD.js → CredentialsView-AVQZL_tm.js} +2 -2
- package/dist/assets/{CredentialsView-9EPVLguD.js.map → CredentialsView-AVQZL_tm.js.map} +1 -1
- package/dist/assets/{ExecutionFilter-xWjqUjz0.js → ExecutionFilter-tcX3bN8y.js} +2 -2
- package/dist/assets/{ExecutionFilter-xWjqUjz0.js.map → ExecutionFilter-tcX3bN8y.js.map} +1 -1
- package/dist/assets/{ExecutionPreview-IQ7v5u01.js → ExecutionPreview-OuL-2qRR.js} +2 -2
- package/dist/assets/{ExecutionPreview-IQ7v5u01.js.map → ExecutionPreview-OuL-2qRR.js.map} +1 -1
- package/dist/assets/{ExecutionsInfoAccordion-GNoSEKPt.js → ExecutionsInfoAccordion-J0VUGzOg.js} +2 -2
- package/dist/assets/{ExecutionsInfoAccordion-GNoSEKPt.js.map → ExecutionsInfoAccordion-J0VUGzOg.js.map} +1 -1
- package/dist/assets/{ExecutionsLandingPage-bMbJUz4X.js → ExecutionsLandingPage-LNx1ct-F.js} +2 -2
- package/dist/assets/{ExecutionsLandingPage-bMbJUz4X.js.map → ExecutionsLandingPage-LNx1ct-F.js.map} +1 -1
- package/dist/assets/{ExecutionsList-VqMNpnno.js → ExecutionsList-1jr8ziaw.js} +2 -2
- package/dist/assets/ExecutionsList-1jr8ziaw.js.map +1 -0
- package/dist/assets/{ExecutionsView-cib3hepc.js → ExecutionsView-vfalxf-N.js} +2 -2
- package/dist/assets/{ExecutionsView-cib3hepc.js.map → ExecutionsView-vfalxf-N.js.map} +1 -1
- package/dist/assets/{FixedCollectionParameter-2NZhE0YP.js → FixedCollectionParameter-i4v0_RBC.js} +3 -3
- package/dist/assets/{FixedCollectionParameter-2NZhE0YP.js.map → FixedCollectionParameter-i4v0_RBC.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-JpQD0IzR.js → ForgotMyPasswordView-n-WXfUXB.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-JpQD0IzR.js.map → ForgotMyPasswordView-n-WXfUXB.js.map} +1 -1
- package/dist/assets/{MainHeader-_EB1A67D.js → MainHeader-it41_mme.js} +2 -2
- package/dist/assets/{MainHeader-_EB1A67D.js.map → MainHeader-it41_mme.js.map} +1 -1
- package/dist/assets/{MainSidebar-QaJ5uvnW.js → MainSidebar-K22ttpb5.js} +2 -2
- package/dist/assets/{MainSidebar-QaJ5uvnW.js.map → MainSidebar-K22ttpb5.js.map} +1 -1
- package/dist/assets/{NodeCreation-OxTpBRfP.js → NodeCreation-3pcb_BwC.js} +3 -3
- package/dist/assets/{NodeCreation-OxTpBRfP.js.map → NodeCreation-3pcb_BwC.js.map} +1 -1
- package/dist/assets/{NodeCreator-_GxUysbY.js → NodeCreator-r6gxY14d.js} +2 -2
- package/dist/assets/{NodeCreator-_GxUysbY.js.map → NodeCreator-r6gxY14d.js.map} +1 -1
- package/dist/assets/{NodeView-CdR2fi_x.js → NodeView-LzPrYfwG.js} +3 -3
- package/dist/assets/{NodeView-CdR2fi_x.js.map → NodeView-LzPrYfwG.js.map} +1 -1
- package/dist/assets/{ResourcesListLayout-XUIQQpyB.js → ResourcesListLayout-XbNZXU-j.js} +2 -2
- package/dist/assets/{ResourcesListLayout-XUIQQpyB.js.map → ResourcesListLayout-XbNZXU-j.js.map} +1 -1
- package/dist/assets/{RunDataAi-4m1wWDUf.js → RunDataAi-ueFTZBht.js} +2 -2
- package/dist/assets/{RunDataAi-4m1wWDUf.js.map → RunDataAi-ueFTZBht.js.map} +1 -1
- package/dist/assets/{RunDataJson-FZZoF8ao.js → RunDataJson-VFzb6R4m.js} +3 -3
- package/dist/assets/{RunDataJson-FZZoF8ao.js.map → RunDataJson-VFzb6R4m.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-LZGsgNyW.js → RunDataJsonActions-LDR8SlAW.js} +2 -2
- package/dist/assets/{RunDataJsonActions-LZGsgNyW.js.map → RunDataJsonActions-LDR8SlAW.js.map} +1 -1
- package/dist/assets/{RunDataSchema-wjyR7MiY.js → RunDataSchema-BB0j0bVA.js} +2 -2
- package/dist/assets/{RunDataSchema-wjyR7MiY.js.map → RunDataSchema-BB0j0bVA.js.map} +1 -1
- package/dist/assets/{RunDataTable-690SZ7_1.js → RunDataTable-Qas85Wnj.js} +2 -2
- package/dist/assets/{RunDataTable-690SZ7_1.js.map → RunDataTable-Qas85Wnj.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-9tSVzIi2.js → SamlOnboarding-4D4QjACf.js} +2 -2
- package/dist/assets/{SamlOnboarding-9tSVzIi2.js.map → SamlOnboarding-4D4QjACf.js.map} +1 -1
- package/dist/assets/{SettingsApiView-95Wb-oA5.js → SettingsApiView-0Ne2kemN.js} +2 -2
- package/dist/assets/{SettingsApiView-95Wb-oA5.js.map → SettingsApiView-0Ne2kemN.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-WW65T1Gl.js → SettingsCommunityNodesView-zzzz0aj6.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-WW65T1Gl.js.map → SettingsCommunityNodesView-zzzz0aj6.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-6YJbQ8LH.js → SettingsExternalSecrets-bsdr9nMJ.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-6YJbQ8LH.js.map → SettingsExternalSecrets-bsdr9nMJ.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-6ZiGYnHw.js → SettingsFakeDoorView-0ioWE56l.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-6ZiGYnHw.js.map → SettingsFakeDoorView-0ioWE56l.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-G9lNDLq4.js → SettingsLdapView-nV_D5CDp.js} +2 -2
- package/dist/assets/{SettingsLdapView-G9lNDLq4.js.map → SettingsLdapView-nV_D5CDp.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-hOxp5upg.js → SettingsLogStreamingView-GPC6oqoB.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-hOxp5upg.js.map → SettingsLogStreamingView-GPC6oqoB.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-A4p6uSTm.js → SettingsSourceControl-YlWPbedb.js} +2 -2
- package/dist/assets/{SettingsSourceControl-A4p6uSTm.js.map → SettingsSourceControl-YlWPbedb.js.map} +1 -1
- package/dist/assets/{SettingsSso-kXl38iOM.js → SettingsSso-o3FTQjpW.js} +2 -2
- package/dist/assets/{SettingsSso-kXl38iOM.js.map → SettingsSso-o3FTQjpW.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-E00t5N2Z.js → SettingsUsageAndPlan-lypv7X6a.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-E00t5N2Z.js.map → SettingsUsageAndPlan-lypv7X6a.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-4PoSbZc_.js → SettingsUsersView-BP40GKuA.js} +2 -2
- package/dist/assets/{SettingsUsersView-4PoSbZc_.js.map → SettingsUsersView-BP40GKuA.js.map} +1 -1
- package/dist/assets/{SettingsView-ITSZzUOy.js → SettingsView-UI5wnO8B.js} +2 -2
- package/dist/assets/{SettingsView-ITSZzUOy.js.map → SettingsView-UI5wnO8B.js.map} +1 -1
- package/dist/assets/{SetupView-iFHyYLKM.js → SetupView-jUHcBldc.js} +2 -2
- package/dist/assets/{SetupView-iFHyYLKM.js.map → SetupView-jUHcBldc.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-1mq-ZIl2.js → SetupWorkflowFromTemplateView-xZok8Ro-.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-1mq-ZIl2.js.map → SetupWorkflowFromTemplateView-xZok8Ro-.js.map} +1 -1
- package/dist/assets/{SigninView-eqdMLCtk.js → SigninView-jH2VFMFu.js} +2 -2
- package/dist/assets/{SigninView-eqdMLCtk.js.map → SigninView-jH2VFMFu.js.map} +1 -1
- package/dist/assets/{SignupView-a26ywVgy.js → SignupView-cQJowW7M.js} +2 -2
- package/dist/assets/{SignupView-a26ywVgy.js.map → SignupView-cQJowW7M.js.map} +1 -1
- package/dist/assets/{TemplateDetails-neZvQLcE.js → TemplateDetails-FXwRGgg3.js} +2 -2
- package/dist/assets/{TemplateDetails-neZvQLcE.js.map → TemplateDetails-FXwRGgg3.js.map} +1 -1
- package/dist/assets/{TemplateList-apw79EVp.js → TemplateList-ygiFPwW5.js} +2 -2
- package/dist/assets/{TemplateList-apw79EVp.js.map → TemplateList-ygiFPwW5.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-2NGTxXTg.js → TemplatesCollectionView-iJK5C7dQ.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-2NGTxXTg.js.map → TemplatesCollectionView-iJK5C7dQ.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-0FL2pP83.js → TemplatesSearchView-HA2xad9U.js} +2 -2
- package/dist/assets/{TemplatesSearchView-0FL2pP83.js.map → TemplatesSearchView-HA2xad9U.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-D4Lnmnhg.js → TemplatesWorkflowView-KdHMuTUs.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-D4Lnmnhg.js.map → TemplatesWorkflowView-KdHMuTUs.js.map} +1 -1
- package/dist/assets/{VariablesView-tzHYYMLV.js → VariablesView-BGFOVdr1.js} +2 -2
- package/dist/assets/{VariablesView-tzHYYMLV.js.map → VariablesView-BGFOVdr1.js.map} +1 -1
- package/dist/assets/{WorkerView-AmUPKGBk.js → WorkerView-FnskutaO.js} +2 -2
- package/dist/assets/{WorkerView-AmUPKGBk.js.map → WorkerView-FnskutaO.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-haTVfR4g.js → WorkflowActivator-B2Cg8gE_.js} +2 -2
- package/dist/assets/{WorkflowActivator-haTVfR4g.js.map → WorkflowActivator-B2Cg8gE_.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-azyuxv8R.js → WorkflowOnboardingView-ZBFcAyXB.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-azyuxv8R.js.map → WorkflowOnboardingView-ZBFcAyXB.js.map} +1 -1
- package/dist/assets/{WorkflowsView-oE-PnjgI.js → WorkflowsView-ZCzM_7eW.js} +2 -2
- package/dist/assets/{WorkflowsView-oE-PnjgI.js.map → WorkflowsView-ZCzM_7eW.js.map} +1 -1
- package/dist/assets/{cloud-TMu3mk45.js → cloud-B6sgy7jV.js} +2 -2
- package/dist/assets/{cloud-TMu3mk45.js.map → cloud-B6sgy7jV.js.map} +1 -1
- package/dist/assets/{executionsHelpers-jpam7Sff.js → executionsHelpers-8_uqSfWi.js} +2 -2
- package/dist/assets/{executionsHelpers-jpam7Sff.js.map → executionsHelpers-8_uqSfWi.js.map} +1 -1
- package/dist/assets/{index-hMVAffQ3.js → index-sMRiWGJS.js} +4 -4
- package/dist/assets/{index-hMVAffQ3.js.map → index-sMRiWGJS.js.map} +1 -1
- package/dist/assets/{pushConnection-NKwmlD0l.js → pushConnection-SP3wVlD4.js} +2 -2
- package/dist/assets/{pushConnection-NKwmlD0l.js.map → pushConnection-SP3wVlD4.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-WpRAbEhr.js → useExecutionDebugging-vYjc-e7j.js} +2 -2
- package/dist/assets/{useExecutionDebugging-WpRAbEhr.js.map → useExecutionDebugging-vYjc-e7j.js.map} +1 -1
- package/dist/assets/{workflowActivate-UB1_xc5U.js → workflowActivate-FonyQsS3.js} +2 -2
- package/dist/assets/{workflowActivate-UB1_xc5U.js.map → workflowActivate-FonyQsS3.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/ExecutionsList-VqMNpnno.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{_ as O,n as N,l as A,p as W,u as V,as as q,ds as H,dt as F,s as G,o as j,O as K,k as Y,t as Q,v as X,B as l,V as J,A as Z}from"./n8n-NE7NqrvB.js";import{ag as p,l as b,m as v,T as a,p as c,I as n,G as P,e as k,O as i,Q as M,u as m,S as C,R as g,aH as ee,r as se,M as U,J as te,n as oe,aE as ne,a9 as ae}from"./vendor-2CfOYFi2.js";import{e as ie,b as z,s as re,g as le,w as ce,f as B,h as ue,d as de,a as pe,i as me}from"./index-hMVAffQ3.js";import{m as he}from"./pinia-IhuTtYiV.js";import{D as L}from"./luxon-ZRIU05qF.js";import"./lodash-es-s_m9YyW7.js";import"./@fortawesome/vue-fontawesome-GVmvJ_gj.js";import"./@fortawesome/fontawesome-svg-core-xYGjsix9.js";import"./esprima-next-ulPLCZ1Z.js";import"./@vueuse/core-viEZCtbZ.js";import"./flatted-jPn12Tq4.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./vue-i18n-eiX0lGiQ.js";import"./uuid-McvpxQtQ.js";import"./prettier-s3fE3Qyr.js";import"./codemirror-lang-html-n8n-qoVuUIQR.js";import"./@n8n/codemirror-lang-sql-zd5sOTQ9.js";import"./@lezer/common-aP6EPErF.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-QL7QI0sV.js";import"./codemirror-lang-n8n-expression-qGXLqLTr.js";import"./fast-json-stable-stringify-gO4u4slB.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-f7Vn5Pkq.js";import"./vue3-touch-events-_RfbPMOD.js";import"./@fortawesome/free-solid-svg-icons-KH5RR_hW.js";import"./@fortawesome/free-regular-svg-icons-ipmEYOws.js";import"./chart.js-JtqvIvkt.js";const ge="_notification_j2u1w_12",be={"gift-icon":"_gift-icon_j2u1w_5",notification:ge},fe={},Se=c("div",null,null,-1),_e=[Se];function ye(e,s){const r=p("font-awesome-icon");return b(),v("div",{class:n(e.$style["gift-icon"])},[a(r,{icon:"gift"}),c("div",{class:n(e.$style.notification)},_e,2)],2)}const Ce={$style:be},Te=O(fe,[["render",ye],["__cssModules",Ce]]),ve=["value","max"],we=8,ke=P({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const s=e,r=L.utc(),f=k(()=>{const{days:t=0}=_().diff(r,["days"]).toObject();return Math.ceil(t)}),T=k(()=>{var S;if(!((S=s.cloudPlanData)!=null&&S.expirationDate))return!1;const t=L.fromISO(s.cloudPlanData.expirationDate);return r.toMillis()>t.toMillis()}),_=()=>{var t;return L.fromISO(((t=s==null?void 0:s.cloudPlanData)==null?void 0:t.expirationDate)??"")},u=k(()=>{var t;return(t=s.cloudPlanData)!=null&&t.usage?s.cloudPlanData.usage.executions<s.cloudPlanData.monthlyExecutionsLimit:0}),w=k(()=>{var h;if(!((h=s.cloudPlanData)!=null&&h.usage))return 0;const t=s.cloudPlanData.usage.executions,S=s.cloudPlanData.monthlyExecutionsLimit;return t>S?S:t}),d=k(()=>{var E;if(!((E=s.cloudPlanData)!=null&&E.usage))return 0;const t=s.cloudPlanData.usage.executions,S=s.cloudPlanData.monthlyExecutionsLimit,h=we*S/100;return t<h?h:t}),$=k(()=>{var t;return(t=s.cloudPlanData)!=null&&t.monthlyExecutionsLimit?s.cloudPlanData.monthlyExecutionsLimit:0}),R=()=>{A().goToUpgrade("canvas-nav","upgrade-canvas-nav","redirect")};return(t,S)=>{const h=p("n8n-text"),E=p("i18n-t"),o=p("n8n-button");return b(),v("div",{class:n(t.$style.container)},[T.value?(b(),v("div",{key:0,class:n(t.$style.usageText)},[a(h,{size:"small",color:"danger"},{default:i(()=>[C(g(m(N).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!T.value&&u.value?(b(),v("div",{key:1,class:n(t.$style.usageText)},[a(E,{tag:"span",keypath:"executionUsage.currentUsage"},{text:i(()=>[a(h,{size:"small",color:"text-dark"},{default:i(()=>[C(g(m(N).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:i(()=>[a(h,{size:"small",bold:!0,color:"warning"},{default:i(()=>[C(g(m(N).baseText("executionUsage.currentUsage.count",{adjustToNumber:f.value||0})),1)]),_:1})]),_:1})],2)):u.value?M("",!0):(b(),v("div",{key:2,class:n(t.$style.usageText)},[a(h,{size:"small"},{default:i(()=>[C(g(m(N).baseText("executionUsage.ranOutOfExecutions.text")),1)]),_:1})],2)),T.value?M("",!0):(b(),v("div",{key:3,class:n(t.$style.usageCounter)},[c("div",{class:n(t.$style.progressBarDiv)},[c("progress",{class:n([u.value?t.$style.progressBarSuccess:t.$style.progressBarDanger,t.$style.progressBar]),value:d.value,max:$.value},null,10,ve)],2),c("div",{class:n(t.$style.executionsCountSection)},[a(h,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[C(g(w.value)+"/"+g($.value),1)]),_:1},8,["color"]),a(h,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[C(g(m(N).baseText("executionUsage.label.executions")),1)]),_:1},8,["color"])],2)],2)),c("div",{class:n(t.$style.upgradeButtonSection)},[a(o,{label:m(N).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:R},null,8,["label"])],2)],2)}}}),$e="_container_itrcs_5",Ee="_progressBarDiv_itrcs_13",xe="_progressBar_itrcs_13",Me="_progressBarSuccess_itrcs_42",Re="_progressBarDanger_itrcs_52",Ne="_usageText_itrcs_61",Ie="_usageCounter_itrcs_68",Ue="_danger_itrcs_77",Oe="_executionsCountSection_itrcs_81",De="_upgradeButtonSection_itrcs_85",Le={container:$e,progressBarDiv:Ee,progressBar:xe,progressBarSuccess:Me,progressBarDanger:Re,usageText:Ne,usageCounter:Ie,danger:Ue,executionsCountSection:Oe,upgradeButtonSection:De},Ae={$style:Le},Pe=O(ke,[["__cssModules",Ae]]),Be=P({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const s=e,r={CONFLICT:409};ee();const f=ie(),T=A(),_=W(),u=z(),w=V(),d=q(),$=G(),R=se(300),t=k(()=>u.preferences.branchName),S=k(()=>_.isInstanceOwner);k(()=>s.isCollapsed?"right":"top");async function h(){f.startLoading(),f.setLoadingText(d.baseText("settings.sourceControl.loading.checkingForChanges"));try{const o=await u.getAggregatedStatus();T.openModalWithData({name:H,data:{eventBus:$,status:o}})}catch(o){w.showError(o,d.baseText("error"))}finally{f.stopLoading(),f.setLoadingText(d.baseText("genericHelpers.loading"))}}async function E(){f.startLoading(),f.setLoadingText(d.baseText("settings.sourceControl.loading.pull"));try{const o=await u.pullWorkfolder(!1)||[];if(o.filter(y=>!(y.type==="workflow"&&y.status==="created"&&y.location==="local")).length===0)w.showMessage({title:d.baseText("settings.sourceControl.pull.upToDate.title"),message:d.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{w.showMessage({title:d.baseText("settings.sourceControl.pull.success.title"),type:"success"});const y=["variables","credential"];(o||[]).some(I=>y.includes(I.type))&&oe(()=>{w.showMessage({message:d.baseText("settings.sourceControl.pull.oneLastStep.description"),title:d.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}re.emit("pull")}catch(o){const x=o.response;(x==null?void 0:x.status)===r.CONFLICT?T.openModalWithData({name:F,data:{eventBus:$,status:x.data.data}}):w.showError(o,"Error")}finally{f.stopLoading(),f.setLoadingText(d.baseText("genericHelpers.loading"))}}return(o,x)=>{const y=p("n8n-icon"),D=p("n8n-button"),I=p("n8n-tooltip");return m(u).isEnterpriseSourceControlEnabled&&S.value?(b(),v("div",{key:0,class:n({[o.$style.sync]:!0,[o.$style.collapsed]:o.isCollapsed,[o.$style.isConnected]:m(u).isEnterpriseSourceControlEnabled}),style:te({borderLeftColor:m(u).preferences.branchColor}),"data-test-id":"main-sidebar-source-control"},[m(u).preferences.connected&&m(u).preferences.branchName?(b(),v("div",{key:0,class:n(o.$style.connected),"data-test-id":"main-sidebar-source-control-connected"},[c("span",{class:n(o.$style.branchName)},[a(y,{icon:"code-branch"}),C(" "+g(t.value),1)],2),c("div",{class:n({"pt-xs":!o.isCollapsed})},[a(I,{disabled:!o.isCollapsed,"show-after":R.value,placement:"right"},{content:i(()=>[c("div",null,g(m(d).baseText("settings.sourceControl.button.pull")),1)]),default:i(()=>[a(D,{class:n({"mr-2xs":!o.isCollapsed,"mb-2xs":o.isCollapsed&&!m(u).preferences.branchReadOnly}),icon:"arrow-down",type:"tertiary",size:"mini",square:o.isCollapsed,label:o.isCollapsed?"":m(d).baseText("settings.sourceControl.button.pull"),onClick:E},null,8,["class","square","label"])]),_:1},8,["disabled","show-after"]),m(u).preferences.branchReadOnly?M("",!0):(b(),U(I,{key:0,disabled:!o.isCollapsed,"show-after":R.value,placement:"right"},{content:i(()=>[c("div",null,g(m(d).baseText("settings.sourceControl.button.push")),1)]),default:i(()=>[a(D,{square:o.isCollapsed,label:o.isCollapsed?"":m(d).baseText("settings.sourceControl.button.push"),icon:"arrow-up",type:"tertiary",size:"mini",onClick:h},null,8,["square","label"])]),_:1},8,["disabled","show-after"]))],2)],2)):M("",!0)],6)):M("",!0)}}}),We="_sync_1bnfs_5",ze="_isConnected_1bnfs_12",Ve="_collapsed_1bnfs_16",qe="_branchName_1bnfs_26",He="_connected_1bnfs_36",Fe={sync:We,isConnected:ze,collapsed:Ve,branchName:qe,connected:He},Ge={$style:Fe},je=O(Be,[["__cssModules",Ge]]),Ke=P({name:"MainSidebar",components:{GiftNotificationIcon:Te,ExecutionsUsage:Pe,MainSidebarSourceControl:je},mixins:[le,ce,B,ue,de],setup(e){var s,r;return{...pe(),...(r=(s=B).setup)==null?void 0:r.call(s,e)}},data(){return{basePath:"",fullyExpanded:!1}},computed:{...he(X,Q,A,W,Y,K,j,z),logoPath(){return this.isCollapsed?this.basePath+"n8n-logo-collapsed.svg":this.basePath+this.uiStore.logo},hasVersionUpdates(){return this.settingsStore.settings.releaseChannel==="stable"&&this.versionsStore.hasVersionUpdates},nextVersions(){return this.versionsStore.nextVersions},isCollapsed(){return this.uiStore.sidebarMenuCollapsed},canUserAccessSettings(){return this.findFirstAccessibleSettingsRoute()!==null},showUserArea(){return me(["authenticated"])},workflowExecution(){return this.workflowsStore.getWorkflowExecution},userMenuItems(){return[{id:"settings",label:this.$locale.baseText("settings")},{id:"logout",label:this.$locale.baseText("auth.signout")}]},mainMenuItems(){var T;const e=[],s=this.uiStore.sidebarMenuItems,r={id:"workflows",icon:"network-wired",label:this.$locale.baseText("mainSidebar.workflows"),position:"top",activateOnRouteNames:[l.WORKFLOWS]};if(this.sourceControlStore.preferences.branchReadOnly&&(r.secondaryIcon={name:"lock",tooltip:{content:this.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")}}),s&&s.length>0)for(const _ of s)e.push({id:_.id,icon:_.icon||"",label:_.label||"",position:_.position,type:(T=_.properties)!=null&&T.href?"link":"regular",properties:_.properties});const f=[r,{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"top",available:this.settingsStore.isTemplatesEnabled,activateOnRouteNames:[l.TEMPLATES]},{id:"credentials",icon:"key",label:this.$locale.baseText("mainSidebar.credentials"),customIconSize:"medium",position:"top",activateOnRouteNames:[l.CREDENTIALS]},{id:"variables",icon:"variable",label:this.$locale.baseText("mainSidebar.variables"),customIconSize:"medium",position:"top",activateOnRouteNames:[l.VARIABLES]},{id:"executions",icon:"tasks",label:this.$locale.baseText("mainSidebar.executions"),position:"top",activateOnRouteNames:[l.EXECUTIONS]},{id:"cloud-admin",type:"link",position:"bottom",label:"Admin Panel",icon:"home",available:this.settingsStore.isCloudDeployment&&this.usersStore.isInstanceOwner},{id:"settings",icon:"cog",label:this.$locale.baseText("settings"),position:"bottom",available:this.canUserAccessSettings&&this.usersStore.currentUser!==null,activateOnRouteNames:[l.USERS_SETTINGS,l.API_SETTINGS,l.PERSONAL_SETTINGS]},{id:"help",icon:"question",label:"Help",position:"bottom",children:[{id:"quickstart",icon:"video",label:this.$locale.baseText("mainSidebar.helpMenuItems.quickstart"),type:"link",properties:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",newWindow:!0}},{id:"docs",icon:"book",label:this.$locale.baseText("mainSidebar.helpMenuItems.documentation"),type:"link",properties:{href:"https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",newWindow:!0}},{id:"forum",icon:"users",label:this.$locale.baseText("mainSidebar.helpMenuItems.forum"),type:"link",properties:{href:"https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",newWindow:!0}},{id:"examples",icon:"graduation-cap",label:this.$locale.baseText("mainSidebar.helpMenuItems.course"),type:"link",properties:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",newWindow:!0}},{id:"about",icon:"info",label:this.$locale.baseText("mainSidebar.aboutN8n"),position:"bottom"}]}];return[...e,...f]},userIsTrialing(){return this.cloudPlanStore.userIsTrialing},currentPlanAndUsageData(){const e=this.cloudPlanStore.currentPlanData,s=this.cloudPlanStore.currentUsageData;return!e||!s?null:{...e,usage:s}}},async mounted(){this.basePath=this.rootStore.baseUrl,this.$refs.user&&this.$externalHooks().run("mainSidebar.mounted",{userRef:this.$refs.user}),this.$nextTick(()=>{window.innerWidth<900||this.uiStore.isNodeView?this.uiStore.sidebarMenuCollapsed=!0:this.uiStore.sidebarMenuCollapsed=!1,this.fullyExpanded=!this.isCollapsed})},created(){window.addEventListener("resize",this.onResize)},beforeUnmount(){window.removeEventListener("resize",this.onResize)},methods:{trackHelpItemClick(e){this.$telemetry.track("User clicked help resource",{type:e,workflow_id:this.workflowsStore.workflowId})},async onUserActionToggle(e){switch(e){case"logout":this.onLogout();break;case"settings":this.$router.push({name:l.PERSONAL_SETTINGS});break}},onLogout(){this.$router.push({name:l.SIGNOUT})},toggleCollapse(){this.uiStore.toggleSidebarMenuCollapse(),this.isCollapsed?this.fullyExpanded=!this.isCollapsed:setTimeout(()=>{this.fullyExpanded=!this.isCollapsed},300)},openUpdatesPanel(){this.uiStore.openModal(J)},async handleSelect(e){switch(e){case"workflows":{this.$router.currentRoute.name!==l.WORKFLOWS&&this.goToRoute({name:l.WORKFLOWS});break}case"templates":{this.$router.currentRoute.name!==l.TEMPLATES&&this.goToRoute({name:l.TEMPLATES});break}case"credentials":{this.$router.currentRoute.name!==l.CREDENTIALS&&this.goToRoute({name:l.CREDENTIALS});break}case"variables":{this.$router.currentRoute.name!==l.VARIABLES&&this.goToRoute({name:l.VARIABLES});break}case"executions":{this.$router.currentRoute.name!==l.EXECUTIONS&&this.goToRoute({name:l.EXECUTIONS});break}case"settings":{const s=this.findFirstAccessibleSettingsRoute();if(s){const r=this.$router.resolve({name:s});this.$router.currentRoute.name!==s&&this.goToRoute(r.path)}break}case"about":{this.trackHelpItemClick("about"),this.uiStore.openModal(Z);break}case"cloud-admin":{this.cloudPlanStore.redirectToDashboard();break}case"quickstart":case"docs":case"forum":case"examples":{this.trackHelpItemClick(e);break}}},goToRoute(e){this.$router.push(e).catch(s=>{console.log(s),ne(s)||console.error(s)})},findFirstAccessibleSettingsRoute(){const e=this.$router.getRoutes().find(r=>r.path==="/settings").children.map(r=>r.name||"");let s=null;for(const r of e)if(this.canUserAccessRouteByName(r)){s=r;break}return s},onResize(e){this.callDebounced("onResizeEnd",{debounceTime:100},e)},async onResizeEnd(e){const s=e.target.outerWidth;await this.checkWidthAndAdjustSidebar(s)},async checkWidthAndAdjustSidebar(e){e<900&&(this.uiStore.sidebarMenuCollapsed=!0,await this.$nextTick(),this.fullyExpanded=!this.isCollapsed)}}}),Ye="_sideMenu_q79od_5",Qe="_logo_q79od_12",Xe="_sideMenuCollapsed_q79od_23",Je="_sideMenuCollapseButton_q79od_30",Ze="_updates_q79od_49",es="_expanded_q79od_62",ss="_userArea_q79od_69",ts="_userName_q79od_76",os="_userActions_q79od_90",ns={sideMenu:Ye,logo:Qe,sideMenuCollapsed:Xe,sideMenuCollapseButton:Je,updates:Ze,expanded:es,userArea:ss,userName:ts,userActions:os},as=["src"],is={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function rs(e,s,r,f,T,_){const u=p("n8n-icon"),w=p("ExecutionsUsage"),d=p("GiftNotificationIcon"),$=p("n8n-text"),R=p("MainSidebarSourceControl"),t=p("n8n-avatar"),S=p("el-dropdown-item"),h=p("el-dropdown-menu"),E=p("el-dropdown"),o=p("n8n-action-dropdown"),x=p("n8n-menu");return b(),v("div",{id:"side-menu",class:n({"side-menu":!0,[e.$style.sideMenu]:!0,[e.$style.sideMenuCollapsed]:e.isCollapsed})},[c("div",{id:"collapse-change-button",class:n(["clickable",e.$style.sideMenuCollapseButton]),onClick:s[0]||(s[0]=(...y)=>e.toggleCollapse&&e.toggleCollapse(...y))},[e.isCollapsed?(b(),U(u,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(b(),U(u,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),a(x,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ae({header:i(()=>[c("div",{class:n(e.$style.logo)},[c("img",{src:e.logoPath,"data-test-id":"n8n-logo",class:n(e.$style.icon),alt:"n8n"},null,10,as)],2)]),beforeLowerMenu:i(()=>[e.fullyExpanded&&e.userIsTrialing?(b(),U(w,{key:0,"cloud-plan-data":e.currentPlanAndUsageData},null,8,["cloud-plan-data"])):M("",!0)]),menuSuffix:i(()=>[c("div",null,[e.hasVersionUpdates?(b(),v("div",{key:0,class:n(e.$style.updates),onClick:s[1]||(s[1]=(...y)=>e.openUpdatesPanel&&e.openUpdatesPanel(...y))},[c("div",{class:n(e.$style.giftContainer)},[a(d)],2),a($,{class:n({"ml-xs":!0,[e.$style.expanded]:e.fullyExpanded}),color:"text-base"},{default:i(()=>[C(g(e.nextVersions.length>99?"99+":e.nextVersions.length)+" update"+g(e.nextVersions.length>1?"s":""),1)]),_:1},8,["class"])],2)):M("",!0),a(R,{"is-collapsed":e.isCollapsed},null,8,["is-collapsed"])])]),_:2},[e.showUserArea?{name:"footer",fn:i(()=>[c("div",{class:n(e.$style.userArea)},[c("div",is,[a(E,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:i(()=>[a(h,null,{default:i(()=>[a(S,{command:"settings"},{default:i(()=>[C(g(e.$locale.baseText("settings")),1)]),_:1}),a(S,{command:"logout"},{default:i(()=>[C(g(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:i(()=>[c("div",{class:n({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[a(t,{firstName:e.usersStore.currentUser.firstName,lastName:e.usersStore.currentUser.lastName,size:"small"},null,8,["firstName","lastName"])],2)]),_:1},8,["disabled","onCommand"])]),c("div",{class:n({"ml-2xs":!0,[e.$style.userName]:!0,[e.$style.expanded]:e.fullyExpanded})},[a($,{size:"small",bold:!0,color:"text-dark"},{default:i(()=>[C(g(e.usersStore.currentUser.fullName),1)]),_:1})],2),c("div",{class:n({[e.$style.userActions]:!0,[e.$style.expanded]:e.fullyExpanded})},[a(o,{items:e.userMenuItems,placement:"top-start","data-test-id":"user-menu",onSelect:e.onUserActionToggle},null,8,["items","onSelect"])],2)],2)]),key:"0"}:void 0]),1032,["items","collapsed","onSelect"])],2)}const ls={$style:ns},Ws=O(Ke,[["render",rs],["__cssModules",ls]]);export{Ws as default};
|
|
2
|
-
//# sourceMappingURL=MainSidebar-
|
|
1
|
+
import{_ as O,n as N,l as A,p as W,u as V,as as q,ds as H,dt as F,s as G,o as j,O as K,k as Y,t as Q,v as X,B as l,V as J,A as Z}from"./n8n-NE7NqrvB.js";import{ag as p,l as b,m as v,T as a,p as c,I as n,G as P,e as k,O as i,Q as M,u as m,S as C,R as g,aH as ee,r as se,M as U,J as te,n as oe,aE as ne,a9 as ae}from"./vendor-2CfOYFi2.js";import{e as ie,b as z,s as re,g as le,w as ce,f as B,h as ue,d as de,a as pe,i as me}from"./index-sMRiWGJS.js";import{m as he}from"./pinia-IhuTtYiV.js";import{D as L}from"./luxon-ZRIU05qF.js";import"./lodash-es-s_m9YyW7.js";import"./@fortawesome/vue-fontawesome-GVmvJ_gj.js";import"./@fortawesome/fontawesome-svg-core-xYGjsix9.js";import"./esprima-next-ulPLCZ1Z.js";import"./@vueuse/core-viEZCtbZ.js";import"./flatted-jPn12Tq4.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./vue-i18n-eiX0lGiQ.js";import"./uuid-McvpxQtQ.js";import"./prettier-s3fE3Qyr.js";import"./codemirror-lang-html-n8n-qoVuUIQR.js";import"./@n8n/codemirror-lang-sql-zd5sOTQ9.js";import"./@lezer/common-aP6EPErF.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-QL7QI0sV.js";import"./codemirror-lang-n8n-expression-qGXLqLTr.js";import"./fast-json-stable-stringify-gO4u4slB.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-f7Vn5Pkq.js";import"./vue3-touch-events-_RfbPMOD.js";import"./@fortawesome/free-solid-svg-icons-KH5RR_hW.js";import"./@fortawesome/free-regular-svg-icons-ipmEYOws.js";import"./chart.js-JtqvIvkt.js";const ge="_notification_j2u1w_12",be={"gift-icon":"_gift-icon_j2u1w_5",notification:ge},fe={},Se=c("div",null,null,-1),_e=[Se];function ye(e,s){const r=p("font-awesome-icon");return b(),v("div",{class:n(e.$style["gift-icon"])},[a(r,{icon:"gift"}),c("div",{class:n(e.$style.notification)},_e,2)],2)}const Ce={$style:be},Te=O(fe,[["render",ye],["__cssModules",Ce]]),ve=["value","max"],we=8,ke=P({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const s=e,r=L.utc(),f=k(()=>{const{days:t=0}=_().diff(r,["days"]).toObject();return Math.ceil(t)}),T=k(()=>{var S;if(!((S=s.cloudPlanData)!=null&&S.expirationDate))return!1;const t=L.fromISO(s.cloudPlanData.expirationDate);return r.toMillis()>t.toMillis()}),_=()=>{var t;return L.fromISO(((t=s==null?void 0:s.cloudPlanData)==null?void 0:t.expirationDate)??"")},u=k(()=>{var t;return(t=s.cloudPlanData)!=null&&t.usage?s.cloudPlanData.usage.executions<s.cloudPlanData.monthlyExecutionsLimit:0}),w=k(()=>{var h;if(!((h=s.cloudPlanData)!=null&&h.usage))return 0;const t=s.cloudPlanData.usage.executions,S=s.cloudPlanData.monthlyExecutionsLimit;return t>S?S:t}),d=k(()=>{var E;if(!((E=s.cloudPlanData)!=null&&E.usage))return 0;const t=s.cloudPlanData.usage.executions,S=s.cloudPlanData.monthlyExecutionsLimit,h=we*S/100;return t<h?h:t}),$=k(()=>{var t;return(t=s.cloudPlanData)!=null&&t.monthlyExecutionsLimit?s.cloudPlanData.monthlyExecutionsLimit:0}),R=()=>{A().goToUpgrade("canvas-nav","upgrade-canvas-nav","redirect")};return(t,S)=>{const h=p("n8n-text"),E=p("i18n-t"),o=p("n8n-button");return b(),v("div",{class:n(t.$style.container)},[T.value?(b(),v("div",{key:0,class:n(t.$style.usageText)},[a(h,{size:"small",color:"danger"},{default:i(()=>[C(g(m(N).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!T.value&&u.value?(b(),v("div",{key:1,class:n(t.$style.usageText)},[a(E,{tag:"span",keypath:"executionUsage.currentUsage"},{text:i(()=>[a(h,{size:"small",color:"text-dark"},{default:i(()=>[C(g(m(N).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:i(()=>[a(h,{size:"small",bold:!0,color:"warning"},{default:i(()=>[C(g(m(N).baseText("executionUsage.currentUsage.count",{adjustToNumber:f.value||0})),1)]),_:1})]),_:1})],2)):u.value?M("",!0):(b(),v("div",{key:2,class:n(t.$style.usageText)},[a(h,{size:"small"},{default:i(()=>[C(g(m(N).baseText("executionUsage.ranOutOfExecutions.text")),1)]),_:1})],2)),T.value?M("",!0):(b(),v("div",{key:3,class:n(t.$style.usageCounter)},[c("div",{class:n(t.$style.progressBarDiv)},[c("progress",{class:n([u.value?t.$style.progressBarSuccess:t.$style.progressBarDanger,t.$style.progressBar]),value:d.value,max:$.value},null,10,ve)],2),c("div",{class:n(t.$style.executionsCountSection)},[a(h,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[C(g(w.value)+"/"+g($.value),1)]),_:1},8,["color"]),a(h,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[C(g(m(N).baseText("executionUsage.label.executions")),1)]),_:1},8,["color"])],2)],2)),c("div",{class:n(t.$style.upgradeButtonSection)},[a(o,{label:m(N).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:R},null,8,["label"])],2)],2)}}}),$e="_container_itrcs_5",Ee="_progressBarDiv_itrcs_13",xe="_progressBar_itrcs_13",Me="_progressBarSuccess_itrcs_42",Re="_progressBarDanger_itrcs_52",Ne="_usageText_itrcs_61",Ie="_usageCounter_itrcs_68",Ue="_danger_itrcs_77",Oe="_executionsCountSection_itrcs_81",De="_upgradeButtonSection_itrcs_85",Le={container:$e,progressBarDiv:Ee,progressBar:xe,progressBarSuccess:Me,progressBarDanger:Re,usageText:Ne,usageCounter:Ie,danger:Ue,executionsCountSection:Oe,upgradeButtonSection:De},Ae={$style:Le},Pe=O(ke,[["__cssModules",Ae]]),Be=P({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const s=e,r={CONFLICT:409};ee();const f=ie(),T=A(),_=W(),u=z(),w=V(),d=q(),$=G(),R=se(300),t=k(()=>u.preferences.branchName),S=k(()=>_.isInstanceOwner);k(()=>s.isCollapsed?"right":"top");async function h(){f.startLoading(),f.setLoadingText(d.baseText("settings.sourceControl.loading.checkingForChanges"));try{const o=await u.getAggregatedStatus();T.openModalWithData({name:H,data:{eventBus:$,status:o}})}catch(o){w.showError(o,d.baseText("error"))}finally{f.stopLoading(),f.setLoadingText(d.baseText("genericHelpers.loading"))}}async function E(){f.startLoading(),f.setLoadingText(d.baseText("settings.sourceControl.loading.pull"));try{const o=await u.pullWorkfolder(!1)||[];if(o.filter(y=>!(y.type==="workflow"&&y.status==="created"&&y.location==="local")).length===0)w.showMessage({title:d.baseText("settings.sourceControl.pull.upToDate.title"),message:d.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{w.showMessage({title:d.baseText("settings.sourceControl.pull.success.title"),type:"success"});const y=["variables","credential"];(o||[]).some(I=>y.includes(I.type))&&oe(()=>{w.showMessage({message:d.baseText("settings.sourceControl.pull.oneLastStep.description"),title:d.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}re.emit("pull")}catch(o){const x=o.response;(x==null?void 0:x.status)===r.CONFLICT?T.openModalWithData({name:F,data:{eventBus:$,status:x.data.data}}):w.showError(o,"Error")}finally{f.stopLoading(),f.setLoadingText(d.baseText("genericHelpers.loading"))}}return(o,x)=>{const y=p("n8n-icon"),D=p("n8n-button"),I=p("n8n-tooltip");return m(u).isEnterpriseSourceControlEnabled&&S.value?(b(),v("div",{key:0,class:n({[o.$style.sync]:!0,[o.$style.collapsed]:o.isCollapsed,[o.$style.isConnected]:m(u).isEnterpriseSourceControlEnabled}),style:te({borderLeftColor:m(u).preferences.branchColor}),"data-test-id":"main-sidebar-source-control"},[m(u).preferences.connected&&m(u).preferences.branchName?(b(),v("div",{key:0,class:n(o.$style.connected),"data-test-id":"main-sidebar-source-control-connected"},[c("span",{class:n(o.$style.branchName)},[a(y,{icon:"code-branch"}),C(" "+g(t.value),1)],2),c("div",{class:n({"pt-xs":!o.isCollapsed})},[a(I,{disabled:!o.isCollapsed,"show-after":R.value,placement:"right"},{content:i(()=>[c("div",null,g(m(d).baseText("settings.sourceControl.button.pull")),1)]),default:i(()=>[a(D,{class:n({"mr-2xs":!o.isCollapsed,"mb-2xs":o.isCollapsed&&!m(u).preferences.branchReadOnly}),icon:"arrow-down",type:"tertiary",size:"mini",square:o.isCollapsed,label:o.isCollapsed?"":m(d).baseText("settings.sourceControl.button.pull"),onClick:E},null,8,["class","square","label"])]),_:1},8,["disabled","show-after"]),m(u).preferences.branchReadOnly?M("",!0):(b(),U(I,{key:0,disabled:!o.isCollapsed,"show-after":R.value,placement:"right"},{content:i(()=>[c("div",null,g(m(d).baseText("settings.sourceControl.button.push")),1)]),default:i(()=>[a(D,{square:o.isCollapsed,label:o.isCollapsed?"":m(d).baseText("settings.sourceControl.button.push"),icon:"arrow-up",type:"tertiary",size:"mini",onClick:h},null,8,["square","label"])]),_:1},8,["disabled","show-after"]))],2)],2)):M("",!0)],6)):M("",!0)}}}),We="_sync_1bnfs_5",ze="_isConnected_1bnfs_12",Ve="_collapsed_1bnfs_16",qe="_branchName_1bnfs_26",He="_connected_1bnfs_36",Fe={sync:We,isConnected:ze,collapsed:Ve,branchName:qe,connected:He},Ge={$style:Fe},je=O(Be,[["__cssModules",Ge]]),Ke=P({name:"MainSidebar",components:{GiftNotificationIcon:Te,ExecutionsUsage:Pe,MainSidebarSourceControl:je},mixins:[le,ce,B,ue,de],setup(e){var s,r;return{...pe(),...(r=(s=B).setup)==null?void 0:r.call(s,e)}},data(){return{basePath:"",fullyExpanded:!1}},computed:{...he(X,Q,A,W,Y,K,j,z),logoPath(){return this.isCollapsed?this.basePath+"n8n-logo-collapsed.svg":this.basePath+this.uiStore.logo},hasVersionUpdates(){return this.settingsStore.settings.releaseChannel==="stable"&&this.versionsStore.hasVersionUpdates},nextVersions(){return this.versionsStore.nextVersions},isCollapsed(){return this.uiStore.sidebarMenuCollapsed},canUserAccessSettings(){return this.findFirstAccessibleSettingsRoute()!==null},showUserArea(){return me(["authenticated"])},workflowExecution(){return this.workflowsStore.getWorkflowExecution},userMenuItems(){return[{id:"settings",label:this.$locale.baseText("settings")},{id:"logout",label:this.$locale.baseText("auth.signout")}]},mainMenuItems(){var T;const e=[],s=this.uiStore.sidebarMenuItems,r={id:"workflows",icon:"network-wired",label:this.$locale.baseText("mainSidebar.workflows"),position:"top",activateOnRouteNames:[l.WORKFLOWS]};if(this.sourceControlStore.preferences.branchReadOnly&&(r.secondaryIcon={name:"lock",tooltip:{content:this.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")}}),s&&s.length>0)for(const _ of s)e.push({id:_.id,icon:_.icon||"",label:_.label||"",position:_.position,type:(T=_.properties)!=null&&T.href?"link":"regular",properties:_.properties});const f=[r,{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"top",available:this.settingsStore.isTemplatesEnabled,activateOnRouteNames:[l.TEMPLATES]},{id:"credentials",icon:"key",label:this.$locale.baseText("mainSidebar.credentials"),customIconSize:"medium",position:"top",activateOnRouteNames:[l.CREDENTIALS]},{id:"variables",icon:"variable",label:this.$locale.baseText("mainSidebar.variables"),customIconSize:"medium",position:"top",activateOnRouteNames:[l.VARIABLES]},{id:"executions",icon:"tasks",label:this.$locale.baseText("mainSidebar.executions"),position:"top",activateOnRouteNames:[l.EXECUTIONS]},{id:"cloud-admin",type:"link",position:"bottom",label:"Admin Panel",icon:"home",available:this.settingsStore.isCloudDeployment&&this.usersStore.isInstanceOwner},{id:"settings",icon:"cog",label:this.$locale.baseText("settings"),position:"bottom",available:this.canUserAccessSettings&&this.usersStore.currentUser!==null,activateOnRouteNames:[l.USERS_SETTINGS,l.API_SETTINGS,l.PERSONAL_SETTINGS]},{id:"help",icon:"question",label:"Help",position:"bottom",children:[{id:"quickstart",icon:"video",label:this.$locale.baseText("mainSidebar.helpMenuItems.quickstart"),type:"link",properties:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",newWindow:!0}},{id:"docs",icon:"book",label:this.$locale.baseText("mainSidebar.helpMenuItems.documentation"),type:"link",properties:{href:"https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",newWindow:!0}},{id:"forum",icon:"users",label:this.$locale.baseText("mainSidebar.helpMenuItems.forum"),type:"link",properties:{href:"https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",newWindow:!0}},{id:"examples",icon:"graduation-cap",label:this.$locale.baseText("mainSidebar.helpMenuItems.course"),type:"link",properties:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",newWindow:!0}},{id:"about",icon:"info",label:this.$locale.baseText("mainSidebar.aboutN8n"),position:"bottom"}]}];return[...e,...f]},userIsTrialing(){return this.cloudPlanStore.userIsTrialing},currentPlanAndUsageData(){const e=this.cloudPlanStore.currentPlanData,s=this.cloudPlanStore.currentUsageData;return!e||!s?null:{...e,usage:s}}},async mounted(){this.basePath=this.rootStore.baseUrl,this.$refs.user&&this.$externalHooks().run("mainSidebar.mounted",{userRef:this.$refs.user}),this.$nextTick(()=>{window.innerWidth<900||this.uiStore.isNodeView?this.uiStore.sidebarMenuCollapsed=!0:this.uiStore.sidebarMenuCollapsed=!1,this.fullyExpanded=!this.isCollapsed})},created(){window.addEventListener("resize",this.onResize)},beforeUnmount(){window.removeEventListener("resize",this.onResize)},methods:{trackHelpItemClick(e){this.$telemetry.track("User clicked help resource",{type:e,workflow_id:this.workflowsStore.workflowId})},async onUserActionToggle(e){switch(e){case"logout":this.onLogout();break;case"settings":this.$router.push({name:l.PERSONAL_SETTINGS});break}},onLogout(){this.$router.push({name:l.SIGNOUT})},toggleCollapse(){this.uiStore.toggleSidebarMenuCollapse(),this.isCollapsed?this.fullyExpanded=!this.isCollapsed:setTimeout(()=>{this.fullyExpanded=!this.isCollapsed},300)},openUpdatesPanel(){this.uiStore.openModal(J)},async handleSelect(e){switch(e){case"workflows":{this.$router.currentRoute.name!==l.WORKFLOWS&&this.goToRoute({name:l.WORKFLOWS});break}case"templates":{this.$router.currentRoute.name!==l.TEMPLATES&&this.goToRoute({name:l.TEMPLATES});break}case"credentials":{this.$router.currentRoute.name!==l.CREDENTIALS&&this.goToRoute({name:l.CREDENTIALS});break}case"variables":{this.$router.currentRoute.name!==l.VARIABLES&&this.goToRoute({name:l.VARIABLES});break}case"executions":{this.$router.currentRoute.name!==l.EXECUTIONS&&this.goToRoute({name:l.EXECUTIONS});break}case"settings":{const s=this.findFirstAccessibleSettingsRoute();if(s){const r=this.$router.resolve({name:s});this.$router.currentRoute.name!==s&&this.goToRoute(r.path)}break}case"about":{this.trackHelpItemClick("about"),this.uiStore.openModal(Z);break}case"cloud-admin":{this.cloudPlanStore.redirectToDashboard();break}case"quickstart":case"docs":case"forum":case"examples":{this.trackHelpItemClick(e);break}}},goToRoute(e){this.$router.push(e).catch(s=>{console.log(s),ne(s)||console.error(s)})},findFirstAccessibleSettingsRoute(){const e=this.$router.getRoutes().find(r=>r.path==="/settings").children.map(r=>r.name||"");let s=null;for(const r of e)if(this.canUserAccessRouteByName(r)){s=r;break}return s},onResize(e){this.callDebounced("onResizeEnd",{debounceTime:100},e)},async onResizeEnd(e){const s=e.target.outerWidth;await this.checkWidthAndAdjustSidebar(s)},async checkWidthAndAdjustSidebar(e){e<900&&(this.uiStore.sidebarMenuCollapsed=!0,await this.$nextTick(),this.fullyExpanded=!this.isCollapsed)}}}),Ye="_sideMenu_q79od_5",Qe="_logo_q79od_12",Xe="_sideMenuCollapsed_q79od_23",Je="_sideMenuCollapseButton_q79od_30",Ze="_updates_q79od_49",es="_expanded_q79od_62",ss="_userArea_q79od_69",ts="_userName_q79od_76",os="_userActions_q79od_90",ns={sideMenu:Ye,logo:Qe,sideMenuCollapsed:Xe,sideMenuCollapseButton:Je,updates:Ze,expanded:es,userArea:ss,userName:ts,userActions:os},as=["src"],is={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function rs(e,s,r,f,T,_){const u=p("n8n-icon"),w=p("ExecutionsUsage"),d=p("GiftNotificationIcon"),$=p("n8n-text"),R=p("MainSidebarSourceControl"),t=p("n8n-avatar"),S=p("el-dropdown-item"),h=p("el-dropdown-menu"),E=p("el-dropdown"),o=p("n8n-action-dropdown"),x=p("n8n-menu");return b(),v("div",{id:"side-menu",class:n({"side-menu":!0,[e.$style.sideMenu]:!0,[e.$style.sideMenuCollapsed]:e.isCollapsed})},[c("div",{id:"collapse-change-button",class:n(["clickable",e.$style.sideMenuCollapseButton]),onClick:s[0]||(s[0]=(...y)=>e.toggleCollapse&&e.toggleCollapse(...y))},[e.isCollapsed?(b(),U(u,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(b(),U(u,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),a(x,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ae({header:i(()=>[c("div",{class:n(e.$style.logo)},[c("img",{src:e.logoPath,"data-test-id":"n8n-logo",class:n(e.$style.icon),alt:"n8n"},null,10,as)],2)]),beforeLowerMenu:i(()=>[e.fullyExpanded&&e.userIsTrialing?(b(),U(w,{key:0,"cloud-plan-data":e.currentPlanAndUsageData},null,8,["cloud-plan-data"])):M("",!0)]),menuSuffix:i(()=>[c("div",null,[e.hasVersionUpdates?(b(),v("div",{key:0,class:n(e.$style.updates),onClick:s[1]||(s[1]=(...y)=>e.openUpdatesPanel&&e.openUpdatesPanel(...y))},[c("div",{class:n(e.$style.giftContainer)},[a(d)],2),a($,{class:n({"ml-xs":!0,[e.$style.expanded]:e.fullyExpanded}),color:"text-base"},{default:i(()=>[C(g(e.nextVersions.length>99?"99+":e.nextVersions.length)+" update"+g(e.nextVersions.length>1?"s":""),1)]),_:1},8,["class"])],2)):M("",!0),a(R,{"is-collapsed":e.isCollapsed},null,8,["is-collapsed"])])]),_:2},[e.showUserArea?{name:"footer",fn:i(()=>[c("div",{class:n(e.$style.userArea)},[c("div",is,[a(E,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:i(()=>[a(h,null,{default:i(()=>[a(S,{command:"settings"},{default:i(()=>[C(g(e.$locale.baseText("settings")),1)]),_:1}),a(S,{command:"logout"},{default:i(()=>[C(g(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:i(()=>[c("div",{class:n({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[a(t,{firstName:e.usersStore.currentUser.firstName,lastName:e.usersStore.currentUser.lastName,size:"small"},null,8,["firstName","lastName"])],2)]),_:1},8,["disabled","onCommand"])]),c("div",{class:n({"ml-2xs":!0,[e.$style.userName]:!0,[e.$style.expanded]:e.fullyExpanded})},[a($,{size:"small",bold:!0,color:"text-dark"},{default:i(()=>[C(g(e.usersStore.currentUser.fullName),1)]),_:1})],2),c("div",{class:n({[e.$style.userActions]:!0,[e.$style.expanded]:e.fullyExpanded})},[a(o,{items:e.userMenuItems,placement:"top-start","data-test-id":"user-menu",onSelect:e.onUserActionToggle},null,8,["items","onSelect"])],2)],2)]),key:"0"}:void 0]),1032,["items","collapsed","onSelect"])],2)}const ls={$style:ns},Ws=O(Ke,[["render",rs],["__cssModules",ls]]);export{Ws as default};
|
|
2
|
+
//# sourceMappingURL=MainSidebar-K22ttpb5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MainSidebar-QaJ5uvnW.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/components/ExecutionsUsage.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","<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 { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUsersStore } from '@/stores/users.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 usersStore = useUsersStore();\nconst sourceControlStore = useSourceControlStore();\nconst message = useMessage();\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 isInstanceOwner = computed(() => usersStore.isInstanceOwner);\nconst setupButtonTooltipPlacement = computed(() => (props.isCollapsed ? 'right' : 'top'));\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=\"sourceControlStore.isEnterpriseSourceControlEnabled && isInstanceOwner\"\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<ExecutionsUsage\n\t\t\t\t\t:cloud-plan-data=\"currentPlanAndUsageData\"\n\t\t\t\t\tv-if=\"fullyExpanded && userIsTrialing\"\n\t\t\t/></template>\n\t\t\t<template #menuSuffix>\n\t\t\t\t<div>\n\t\t\t\t\t<div v-if=\"hasVersionUpdates\" :class=\"$style.updates\" @click=\"openUpdatesPanel\">\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 #footer v-if=\"showUserArea\">\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:firstName=\"usersStore.currentUser.firstName\"\n\t\t\t\t\t\t\t\t\t:lastName=\"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 { genericHelpers } from '@/mixins/genericHelpers';\nimport { useMessage } from '@/composables/useMessage';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { workflowRun } from '@/mixins/workflowRun';\n\nimport { ABOUT_MODAL_KEY, VERSIONS_MODAL_KEY, VIEWS } from '@/constants';\nimport { userHelpers } from '@/mixins/userHelpers';\nimport { debounceHelper } from '@/mixins/debounce';\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 { isNavigationFailure } from 'vue-router';\nimport ExecutionsUsage from '@/components/ExecutionsUsage.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/rbac/permissions';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tExecutionsUsage,\n\t\tMainSidebarSourceControl,\n\t},\n\tmixins: [genericHelpers, workflowHelpers, workflowRun, userHelpers, debounceHelper],\n\tsetup(props) {\n\t\treturn {\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowRun.setup?.(props),\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),\n\t\tlogoPath(): string {\n\t\t\tif (this.isCollapsed) return this.basePath + 'n8n-logo-collapsed.svg';\n\n\t\t\treturn this.basePath + 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\t\t\tconst injectedItems = this.uiStore.sidebarMenuItems;\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\tactivateOnRouteNames: [VIEWS.WORKFLOWS],\n\t\t\t};\n\n\t\t\tif (this.sourceControlStore.preferences.branchReadOnly) {\n\t\t\t\tworkflows.secondaryIcon = {\n\t\t\t\t\tname: 'lock',\n\t\t\t\t\ttooltip: {\n\t\t\t\t\t\tcontent: this.$locale.baseText('mainSidebar.workflows.readOnlyEnv.tooltip'),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (injectedItems && injectedItems.length > 0) {\n\t\t\t\tfor (const item of injectedItems) {\n\t\t\t\t\titems.push({\n\t\t\t\t\t\tid: item.id,\n\t\t\t\t\t\ticon: item.icon || '',\n\t\t\t\t\t\tlabel: item.label || '',\n\t\t\t\t\t\tposition: item.position,\n\t\t\t\t\t\ttype: item.properties?.href ? 'link' : 'regular',\n\t\t\t\t\t\tproperties: item.properties,\n\t\t\t\t\t} as IMenuItem);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst regularItems: IMenuItem[] = [\n\t\t\t\tworkflows,\n\t\t\t\t{\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: this.settingsStore.isTemplatesEnabled,\n\t\t\t\t\tactivateOnRouteNames: [VIEWS.TEMPLATES],\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\tactivateOnRouteNames: [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\tactivateOnRouteNames: [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\tactivateOnRouteNames: [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\ttype: 'link',\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 && this.usersStore.isInstanceOwner,\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},\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\tnewWindow: true,\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\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\tnewWindow: true,\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\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\tnewWindow: true,\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\tnewWindow: true,\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\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\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\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 'workflows': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.WORKFLOWS) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.WORKFLOWS });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.TEMPLATES) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.TEMPLATES });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'credentials': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.CREDENTIALS) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.CREDENTIALS });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'variables': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.VARIABLES) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.VARIABLES });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'executions': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.EXECUTIONS) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.EXECUTIONS });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst defaultRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\t\t\tif (defaultRoute) {\n\t\t\t\t\t\tconst route = this.$router.resolve({ name: defaultRoute });\n\t\t\t\t\t\tif (this.$router.currentRoute.name !== defaultRoute) {\n\t\t\t\t\t\t\tthis.goToRoute(route.path);\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\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\tthis.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\tgoToRoute(route: string | { name: string }) {\n\t\t\tthis.$router.push(route).catch((failure) => {\n\t\t\t\tconsole.log(failure);\n\t\t\t\t// Catch navigation failures caused by route guards\n\t\t\t\tif (!isNavigationFailure(failure)) {\n\t\t\t\t\tconsole.error(failure);\n\t\t\t\t}\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 = null;\n\t\t\tfor (const route of settingsRoutes) {\n\t\t\t\tif (this.canUserAccessRouteByName(route)) {\n\t\t\t\t\tdefaultSettingsRoute = route;\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('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","_createVNode","_component_font_awesome_icon","_createElementVNode","PROGRESS_BAR_MINIMUM_THRESHOLD","now","DateTime","daysLeftOnTrial","computed","days","getPlanExpirationDate","isTrialExpired","_a","props","trialEndsAt","trialHasExecutionsLeft","currentExecutions","usedExecutions","executionsQuota","currentExecutionsWithThreshold","threshold","maxExecutions","onUpgradeClicked","useUIStore","responseStatuses","useRouter","loadingService","useLoadingService","uiStore","usersStore","useUsersStore","sourceControlStore","useSourceControlStore","toast","useToast","i18n","useI18n","eventBus","createEventBus","tooltipOpenDelay","ref","currentBranch","isInstanceOwner","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","genericHelpers","workflowHelpers","workflowRun","userHelpers","debounceHelper","useMessage","_b","mapStores","useRootStore","useSettingsStore","useVersionsStore","useWorkflowsStore","useCloudPlanStore","hasPermission","items","injectedItems","workflows","VIEWS","item","regularItems","planData","usage","itemType","action","VERSIONS_MODAL_KEY","key","defaultRoute","route","ABOUT_MODAL_KEY","failure","isNavigationFailure","settingsRoutes","defaultSettingsRoute","event","browserWidth","width","_hoisted_1","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","args","_createBlock","_component_n8n_icon","_component_n8n_menu","_createSlots","_withCtx","_component_ExecutionsUsage","_createCommentVNode","_component_GiftNotificationIcon","_component_n8n_text","_component_el_dropdown","_component_el_dropdown_menu","_component_el_dropdown_item","_component_n8n_avatar","_component_n8n_action_dropdown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MainSidebar-K22ttpb5.js","sources":["../../src/components/GiftNotificationIcon.vue","../../src/components/ExecutionsUsage.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","<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 { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUsersStore } from '@/stores/users.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 usersStore = useUsersStore();\nconst sourceControlStore = useSourceControlStore();\nconst message = useMessage();\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 isInstanceOwner = computed(() => usersStore.isInstanceOwner);\nconst setupButtonTooltipPlacement = computed(() => (props.isCollapsed ? 'right' : 'top'));\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=\"sourceControlStore.isEnterpriseSourceControlEnabled && isInstanceOwner\"\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<ExecutionsUsage\n\t\t\t\t\t:cloud-plan-data=\"currentPlanAndUsageData\"\n\t\t\t\t\tv-if=\"fullyExpanded && userIsTrialing\"\n\t\t\t/></template>\n\t\t\t<template #menuSuffix>\n\t\t\t\t<div>\n\t\t\t\t\t<div v-if=\"hasVersionUpdates\" :class=\"$style.updates\" @click=\"openUpdatesPanel\">\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 #footer v-if=\"showUserArea\">\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:firstName=\"usersStore.currentUser.firstName\"\n\t\t\t\t\t\t\t\t\t:lastName=\"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 { genericHelpers } from '@/mixins/genericHelpers';\nimport { useMessage } from '@/composables/useMessage';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { workflowRun } from '@/mixins/workflowRun';\n\nimport { ABOUT_MODAL_KEY, VERSIONS_MODAL_KEY, VIEWS } from '@/constants';\nimport { userHelpers } from '@/mixins/userHelpers';\nimport { debounceHelper } from '@/mixins/debounce';\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 { isNavigationFailure } from 'vue-router';\nimport ExecutionsUsage from '@/components/ExecutionsUsage.vue';\nimport MainSidebarSourceControl from '@/components/MainSidebarSourceControl.vue';\nimport { hasPermission } from '@/rbac/permissions';\n\nexport default defineComponent({\n\tname: 'MainSidebar',\n\tcomponents: {\n\t\tGiftNotificationIcon,\n\t\tExecutionsUsage,\n\t\tMainSidebarSourceControl,\n\t},\n\tmixins: [genericHelpers, workflowHelpers, workflowRun, userHelpers, debounceHelper],\n\tsetup(props) {\n\t\treturn {\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowRun.setup?.(props),\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),\n\t\tlogoPath(): string {\n\t\t\tif (this.isCollapsed) return this.basePath + 'n8n-logo-collapsed.svg';\n\n\t\t\treturn this.basePath + 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\t\t\tconst injectedItems = this.uiStore.sidebarMenuItems;\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\tactivateOnRouteNames: [VIEWS.WORKFLOWS],\n\t\t\t};\n\n\t\t\tif (this.sourceControlStore.preferences.branchReadOnly) {\n\t\t\t\tworkflows.secondaryIcon = {\n\t\t\t\t\tname: 'lock',\n\t\t\t\t\ttooltip: {\n\t\t\t\t\t\tcontent: this.$locale.baseText('mainSidebar.workflows.readOnlyEnv.tooltip'),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (injectedItems && injectedItems.length > 0) {\n\t\t\t\tfor (const item of injectedItems) {\n\t\t\t\t\titems.push({\n\t\t\t\t\t\tid: item.id,\n\t\t\t\t\t\ticon: item.icon || '',\n\t\t\t\t\t\tlabel: item.label || '',\n\t\t\t\t\t\tposition: item.position,\n\t\t\t\t\t\ttype: item.properties?.href ? 'link' : 'regular',\n\t\t\t\t\t\tproperties: item.properties,\n\t\t\t\t\t} as IMenuItem);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst regularItems: IMenuItem[] = [\n\t\t\t\tworkflows,\n\t\t\t\t{\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: this.settingsStore.isTemplatesEnabled,\n\t\t\t\t\tactivateOnRouteNames: [VIEWS.TEMPLATES],\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\tactivateOnRouteNames: [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\tactivateOnRouteNames: [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\tactivateOnRouteNames: [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\ttype: 'link',\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 && this.usersStore.isInstanceOwner,\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},\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\tnewWindow: true,\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\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\tnewWindow: true,\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\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\tnewWindow: true,\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\ttype: 'link',\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\thref: 'https://www.youtube.com/watch?v=1MwSoB0gnM4',\n\t\t\t\t\t\t\t\tnewWindow: true,\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\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\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\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 'workflows': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.WORKFLOWS) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.WORKFLOWS });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.TEMPLATES) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.TEMPLATES });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'credentials': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.CREDENTIALS) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.CREDENTIALS });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'variables': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.VARIABLES) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.VARIABLES });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'executions': {\n\t\t\t\t\tif (this.$router.currentRoute.name !== VIEWS.EXECUTIONS) {\n\t\t\t\t\t\tthis.goToRoute({ name: VIEWS.EXECUTIONS });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst defaultRoute = this.findFirstAccessibleSettingsRoute();\n\t\t\t\t\tif (defaultRoute) {\n\t\t\t\t\t\tconst route = this.$router.resolve({ name: defaultRoute });\n\t\t\t\t\t\tif (this.$router.currentRoute.name !== defaultRoute) {\n\t\t\t\t\t\t\tthis.goToRoute(route.path);\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\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\tthis.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\tgoToRoute(route: string | { name: string }) {\n\t\t\tthis.$router.push(route).catch((failure) => {\n\t\t\t\tconsole.log(failure);\n\t\t\t\t// Catch navigation failures caused by route guards\n\t\t\t\tif (!isNavigationFailure(failure)) {\n\t\t\t\t\tconsole.error(failure);\n\t\t\t\t}\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 = null;\n\t\t\tfor (const route of settingsRoutes) {\n\t\t\t\tif (this.canUserAccessRouteByName(route)) {\n\t\t\t\t\tdefaultSettingsRoute = route;\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('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","_createVNode","_component_font_awesome_icon","_createElementVNode","PROGRESS_BAR_MINIMUM_THRESHOLD","now","DateTime","daysLeftOnTrial","computed","days","getPlanExpirationDate","isTrialExpired","_a","props","trialEndsAt","trialHasExecutionsLeft","currentExecutions","usedExecutions","executionsQuota","currentExecutionsWithThreshold","threshold","maxExecutions","onUpgradeClicked","useUIStore","responseStatuses","useRouter","loadingService","useLoadingService","uiStore","usersStore","useUsersStore","sourceControlStore","useSourceControlStore","toast","useToast","i18n","useI18n","eventBus","createEventBus","tooltipOpenDelay","ref","currentBranch","isInstanceOwner","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","genericHelpers","workflowHelpers","workflowRun","userHelpers","debounceHelper","useMessage","_b","mapStores","useRootStore","useSettingsStore","useVersionsStore","useWorkflowsStore","useCloudPlanStore","hasPermission","items","injectedItems","workflows","VIEWS","item","regularItems","planData","usage","itemType","action","VERSIONS_MODAL_KEY","key","defaultRoute","route","ABOUT_MODAL_KEY","failure","isNavigationFailure","settingsRoutes","defaultSettingsRoute","event","browserWidth","width","_hoisted_1","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","args","_createBlock","_component_n8n_icon","_component_n8n_menu","_createSlots","_withCtx","_component_ExecutionsUsage","_createCommentVNode","_component_GiftNotificationIcon","_component_n8n_text","_component_el_dropdown","_component_el_dropdown_menu","_component_el_dropdown_item","_component_n8n_avatar","_component_n8n_action_dropdown"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{b8 as w,af as $,er as R,n as M,O as B,x as V,a3 as W,b9 as Y,Q as z,S as L,eU as g,ey as H,d0 as U,l as G,ft as K,fu as F,_ as j}from"./n8n-NE7NqrvB.js";import{a4 as I,l as Q}from"./index-
|
|
2
|
-
//# sourceMappingURL=NodeCreation-
|
|
1
|
+
import{b8 as w,af as $,er as R,n as M,O as B,x as V,a3 as W,b9 as Y,Q as z,S as L,eU as g,ey as H,d0 as U,l as G,ft as K,fu as F,_ as j}from"./n8n-NE7NqrvB.js";import{a4 as I,l as Q}from"./index-sMRiWGJS.js";import{u as P,t as X,s as Z}from"./NodeView-LzPrYfwG.js";import{a as q,e as J,G as ee,aD as te,Z as oe,ag as ne,l as h,m as D,I as C,p as x,T as y,O as v,Q as se,M as re,u as ae,aF as ce}from"./vendor-2CfOYFi2.js";const ie=()=>{const T=P(),i=q(),S=J(()=>({actions:(i==null?void 0:i.proxy.$locale.baseText("nodeCreator.actionsCategory.actions"))??"",triggers:(i==null?void 0:i.proxy.$locale.baseText("nodeCreator.actionsCategory.triggers"))??""}));function E(e){const t=[W,Y];return T.mergedNodes.filter(o=>t.some(s=>s===o.name)).map(o=>{const s=X(o,e,"action");if(s.type==="action"){const r=`nodeCreator.actionsPlaceholderNode.${o.name.replace("n8n-nodes-base.","")}`,c=i==null?void 0:i.proxy.$locale.baseText(r);c!==r&&(s.properties.displayName=c)}return s})}function p(e,t){return e.filter(n=>n.type==="action"&&n.properties.codex.categories.includes(t))}function k(e){var d,r,c,u;const t=Z([...e]),n=new Set;for(const a of t){if(a.type!=="action")continue;const l=(r=(d=a.properties)==null?void 0:d.codex)==null?void 0:r.label;n.add(l)}if(n.size<=1)return t;const o=new Map;for(let a=0;a<t.length;a++){const l=t[a];if(l.type!=="action")continue;const f=(u=(c=l.properties)==null?void 0:c.codex)==null?void 0:u.label;o.has(f)||o.set(f,a)}let s=0;for(const a of n){const l={uuid:a,type:"label",key:a,subcategory:t[0].key,properties:{key:a}},f=o.get(a)+s;t.splice(f,0,l),s++}return t}function _(e,t,n=!0){const o=p(e,t);return n?k(o):o}function m(e){const t=e.displayOptions,n=Object.keys((t==null?void 0:t.show)||{}).reduce((o,s)=>{var d,r;return o[s]=(r=(d=t==null?void 0:t.show)==null?void 0:d[s])==null?void 0:r[0],o},{});return{name:e.displayName,key:e.name,value:{...e.values,...n}}}function b(e){const{selectedView:t,openSource:n}=P(),{workflowTriggerNodes:o}=B(),s=e.some(l=>z().isTriggerNode(l.type)),d=o.length>0,r=t===H,c=e.every(l=>l.type===L);return![g.PLUS_ENDPOINT,g.NODE_CONNECTION_ACTION,g.NODE_CONNECTION_DROP].includes(n)&&!s&&!d&&r&&!c}function A(e){if(e.length===0)return{nodes:[],connections:[]};const t=[],n=[],o=e.find(s=>s.type!==w);return o&&(o.openDetail=!0),b(e)&&(e.unshift({type:w,isAutoAdd:!0}),n.push({from:{nodeIndex:0},to:{nodeIndex:1}})),e.forEach((s,d)=>{switch(t.push(s),s.type){case $:{const r=d,c=r+1;t.push({type:R,isAutoAdd:!0,name:M.baseText("nodeView.replaceMe")}),n.push({from:{nodeIndex:r,outputIndex:1},to:{nodeIndex:c}},{from:{nodeIndex:c},to:{nodeIndex:r}});break}}}),{nodes:t,connections:n}}function N(e,t,n=""){const{$onAction:o}=B(),s=o(({name:d,after:r,store:{setLastNodeParameters:c},args:u})=>{d!=="addNode"||u[0].type!==e.key||r(()=>{c(e),t&&O(e,t,n),s()})});return s}function O(e,t,n){const o={node_type:e.key,action:e.name,source_mode:n.toLowerCase(),resource:e.value.resource||""};V("nodeCreateList.addAction",o),t==null||t.trackNodesPanel("nodeCreateList.addAction",o)}return{actionsCategoryLocales:S,getPlaceholderTriggerActions:E,parseCategoryActions:_,getAddedNodesAndConnections:A,getActionData:m,setAddedNodeActionParameters:N}},de=ee({__name:"NodeCreation",props:{nodeViewScale:{},createNodeActive:{type:Boolean,default:!1}},emits:["addNodes","toggleNodeCreator"],setup(T,{emit:i}){const S=T,E=te(async()=>U(()=>import("./NodeCreator-r6gxY14d.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,42,43,44,45,46]))),p=oe({showStickyButton:!1}),k=G(),{getAddedNodesAndConnections:_}=ie();function m(e){const t=e.target;p.showStickyButton=!0;const n=o=>{if(t){const s=t.getBoundingClientRect(),d=s.height,r=s.width,c=s.left,u=c+r,a=s.top,l=a+d;o.pageX>c&&o.pageX<u&&o.pageY>a&&o.pageY<l||(p.showStickyButton=!1,document.removeEventListener("mousemove",n,!1))}};document.addEventListener("mousemove",n,!1)}function b(){i("toggleNodeCreator",{source:g.ADD_NODE_BUTTON,createNodeActive:!0})}function A(){document.activeElement&&document.activeElement.blur();const e=[...k.nodeViewOffsetPosition],t=Q(S.nodeViewScale,e);t[0]-=K/2,t[1]-=F/2,i("addNodes",_([{type:L,position:t}]))}function N(){i("toggleNodeCreator",{createNodeActive:!1})}function O(e){i("addNodes",_(e.map(t=>({type:t})))),N()}return(e,t)=>{const n=ne("n8n-icon-button");return h(),D("div",null,[e.createNodeActive?se("",!0):(h(),D("div",{key:0,class:C([e.$style.nodeButtonsWrapper,p.showStickyButton?e.$style.noEvents:""]),onMouseenter:m},[x("div",{class:C(e.$style.nodeCreatorButton),"data-test-id":"node-creator-plus-button"},[y(I,{label:e.$locale.baseText("nodeView.openNodesPanel"),shortcut:{keys:["Tab"]},placement:"left"},{default:v(()=>[y(n,{size:"xlarge",icon:"plus",type:"tertiary",class:C(e.$style.nodeCreatorPlus),onClick:b},null,8,["class"])]),_:1},8,["label"]),x("div",{class:C([e.$style.addStickyButton,p.showStickyButton?e.$style.visibleButton:""]),onClick:A,"data-test-id":"add-sticky-button"},[y(I,{label:e.$locale.baseText("nodeView.addStickyHint"),shortcut:{keys:["s"],shiftKey:!0},placement:"left"},{default:v(()=>[y(n,{type:"tertiary",icon:["far","note-sticky"]})]),_:1},8,["label"])],2)],2)],34)),(h(),re(ce,null,{default:v(()=>[y(ae(E),{active:e.createNodeActive,onNodeTypeSelected:O,onCloseNodeCreator:N},null,8,["active"])]),_:1}))])}}}),le="_nodeButtonsWrapper_zpked_5",ue="_addStickyButton_zpked_14",pe="_visibleButton_zpked_21",fe="_noEvents_zpked_26",ye="_nodeCreatorButton_zpked_30",_e="_nodeCreatorPlus_zpked_47",Ne={nodeButtonsWrapper:le,addStickyButton:ue,visibleButton:pe,noEvents:fe,nodeCreatorButton:ye,nodeCreatorPlus:_e},Ce={$style:Ne},ge=j(de,[["__cssModules",Ce]]),me=Object.freeze(Object.defineProperty({__proto__:null,default:ge},Symbol.toStringTag,{value:"Module"}));export{me as N,ie as u};
|
|
2
|
+
//# sourceMappingURL=NodeCreation-3pcb_BwC.js.map
|
|
3
3
|
function __vite__mapDeps(indexes) {
|
|
4
4
|
if (!__vite__mapDeps.viteFileDeps) {
|
|
5
|
-
__vite__mapDeps.viteFileDeps = ["assets/NodeCreator-
|
|
5
|
+
__vite__mapDeps.viteFileDeps = ["assets/NodeCreator-r6gxY14d.js","assets/n8n-NE7NqrvB.js","assets/vendor-2CfOYFi2.js","assets/lodash-es-s_m9YyW7.js","assets/@fortawesome/vue-fontawesome-GVmvJ_gj.js","assets/@fortawesome/fontawesome-svg-core-xYGjsix9.js","assets/esprima-next-ulPLCZ1Z.js","assets/luxon-ZRIU05qF.js","assets/pinia-IhuTtYiV.js","assets/@vueuse/core-viEZCtbZ.js","assets/flatted-jPn12Tq4.js","assets/@n8n/permissions-8yMqUF1Y.js","assets/vue-i18n-eiX0lGiQ.js","assets/uuid-McvpxQtQ.js","assets/n8n-zitRoI8t.css","assets/NodeView-LzPrYfwG.js","assets/@jsplumb/core-MKwKlGip.js","assets/@jsplumb/util-DR0SB56A.js","assets/@jsplumb/common-Q5_tv_GT.js","assets/index-sMRiWGJS.js","assets/prettier-s3fE3Qyr.js","assets/codemirror-lang-html-n8n-qoVuUIQR.js","assets/@n8n/codemirror-lang-sql-zd5sOTQ9.js","assets/@lezer/common-aP6EPErF.js","assets/@jsplumb/connector-bezier-3dWY17R5.js","assets/@jsplumb/browser-ui-QL7QI0sV.js","assets/codemirror-lang-n8n-expression-qGXLqLTr.js","assets/fast-json-stable-stringify-gO4u4slB.js","assets/timeago.js--Bumj2r9.js","assets/qrcode.vue-f7Vn5Pkq.js","assets/vue3-touch-events-_RfbPMOD.js","assets/@fortawesome/free-solid-svg-icons-KH5RR_hW.js","assets/@fortawesome/free-regular-svg-icons-ipmEYOws.js","assets/chart.js-JtqvIvkt.js","assets/index-DESuWr3H.css","assets/useExecutionDebugging-vYjc-e7j.js","assets/file-saver-_vO_MOS2.js","assets/vue-json-pretty-HTL9TWGq.js","assets/RunDataAi-ueFTZBht.js","assets/vue-markdown-render-Y8yswakT.js","assets/useCopyToClipboard-oKZllDWR.js","assets/copy-to-clipboard-6yTgHm0Q.js","assets/RunDataAi-lJTQYpdI.css","assets/workflowActivate-FonyQsS3.js","assets/collaboration.store-lUjjktP5.js","assets/NodeView-Q31_rSeE.css","assets/NodeCreator-aPU6exql.css"]
|
|
6
6
|
}
|
|
7
7
|
return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["useActions","nodeCreatorStore","useNodeCreatorStore","instance","getCurrentInstance","actionsCategoryLocales","computed","getPlaceholderTriggerActions","subcategory","nodes","WEBHOOK_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","node","n","transformed","transformNodeType","localeKey","overwriteLocale","filterActionsCategory","items","category","item","injectActionsLabels","extendedActions","sortNodeCreateElements","labelsSet","action","label","_b","_a","firstIndexMap","i","_d","_c","insertedLabels","newLabel","insertIndex","parseCategoryActions","actions","withLabels","filteredActions","getActionData","actionItem","displayOptions","displayConditions","acc","showCondition","shouldPrependManualTrigger","addedNodes","selectedView","openSource","workflowTriggerNodes","useWorkflowsStore","hasTrigger","useNodeTypesStore","workflowContainsTrigger","isTriggerPanel","TRIGGER_NODE_CREATOR_VIEW","onlyStickyNodes","STICKY_NODE_TYPE","NODE_CREATOR_OPEN_SOURCES","getAddedNodesAndConnections","connections","nodeToAutoOpen","MANUAL_TRIGGER_NODE_TYPE","index","SPLIT_IN_BATCHES_NODE_TYPE","splitInBatchesIndex","noOpIndex","NO_OP_NODE_TYPE","i18n","setAddedNodeActionParameters","telemetry","rootView","onWorkflowStoreAction","storeWatcher","name","after","setLastNodeParameters","args","trackActionSelected","payload","runExternalHook","NodeCreator","defineAsyncComponent","__vitePreload","state","reactive","uiStore","useUIStore","onCreateMenuHoverIn","mouseinEvent","buttonsWrapper","moveCallback","mousemoveEvent","wrapperBounds","wrapperH","wrapperW","wrapperLeftNear","wrapperLeftFar","wrapperTopNear","wrapperTopFar","openNodeCreator","emit","addStickyNote","offset","position","getMidCanvasPosition","props","DEFAULT_STICKY_WIDTH","DEFAULT_STICKY_HEIGHT","closeNodeCreator","nodeTypeSelected","nodeTypes","type"],"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\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tNO_OP_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 { runExternalHook } from '@/utils/externalHooks';\n\nimport { sortNodeCreateElements, transformNodeType } from '../utils';\n\nexport const useActions = () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst instance = getCurrentInstance();\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\t\tconst singleNodeOpenSources = [\n\t\t\tNODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t];\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\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 (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\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 runExternalHook('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 () => 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<keyboard-shortcut-tooltip\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</keyboard-shortcut-tooltip>\n\t\t\t\t<div\n\t\t\t\t\t:class=\"[$style.addStickyButton, state.showStickyButton ? $style.visibleButton : '']\"\n\t\t\t\t\t@click=\"addStickyNote\"\n\t\t\t\t\tdata-test-id=\"add-sticky-button\"\n\t\t\t\t>\n\t\t\t\t\t<keyboard-shortcut-tooltip\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</keyboard-shortcut-tooltip>\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-s);\n\tright: var(--spacing-s);\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-OxTpBRfP.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["useActions","nodeCreatorStore","useNodeCreatorStore","instance","getCurrentInstance","actionsCategoryLocales","computed","getPlaceholderTriggerActions","subcategory","nodes","WEBHOOK_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","node","n","transformed","transformNodeType","localeKey","overwriteLocale","filterActionsCategory","items","category","item","injectActionsLabels","extendedActions","sortNodeCreateElements","labelsSet","action","label","_b","_a","firstIndexMap","i","_d","_c","insertedLabels","newLabel","insertIndex","parseCategoryActions","actions","withLabels","filteredActions","getActionData","actionItem","displayOptions","displayConditions","acc","showCondition","shouldPrependManualTrigger","addedNodes","selectedView","openSource","workflowTriggerNodes","useWorkflowsStore","hasTrigger","useNodeTypesStore","workflowContainsTrigger","isTriggerPanel","TRIGGER_NODE_CREATOR_VIEW","onlyStickyNodes","STICKY_NODE_TYPE","NODE_CREATOR_OPEN_SOURCES","getAddedNodesAndConnections","connections","nodeToAutoOpen","MANUAL_TRIGGER_NODE_TYPE","index","SPLIT_IN_BATCHES_NODE_TYPE","splitInBatchesIndex","noOpIndex","NO_OP_NODE_TYPE","i18n","setAddedNodeActionParameters","telemetry","rootView","onWorkflowStoreAction","storeWatcher","name","after","setLastNodeParameters","args","trackActionSelected","payload","runExternalHook","NodeCreator","defineAsyncComponent","__vitePreload","state","reactive","uiStore","useUIStore","onCreateMenuHoverIn","mouseinEvent","buttonsWrapper","moveCallback","mousemoveEvent","wrapperBounds","wrapperH","wrapperW","wrapperLeftNear","wrapperLeftFar","wrapperTopNear","wrapperTopFar","openNodeCreator","emit","addStickyNote","offset","position","getMidCanvasPosition","props","DEFAULT_STICKY_WIDTH","DEFAULT_STICKY_HEIGHT","closeNodeCreator","nodeTypeSelected","nodeTypes","type"],"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\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tNO_OP_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 { runExternalHook } from '@/utils/externalHooks';\n\nimport { sortNodeCreateElements, transformNodeType } from '../utils';\n\nexport const useActions = () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst instance = getCurrentInstance();\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\t\tconst singleNodeOpenSources = [\n\t\t\tNODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t];\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\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 (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\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 runExternalHook('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 () => 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<keyboard-shortcut-tooltip\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</keyboard-shortcut-tooltip>\n\t\t\t\t<div\n\t\t\t\t\t:class=\"[$style.addStickyButton, state.showStickyButton ? $style.visibleButton : '']\"\n\t\t\t\t\t@click=\"addStickyNote\"\n\t\t\t\t\tdata-test-id=\"add-sticky-button\"\n\t\t\t\t>\n\t\t\t\t\t<keyboard-shortcut-tooltip\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</keyboard-shortcut-tooltip>\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-s);\n\tright: var(--spacing-s);\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-3pcb_BwC.js"}
|