n8n-editor-ui 1.32.0 → 1.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/.turbo/turbo-build.log +61 -61
  2. package/dist/assets/{AuthView-WS0zqkdS.js → AuthView-XJQTAppn.js} +2 -2
  3. package/dist/assets/{AuthView-WS0zqkdS.js.map → AuthView-XJQTAppn.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-tmVe2elM.js → CanvasControls-nkm_s3NJ.js} +2 -2
  5. package/dist/assets/{CanvasControls-tmVe2elM.js.map → CanvasControls-nkm_s3NJ.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-u6wexPI8.js → ChangePasswordView-LJP0GGhW.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-u6wexPI8.js.map → ChangePasswordView-LJP0GGhW.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-ix5yo0BD.js → CollectionParameter-WomdLuIg.js} +2 -2
  9. package/dist/assets/CollectionParameter-WomdLuIg.js.map +1 -0
  10. package/dist/assets/{CredentialsView-d-2fVzNy.js → CredentialsView-eWc7OhDm.js} +2 -2
  11. package/dist/assets/{CredentialsView-d-2fVzNy.js.map → CredentialsView-eWc7OhDm.js.map} +1 -1
  12. package/dist/assets/{ExecutionFilter-Kg4fhYje.js → ExecutionFilter-PMU0Na0k.js} +2 -2
  13. package/dist/assets/{ExecutionFilter-Kg4fhYje.js.map → ExecutionFilter-PMU0Na0k.js.map} +1 -1
  14. package/dist/assets/{ExecutionPreview-Z16KTdFl.js → ExecutionPreview-HbKLO92J.js} +2 -2
  15. package/dist/assets/{ExecutionPreview-Z16KTdFl.js.map → ExecutionPreview-HbKLO92J.js.map} +1 -1
  16. package/dist/assets/{ExecutionsInfoAccordion-UocBSgxb.js → ExecutionsInfoAccordion-bUnNtFv2.js} +2 -2
  17. package/dist/assets/{ExecutionsInfoAccordion-UocBSgxb.js.map → ExecutionsInfoAccordion-bUnNtFv2.js.map} +1 -1
  18. package/dist/assets/{ExecutionsLandingPage--EwoSMiA.js → ExecutionsLandingPage-T60dbSux.js} +2 -2
  19. package/dist/assets/{ExecutionsLandingPage--EwoSMiA.js.map → ExecutionsLandingPage-T60dbSux.js.map} +1 -1
  20. package/dist/assets/{ExecutionsList-9MEhhn56.js → ExecutionsList-XJRM7Cqr.js} +2 -2
  21. package/dist/assets/{ExecutionsList-9MEhhn56.js.map → ExecutionsList-XJRM7Cqr.js.map} +1 -1
  22. package/dist/assets/{ExecutionsView-dOO1b5pZ.js → ExecutionsView-1aQVikJo.js} +2 -2
  23. package/dist/assets/{ExecutionsView-dOO1b5pZ.js.map → ExecutionsView-1aQVikJo.js.map} +1 -1
  24. package/dist/assets/{ForgotMyPasswordView-P3MqS20s.js → ForgotMyPasswordView-7wj-yAwY.js} +2 -2
  25. package/dist/assets/{ForgotMyPasswordView-P3MqS20s.js.map → ForgotMyPasswordView-7wj-yAwY.js.map} +1 -1
  26. package/dist/assets/{MainHeader-A43lnXDH.js → MainHeader-DUYaLAFd.js} +2 -2
  27. package/dist/assets/{MainHeader-A43lnXDH.js.map → MainHeader-DUYaLAFd.js.map} +1 -1
  28. package/dist/assets/{MainSidebar-_TrEfGUX.js → MainSidebar-AwOXawEk.js} +2 -2
  29. package/dist/assets/{MainSidebar-_TrEfGUX.js.map → MainSidebar-AwOXawEk.js.map} +1 -1
  30. package/dist/assets/{NodeCreation-d5MgZecP.js → NodeCreation-KwIDuMQX.js} +3 -3
  31. package/dist/assets/{NodeCreation-d5MgZecP.js.map → NodeCreation-KwIDuMQX.js.map} +1 -1
  32. package/dist/assets/{NodeCreator-HX7vFQ36.js → NodeCreator-6iz29Jwh.js} +2 -2
  33. package/dist/assets/{NodeCreator-HX7vFQ36.js.map → NodeCreator-6iz29Jwh.js.map} +1 -1
  34. package/dist/assets/{NodeList-Av_5l31V.js → NodeList-oe8SSQ2g.js} +2 -2
  35. package/dist/assets/{NodeList-Av_5l31V.js.map → NodeList-oe8SSQ2g.js.map} +1 -1
  36. package/dist/assets/{NodeView-xSCHk5Gm.js → NodeView-JV8BP6TJ.js} +3 -3
  37. package/dist/assets/{NodeView-xSCHk5Gm.js.map → NodeView-JV8BP6TJ.js.map} +1 -1
  38. package/dist/assets/{RunDataAi-lf7VU0w1.js → RunDataAi--C9ACRTm.js} +2 -2
  39. package/dist/assets/{RunDataAi-lf7VU0w1.js.map → RunDataAi--C9ACRTm.js.map} +1 -1
  40. package/dist/assets/{RunDataJson-hLAWizOD.js → RunDataJson-hcKGDyJz.js} +3 -3
  41. package/dist/assets/{RunDataJson-hLAWizOD.js.map → RunDataJson-hcKGDyJz.js.map} +1 -1
  42. package/dist/assets/{RunDataJsonActions-GrJTnQ3y.js → RunDataJsonActions-pkATA7DE.js} +2 -2
  43. package/dist/assets/{RunDataJsonActions-GrJTnQ3y.js.map → RunDataJsonActions-pkATA7DE.js.map} +1 -1
  44. package/dist/assets/{RunDataSchema-ZI0MG5I5.js → RunDataSchema-fPAFgFi6.js} +2 -2
  45. package/dist/assets/{RunDataSchema-ZI0MG5I5.js.map → RunDataSchema-fPAFgFi6.js.map} +1 -1
  46. package/dist/assets/{RunDataTable-th0cgEkH.js → RunDataTable-Xbkzwy5h.js} +2 -2
  47. package/dist/assets/{RunDataTable-th0cgEkH.js.map → RunDataTable-Xbkzwy5h.js.map} +1 -1
  48. package/dist/assets/{SamlOnboarding-1z7rskrY.js → SamlOnboarding-tMxkYuyc.js} +2 -2
  49. package/dist/assets/{SamlOnboarding-1z7rskrY.js.map → SamlOnboarding-tMxkYuyc.js.map} +1 -1
  50. package/dist/assets/{SettingsApiView-y-RxfWUk.js → SettingsApiView-iLhcZ_Ad.js} +2 -2
  51. package/dist/assets/{SettingsApiView-y-RxfWUk.js.map → SettingsApiView-iLhcZ_Ad.js.map} +1 -1
  52. package/dist/assets/{SettingsCommunityNodesView-eB9yXqkR.js → SettingsCommunityNodesView-kCmnDZXU.js} +2 -2
  53. package/dist/assets/{SettingsCommunityNodesView-eB9yXqkR.js.map → SettingsCommunityNodesView-kCmnDZXU.js.map} +1 -1
  54. package/dist/assets/{SettingsExternalSecrets-F8cAkZ70.js → SettingsExternalSecrets-QTCx-DCR.js} +2 -2
  55. package/dist/assets/{SettingsExternalSecrets-F8cAkZ70.js.map → SettingsExternalSecrets-QTCx-DCR.js.map} +1 -1
  56. package/dist/assets/{SettingsFakeDoorView-vORcl2KE.js → SettingsFakeDoorView-3ZAyfMNZ.js} +2 -2
  57. package/dist/assets/{SettingsFakeDoorView-vORcl2KE.js.map → SettingsFakeDoorView-3ZAyfMNZ.js.map} +1 -1
  58. package/dist/assets/{SettingsLdapView-HLdSAg7l.js → SettingsLdapView-9EURrpDL.js} +2 -2
  59. package/dist/assets/{SettingsLdapView-HLdSAg7l.js.map → SettingsLdapView-9EURrpDL.js.map} +1 -1
  60. package/dist/assets/{SettingsLogStreamingView-k8W4YRkq.js → SettingsLogStreamingView-eE9RDUjN.js} +2 -2
  61. package/dist/assets/{SettingsLogStreamingView-k8W4YRkq.js.map → SettingsLogStreamingView-eE9RDUjN.js.map} +1 -1
  62. package/dist/assets/{SettingsSourceControl-zQ3hu1Xb.js → SettingsSourceControl-bMzlo6t4.js} +2 -2
  63. package/dist/assets/{SettingsSourceControl-zQ3hu1Xb.js.map → SettingsSourceControl-bMzlo6t4.js.map} +1 -1
  64. package/dist/assets/{SettingsSso-ZDaKZSAz.js → SettingsSso-f8qqkUbH.js} +2 -2
  65. package/dist/assets/{SettingsSso-ZDaKZSAz.js.map → SettingsSso-f8qqkUbH.js.map} +1 -1
  66. package/dist/assets/{SettingsUsageAndPlan-qhA0XufK.js → SettingsUsageAndPlan-Smr5GpEg.js} +2 -2
  67. package/dist/assets/{SettingsUsageAndPlan-qhA0XufK.js.map → SettingsUsageAndPlan-Smr5GpEg.js.map} +1 -1
  68. package/dist/assets/{SettingsUsersView-MpwADpXX.js → SettingsUsersView-VvvWispo.js} +2 -2
  69. package/dist/assets/{SettingsUsersView-MpwADpXX.js.map → SettingsUsersView-VvvWispo.js.map} +1 -1
  70. package/dist/assets/{SettingsView-0oD4eR43.js → SettingsView-rRURYQHa.js} +2 -2
  71. package/dist/assets/{SettingsView-0oD4eR43.js.map → SettingsView-rRURYQHa.js.map} +1 -1
  72. package/dist/assets/{SetupView-BgoIEBSe.js → SetupView-Pgc80gpk.js} +2 -2
  73. package/dist/assets/{SetupView-BgoIEBSe.js.map → SetupView-Pgc80gpk.js.map} +1 -1
  74. package/dist/assets/{SetupWorkflowCredentialsButton-lgz8EmNk.js → SetupWorkflowCredentialsButton-13o0FsxU.js} +2 -2
  75. package/dist/assets/{SetupWorkflowCredentialsButton-lgz8EmNk.js.map → SetupWorkflowCredentialsButton-13o0FsxU.js.map} +1 -1
  76. package/dist/assets/{SetupWorkflowFromTemplateView-oupB9su8.js → SetupWorkflowFromTemplateView-j2kVEUDy.js} +2 -2
  77. package/dist/assets/{SetupWorkflowFromTemplateView-oupB9su8.js.map → SetupWorkflowFromTemplateView-j2kVEUDy.js.map} +1 -1
  78. package/dist/assets/{SigninView-NkydbvAT.js → SigninView-uMLwylSB.js} +2 -2
  79. package/dist/assets/{SigninView-NkydbvAT.js.map → SigninView-uMLwylSB.js.map} +1 -1
  80. package/dist/assets/{SignupView-_1SYATx9.js → SignupView-D81TqUjs.js} +2 -2
  81. package/dist/assets/{SignupView-_1SYATx9.js.map → SignupView-D81TqUjs.js.map} +1 -1
  82. package/dist/assets/{TemplateDetails-1Snx23Yf.js → TemplateDetails-VIO9zkEg.js} +2 -2
  83. package/dist/assets/{TemplateDetails-1Snx23Yf.js.map → TemplateDetails-VIO9zkEg.js.map} +1 -1
  84. package/dist/assets/{TemplateList-EnEI8gDE.js → TemplateList-HB8hUr_8.js} +2 -2
  85. package/dist/assets/{TemplateList-EnEI8gDE.js.map → TemplateList-HB8hUr_8.js.map} +1 -1
  86. package/dist/assets/{TemplatesCollectionView-n34DkMyr.js → TemplatesCollectionView-NFkj_TcY.js} +2 -2
  87. package/dist/assets/{TemplatesCollectionView-n34DkMyr.js.map → TemplatesCollectionView-NFkj_TcY.js.map} +1 -1
  88. package/dist/assets/{TemplatesInfoCarousel-f6mATm4z.js → TemplatesInfoCarousel-d4FjKWjW.js} +2 -2
  89. package/dist/assets/{TemplatesInfoCarousel-f6mATm4z.js.map → TemplatesInfoCarousel-d4FjKWjW.js.map} +1 -1
  90. package/dist/assets/{TemplatesSearchView-Zux67gUG.js → TemplatesSearchView-W0D9cTjN.js} +2 -2
  91. package/dist/assets/{TemplatesSearchView-Zux67gUG.js.map → TemplatesSearchView-W0D9cTjN.js.map} +1 -1
  92. package/dist/assets/{TemplatesWorkflowView-dSvK0QBs.js → TemplatesWorkflowView-vHpI2Rpl.js} +2 -2
  93. package/dist/assets/{TemplatesWorkflowView-dSvK0QBs.js.map → TemplatesWorkflowView-vHpI2Rpl.js.map} +1 -1
  94. package/dist/assets/{VariablesView-BftXbT8z.js → VariablesView-nF0EArdS.js} +2 -2
  95. package/dist/assets/{VariablesView-BftXbT8z.js.map → VariablesView-nF0EArdS.js.map} +1 -1
  96. package/dist/assets/{WorkerView-7Ib0flYZ.js → WorkerView-GubNFvBv.js} +2 -2
  97. package/dist/assets/{WorkerView-7Ib0flYZ.js.map → WorkerView-GubNFvBv.js.map} +1 -1
  98. package/dist/assets/{WorkflowActivator-Pbw1i_AI.js → WorkflowActivator-ySuj7uJI.js} +2 -2
  99. package/dist/assets/{WorkflowActivator-Pbw1i_AI.js.map → WorkflowActivator-ySuj7uJI.js.map} +1 -1
  100. package/dist/assets/{WorkflowHistory-_c2_b4mu.js → WorkflowHistory-gufVg7PC.js} +2 -2
  101. package/dist/assets/{WorkflowHistory-_c2_b4mu.js.map → WorkflowHistory-gufVg7PC.js.map} +1 -1
  102. package/dist/assets/{WorkflowOnboardingView-IqgW-M7B.js → WorkflowOnboardingView-sWTN3TK2.js} +2 -2
  103. package/dist/assets/{WorkflowOnboardingView-IqgW-M7B.js.map → WorkflowOnboardingView-sWTN3TK2.js.map} +1 -1
  104. package/dist/assets/{WorkflowsView-K1vknxJ3.js → WorkflowsView-9qPyA8du.js} +2 -2
  105. package/dist/assets/{WorkflowsView-K1vknxJ3.js.map → WorkflowsView-9qPyA8du.js.map} +1 -1
  106. package/dist/assets/{cloud-39Y_KZne.js → cloud-mOwwKpjz.js} +2 -2
  107. package/dist/assets/{cloud-39Y_KZne.js.map → cloud-mOwwKpjz.js.map} +1 -1
  108. package/dist/assets/{index-lUr8MiJ2.js → index-9xnnd4cn.js} +66 -66
  109. package/dist/assets/index-9xnnd4cn.js.map +1 -0
  110. package/dist/assets/{index-wl9S8xQJ.css → index-ED3b68TP.css} +1 -1
  111. package/dist/assets/{pushConnection-9MR6fwUT.js → pushConnection-6aRCrIsi.js} +2 -2
  112. package/dist/assets/{pushConnection-9MR6fwUT.js.map → pushConnection-6aRCrIsi.js.map} +1 -1
  113. package/dist/assets/{templateActions-MTyOknNV.js → templateActions-MRmcczkP.js} +2 -2
  114. package/dist/assets/{templateActions-MTyOknNV.js.map → templateActions-MRmcczkP.js.map} +1 -1
  115. package/dist/assets/{useExecutionDebugging-rwa9vby_.js → useExecutionDebugging-Z2R2TujJ.js} +2 -2
  116. package/dist/assets/{useExecutionDebugging-rwa9vby_.js.map → useExecutionDebugging-Z2R2TujJ.js.map} +1 -1
  117. package/dist/assets/{workflowActivate-iOg_mrLc.js → workflowActivate-rRmpx9AQ.js} +2 -2
  118. package/dist/assets/{workflowActivate-iOg_mrLc.js.map → workflowActivate-rRmpx9AQ.js.map} +1 -1
  119. package/dist/index.html +2 -2
  120. package/package.json +1 -1
  121. package/dist/assets/CollectionParameter-ix5yo0BD.js.map +0 -1
  122. package/dist/assets/index-lUr8MiJ2.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{m as se}from"./pinia-e-gLcRJ1.js";import{P as re}from"./PushConnectionTracker-bLZhrljQ.js";import{e as ne}from"./executionsHelpers-jrq7As-r.js";import{_ as I,e as Z,x as ee,fL as ae,u as te,l as ce}from"./n8n-uKoDE8Qf.js";import{u as P,W as T,p as Q}from"./pushConnection-9MR6fwUT.js";import{v as S,r as b,f as l,h as d,i as k,K as u,E as p,x as Y,y as i,H as J,a6 as g,D as C,J as v,I as s,F as E,_ as F,u as f,e as X,b as ie,l as le}from"./vendor-3VD3vVJy.js";import{l as de}from"./index-lUr8MiJ2.js";import{C as H}from"./vue-chartjs-bC78n1Nk.js";import"./dateFormatter-uGeLbFGz.js";import"./lodash-es-JdX4GWLn.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-lH03nmRE.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-MkmfYvll.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./collaboration.store-KS2_i2m5.js";import"./@n8n/codemirror-lang-sql-feLn5IS9.js";import"./@lezer/common-1hBQ1gIF.js";import"./codemirror-lang-html-n8n-wWQLhhqk.js";import"./prettier-s3fE3Qyr.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-AlqFM-P6.js";import"./codemirror-lang-n8n-expression-HpIZnV_9.js";import"./fast-json-stable-stringify-LPGjnXm6.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-B6sLPrrf.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";function oe(t){return t.reduce((a,n)=>a+n,0)/t.length}function ue(t){return oe(t).toFixed(2)}function B(t){return t/1024/1024/1024}const pe=S({__name:"WorkerAccordion.ee",props:{icon:{type:String,default:"tasks"},iconColor:{type:String,default:"black"},initialExpanded:{type:Boolean,default:!0}},setup(t){const n=b(t.initialExpanded);function c(){n.value=!n.value}return(o,m)=>{const e=g("n8n-icon"),h=g("n8n-text");return l(),d("div",{class:i(["accordion",o.$style.container])},[k("div",{class:i({[o.$style.header]:!0,[o.$style.expanded]:n.value}),onClick:c},[u(e,{icon:t.icon,color:t.iconColor,size:"small",class:"mr-2xs"},null,8,["icon","color"]),u(h,{class:i(o.$style.headerText),color:"text-base",size:"small",align:"left",bold:""},{default:p(()=>[Y(o.$slots,"title")]),_:3},8,["class"]),u(e,{icon:n.value?"chevron-up":"chevron-down",bold:""},null,8,["icon"])],2),n.value?(l(),d("div",{key:0,class:i({[o.$style.description]:!0,[o.$style.collapsed]:!n.value})},[Y(o.$slots,"content")],2)):J("",!0)],2)}}}),me="_container_jb2mu_5",_e="_header_jb2mu_9",he="_headerText_jb2mu_15",ke="_expanded_jb2mu_19",ye="_description_jb2mu_23",fe={container:me,header:_e,headerText:he,expanded:ke,description:ye},ge={$style:fe},N=I(pe,[["__cssModules",ge]]),$e=["href"],ve=["href"],we=S({__name:"WorkerJobAccordion.ee",props:{items:{}},setup(t){const a=t;function n(c){let o=Math.floor((new Date().getTime()-c.getTime())/1e3);const m=Math.floor(o/3600);o-=m*3600;const e=Math.floor(o/60);return o-=e*60,`${m}h ${e}m ${Math.floor(o)}s`}return(c,o)=>{const m=g("n8n-text");return l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!0},{title:p(()=>[v(s(c.$locale.baseText("workerList.item.jobListTitle"))+" ("+s(c.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:i(c.$style.accordionItems)},[(l(!0),d(E,null,F(a.items,e=>(l(),d("div",{key:e.executionId,class:i(c.$style.accordionItem)},[k("a",{href:"/workflow/"+e.workflowId+"/executions/"+e.executionId}," Execution "+s(e.executionId)+" - "+s(e.workflowName),9,$e),u(m,{color:"text-base",size:"small",align:"left"},{default:p(()=>{var h;return[v(" | Started at: "+s((h=new Date(e.startedAt))==null?void 0:h.toLocaleTimeString())+" | Running for "+s(n(new Date(e.startedAt)))+" "+s(e.retryOf?`| Retry of: ${e.retryOf}`:"")+" | ",1)]}),_:2},1024),k("a",{target:"_blank",href:"/workflow/"+e.workflowId}," (Open workflow)",8,ve)],2))),128))],2)):(l(),d("div",{key:1,class:i(c.$style.accordionItems)},[k("span",{class:i(c.$style.empty)},s(c.$locale.baseText("workerList.item.jobList.empty")),3)],2))]),_:1})}}}),be="_accordionItems_lupqv_5",Me="_accordionItem_lupqv_5",Ie="_empty_lupqv_18",Se={accordionItems:be,accordionItem:Me,empty:Ie},Le={$style:Se},Te=I(we,[["__cssModules",Le]]),Ce=["onClick"],xe=S({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const a=t,n=ee(),c=de(),{showMessage:o}=Z();function m(e){try{c.copy(e),o({title:n.baseText("workerList.item.copyAddressToClipboard"),type:"success"})}catch{}}return(e,h)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[v(s(e.$locale.baseText("workerList.item.netListTitle"))+" ("+s(e.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:i(e.$style.accordionItems)},[(l(!0),d(E,null,F(a.items,y=>(l(),d("div",{key:y.address,class:i(e.$style.accordionItem),onClick:r=>m(y.address)},[v(s(y.family)+": ",1),k("span",{class:i(e.$style.clickable)},s(y.address),3),v(" "+s(y.internal?"(internal)":""),1)],10,Ce))),128))],2)):J("",!0)]),_:1}))}}),Ae="_accordionItems_v7u0l_5",We="_accordionItem_v7u0l_5",Ue="_clickable_v7u0l_19",Be={accordionItems:Ae,accordionItem:We,clickable:Ue},Re={$style:Be},De=I(xe,[["__cssModules",Re]]),je=S({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var O,q,z;const a=t,n=(w,x,L=0)=>({datasets:[{label:w,backgroundColor:x,data:L?Array(Math.min(T,L)).fill(0):[]}],labels:Array(Math.min(T,L)).fill("")}),c=P(),o=b(void 0),m=b(void 0),e=b(void 0),h=()=>({responsive:!0,maintainAspectRatio:!0,scales:{y:{type:"linear",display:!0,position:"left",min:0,suggestedMax:5}}}),y=h(),r=h();(O=r.scales)!=null&&O.y&&(r.scales.y.suggestedMax=100);const _=B((q=c.workers[a.workerId])==null?void 0:q.totalMem)??1,$=h();(z=$.scales)!=null&&z.y&&($.scales.y.suggestedMax=_);const M=b(n("Job Count","rgb(255, 111, 92)",T)),W=b(n("Processor Usage","rgb(19, 205, 103)",T)),V=b(n("Memory Usage","rgb(244, 216, 174)",T));return c.$onAction(({name:w,store:x})=>{var L,G;if(w==="updateWorkerStatus"){const R=T-(((L=x.workersHistory[a.workerId])==null?void 0:L.length)??0),A=n("Job Count","rgb(255, 111, 92)",R),D=n("Processor Usage","rgb(19, 205, 103)",R),j=n("Memory Usage","rgb(244, 216, 174)",R);(G=x.workersHistory[a.workerId])==null||G.forEach(U=>{var K;A.datasets[0].data.push(U.data.runningJobsSummary.length),(K=A.labels)==null||K.push(new Date(U.timestamp).toLocaleTimeString()),D.datasets[0].data.push(oe(U.data.loadAvg)),D.labels=A.labels,j.datasets[0].data.push(_-B(U.data.freeMem)),j.labels=A.labels}),M.value=A,W.value=D,V.value=j}}),(w,x)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[v(s(w.$locale.baseText("workerList.item.chartsTitle")),1)]),content:p(()=>[k("div",{class:i(w.$style.charts)},[u(f(H),{ref_key:"chartRefJobs",ref:o,type:"line",data:M.value,options:f(y),class:i(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefCPU",ref:m,type:"line",data:W.value,options:f(r),class:i(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefMemory",ref:e,type:"line",data:V.value,options:f($),class:i(w.$style.chart)},null,8,["data","options","class"])],2)]),_:1}))}}),He="_accordionItems_1k0p0_5",Pe="_accordionItem_1k0p0_5",Je="_charts_1k0p0_18",Ee="_chart_1k0p0_18",Fe={accordionItems:He,accordionItem:Pe,charts:Je,chart:Ee},Ne={$style:Fe},Ve=I(je,[["__cssModules",Ne]]),Oe=k("br",null,null,-1),qe=S({__name:"WorkerCard.ee",props:{workerId:{}},setup(t){let a;const n=P(),c=t,o=b("0"),m=b(!1),e=X(()=>n.getWorkerStatus(c.workerId)),h=X(()=>{var r;return((r=e.value)==null?void 0:r.interfaces.toSorted((_,$)=>_.family.localeCompare($.family)))??[]});function y(r){const _=Math.floor(r/86400);r-=_*3600*24;const $=Math.floor(r/3600);r-=$*3600;const M=Math.floor(r/60);return r-=M*60,`${_}d ${$}h ${M}m ${Math.floor(r)}s`}return ie(()=>{a=setInterval(()=>{const r=n.getWorkerLastUpdated(c.workerId);if(!r)return;const _=Math.ceil((Date.now()-r)/1e3);m.value=_>10,o.value=_.toFixed(0)},500)}),le(()=>{clearInterval(a)}),(r,_)=>{const $=g("n8n-heading"),M=g("n8n-text"),W=g("n8n-card");return e.value?(l(),C(W,{key:0,class:i(r.$style.cardLink)},{header:p(()=>[u($,{tag:"h2",bold:"",class:i(m.value?[r.$style.cardHeading,r.$style.stale]:[r.$style.cardHeading]),"data-test-id":"worker-card-name"},{default:p(()=>[v(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),Oe,v(" Average Load: "+s(f(ue)(e.value.loadAvg??[0]))+" | Free Memory: "+s(f(B)(e.value.freeMem).toFixed(2))+"GB / "+s(f(B)(e.value.totalMem).toFixed(2))+"GB "+s(m.value?" (stale)":""),1)]),_:1},8,["class"])]),append:p(()=>[k("div",{ref:"cardActions",class:i(r.$style.cardActions)},null,2)]),default:p(()=>[k("div",{class:i(r.$style.cardDescription)},[u(M,{color:"text-light",size:"small",class:i(r.$style.container)},{default:p(()=>[k("span",null,s(r.$locale.baseText("workerList.item.lastUpdated"))+" "+s(o.value)+"s ago | n8n-Version: "+s(e.value.version)+" | Architecture: "+s(e.value.arch)+" ( "+s(e.value.platform)+") | Uptime: "+s(y(e.value.uptime)),1),u(Te,{items:e.value.runningJobsSummary},null,8,["items"]),u(De,{items:h.value},null,8,["items"]),u(Ve,{"worker-id":e.value.workerId},null,8,["worker-id"])]),_:1},8,["class"])],2)]),_:1},8,["class"])):J("",!0)}}}),ze="_container_124hj_5",Ge="_cardLink_124hj_9",Ke="_cardHeading_124hj_19",Qe="_stale_124hj_25",Ye="_cardDescription_124hj_29",Xe="_cardActions_124hj_36",Ze={container:ze,cardLink:Ge,cardHeading:Ke,stale:Qe,cardDescription:Ye,cardActions:Xe},et={$style:Ze},tt=I(qe,[["__cssModules",et]]),ot=S({name:"WorkerList",components:{PushConnectionTracker:re,WorkerCard:tt},mixins:[Q,ne],props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(t,a){var c,o;return{i18n:ee(),...Z(),...(o=(c=Q).setup)==null?void 0:o.call(c,t,a)}},mounted(){ae(`n8n - ${this.pageTitle}`),this.$telemetry.track("User viewed worker view",{instance_id:this.rootStore.instanceId})},beforeMount(){window.Cypress===void 0&&(this.pushStore.pushConnect(),this.orchestrationManagerStore.startWorkerStatusPolling())},beforeUnmount(){window.Cypress===void 0&&(this.orchestrationManagerStore.stopWorkerStatusPolling(),this.pushStore.pushDisconnect())},computed:{...se(te,P),combinedWorkers(){const t=[];for(const a in this.orchestrationManagerStore.workers)t.push(this.orchestrationManagerStore.workers[a]);return t},initialStatusReceived(){return this.orchestrationManagerStore.initialStatusReceived},workerIds(){return Object.keys(this.orchestrationManagerStore.workers)},pageTitle(){return this.i18n.baseText("workerList.pageTitle")}},methods:{averageLoadAvg(t){return(t.reduce((a,n)=>a+n,0)/t.length).toFixed(2)},getStatus(t){return t.runningJobsSummary.length>0?"running":"success"},getRowClass(t){return[this.$style.execRow,this.$style[this.getStatus(t)]].join(" ")}}}),st="_workerListHeader_q7mrl_5",rt="_card_q7mrl_12",nt="_tableLoader_q7mrl_16",at={workerListHeader:st,card:rt,tableLoader:nt},ct={key:0},it={key:1},lt={key:0},dt={key:1};function ut(t,a,n,c,o,m){const e=g("PushConnectionTracker"),h=g("n8n-heading"),y=g("n8n-spinner"),r=g("WorkerCard");return l(),d("div",null,[u(e,{class:"actions"}),k("div",{class:i(t.$style.workerListHeader)},[u(h,{tag:"h1",size:"2xlarge"},{default:p(()=>[v(s(t.pageTitle),1)]),_:1})],2),t.initialStatusReceived?(l(),d("div",it,[t.workerIds.length===0?(l(),d("div",lt,s(t.$locale.baseText("workerList.empty")),1)):(l(),d("div",dt,[(l(!0),d(E,null,F(t.workerIds,_=>(l(),d("div",{key:_,class:i(t.$style.card)},[u(r,{"worker-id":_,"data-test-id":"worker-card"},null,8,["worker-id"])],2))),128))]))])):(l(),d("div",ct,[u(y)]))])}const pt={$style:at},mt=I(ot,[["render",ut],["__cssModules",pt]]),_t=["href"],ht=S({__name:"WorkerView",setup(t){const a=ce(),n=te(),c=()=>{n.goToUpgrade("worker-view","upgrade-worker-view")};return(o,m)=>{const e=g("n8n-action-box");return f(a).isQueueModeEnabled&&f(a).isWorkerViewAvailable?(l(),C(mt,{key:0,"data-test-id":"worker-view-licensed"})):(l(),C(e,{key:1,"data-test-id":"worker-view-unlicensed",class:i(o.$style.actionBox),description:o.$locale.baseText("workerList.actionBox.description"),"button-text":o.$locale.baseText("workerList.actionBox.buttonText"),"onClick:button":c},{heading:p(()=>[k("span",null,s(o.$locale.baseText("workerList.actionBox.title")),1)]),description:p(()=>[v(s(o.$locale.baseText("workerList.actionBox.description"))+" ",1),k("a",{href:o.$locale.baseText("workerList.docs.url"),target:"_blank"},s(o.$locale.baseText("workerList.actionBox.description.link")),9,_t)]),_:1},8,["class","description","button-text"]))}}}),kt="_actionBox_wwwe5_5",yt={actionBox:kt},ft={$style:yt},Zt=I(ht,[["__cssModules",ft]]);export{Zt as default};
2
- //# sourceMappingURL=WorkerView-7Ib0flYZ.js.map
1
+ import{m as se}from"./pinia-e-gLcRJ1.js";import{P as re}from"./PushConnectionTracker-bLZhrljQ.js";import{e as ne}from"./executionsHelpers-jrq7As-r.js";import{_ as I,e as Z,x as ee,fL as ae,u as te,l as ce}from"./n8n-uKoDE8Qf.js";import{u as P,W as T,p as Q}from"./pushConnection-6aRCrIsi.js";import{v as S,r as b,f as l,h as d,i as k,K as u,E as p,x as Y,y as i,H as J,a6 as g,D as C,J as v,I as s,F as E,_ as F,u as f,e as X,b as ie,l as le}from"./vendor-3VD3vVJy.js";import{l as de}from"./index-9xnnd4cn.js";import{C as H}from"./vue-chartjs-bC78n1Nk.js";import"./dateFormatter-uGeLbFGz.js";import"./lodash-es-JdX4GWLn.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-lH03nmRE.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-MkmfYvll.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./collaboration.store-KS2_i2m5.js";import"./@n8n/codemirror-lang-sql-feLn5IS9.js";import"./@lezer/common-1hBQ1gIF.js";import"./codemirror-lang-html-n8n-wWQLhhqk.js";import"./prettier-s3fE3Qyr.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-AlqFM-P6.js";import"./codemirror-lang-n8n-expression-HpIZnV_9.js";import"./fast-json-stable-stringify-LPGjnXm6.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-B6sLPrrf.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";function oe(t){return t.reduce((a,n)=>a+n,0)/t.length}function ue(t){return oe(t).toFixed(2)}function B(t){return t/1024/1024/1024}const pe=S({__name:"WorkerAccordion.ee",props:{icon:{type:String,default:"tasks"},iconColor:{type:String,default:"black"},initialExpanded:{type:Boolean,default:!0}},setup(t){const n=b(t.initialExpanded);function c(){n.value=!n.value}return(o,m)=>{const e=g("n8n-icon"),h=g("n8n-text");return l(),d("div",{class:i(["accordion",o.$style.container])},[k("div",{class:i({[o.$style.header]:!0,[o.$style.expanded]:n.value}),onClick:c},[u(e,{icon:t.icon,color:t.iconColor,size:"small",class:"mr-2xs"},null,8,["icon","color"]),u(h,{class:i(o.$style.headerText),color:"text-base",size:"small",align:"left",bold:""},{default:p(()=>[Y(o.$slots,"title")]),_:3},8,["class"]),u(e,{icon:n.value?"chevron-up":"chevron-down",bold:""},null,8,["icon"])],2),n.value?(l(),d("div",{key:0,class:i({[o.$style.description]:!0,[o.$style.collapsed]:!n.value})},[Y(o.$slots,"content")],2)):J("",!0)],2)}}}),me="_container_jb2mu_5",_e="_header_jb2mu_9",he="_headerText_jb2mu_15",ke="_expanded_jb2mu_19",ye="_description_jb2mu_23",fe={container:me,header:_e,headerText:he,expanded:ke,description:ye},ge={$style:fe},N=I(pe,[["__cssModules",ge]]),$e=["href"],ve=["href"],we=S({__name:"WorkerJobAccordion.ee",props:{items:{}},setup(t){const a=t;function n(c){let o=Math.floor((new Date().getTime()-c.getTime())/1e3);const m=Math.floor(o/3600);o-=m*3600;const e=Math.floor(o/60);return o-=e*60,`${m}h ${e}m ${Math.floor(o)}s`}return(c,o)=>{const m=g("n8n-text");return l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!0},{title:p(()=>[v(s(c.$locale.baseText("workerList.item.jobListTitle"))+" ("+s(c.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:i(c.$style.accordionItems)},[(l(!0),d(E,null,F(a.items,e=>(l(),d("div",{key:e.executionId,class:i(c.$style.accordionItem)},[k("a",{href:"/workflow/"+e.workflowId+"/executions/"+e.executionId}," Execution "+s(e.executionId)+" - "+s(e.workflowName),9,$e),u(m,{color:"text-base",size:"small",align:"left"},{default:p(()=>{var h;return[v(" | Started at: "+s((h=new Date(e.startedAt))==null?void 0:h.toLocaleTimeString())+" | Running for "+s(n(new Date(e.startedAt)))+" "+s(e.retryOf?`| Retry of: ${e.retryOf}`:"")+" | ",1)]}),_:2},1024),k("a",{target:"_blank",href:"/workflow/"+e.workflowId}," (Open workflow)",8,ve)],2))),128))],2)):(l(),d("div",{key:1,class:i(c.$style.accordionItems)},[k("span",{class:i(c.$style.empty)},s(c.$locale.baseText("workerList.item.jobList.empty")),3)],2))]),_:1})}}}),be="_accordionItems_lupqv_5",Me="_accordionItem_lupqv_5",Ie="_empty_lupqv_18",Se={accordionItems:be,accordionItem:Me,empty:Ie},Le={$style:Se},Te=I(we,[["__cssModules",Le]]),Ce=["onClick"],xe=S({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const a=t,n=ee(),c=de(),{showMessage:o}=Z();function m(e){try{c.copy(e),o({title:n.baseText("workerList.item.copyAddressToClipboard"),type:"success"})}catch{}}return(e,h)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[v(s(e.$locale.baseText("workerList.item.netListTitle"))+" ("+s(e.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:i(e.$style.accordionItems)},[(l(!0),d(E,null,F(a.items,y=>(l(),d("div",{key:y.address,class:i(e.$style.accordionItem),onClick:r=>m(y.address)},[v(s(y.family)+": ",1),k("span",{class:i(e.$style.clickable)},s(y.address),3),v(" "+s(y.internal?"(internal)":""),1)],10,Ce))),128))],2)):J("",!0)]),_:1}))}}),Ae="_accordionItems_v7u0l_5",We="_accordionItem_v7u0l_5",Ue="_clickable_v7u0l_19",Be={accordionItems:Ae,accordionItem:We,clickable:Ue},Re={$style:Be},De=I(xe,[["__cssModules",Re]]),je=S({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var O,q,z;const a=t,n=(w,x,L=0)=>({datasets:[{label:w,backgroundColor:x,data:L?Array(Math.min(T,L)).fill(0):[]}],labels:Array(Math.min(T,L)).fill("")}),c=P(),o=b(void 0),m=b(void 0),e=b(void 0),h=()=>({responsive:!0,maintainAspectRatio:!0,scales:{y:{type:"linear",display:!0,position:"left",min:0,suggestedMax:5}}}),y=h(),r=h();(O=r.scales)!=null&&O.y&&(r.scales.y.suggestedMax=100);const _=B((q=c.workers[a.workerId])==null?void 0:q.totalMem)??1,$=h();(z=$.scales)!=null&&z.y&&($.scales.y.suggestedMax=_);const M=b(n("Job Count","rgb(255, 111, 92)",T)),W=b(n("Processor Usage","rgb(19, 205, 103)",T)),V=b(n("Memory Usage","rgb(244, 216, 174)",T));return c.$onAction(({name:w,store:x})=>{var L,G;if(w==="updateWorkerStatus"){const R=T-(((L=x.workersHistory[a.workerId])==null?void 0:L.length)??0),A=n("Job Count","rgb(255, 111, 92)",R),D=n("Processor Usage","rgb(19, 205, 103)",R),j=n("Memory Usage","rgb(244, 216, 174)",R);(G=x.workersHistory[a.workerId])==null||G.forEach(U=>{var K;A.datasets[0].data.push(U.data.runningJobsSummary.length),(K=A.labels)==null||K.push(new Date(U.timestamp).toLocaleTimeString()),D.datasets[0].data.push(oe(U.data.loadAvg)),D.labels=A.labels,j.datasets[0].data.push(_-B(U.data.freeMem)),j.labels=A.labels}),M.value=A,W.value=D,V.value=j}}),(w,x)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[v(s(w.$locale.baseText("workerList.item.chartsTitle")),1)]),content:p(()=>[k("div",{class:i(w.$style.charts)},[u(f(H),{ref_key:"chartRefJobs",ref:o,type:"line",data:M.value,options:f(y),class:i(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefCPU",ref:m,type:"line",data:W.value,options:f(r),class:i(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefMemory",ref:e,type:"line",data:V.value,options:f($),class:i(w.$style.chart)},null,8,["data","options","class"])],2)]),_:1}))}}),He="_accordionItems_1k0p0_5",Pe="_accordionItem_1k0p0_5",Je="_charts_1k0p0_18",Ee="_chart_1k0p0_18",Fe={accordionItems:He,accordionItem:Pe,charts:Je,chart:Ee},Ne={$style:Fe},Ve=I(je,[["__cssModules",Ne]]),Oe=k("br",null,null,-1),qe=S({__name:"WorkerCard.ee",props:{workerId:{}},setup(t){let a;const n=P(),c=t,o=b("0"),m=b(!1),e=X(()=>n.getWorkerStatus(c.workerId)),h=X(()=>{var r;return((r=e.value)==null?void 0:r.interfaces.toSorted((_,$)=>_.family.localeCompare($.family)))??[]});function y(r){const _=Math.floor(r/86400);r-=_*3600*24;const $=Math.floor(r/3600);r-=$*3600;const M=Math.floor(r/60);return r-=M*60,`${_}d ${$}h ${M}m ${Math.floor(r)}s`}return ie(()=>{a=setInterval(()=>{const r=n.getWorkerLastUpdated(c.workerId);if(!r)return;const _=Math.ceil((Date.now()-r)/1e3);m.value=_>10,o.value=_.toFixed(0)},500)}),le(()=>{clearInterval(a)}),(r,_)=>{const $=g("n8n-heading"),M=g("n8n-text"),W=g("n8n-card");return e.value?(l(),C(W,{key:0,class:i(r.$style.cardLink)},{header:p(()=>[u($,{tag:"h2",bold:"",class:i(m.value?[r.$style.cardHeading,r.$style.stale]:[r.$style.cardHeading]),"data-test-id":"worker-card-name"},{default:p(()=>[v(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),Oe,v(" Average Load: "+s(f(ue)(e.value.loadAvg??[0]))+" | Free Memory: "+s(f(B)(e.value.freeMem).toFixed(2))+"GB / "+s(f(B)(e.value.totalMem).toFixed(2))+"GB "+s(m.value?" (stale)":""),1)]),_:1},8,["class"])]),append:p(()=>[k("div",{ref:"cardActions",class:i(r.$style.cardActions)},null,2)]),default:p(()=>[k("div",{class:i(r.$style.cardDescription)},[u(M,{color:"text-light",size:"small",class:i(r.$style.container)},{default:p(()=>[k("span",null,s(r.$locale.baseText("workerList.item.lastUpdated"))+" "+s(o.value)+"s ago | n8n-Version: "+s(e.value.version)+" | Architecture: "+s(e.value.arch)+" ( "+s(e.value.platform)+") | Uptime: "+s(y(e.value.uptime)),1),u(Te,{items:e.value.runningJobsSummary},null,8,["items"]),u(De,{items:h.value},null,8,["items"]),u(Ve,{"worker-id":e.value.workerId},null,8,["worker-id"])]),_:1},8,["class"])],2)]),_:1},8,["class"])):J("",!0)}}}),ze="_container_124hj_5",Ge="_cardLink_124hj_9",Ke="_cardHeading_124hj_19",Qe="_stale_124hj_25",Ye="_cardDescription_124hj_29",Xe="_cardActions_124hj_36",Ze={container:ze,cardLink:Ge,cardHeading:Ke,stale:Qe,cardDescription:Ye,cardActions:Xe},et={$style:Ze},tt=I(qe,[["__cssModules",et]]),ot=S({name:"WorkerList",components:{PushConnectionTracker:re,WorkerCard:tt},mixins:[Q,ne],props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(t,a){var c,o;return{i18n:ee(),...Z(),...(o=(c=Q).setup)==null?void 0:o.call(c,t,a)}},mounted(){ae(`n8n - ${this.pageTitle}`),this.$telemetry.track("User viewed worker view",{instance_id:this.rootStore.instanceId})},beforeMount(){window.Cypress===void 0&&(this.pushStore.pushConnect(),this.orchestrationManagerStore.startWorkerStatusPolling())},beforeUnmount(){window.Cypress===void 0&&(this.orchestrationManagerStore.stopWorkerStatusPolling(),this.pushStore.pushDisconnect())},computed:{...se(te,P),combinedWorkers(){const t=[];for(const a in this.orchestrationManagerStore.workers)t.push(this.orchestrationManagerStore.workers[a]);return t},initialStatusReceived(){return this.orchestrationManagerStore.initialStatusReceived},workerIds(){return Object.keys(this.orchestrationManagerStore.workers)},pageTitle(){return this.i18n.baseText("workerList.pageTitle")}},methods:{averageLoadAvg(t){return(t.reduce((a,n)=>a+n,0)/t.length).toFixed(2)},getStatus(t){return t.runningJobsSummary.length>0?"running":"success"},getRowClass(t){return[this.$style.execRow,this.$style[this.getStatus(t)]].join(" ")}}}),st="_workerListHeader_q7mrl_5",rt="_card_q7mrl_12",nt="_tableLoader_q7mrl_16",at={workerListHeader:st,card:rt,tableLoader:nt},ct={key:0},it={key:1},lt={key:0},dt={key:1};function ut(t,a,n,c,o,m){const e=g("PushConnectionTracker"),h=g("n8n-heading"),y=g("n8n-spinner"),r=g("WorkerCard");return l(),d("div",null,[u(e,{class:"actions"}),k("div",{class:i(t.$style.workerListHeader)},[u(h,{tag:"h1",size:"2xlarge"},{default:p(()=>[v(s(t.pageTitle),1)]),_:1})],2),t.initialStatusReceived?(l(),d("div",it,[t.workerIds.length===0?(l(),d("div",lt,s(t.$locale.baseText("workerList.empty")),1)):(l(),d("div",dt,[(l(!0),d(E,null,F(t.workerIds,_=>(l(),d("div",{key:_,class:i(t.$style.card)},[u(r,{"worker-id":_,"data-test-id":"worker-card"},null,8,["worker-id"])],2))),128))]))])):(l(),d("div",ct,[u(y)]))])}const pt={$style:at},mt=I(ot,[["render",ut],["__cssModules",pt]]),_t=["href"],ht=S({__name:"WorkerView",setup(t){const a=ce(),n=te(),c=()=>{n.goToUpgrade("worker-view","upgrade-worker-view")};return(o,m)=>{const e=g("n8n-action-box");return f(a).isQueueModeEnabled&&f(a).isWorkerViewAvailable?(l(),C(mt,{key:0,"data-test-id":"worker-view-licensed"})):(l(),C(e,{key:1,"data-test-id":"worker-view-unlicensed",class:i(o.$style.actionBox),description:o.$locale.baseText("workerList.actionBox.description"),"button-text":o.$locale.baseText("workerList.actionBox.buttonText"),"onClick:button":c},{heading:p(()=>[k("span",null,s(o.$locale.baseText("workerList.actionBox.title")),1)]),description:p(()=>[v(s(o.$locale.baseText("workerList.actionBox.description"))+" ",1),k("a",{href:o.$locale.baseText("workerList.docs.url"),target:"_blank"},s(o.$locale.baseText("workerList.actionBox.description.link")),9,_t)]),_:1},8,["class","description","button-text"]))}}}),kt="_actionBox_wwwe5_5",yt={actionBox:kt},ft={$style:yt},Zt=I(ht,[["__cssModules",ft]]);export{Zt as default};
2
+ //# sourceMappingURL=WorkerView-GubNFvBv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerView-7Ib0flYZ.js","sources":["../../src/utils/workerUtils.ts","../../src/components/Workers/WorkerAccordion.ee.vue","../../src/components/Workers/WorkerJobAccordion.ee.vue","../../src/components/Workers/WorkerNetAccordion.ee.vue","../../src/components/Workers/WorkerChartsAccordion.ee.vue","../../src/components/Workers/WorkerCard.ee.vue","../../src/components/WorkerList.ee.vue","../../src/views/WorkerView.vue"],"sourcesContent":["export function averageWorkerLoadFromLoads(loads: number[]): number {\n\treturn loads.reduce((prev, curr) => prev + curr, 0) / loads.length;\n}\n\nexport function averageWorkerLoadFromLoadsAsString(loads: number[]): string {\n\treturn averageWorkerLoadFromLoads(loads).toFixed(2);\n}\n\nexport function memAsGb(mem: number): number {\n\treturn mem / 1024 / 1024 / 1024;\n}\n","<template>\n\t<div :class=\"['accordion', $style.container]\">\n\t\t<div :class=\"{ [$style.header]: true, [$style.expanded]: expanded }\" @click=\"toggle\">\n\t\t\t<n8n-icon :icon=\"icon\" :color=\"iconColor\" size=\"small\" class=\"mr-2xs\" />\n\t\t\t<n8n-text :class=\"$style.headerText\" color=\"text-base\" size=\"small\" align=\"left\" bold>\n\t\t\t\t<slot name=\"title\"></slot>\n\t\t\t</n8n-text>\n\t\t\t<n8n-icon :icon=\"expanded ? 'chevron-up' : 'chevron-down'\" bold />\n\t\t</div>\n\t\t<div v-if=\"expanded\" :class=\"{ [$style.description]: true, [$style.collapsed]: !expanded }\">\n\t\t\t<slot name=\"content\"></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nconst props = defineProps({\n\ticon: {\n\t\ttype: String,\n\t\tdefault: 'tasks',\n\t},\n\ticonColor: {\n\t\ttype: String,\n\t\tdefault: 'black',\n\t},\n\tinitialExpanded: {\n\t\ttype: Boolean,\n\t\tdefault: true,\n\t},\n});\n\nconst expanded = ref<boolean>(props.initialExpanded);\n\nfunction toggle() {\n\texpanded.value = !expanded.value;\n}\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.header {\n\tcursor: pointer;\n\tdisplay: flex;\n\tpadding-top: var(--spacing-s);\n\talign-items: center;\n\n\t.headerText {\n\t\tflex-grow: 1;\n\t}\n}\n\n.expanded {\n\tpadding: var(--spacing-s) 0 0 0;\n}\n\n.description {\n\tdisplay: flex;\n\tpadding: 0 var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\n\tb {\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"true\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.jobListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div v-for=\"item in props.items\" :key=\"item.executionId\" :class=\"$style.accordionItem\">\n\t\t\t\t\t<a :href=\"'/workflow/' + item.workflowId + '/executions/' + item.executionId\">\n\t\t\t\t\t\tExecution {{ item.executionId }} - {{ item.workflowName }}</a\n\t\t\t\t\t>\n\t\t\t\t\t<n8n-text color=\"text-base\" size=\"small\" align=\"left\">\n\t\t\t\t\t\t| Started at:\n\t\t\t\t\t\t{{ new Date(item.startedAt)?.toLocaleTimeString() }} | Running for\n\t\t\t\t\t\t{{ runningSince(new Date(item.startedAt)) }}\n\t\t\t\t\t\t{{ item.retryOf ? `| Retry of: ${item.retryOf}` : '' }} |\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<a target=\"_blank\" :href=\"'/workflow/' + item.workflowId\"> (Open workflow)</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.accordionItems\">\n\t\t\t\t<span :class=\"$style.empty\">\n\t\t\t\t\t{{ $locale.baseText('workerList.item.jobList.empty') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { WorkerJobStatusSummary } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\n\nconst props = defineProps<{\n\titems: WorkerJobStatusSummary[];\n}>();\n\nfunction runningSince(started: Date): string {\n\tlet seconds = Math.floor((new Date().getTime() - started.getTime()) / 1000);\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.empty {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-top: var(--spacing-2xs);\n\tmargin-left: var(--spacing-4xs);\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.netListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"item in props.items\"\n\t\t\t\t\t:key=\"item.address\"\n\t\t\t\t\t:class=\"$style.accordionItem\"\n\t\t\t\t\t@click=\"onCopyToClipboard(item.address)\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.family }}: <span :class=\"$style.clickable\">{{ item.address }}</span>\n\t\t\t\t\t{{ item.internal ? '(internal)' : '' }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\n\nconst props = defineProps<{\n\titems: IPushDataWorkerStatusPayload['interfaces'];\n}>();\n\nconst i18n = useI18n();\nconst clipboard = useClipboard();\nconst { showMessage } = useToast();\n\nfunction onCopyToClipboard(content: string) {\n\ttry {\n\t\tvoid clipboard.copy(content);\n\t\tshowMessage({\n\t\t\ttitle: i18n.baseText('workerList.item.copyAddressToClipboard'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch {}\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.clickable {\n\tcursor: pointer !important;\n\n\t&:hover {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.chartsTitle') }}\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div :class=\"$style.charts\">\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefJobs\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataJobs\"\n\t\t\t\t\t:options=\"optionsJobs\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefCPU\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataCPU\"\n\t\t\t\t\t:options=\"optionsCPU\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefMemory\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataMemory\"\n\t\t\t\t\t:options=\"optionsMemory\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { WORKER_HISTORY_LENGTH, useOrchestrationStore } from '@/stores/orchestration.store';\nimport { ref } from 'vue';\nimport type { ChartData, ChartOptions } from 'chart.js';\nimport type { ChartComponentRef } from 'vue-chartjs';\nimport { Chart } from 'vue-chartjs';\nimport { averageWorkerLoadFromLoads, memAsGb } from '@/utils/workerUtils';\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst blankDataSet = (label: string, color: string, prefill: number = 0) => ({\n\tdatasets: [\n\t\t{\n\t\t\tlabel,\n\t\t\tbackgroundColor: color,\n\t\t\tdata: prefill ? Array<number>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(0) : [],\n\t\t},\n\t],\n\tlabels: Array<string>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(''),\n});\n\nconst orchestrationStore = useOrchestrationStore();\nconst chartRefJobs = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefCPU = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefMemory = ref<ChartComponentRef | undefined>(undefined);\nconst optionsBase: () => Partial<ChartOptions<'line'>> = () => ({\n\tresponsive: true,\n\tmaintainAspectRatio: true,\n\tscales: {\n\t\ty: {\n\t\t\ttype: 'linear',\n\t\t\tdisplay: true,\n\t\t\tposition: 'left',\n\t\t\tmin: 0,\n\t\t\tsuggestedMax: 5,\n\t\t},\n\t},\n\t// uncomment to disable animation\n\t// animation: {\n\t// \tduration: 0,\n\t// },\n});\nconst optionsJobs: Partial<ChartOptions<'line'>> = optionsBase();\nconst optionsCPU: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsCPU.scales?.y) optionsCPU.scales.y.suggestedMax = 100;\nconst maxMemory = memAsGb(orchestrationStore.workers[props.workerId]?.totalMem) ?? 1;\nconst optionsMemory: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsMemory.scales?.y) optionsMemory.scales.y.suggestedMax = maxMemory;\n\n// prefilled initial arrays\nconst dataJobs = ref<ChartData>(\n\tblankDataSet('Job Count', 'rgb(255, 111, 92)', WORKER_HISTORY_LENGTH),\n);\nconst dataCPU = ref<ChartData>(\n\tblankDataSet('Processor Usage', 'rgb(19, 205, 103)', WORKER_HISTORY_LENGTH),\n);\nconst dataMemory = ref<ChartData>(\n\tblankDataSet('Memory Usage', 'rgb(244, 216, 174)', WORKER_HISTORY_LENGTH),\n);\n\norchestrationStore.$onAction(({ name, store }) => {\n\tif (name === 'updateWorkerStatus') {\n\t\tconst prefillCount =\n\t\t\tWORKER_HISTORY_LENGTH - (store.workersHistory[props.workerId]?.length ?? 0);\n\t\tconst newDataJobs: ChartData = blankDataSet('Job Count', 'rgb(255, 111, 92)', prefillCount);\n\t\tconst newDataCPU: ChartData = blankDataSet(\n\t\t\t'Processor Usage',\n\t\t\t'rgb(19, 205, 103)',\n\t\t\tprefillCount,\n\t\t);\n\t\tconst newDataMemory: ChartData = blankDataSet(\n\t\t\t'Memory Usage',\n\t\t\t'rgb(244, 216, 174)',\n\t\t\tprefillCount,\n\t\t);\n\t\tstore.workersHistory[props.workerId]?.forEach((item) => {\n\t\t\tnewDataJobs.datasets[0].data.push(item.data.runningJobsSummary.length);\n\t\t\tnewDataJobs.labels?.push(new Date(item.timestamp).toLocaleTimeString());\n\t\t\tnewDataCPU.datasets[0].data.push(averageWorkerLoadFromLoads(item.data.loadAvg));\n\t\t\tnewDataCPU.labels = newDataJobs.labels;\n\t\t\tnewDataMemory.datasets[0].data.push(maxMemory - memAsGb(item.data.freeMem));\n\t\t\tnewDataMemory.labels = newDataJobs.labels;\n\t\t});\n\t\tdataJobs.value = newDataJobs;\n\t\tdataCPU.value = newDataCPU;\n\t\tdataMemory.value = newDataMemory;\n\t}\n});\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.charts {\n\twidth: 100%;\n\tflex-direction: column;\n}\n\n.chart {\n\tmax-width: 100%;\n\tmax-height: 200px;\n\tposition: relative;\n}\n</style>\n","<template>\n\t<n8n-card v-if=\"worker\" :class=\"$style.cardLink\">\n\t\t<template #header>\n\t\t\t<n8n-heading\n\t\t\t\ttag=\"h2\"\n\t\t\t\tbold\n\t\t\t\t:class=\"stale ? [$style.cardHeading, $style.stale] : [$style.cardHeading]\"\n\t\t\t\tdata-test-id=\"worker-card-name\"\n\t\t\t>\n\t\t\t\tName: {{ worker.workerId }} ({{ worker.hostname }}) <br />\n\t\t\t\tAverage Load: {{ averageWorkerLoadFromLoadsAsString(worker.loadAvg ?? [0]) }} | Free Memory:\n\t\t\t\t{{ memAsGb(worker.freeMem).toFixed(2) }}GB / {{ memAsGb(worker.totalMem).toFixed(2) }}GB\n\t\t\t\t{{ stale ? ' (stale)' : '' }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<div :class=\"$style.cardDescription\">\n\t\t\t<n8n-text color=\"text-light\" size=\"small\" :class=\"$style.container\">\n\t\t\t\t<span\n\t\t\t\t\t>{{ $locale.baseText('workerList.item.lastUpdated') }} {{ secondsSinceLastUpdateString }}s\n\t\t\t\t\tago | n8n-Version: {{ worker.version }} | Architecture: {{ worker.arch }} (\n\t\t\t\t\t{{ worker.platform }}) | Uptime: {{ upTime(worker.uptime) }}</span\n\t\t\t\t>\n\t\t\t\t<WorkerJobAccordion :items=\"worker.runningJobsSummary\" />\n\t\t\t\t<WorkerNetAccordion :items=\"sortedWorkerInterfaces\" />\n\t\t\t\t<WorkerChartsAccordion :worker-id=\"worker.workerId\" />\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<template #append>\n\t\t\t<div ref=\"cardActions\" :class=\"$style.cardActions\">\n\t\t\t\t<!-- For future Worker actions -->\n\t\t\t</div>\n\t\t</template>\n\t</n8n-card>\n</template>\n\n<script setup lang=\"ts\">\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport { computed, onMounted, onBeforeUnmount, ref } from 'vue';\nimport { averageWorkerLoadFromLoadsAsString, memAsGb } from '../../utils/workerUtils';\nimport WorkerJobAccordion from './WorkerJobAccordion.ee.vue';\nimport WorkerNetAccordion from './WorkerNetAccordion.ee.vue';\nimport WorkerChartsAccordion from './WorkerChartsAccordion.ee.vue';\n\nlet interval: NodeJS.Timer;\n\nconst orchestrationStore = useOrchestrationStore();\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst secondsSinceLastUpdateString = ref<string>('0');\nconst stale = ref<boolean>(false);\n\nconst worker = computed((): IPushDataWorkerStatusPayload | undefined => {\n\treturn orchestrationStore.getWorkerStatus(props.workerId);\n});\n\nconst sortedWorkerInterfaces = computed(\n\t() => worker.value?.interfaces.toSorted((a, b) => a.family.localeCompare(b.family)) ?? [],\n);\n\nfunction upTime(seconds: number): string {\n\tconst days = Math.floor(seconds / (3600 * 24));\n\tseconds -= days * 3600 * 24;\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${days}d ${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n\nonMounted(() => {\n\tinterval = setInterval(() => {\n\t\tconst lastUpdated = orchestrationStore.getWorkerLastUpdated(props.workerId);\n\t\tif (!lastUpdated) {\n\t\t\treturn;\n\t\t}\n\t\tconst secondsSinceLastUpdate = Math.ceil((Date.now() - lastUpdated) / 1000);\n\t\tstale.value = secondsSinceLastUpdate > 10;\n\t\tsecondsSinceLastUpdateString.value = secondsSinceLastUpdate.toFixed(0);\n\t}, 500);\n});\n\nonBeforeUnmount(() => {\n\tclearInterval(interval);\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.cardLink {\n\ttransition: box-shadow 0.3s ease;\n\tcursor: pointer;\n\tpadding: 0;\n\talign-items: stretch;\n\n\t&:hover {\n\t\tbox-shadow: 0 2px 8px rgba(#441c17, 0.1);\n\t}\n}\n\n.cardHeading {\n\tfont-size: var(--font-size-s);\n\tword-break: break-word;\n\tpadding: var(--spacing-s) 0 0 var(--spacing-s);\n}\n\n.stale {\n\topacity: 0.5;\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s) var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<template>\n\t<div>\n\t\t<PushConnectionTracker class=\"actions\"></PushConnectionTracker>\n\t\t<div :class=\"$style.workerListHeader\">\n\t\t\t<n8n-heading tag=\"h1\" size=\"2xlarge\">{{ pageTitle }}</n8n-heading>\n\t\t</div>\n\t\t<div v-if=\"!initialStatusReceived\">\n\t\t\t<n8n-spinner />\n\t\t</div>\n\t\t<div v-else>\n\t\t\t<div v-if=\"workerIds.length === 0\">{{ $locale.baseText('workerList.empty') }}</div>\n\t\t\t<div v-else>\n\t\t\t\t<div v-for=\"workerId in workerIds\" :key=\"workerId\" :class=\"$style.card\">\n\t\t\t\t\t<WorkerCard :worker-id=\"workerId\" data-test-id=\"worker-card\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport { executionHelpers } from '@/mixins/executionsHelpers';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport type { ExecutionStatus } from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport { pushConnection } from '@/mixins/pushConnection';\nimport WorkerCard from './Workers/WorkerCard.ee.vue';\n\n// eslint-disable-next-line import/no-default-export\nexport default defineComponent({\n\tname: 'WorkerList',\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/naming-convention\n\tcomponents: { PushConnectionTracker, WorkerCard },\n\tmixins: [pushConnection, executionHelpers],\n\tprops: {\n\t\tautoRefreshEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst i18n = useI18n();\n\t\treturn {\n\t\t\ti18n,\n\t\t\t...useToast(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...pushConnection.setup?.(props, ctx),\n\t\t};\n\t},\n\tmounted() {\n\t\tsetPageTitle(`n8n - ${this.pageTitle}`);\n\n\t\tthis.$telemetry.track('User viewed worker view', {\n\t\t\tinstance_id: this.rootStore.instanceId,\n\t\t});\n\t},\n\tbeforeMount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.pushStore.pushConnect();\n\t\tthis.orchestrationManagerStore.startWorkerStatusPolling();\n\t},\n\tbeforeUnmount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.orchestrationManagerStore.stopWorkerStatusPolling();\n\t\tthis.pushStore.pushDisconnect();\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore, useOrchestrationStore),\n\t\tcombinedWorkers(): IPushDataWorkerStatusPayload[] {\n\t\t\tconst returnData: IPushDataWorkerStatusPayload[] = [];\n\t\t\tfor (const workerId in this.orchestrationManagerStore.workers) {\n\t\t\t\treturnData.push(this.orchestrationManagerStore.workers[workerId]);\n\t\t\t}\n\t\t\treturn returnData;\n\t\t},\n\t\tinitialStatusReceived(): boolean {\n\t\t\treturn this.orchestrationManagerStore.initialStatusReceived;\n\t\t},\n\t\tworkerIds(): string[] {\n\t\t\treturn Object.keys(this.orchestrationManagerStore.workers);\n\t\t},\n\t\tpageTitle() {\n\t\t\treturn this.i18n.baseText('workerList.pageTitle');\n\t\t},\n\t},\n\tmethods: {\n\t\taverageLoadAvg(loads: number[]) {\n\t\t\treturn (loads.reduce((prev, curr) => prev + curr, 0) / loads.length).toFixed(2);\n\t\t},\n\t\tgetStatus(payload: IPushDataWorkerStatusPayload): ExecutionStatus {\n\t\t\tif (payload.runningJobsSummary.length > 0) {\n\t\t\t\treturn 'running';\n\t\t\t} else {\n\t\t\t\treturn 'success';\n\t\t\t}\n\t\t},\n\t\tgetRowClass(payload: IPushDataWorkerStatusPayload): string {\n\t\t\treturn [this.$style.execRow, this.$style[this.getStatus(payload)]].join(' ');\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.workerListHeader {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.card {\n\tmargin-bottom: var(--spacing-s);\n}\n\n.tableLoader {\n\twidth: 100%;\n\theight: 48px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n</style>\n","<template>\n\t<WorkerList\n\t\tv-if=\"settingsStore.isQueueModeEnabled && settingsStore.isWorkerViewAvailable\"\n\t\tdata-test-id=\"worker-view-licensed\"\n\t/>\n\t<n8n-action-box\n\t\tv-else\n\t\tdata-test-id=\"worker-view-unlicensed\"\n\t\t:class=\"$style.actionBox\"\n\t\t:description=\"$locale.baseText('workerList.actionBox.description')\"\n\t\t:button-text=\"$locale.baseText('workerList.actionBox.buttonText')\"\n\t\t@click:button=\"goToUpgrade\"\n\t>\n\t\t<template #heading>\n\t\t\t<span>{{ $locale.baseText('workerList.actionBox.title') }}</span>\n\t\t</template>\n\t\t<template #description>\n\t\t\t{{ $locale.baseText('workerList.actionBox.description') }}\n\t\t\t<a :href=\"$locale.baseText('workerList.docs.url')\" target=\"_blank\">\n\t\t\t\t{{ $locale.baseText('workerList.actionBox.description.link') }}\n\t\t\t</a>\n\t\t</template>\n\t</n8n-action-box>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerList from '@/components/WorkerList.ee.vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\n\nconst settingsStore = useSettingsStore();\nconst uiStore = useUIStore();\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('worker-view', 'upgrade-worker-view');\n};\n</script>\n\n<style module lang=\"scss\">\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n</style>\n"],"names":["averageWorkerLoadFromLoads","loads","prev","curr","averageWorkerLoadFromLoadsAsString","memAsGb","mem","expanded","ref","__props","toggle","props","runningSince","started","seconds","hrs","mnts","i18n","useI18n","clipboard","useClipboard","showMessage","useToast","onCopyToClipboard","content","blankDataSet","label","color","prefill","WORKER_HISTORY_LENGTH","orchestrationStore","useOrchestrationStore","chartRefJobs","chartRefCPU","chartRefMemory","optionsBase","optionsJobs","optionsCPU","_a","maxMemory","_b","optionsMemory","_c","dataJobs","dataCPU","dataMemory","name","store","prefillCount","newDataJobs","newDataCPU","newDataMemory","item","interval","secondsSinceLastUpdateString","stale","worker","computed","sortedWorkerInterfaces","a","b","upTime","days","onMounted","lastUpdated","secondsSinceLastUpdate","onBeforeUnmount","_sfc_main$1","defineComponent","PushConnectionTracker","WorkerCard","pushConnection","executionHelpers","ctx","setPageTitle","mapStores","useUIStore","returnData","workerId","payload","_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_PushConnectionTracker","_createElementVNode","_normalizeClass","_ctx","_component_n8n_heading","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_Fragment","_renderList","_component_WorkerCard","_hoisted_1","_component_n8n_spinner","settingsStore","useSettingsStore","uiStore","goToUpgrade"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerView-GubNFvBv.js","sources":["../../src/utils/workerUtils.ts","../../src/components/Workers/WorkerAccordion.ee.vue","../../src/components/Workers/WorkerJobAccordion.ee.vue","../../src/components/Workers/WorkerNetAccordion.ee.vue","../../src/components/Workers/WorkerChartsAccordion.ee.vue","../../src/components/Workers/WorkerCard.ee.vue","../../src/components/WorkerList.ee.vue","../../src/views/WorkerView.vue"],"sourcesContent":["export function averageWorkerLoadFromLoads(loads: number[]): number {\n\treturn loads.reduce((prev, curr) => prev + curr, 0) / loads.length;\n}\n\nexport function averageWorkerLoadFromLoadsAsString(loads: number[]): string {\n\treturn averageWorkerLoadFromLoads(loads).toFixed(2);\n}\n\nexport function memAsGb(mem: number): number {\n\treturn mem / 1024 / 1024 / 1024;\n}\n","<template>\n\t<div :class=\"['accordion', $style.container]\">\n\t\t<div :class=\"{ [$style.header]: true, [$style.expanded]: expanded }\" @click=\"toggle\">\n\t\t\t<n8n-icon :icon=\"icon\" :color=\"iconColor\" size=\"small\" class=\"mr-2xs\" />\n\t\t\t<n8n-text :class=\"$style.headerText\" color=\"text-base\" size=\"small\" align=\"left\" bold>\n\t\t\t\t<slot name=\"title\"></slot>\n\t\t\t</n8n-text>\n\t\t\t<n8n-icon :icon=\"expanded ? 'chevron-up' : 'chevron-down'\" bold />\n\t\t</div>\n\t\t<div v-if=\"expanded\" :class=\"{ [$style.description]: true, [$style.collapsed]: !expanded }\">\n\t\t\t<slot name=\"content\"></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nconst props = defineProps({\n\ticon: {\n\t\ttype: String,\n\t\tdefault: 'tasks',\n\t},\n\ticonColor: {\n\t\ttype: String,\n\t\tdefault: 'black',\n\t},\n\tinitialExpanded: {\n\t\ttype: Boolean,\n\t\tdefault: true,\n\t},\n});\n\nconst expanded = ref<boolean>(props.initialExpanded);\n\nfunction toggle() {\n\texpanded.value = !expanded.value;\n}\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.header {\n\tcursor: pointer;\n\tdisplay: flex;\n\tpadding-top: var(--spacing-s);\n\talign-items: center;\n\n\t.headerText {\n\t\tflex-grow: 1;\n\t}\n}\n\n.expanded {\n\tpadding: var(--spacing-s) 0 0 0;\n}\n\n.description {\n\tdisplay: flex;\n\tpadding: 0 var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\n\tb {\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"true\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.jobListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div v-for=\"item in props.items\" :key=\"item.executionId\" :class=\"$style.accordionItem\">\n\t\t\t\t\t<a :href=\"'/workflow/' + item.workflowId + '/executions/' + item.executionId\">\n\t\t\t\t\t\tExecution {{ item.executionId }} - {{ item.workflowName }}</a\n\t\t\t\t\t>\n\t\t\t\t\t<n8n-text color=\"text-base\" size=\"small\" align=\"left\">\n\t\t\t\t\t\t| Started at:\n\t\t\t\t\t\t{{ new Date(item.startedAt)?.toLocaleTimeString() }} | Running for\n\t\t\t\t\t\t{{ runningSince(new Date(item.startedAt)) }}\n\t\t\t\t\t\t{{ item.retryOf ? `| Retry of: ${item.retryOf}` : '' }} |\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<a target=\"_blank\" :href=\"'/workflow/' + item.workflowId\"> (Open workflow)</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.accordionItems\">\n\t\t\t\t<span :class=\"$style.empty\">\n\t\t\t\t\t{{ $locale.baseText('workerList.item.jobList.empty') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { WorkerJobStatusSummary } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\n\nconst props = defineProps<{\n\titems: WorkerJobStatusSummary[];\n}>();\n\nfunction runningSince(started: Date): string {\n\tlet seconds = Math.floor((new Date().getTime() - started.getTime()) / 1000);\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.empty {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-top: var(--spacing-2xs);\n\tmargin-left: var(--spacing-4xs);\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.netListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"item in props.items\"\n\t\t\t\t\t:key=\"item.address\"\n\t\t\t\t\t:class=\"$style.accordionItem\"\n\t\t\t\t\t@click=\"onCopyToClipboard(item.address)\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.family }}: <span :class=\"$style.clickable\">{{ item.address }}</span>\n\t\t\t\t\t{{ item.internal ? '(internal)' : '' }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\n\nconst props = defineProps<{\n\titems: IPushDataWorkerStatusPayload['interfaces'];\n}>();\n\nconst i18n = useI18n();\nconst clipboard = useClipboard();\nconst { showMessage } = useToast();\n\nfunction onCopyToClipboard(content: string) {\n\ttry {\n\t\tvoid clipboard.copy(content);\n\t\tshowMessage({\n\t\t\ttitle: i18n.baseText('workerList.item.copyAddressToClipboard'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch {}\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.clickable {\n\tcursor: pointer !important;\n\n\t&:hover {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.chartsTitle') }}\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div :class=\"$style.charts\">\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefJobs\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataJobs\"\n\t\t\t\t\t:options=\"optionsJobs\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefCPU\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataCPU\"\n\t\t\t\t\t:options=\"optionsCPU\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefMemory\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataMemory\"\n\t\t\t\t\t:options=\"optionsMemory\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { WORKER_HISTORY_LENGTH, useOrchestrationStore } from '@/stores/orchestration.store';\nimport { ref } from 'vue';\nimport type { ChartData, ChartOptions } from 'chart.js';\nimport type { ChartComponentRef } from 'vue-chartjs';\nimport { Chart } from 'vue-chartjs';\nimport { averageWorkerLoadFromLoads, memAsGb } from '@/utils/workerUtils';\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst blankDataSet = (label: string, color: string, prefill: number = 0) => ({\n\tdatasets: [\n\t\t{\n\t\t\tlabel,\n\t\t\tbackgroundColor: color,\n\t\t\tdata: prefill ? Array<number>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(0) : [],\n\t\t},\n\t],\n\tlabels: Array<string>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(''),\n});\n\nconst orchestrationStore = useOrchestrationStore();\nconst chartRefJobs = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefCPU = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefMemory = ref<ChartComponentRef | undefined>(undefined);\nconst optionsBase: () => Partial<ChartOptions<'line'>> = () => ({\n\tresponsive: true,\n\tmaintainAspectRatio: true,\n\tscales: {\n\t\ty: {\n\t\t\ttype: 'linear',\n\t\t\tdisplay: true,\n\t\t\tposition: 'left',\n\t\t\tmin: 0,\n\t\t\tsuggestedMax: 5,\n\t\t},\n\t},\n\t// uncomment to disable animation\n\t// animation: {\n\t// \tduration: 0,\n\t// },\n});\nconst optionsJobs: Partial<ChartOptions<'line'>> = optionsBase();\nconst optionsCPU: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsCPU.scales?.y) optionsCPU.scales.y.suggestedMax = 100;\nconst maxMemory = memAsGb(orchestrationStore.workers[props.workerId]?.totalMem) ?? 1;\nconst optionsMemory: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsMemory.scales?.y) optionsMemory.scales.y.suggestedMax = maxMemory;\n\n// prefilled initial arrays\nconst dataJobs = ref<ChartData>(\n\tblankDataSet('Job Count', 'rgb(255, 111, 92)', WORKER_HISTORY_LENGTH),\n);\nconst dataCPU = ref<ChartData>(\n\tblankDataSet('Processor Usage', 'rgb(19, 205, 103)', WORKER_HISTORY_LENGTH),\n);\nconst dataMemory = ref<ChartData>(\n\tblankDataSet('Memory Usage', 'rgb(244, 216, 174)', WORKER_HISTORY_LENGTH),\n);\n\norchestrationStore.$onAction(({ name, store }) => {\n\tif (name === 'updateWorkerStatus') {\n\t\tconst prefillCount =\n\t\t\tWORKER_HISTORY_LENGTH - (store.workersHistory[props.workerId]?.length ?? 0);\n\t\tconst newDataJobs: ChartData = blankDataSet('Job Count', 'rgb(255, 111, 92)', prefillCount);\n\t\tconst newDataCPU: ChartData = blankDataSet(\n\t\t\t'Processor Usage',\n\t\t\t'rgb(19, 205, 103)',\n\t\t\tprefillCount,\n\t\t);\n\t\tconst newDataMemory: ChartData = blankDataSet(\n\t\t\t'Memory Usage',\n\t\t\t'rgb(244, 216, 174)',\n\t\t\tprefillCount,\n\t\t);\n\t\tstore.workersHistory[props.workerId]?.forEach((item) => {\n\t\t\tnewDataJobs.datasets[0].data.push(item.data.runningJobsSummary.length);\n\t\t\tnewDataJobs.labels?.push(new Date(item.timestamp).toLocaleTimeString());\n\t\t\tnewDataCPU.datasets[0].data.push(averageWorkerLoadFromLoads(item.data.loadAvg));\n\t\t\tnewDataCPU.labels = newDataJobs.labels;\n\t\t\tnewDataMemory.datasets[0].data.push(maxMemory - memAsGb(item.data.freeMem));\n\t\t\tnewDataMemory.labels = newDataJobs.labels;\n\t\t});\n\t\tdataJobs.value = newDataJobs;\n\t\tdataCPU.value = newDataCPU;\n\t\tdataMemory.value = newDataMemory;\n\t}\n});\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.charts {\n\twidth: 100%;\n\tflex-direction: column;\n}\n\n.chart {\n\tmax-width: 100%;\n\tmax-height: 200px;\n\tposition: relative;\n}\n</style>\n","<template>\n\t<n8n-card v-if=\"worker\" :class=\"$style.cardLink\">\n\t\t<template #header>\n\t\t\t<n8n-heading\n\t\t\t\ttag=\"h2\"\n\t\t\t\tbold\n\t\t\t\t:class=\"stale ? [$style.cardHeading, $style.stale] : [$style.cardHeading]\"\n\t\t\t\tdata-test-id=\"worker-card-name\"\n\t\t\t>\n\t\t\t\tName: {{ worker.workerId }} ({{ worker.hostname }}) <br />\n\t\t\t\tAverage Load: {{ averageWorkerLoadFromLoadsAsString(worker.loadAvg ?? [0]) }} | Free Memory:\n\t\t\t\t{{ memAsGb(worker.freeMem).toFixed(2) }}GB / {{ memAsGb(worker.totalMem).toFixed(2) }}GB\n\t\t\t\t{{ stale ? ' (stale)' : '' }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<div :class=\"$style.cardDescription\">\n\t\t\t<n8n-text color=\"text-light\" size=\"small\" :class=\"$style.container\">\n\t\t\t\t<span\n\t\t\t\t\t>{{ $locale.baseText('workerList.item.lastUpdated') }} {{ secondsSinceLastUpdateString }}s\n\t\t\t\t\tago | n8n-Version: {{ worker.version }} | Architecture: {{ worker.arch }} (\n\t\t\t\t\t{{ worker.platform }}) | Uptime: {{ upTime(worker.uptime) }}</span\n\t\t\t\t>\n\t\t\t\t<WorkerJobAccordion :items=\"worker.runningJobsSummary\" />\n\t\t\t\t<WorkerNetAccordion :items=\"sortedWorkerInterfaces\" />\n\t\t\t\t<WorkerChartsAccordion :worker-id=\"worker.workerId\" />\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<template #append>\n\t\t\t<div ref=\"cardActions\" :class=\"$style.cardActions\">\n\t\t\t\t<!-- For future Worker actions -->\n\t\t\t</div>\n\t\t</template>\n\t</n8n-card>\n</template>\n\n<script setup lang=\"ts\">\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport { computed, onMounted, onBeforeUnmount, ref } from 'vue';\nimport { averageWorkerLoadFromLoadsAsString, memAsGb } from '../../utils/workerUtils';\nimport WorkerJobAccordion from './WorkerJobAccordion.ee.vue';\nimport WorkerNetAccordion from './WorkerNetAccordion.ee.vue';\nimport WorkerChartsAccordion from './WorkerChartsAccordion.ee.vue';\n\nlet interval: NodeJS.Timer;\n\nconst orchestrationStore = useOrchestrationStore();\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst secondsSinceLastUpdateString = ref<string>('0');\nconst stale = ref<boolean>(false);\n\nconst worker = computed((): IPushDataWorkerStatusPayload | undefined => {\n\treturn orchestrationStore.getWorkerStatus(props.workerId);\n});\n\nconst sortedWorkerInterfaces = computed(\n\t() => worker.value?.interfaces.toSorted((a, b) => a.family.localeCompare(b.family)) ?? [],\n);\n\nfunction upTime(seconds: number): string {\n\tconst days = Math.floor(seconds / (3600 * 24));\n\tseconds -= days * 3600 * 24;\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${days}d ${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n\nonMounted(() => {\n\tinterval = setInterval(() => {\n\t\tconst lastUpdated = orchestrationStore.getWorkerLastUpdated(props.workerId);\n\t\tif (!lastUpdated) {\n\t\t\treturn;\n\t\t}\n\t\tconst secondsSinceLastUpdate = Math.ceil((Date.now() - lastUpdated) / 1000);\n\t\tstale.value = secondsSinceLastUpdate > 10;\n\t\tsecondsSinceLastUpdateString.value = secondsSinceLastUpdate.toFixed(0);\n\t}, 500);\n});\n\nonBeforeUnmount(() => {\n\tclearInterval(interval);\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.cardLink {\n\ttransition: box-shadow 0.3s ease;\n\tcursor: pointer;\n\tpadding: 0;\n\talign-items: stretch;\n\n\t&:hover {\n\t\tbox-shadow: 0 2px 8px rgba(#441c17, 0.1);\n\t}\n}\n\n.cardHeading {\n\tfont-size: var(--font-size-s);\n\tword-break: break-word;\n\tpadding: var(--spacing-s) 0 0 var(--spacing-s);\n}\n\n.stale {\n\topacity: 0.5;\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s) var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<template>\n\t<div>\n\t\t<PushConnectionTracker class=\"actions\"></PushConnectionTracker>\n\t\t<div :class=\"$style.workerListHeader\">\n\t\t\t<n8n-heading tag=\"h1\" size=\"2xlarge\">{{ pageTitle }}</n8n-heading>\n\t\t</div>\n\t\t<div v-if=\"!initialStatusReceived\">\n\t\t\t<n8n-spinner />\n\t\t</div>\n\t\t<div v-else>\n\t\t\t<div v-if=\"workerIds.length === 0\">{{ $locale.baseText('workerList.empty') }}</div>\n\t\t\t<div v-else>\n\t\t\t\t<div v-for=\"workerId in workerIds\" :key=\"workerId\" :class=\"$style.card\">\n\t\t\t\t\t<WorkerCard :worker-id=\"workerId\" data-test-id=\"worker-card\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport { executionHelpers } from '@/mixins/executionsHelpers';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport type { ExecutionStatus } from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport { pushConnection } from '@/mixins/pushConnection';\nimport WorkerCard from './Workers/WorkerCard.ee.vue';\n\n// eslint-disable-next-line import/no-default-export\nexport default defineComponent({\n\tname: 'WorkerList',\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/naming-convention\n\tcomponents: { PushConnectionTracker, WorkerCard },\n\tmixins: [pushConnection, executionHelpers],\n\tprops: {\n\t\tautoRefreshEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst i18n = useI18n();\n\t\treturn {\n\t\t\ti18n,\n\t\t\t...useToast(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...pushConnection.setup?.(props, ctx),\n\t\t};\n\t},\n\tmounted() {\n\t\tsetPageTitle(`n8n - ${this.pageTitle}`);\n\n\t\tthis.$telemetry.track('User viewed worker view', {\n\t\t\tinstance_id: this.rootStore.instanceId,\n\t\t});\n\t},\n\tbeforeMount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.pushStore.pushConnect();\n\t\tthis.orchestrationManagerStore.startWorkerStatusPolling();\n\t},\n\tbeforeUnmount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.orchestrationManagerStore.stopWorkerStatusPolling();\n\t\tthis.pushStore.pushDisconnect();\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore, useOrchestrationStore),\n\t\tcombinedWorkers(): IPushDataWorkerStatusPayload[] {\n\t\t\tconst returnData: IPushDataWorkerStatusPayload[] = [];\n\t\t\tfor (const workerId in this.orchestrationManagerStore.workers) {\n\t\t\t\treturnData.push(this.orchestrationManagerStore.workers[workerId]);\n\t\t\t}\n\t\t\treturn returnData;\n\t\t},\n\t\tinitialStatusReceived(): boolean {\n\t\t\treturn this.orchestrationManagerStore.initialStatusReceived;\n\t\t},\n\t\tworkerIds(): string[] {\n\t\t\treturn Object.keys(this.orchestrationManagerStore.workers);\n\t\t},\n\t\tpageTitle() {\n\t\t\treturn this.i18n.baseText('workerList.pageTitle');\n\t\t},\n\t},\n\tmethods: {\n\t\taverageLoadAvg(loads: number[]) {\n\t\t\treturn (loads.reduce((prev, curr) => prev + curr, 0) / loads.length).toFixed(2);\n\t\t},\n\t\tgetStatus(payload: IPushDataWorkerStatusPayload): ExecutionStatus {\n\t\t\tif (payload.runningJobsSummary.length > 0) {\n\t\t\t\treturn 'running';\n\t\t\t} else {\n\t\t\t\treturn 'success';\n\t\t\t}\n\t\t},\n\t\tgetRowClass(payload: IPushDataWorkerStatusPayload): string {\n\t\t\treturn [this.$style.execRow, this.$style[this.getStatus(payload)]].join(' ');\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.workerListHeader {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.card {\n\tmargin-bottom: var(--spacing-s);\n}\n\n.tableLoader {\n\twidth: 100%;\n\theight: 48px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n</style>\n","<template>\n\t<WorkerList\n\t\tv-if=\"settingsStore.isQueueModeEnabled && settingsStore.isWorkerViewAvailable\"\n\t\tdata-test-id=\"worker-view-licensed\"\n\t/>\n\t<n8n-action-box\n\t\tv-else\n\t\tdata-test-id=\"worker-view-unlicensed\"\n\t\t:class=\"$style.actionBox\"\n\t\t:description=\"$locale.baseText('workerList.actionBox.description')\"\n\t\t:button-text=\"$locale.baseText('workerList.actionBox.buttonText')\"\n\t\t@click:button=\"goToUpgrade\"\n\t>\n\t\t<template #heading>\n\t\t\t<span>{{ $locale.baseText('workerList.actionBox.title') }}</span>\n\t\t</template>\n\t\t<template #description>\n\t\t\t{{ $locale.baseText('workerList.actionBox.description') }}\n\t\t\t<a :href=\"$locale.baseText('workerList.docs.url')\" target=\"_blank\">\n\t\t\t\t{{ $locale.baseText('workerList.actionBox.description.link') }}\n\t\t\t</a>\n\t\t</template>\n\t</n8n-action-box>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerList from '@/components/WorkerList.ee.vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\n\nconst settingsStore = useSettingsStore();\nconst uiStore = useUIStore();\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('worker-view', 'upgrade-worker-view');\n};\n</script>\n\n<style module lang=\"scss\">\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n</style>\n"],"names":["averageWorkerLoadFromLoads","loads","prev","curr","averageWorkerLoadFromLoadsAsString","memAsGb","mem","expanded","ref","__props","toggle","props","runningSince","started","seconds","hrs","mnts","i18n","useI18n","clipboard","useClipboard","showMessage","useToast","onCopyToClipboard","content","blankDataSet","label","color","prefill","WORKER_HISTORY_LENGTH","orchestrationStore","useOrchestrationStore","chartRefJobs","chartRefCPU","chartRefMemory","optionsBase","optionsJobs","optionsCPU","_a","maxMemory","_b","optionsMemory","_c","dataJobs","dataCPU","dataMemory","name","store","prefillCount","newDataJobs","newDataCPU","newDataMemory","item","interval","secondsSinceLastUpdateString","stale","worker","computed","sortedWorkerInterfaces","a","b","upTime","days","onMounted","lastUpdated","secondsSinceLastUpdate","onBeforeUnmount","_sfc_main$1","defineComponent","PushConnectionTracker","WorkerCard","pushConnection","executionHelpers","ctx","setPageTitle","mapStores","useUIStore","returnData","workerId","payload","_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_PushConnectionTracker","_createElementVNode","_normalizeClass","_ctx","_component_n8n_heading","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_Fragment","_renderList","_component_WorkerCard","_hoisted_1","_component_n8n_spinner","settingsStore","useSettingsStore","uiStore","goToUpgrade"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{e as A,v as T,u as b,d7 as y,_ as W}from"./n8n-uKoDE8Qf.js";import{w as f}from"./workflowActivate-iOg_mrLc.js";import{m as S}from"./pinia-e-gLcRJ1.js";import{v as _,f as s,h as v,i as n,D as k,E as e,J as u,I as c,y as $,K as r,M as N,H as C,a6 as a,ae as E}from"./vendor-3VD3vVJy.js";const I=_({name:"WorkflowActivator",mixins:[f],props:["workflowActive","workflowId"],setup(o,t){var i,l;return{...A(),...(l=(i=f).setup)==null?void 0:l.call(i,o,t)}},computed:{...S(b,T),nodesIssuesExist(){return this.workflowsStore.nodesIssuesExist},isWorkflowActive(){return this.workflowsStore.activeWorkflows.includes(this.workflowId)},couldNotBeStarted(){return this.workflowActive===!0&&this.isWorkflowActive!==this.workflowActive},getActiveColor(){return this.couldNotBeStarted?"#ff4949":"#13ce66"},isCurrentWorkflow(){return this.workflowsStore.workflowId===this.workflowId},disabled(){return!this.workflowId||this.isCurrentWorkflow?!this.workflowActive&&!this.containsTrigger:!1},containsTrigger(){return y(this.workflowsStore.workflowTriggerNodes).length>0}},methods:{async activeChanged(o){return await this.updateWorkflowActivation(this.workflowId,o)},async displayActivationError(){let o;try{const t=await this.workflowsStore.getActivationError(this.workflowId);t===void 0?o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataUndefined"):o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined",{interpolate:{message:t}})}catch{o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.catchBlock")}this.showMessage({title:this.$locale.baseText("workflowActivator.showMessage.displayActivationError.title"),message:o,type:"warning",duration:0,dangerouslyUseHTMLString:!0})}}}),M="_activeStatusText_1dwsh_5",B={activeStatusText:M},D={class:"workflow-activator"},U={key:0,class:"could-not-be-started"},V=["innerHTML"];function x(o,t,i,l,z,L){const w=a("n8n-text"),h=a("el-switch"),d=a("n8n-tooltip"),p=a("font-awesome-icon"),g=E("loading");return s(),v("div",D,[n("div",{class:$(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(s(),k(w,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(s(),k(w,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),r(d,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[n("div",null,c(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[N(r(h,{"model-value":o.workflowActive,title:o.workflowActive?o.$locale.baseText("workflowActivator.deactivateWorkflow"):o.$locale.baseText("workflowActivator.activateWorkflow"),disabled:o.disabled||o.updatingWorkflowActivation,"active-color":o.getActiveColor,"inactive-color":"#8899AA","data-test-id":"workflow-activate-switch","onUpdate:modelValue":o.activeChanged},null,8,["model-value","title","disabled","active-color","onUpdate:modelValue"]),[[g,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(s(),v("div",U,[r(d,{placement:"top"},{content:e(()=>[n("div",{onClick:t[0]||(t[0]=(...m)=>o.displayActivationError&&o.displayActivationError(...m)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,V)]),default:e(()=>[r(p,{icon:"exclamation-triangle",onClick:o.displayActivationError},null,8,["onClick"])]),_:1})])):C("",!0)])}const H={$style:B},F=W(I,[["render",x],["__cssModules",H],["__scopeId","data-v-13aaeab9"]]);export{F as W};
2
- //# sourceMappingURL=WorkflowActivator-Pbw1i_AI.js.map
1
+ import{e as A,v as T,u as b,d7 as y,_ as W}from"./n8n-uKoDE8Qf.js";import{w as f}from"./workflowActivate-rRmpx9AQ.js";import{m as S}from"./pinia-e-gLcRJ1.js";import{v as _,f as s,h as v,i as n,D as k,E as e,J as u,I as c,y as $,K as r,M as N,H as C,a6 as a,ae as E}from"./vendor-3VD3vVJy.js";const I=_({name:"WorkflowActivator",mixins:[f],props:["workflowActive","workflowId"],setup(o,t){var i,l;return{...A(),...(l=(i=f).setup)==null?void 0:l.call(i,o,t)}},computed:{...S(b,T),nodesIssuesExist(){return this.workflowsStore.nodesIssuesExist},isWorkflowActive(){return this.workflowsStore.activeWorkflows.includes(this.workflowId)},couldNotBeStarted(){return this.workflowActive===!0&&this.isWorkflowActive!==this.workflowActive},getActiveColor(){return this.couldNotBeStarted?"#ff4949":"#13ce66"},isCurrentWorkflow(){return this.workflowsStore.workflowId===this.workflowId},disabled(){return!this.workflowId||this.isCurrentWorkflow?!this.workflowActive&&!this.containsTrigger:!1},containsTrigger(){return y(this.workflowsStore.workflowTriggerNodes).length>0}},methods:{async activeChanged(o){return await this.updateWorkflowActivation(this.workflowId,o)},async displayActivationError(){let o;try{const t=await this.workflowsStore.getActivationError(this.workflowId);t===void 0?o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataUndefined"):o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined",{interpolate:{message:t}})}catch{o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.catchBlock")}this.showMessage({title:this.$locale.baseText("workflowActivator.showMessage.displayActivationError.title"),message:o,type:"warning",duration:0,dangerouslyUseHTMLString:!0})}}}),M="_activeStatusText_1dwsh_5",B={activeStatusText:M},D={class:"workflow-activator"},U={key:0,class:"could-not-be-started"},V=["innerHTML"];function x(o,t,i,l,z,L){const w=a("n8n-text"),h=a("el-switch"),d=a("n8n-tooltip"),p=a("font-awesome-icon"),g=E("loading");return s(),v("div",D,[n("div",{class:$(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(s(),k(w,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(s(),k(w,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),r(d,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[n("div",null,c(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[N(r(h,{"model-value":o.workflowActive,title:o.workflowActive?o.$locale.baseText("workflowActivator.deactivateWorkflow"):o.$locale.baseText("workflowActivator.activateWorkflow"),disabled:o.disabled||o.updatingWorkflowActivation,"active-color":o.getActiveColor,"inactive-color":"#8899AA","data-test-id":"workflow-activate-switch","onUpdate:modelValue":o.activeChanged},null,8,["model-value","title","disabled","active-color","onUpdate:modelValue"]),[[g,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(s(),v("div",U,[r(d,{placement:"top"},{content:e(()=>[n("div",{onClick:t[0]||(t[0]=(...m)=>o.displayActivationError&&o.displayActivationError(...m)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,V)]),default:e(()=>[r(p,{icon:"exclamation-triangle",onClick:o.displayActivationError},null,8,["onClick"])]),_:1})])):C("",!0)])}const H={$style:B},F=W(I,[["render",x],["__cssModules",H],["__scopeId","data-v-13aaeab9"]]);export{F as W};
2
+ //# sourceMappingURL=WorkflowActivator-ySuj7uJI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowActivator-Pbw1i_AI.js","sources":["../../src/components/WorkflowActivator.vue"],"sourcesContent":["<template>\n\t<div class=\"workflow-activator\">\n\t\t<div :class=\"$style.activeStatusText\" data-test-id=\"workflow-activator-status\">\n\t\t\t<n8n-text\n\t\t\t\tv-if=\"workflowActive\"\n\t\t\t\t:color=\"couldNotBeStarted ? 'danger' : 'success'\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tbold\n\t\t\t>\n\t\t\t\t{{ $locale.baseText('workflowActivator.active') }}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else color=\"text-base\" size=\"small\" bold>\n\t\t\t\t{{ $locale.baseText('workflowActivator.inactive') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<n8n-tooltip :disabled=\"!disabled\" placement=\"bottom\">\n\t\t\t<template #content>\n\t\t\t\t<div>\n\t\t\t\t\t{{ $locale.baseText('workflowActivator.thisWorkflowHasNoTriggerNodes') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<el-switch\n\t\t\t\tv-loading=\"updatingWorkflowActivation\"\n\t\t\t\t:model-value=\"workflowActive\"\n\t\t\t\t:title=\"\n\t\t\t\t\tworkflowActive\n\t\t\t\t\t\t? $locale.baseText('workflowActivator.deactivateWorkflow')\n\t\t\t\t\t\t: $locale.baseText('workflowActivator.activateWorkflow')\n\t\t\t\t\"\n\t\t\t\t:disabled=\"disabled || updatingWorkflowActivation\"\n\t\t\t\t:active-color=\"getActiveColor\"\n\t\t\t\tinactive-color=\"#8899AA\"\n\t\t\t\tdata-test-id=\"workflow-activate-switch\"\n\t\t\t\t@update:modelValue=\"activeChanged\"\n\t\t\t>\n\t\t\t</el-switch>\n\t\t</n8n-tooltip>\n\n\t\t<div v-if=\"couldNotBeStarted\" class=\"could-not-be-started\">\n\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t<template #content>\n\t\t\t\t\t<div\n\t\t\t\t\t\t@click=\"displayActivationError\"\n\t\t\t\t\t\tv-html=\"$locale.baseText('workflowActivator.theWorkflowIsSetToBeActiveBut')\"\n\t\t\t\t\t></div>\n\t\t\t\t</template>\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" @click=\"displayActivationError\" />\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { useToast } from '@/composables/useToast';\nimport { workflowActivate } from '@/mixins/workflowActivate';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\nimport { getActivatableTriggerNodes } from '@/utils/nodeTypesUtils';\n\nexport default defineComponent({\n\tname: 'WorkflowActivator',\n\tmixins: [workflowActivate],\n\tprops: ['workflowActive', 'workflowId'],\n\tsetup(props, ctx) {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore, useWorkflowsStore),\n\t\tnodesIssuesExist(): boolean {\n\t\t\treturn this.workflowsStore.nodesIssuesExist;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\tconst activeWorkflows = this.workflowsStore.activeWorkflows;\n\t\t\treturn activeWorkflows.includes(this.workflowId);\n\t\t},\n\t\tcouldNotBeStarted(): boolean {\n\t\t\treturn this.workflowActive === true && this.isWorkflowActive !== this.workflowActive;\n\t\t},\n\t\tgetActiveColor(): string {\n\t\t\tif (this.couldNotBeStarted) {\n\t\t\t\treturn '#ff4949';\n\t\t\t}\n\t\t\treturn '#13ce66';\n\t\t},\n\t\tisCurrentWorkflow(): boolean {\n\t\t\treturn this.workflowsStore.workflowId === this.workflowId;\n\t\t},\n\t\tdisabled(): boolean {\n\t\t\tconst isNewWorkflow = !this.workflowId;\n\t\t\tif (isNewWorkflow || this.isCurrentWorkflow) {\n\t\t\t\treturn !this.workflowActive && !this.containsTrigger;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\tconst foundTriggers = getActivatableTriggerNodes(this.workflowsStore.workflowTriggerNodes);\n\t\t\treturn foundTriggers.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync activeChanged(newActiveState: boolean) {\n\t\t\treturn await this.updateWorkflowActivation(this.workflowId, newActiveState);\n\t\t},\n\t\tasync displayActivationError() {\n\t\t\tlet errorMessage: string;\n\t\t\ttry {\n\t\t\t\tconst errorData = await this.workflowsStore.getActivationError(this.workflowId);\n\n\t\t\t\tif (errorData === undefined) {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataUndefined',\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined',\n\t\t\t\t\t\t{ interpolate: { message: errorData } },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.catchBlock',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('workflowActivator.showMessage.displayActivationError.title'),\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'warning',\n\t\t\t\tduration: 0,\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.activeStatusText {\n\twidth: 64px; // Required to avoid jumping when changing active state\n\tpadding-right: var(--spacing-2xs);\n\tbox-sizing: border-box;\n\tdisplay: inline-block;\n\ttext-align: right;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.workflow-activator {\n\tdisplay: inline-flex;\n\tflex-wrap: nowrap;\n\talign-items: center;\n}\n\n.could-not-be-started {\n\tdisplay: inline-block;\n\tcolor: var(--color-text-danger);\n\tmargin-left: 0.5em;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","workflowActivate","props","ctx","useToast","_b","_a","mapStores","useUIStore","useWorkflowsStore","getActivatableTriggerNodes","newActiveState","errorMessage","errorData","_hoisted_2","_directive_loading","_resolveDirective","_openBlock","_hoisted_1","_createElementVNode","_normalizeClass","_ctx","_createBlock","_component_n8n_text","_createVNode","_component_n8n_tooltip","_toDisplayString","_withCtx","_withDirectives","_component_el_switch","_createElementBlock","_cache","args","_hoisted_3","_component_font_awesome_icon"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowActivator-ySuj7uJI.js","sources":["../../src/components/WorkflowActivator.vue"],"sourcesContent":["<template>\n\t<div class=\"workflow-activator\">\n\t\t<div :class=\"$style.activeStatusText\" data-test-id=\"workflow-activator-status\">\n\t\t\t<n8n-text\n\t\t\t\tv-if=\"workflowActive\"\n\t\t\t\t:color=\"couldNotBeStarted ? 'danger' : 'success'\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tbold\n\t\t\t>\n\t\t\t\t{{ $locale.baseText('workflowActivator.active') }}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else color=\"text-base\" size=\"small\" bold>\n\t\t\t\t{{ $locale.baseText('workflowActivator.inactive') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<n8n-tooltip :disabled=\"!disabled\" placement=\"bottom\">\n\t\t\t<template #content>\n\t\t\t\t<div>\n\t\t\t\t\t{{ $locale.baseText('workflowActivator.thisWorkflowHasNoTriggerNodes') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<el-switch\n\t\t\t\tv-loading=\"updatingWorkflowActivation\"\n\t\t\t\t:model-value=\"workflowActive\"\n\t\t\t\t:title=\"\n\t\t\t\t\tworkflowActive\n\t\t\t\t\t\t? $locale.baseText('workflowActivator.deactivateWorkflow')\n\t\t\t\t\t\t: $locale.baseText('workflowActivator.activateWorkflow')\n\t\t\t\t\"\n\t\t\t\t:disabled=\"disabled || updatingWorkflowActivation\"\n\t\t\t\t:active-color=\"getActiveColor\"\n\t\t\t\tinactive-color=\"#8899AA\"\n\t\t\t\tdata-test-id=\"workflow-activate-switch\"\n\t\t\t\t@update:modelValue=\"activeChanged\"\n\t\t\t>\n\t\t\t</el-switch>\n\t\t</n8n-tooltip>\n\n\t\t<div v-if=\"couldNotBeStarted\" class=\"could-not-be-started\">\n\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t<template #content>\n\t\t\t\t\t<div\n\t\t\t\t\t\t@click=\"displayActivationError\"\n\t\t\t\t\t\tv-html=\"$locale.baseText('workflowActivator.theWorkflowIsSetToBeActiveBut')\"\n\t\t\t\t\t></div>\n\t\t\t\t</template>\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" @click=\"displayActivationError\" />\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { useToast } from '@/composables/useToast';\nimport { workflowActivate } from '@/mixins/workflowActivate';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\nimport { getActivatableTriggerNodes } from '@/utils/nodeTypesUtils';\n\nexport default defineComponent({\n\tname: 'WorkflowActivator',\n\tmixins: [workflowActivate],\n\tprops: ['workflowActive', 'workflowId'],\n\tsetup(props, ctx) {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore, useWorkflowsStore),\n\t\tnodesIssuesExist(): boolean {\n\t\t\treturn this.workflowsStore.nodesIssuesExist;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\tconst activeWorkflows = this.workflowsStore.activeWorkflows;\n\t\t\treturn activeWorkflows.includes(this.workflowId);\n\t\t},\n\t\tcouldNotBeStarted(): boolean {\n\t\t\treturn this.workflowActive === true && this.isWorkflowActive !== this.workflowActive;\n\t\t},\n\t\tgetActiveColor(): string {\n\t\t\tif (this.couldNotBeStarted) {\n\t\t\t\treturn '#ff4949';\n\t\t\t}\n\t\t\treturn '#13ce66';\n\t\t},\n\t\tisCurrentWorkflow(): boolean {\n\t\t\treturn this.workflowsStore.workflowId === this.workflowId;\n\t\t},\n\t\tdisabled(): boolean {\n\t\t\tconst isNewWorkflow = !this.workflowId;\n\t\t\tif (isNewWorkflow || this.isCurrentWorkflow) {\n\t\t\t\treturn !this.workflowActive && !this.containsTrigger;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\tconst foundTriggers = getActivatableTriggerNodes(this.workflowsStore.workflowTriggerNodes);\n\t\t\treturn foundTriggers.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync activeChanged(newActiveState: boolean) {\n\t\t\treturn await this.updateWorkflowActivation(this.workflowId, newActiveState);\n\t\t},\n\t\tasync displayActivationError() {\n\t\t\tlet errorMessage: string;\n\t\t\ttry {\n\t\t\t\tconst errorData = await this.workflowsStore.getActivationError(this.workflowId);\n\n\t\t\t\tif (errorData === undefined) {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataUndefined',\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined',\n\t\t\t\t\t\t{ interpolate: { message: errorData } },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.catchBlock',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('workflowActivator.showMessage.displayActivationError.title'),\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'warning',\n\t\t\t\tduration: 0,\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.activeStatusText {\n\twidth: 64px; // Required to avoid jumping when changing active state\n\tpadding-right: var(--spacing-2xs);\n\tbox-sizing: border-box;\n\tdisplay: inline-block;\n\ttext-align: right;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.workflow-activator {\n\tdisplay: inline-flex;\n\tflex-wrap: nowrap;\n\talign-items: center;\n}\n\n.could-not-be-started {\n\tdisplay: inline-block;\n\tcolor: var(--color-text-danger);\n\tmargin-left: 0.5em;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","workflowActivate","props","ctx","useToast","_b","_a","mapStores","useUIStore","useWorkflowsStore","getActivatableTriggerNodes","newActiveState","errorMessage","errorData","_hoisted_2","_directive_loading","_resolveDirective","_openBlock","_hoisted_1","_createElementVNode","_normalizeClass","_ctx","_createBlock","_component_n8n_text","_createVNode","_component_n8n_tooltip","_toDisplayString","_withCtx","_withDirectives","_component_el_switch","_createElementBlock","_cache","args","_hoisted_3","_component_font_awesome_icon"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{v as B,r as $,e as T,b as ae,f as H,h as R,x as J,i as m,I as k,K as V,E as C,J as N,D as P,u as x,H as E,y as p,V as re,a6 as S,F as ie,_ as le,aw as ce,ar as we,q as de,w as ue,a5 as me}from"./vendor-3VD3vVJy.js";import{dy as fe,x as K,_ as D,ap as Q,m as G,l as pe,v as X,fQ as ve,e as ke,u as ye,V as U,fW as _e,dM as he}from"./n8n-uKoDE8Qf.js";import{aw as be}from"./index-lUr8MiJ2.js";import{d as ge}from"./pinia-e-gLcRJ1.js";import{F as We}from"./file-saver-1UKPYnQ-.js";import"./lodash-es-JdX4GWLn.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-lH03nmRE.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-MkmfYvll.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-feLn5IS9.js";import"./@lezer/common-1hBQ1gIF.js";import"./codemirror-lang-html-n8n-wWQLhhqk.js";import"./prettier-s3fE3Qyr.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-AlqFM-P6.js";import"./codemirror-lang-n8n-expression-HpIZnV_9.js";import"./fast-json-stable-stringify-LPGjnXm6.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-B6sLPrrf.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const Ie=["datetime"],$e=["value"],He=B({__name:"WorkflowHistoryListItem",props:{item:{},index:{},actions:{},isActive:{type:Boolean}},emits:["action","preview","mounted"],setup(b,{emit:y}){const o=b,e=y,f=K(),r=$(!1),v=$(null),c=$(null),i=$(!1),_=T(()=>{const t=new Date().getFullYear().toString(),[n,l]=fe(o.item.createdAt,`${o.item.createdAt.startsWith(t)?"":"yyyy "}mmm d"#"HH:MM:ss`).split("#");return f.baseText("workflowHistory.item.createdAt",{interpolate:{date:n,time:l}})}),g=T(()=>{const t=o.item.authors.split(", ");let n=t[0];return t.length>1&&(n=`${n} + ${t.length-1}`),{size:t.length,label:n}}),A=T(()=>f.baseText("workflowHistory.item.id",{interpolate:{id:o.item.versionId}})),w=t=>{e("action",{action:t,id:o.item.versionId,data:{formattedCreatedAt:_.value}})},a=t=>{r.value=t},d=t=>{e("preview",{event:t,id:o.item.versionId})};return ae(()=>{var t,n,l;e("mounted",{index:o.index,offsetTop:((t=v.value)==null?void 0:t.offsetTop)??0,isActive:o.isActive}),i.value=((n=c.value)==null?void 0:n.scrollWidth)>((l=c.value)==null?void 0:l.clientWidth)}),(t,n)=>{const l=S("n8n-tooltip"),W=S("n8n-badge"),I=S("n8n-action-toggle");return H(),R("li",{ref_key:"itemElement",ref:v,"data-test-id":"workflow-history-list-item",class:p({[t.$style.item]:!0,[t.$style.active]:o.isActive,[t.$style.actionsVisible]:r.value})},[J(t.$slots,"default",{formattedCreatedAt:_.value},()=>[m("p",{onClick:d},[m("time",{datetime:t.item.createdAt},k(_.value),9,Ie),V(l,{placement:"right-end",disabled:g.value.size<2&&!i.value},{content:C(()=>[N(k(o.item.authors),1)]),default:C(()=>[m("span",{ref_key:"authorElement",ref:c},k(g.value.label),513)]),_:1},8,["disabled"]),m("data",{value:t.item.versionId},k(A.value),9,$e)])]),m("div",{class:p(t.$style.tail)},[o.index===0?(H(),P(W,{key:0},{default:C(()=>[N(k(x(f).baseText("workflowHistory.item.latest")),1)]),_:1})):E("",!0),V(I,{theme:"dark",class:p(t.$style.actions),actions:o.actions,placement:"bottom-end",onAction:w,onClick:n[0]||(n[0]=re(()=>{},["stop"])),onVisibleChange:a},{default:C(()=>[J(t.$slots,"action-toggle-button")]),_:3},8,["class","actions"])],2)],2)}}}),Te="_item_1bawd_5",xe="_tail_1bawd_37",Ve="_active_1bawd_42",Ce="_actionsVisible_1bawd_49",Ae="_actions_1bawd_49",Oe={item:Te,tail:xe,active:Ve,actionsVisible:Ce,actions:Ae},Se={$style:Oe},Z=D(He,[["__cssModules",Se]]),Le=m("br",null,null,-1),Re=["aria-label"],Ee=B({__name:"WorkflowHistoryList",props:{items:{},activeItem:{},actions:{},requestNumberOfItems:{},lastReceivedItemsLength:{},evaluatedPruneTime:{},shouldUpgrade:{type:Boolean},isListLoading:{type:Boolean}},emits:["action","preview","loadMore","upgrade"],setup(b,{emit:y}){const o=b,e=y,f=K(),r=$(null),v=$(!0),c=$(null),i=a=>a===0?o.actions.filter(d=>d.value!=="restore"):o.actions,_=a=>{c.value=new IntersectionObserver(([d])=>{var t,n;d.isIntersecting&&((t=c.value)==null||t.unobserve(a),(n=c.value)==null||n.disconnect(),c.value=null,e("loadMore",{take:o.requestNumberOfItems,skip:o.items.length}))},{root:r.value,threshold:.01}),c.value.observe(a)},g=({action:a,id:d,data:t})=>{v.value=!1,e("action",{action:a,id:d,data:t})},A=({event:a,id:d})=>{v.value=!1,e("preview",{event:a,id:d})},w=({index:a,offsetTop:d,isActive:t})=>{var n,l;t&&v.value&&(v.value=!1,(n=r.value)==null||n.scrollTo({top:d,behavior:"smooth"})),a===o.items.length-1&&o.lastReceivedItemsLength===o.requestNumberOfItems&&_((l=r.value)==null?void 0:l.children[a])};return(a,d)=>{const t=S("n8n-loading"),n=S("i18n-t");return H(),R("ul",{ref_key:"listElement",ref:r,class:p(a.$style.list),"data-test-id":"workflow-history-list"},[(H(!0),R(ie,null,le(o.items,(l,W)=>{var I;return H(),P(Z,{key:l.versionId,index:W,item:l,"is-active":l.versionId===((I=o.activeItem)==null?void 0:I.versionId),actions:i(W),onAction:g,onPreview:A,onMounted:w},null,8,["index","item","is-active","actions"])}),128)),!o.items.length&&!o.isListLoading?(H(),R("li",{key:0,class:p(a.$style.empty)},[N(k(x(f).baseText("workflowHistory.empty"))+" ",1),Le,N(" "+k(x(f).baseText("workflowHistory.hint")),1)],2)):E("",!0),o.isListLoading?(H(),R("li",{key:1,class:p(a.$style.loader),role:"status","aria-live":"polite","aria-busy":"true","aria-label":x(f).baseText("generic.loading")},[V(t,{rows:3,class:"mb-xs"}),V(t,{rows:3,class:"mb-xs"}),V(t,{rows:3,class:"mb-xs"})],10,Re)):E("",!0),o.shouldUpgrade?(H(),R("li",{key:2,class:p(a.$style.retention)},[m("span",null,k(x(f).baseText("workflowHistory.limit",{interpolate:{evaluatedPruneTime:o.evaluatedPruneTime}})),1),V(n,{keypath:"workflowHistory.upgrade",tag:"span"},{link:C(()=>[m("a",{href:"#",onClick:d[0]||(d[0]=l=>e("upgrade"))},k(x(f).baseText("workflowHistory.upgrade.link")),1)]),_:1})],2)):E("",!0)],2)}}}),Me="_list_1h1nd_5",Ne="_empty_1h1nd_14",Pe="_loader_1h1nd_27",Ue="_retention_1h1nd_31",Fe={list:Me,empty:Ne,loader:Pe,retention:Ue},Be={$style:Fe},Ke=D(Ee,[["__cssModules",Be]]),De=["datetime"],qe=["value"],ze=B({__name:"WorkflowHistoryContent",props:{workflow:{},workflowVersion:{},actions:{},isListLoading:{type:Boolean},isFirstItemShown:{type:Boolean}},emits:["action"],setup(b,{emit:y}){const o=K(),e=b,f=y,r=T(()=>{if(!e.workflowVersion||!e.workflow)return;const{pinData:i,..._}=e.workflow;return{..._,nodes:e.workflowVersion.nodes,connections:e.workflowVersion.connections}}),v=T(()=>e.isFirstItemShown?e.actions.filter(i=>i.value!=="restore"):e.actions),c=({action:i,id:_,data:g})=>{f("action",{action:i,id:_,data:g})};return(i,_)=>{const g=S("n8n-icon"),A=S("n8n-button");return H(),R("div",{class:p(i.$style.content)},[e.workflowVersion?(H(),P(be,{key:0,workflow:r.value,loading:e.isListLoading,"loader-type":"spinner"},null,8,["workflow","loading"])):E("",!0),m("ul",{class:p(i.$style.info)},[e.workflowVersion?(H(),P(Z,{key:0,class:p(i.$style.card),index:-1,item:e.workflowVersion,"is-active":!1,actions:v.value,onAction:c},{default:C(({formattedCreatedAt:w})=>[m("section",{class:p(i.$style.text)},[m("p",null,[m("span",{class:p(i.$style.label)},k(x(o).baseText("workflowHistory.content.title"))+": ",3),m("time",{datetime:e.workflowVersion.createdAt},k(w),9,De)]),m("p",null,[m("span",{class:p(i.$style.label)},k(x(o).baseText("workflowHistory.content.editedBy"))+": ",3),m("span",null,k(e.workflowVersion.authors),1)]),m("p",null,[m("span",{class:p(i.$style.label)},k(x(o).baseText("workflowHistory.content.versionId"))+": ",3),m("data",{value:e.workflowVersion.versionId},k(e.workflowVersion.versionId),9,qe)])],2)]),"action-toggle-button":C(()=>[V(A,{type:"tertiary",size:"large","data-test-id":"action-toggle-button"},{default:C(()=>[N(k(x(o).baseText("workflowHistory.content.actions"))+" ",1),V(g,{class:"ml-3xs",icon:"chevron-down",size:"small"})]),_:1})]),_:1},8,["class","item","actions"])):E("",!0)],2)],2)}}}),Ye="_content_1xe4n_5",je="_info_1xe4n_15",Je="_card_1xe4n_23",Qe="_text_1xe4n_28",Ge="_label_1xe4n_53",Xe={content:Ye,info:je,card:Je,text:Qe,label:Ge},Ze={$style:Xe},et=D(ze,[["__cssModules",Ze]]),tt=async(b,y,o)=>{const{data:e}=await Q(b.baseUrl,`/workflow-history/workflow/${y}`,o);return e},ot=async(b,y,o)=>{const{data:e}=await Q(b.baseUrl,`/workflow-history/workflow/${y}/version/${o}`);return e},st=ge("workflowHistory",()=>{const b=G(),y=pe(),o=X(),e=T(()=>y.settings.workflowHistory.licensePruneTime),f=T(()=>y.settings.workflowHistory.pruneTime),r=T(()=>Math.min(f.value,e.value)),v=T(()=>e.value!==-1&&e.value===f.value),c=async(w,a)=>await tt(b.getRestApiContext,w,a),i=async(w,a)=>await ot(b.getRestApiContext,w,a);return{getWorkflowHistory:c,getWorkflowVersion:i,downloadVersion:async(w,a,d)=>{const[t,n]=await Promise.all([o.fetchWorkflow(w),i(w,a)]),{connections:l,nodes:W}=n,I=new Blob([JSON.stringify({...t,nodes:W,connections:l},null,2)],{type:"application/json;charset=utf-8"});We.saveAs(I,`${t.name}(${d.formattedCreatedAt}).json`)},cloneIntoNewWorkflow:async(w,a,d)=>{const[t,n]=await Promise.all([o.fetchWorkflow(w),i(w,a)]),{connections:l,nodes:W}=n,{name:I}=t,q=await ve(b.getRestApiContext,`${I} (${d.formattedCreatedAt})`),L={nodes:W,connections:l,name:q.name};return await o.createNewWorkflow(L)},restoreWorkflow:async(w,a,d)=>{const t=await i(w,a),{connections:n,nodes:l}=t,W={connections:n,nodes:l};return d&&(W.active=!1),await o.updateWorkflow(w,W,!0).catch(async I=>{if(I.httpStatusCode===400&&I.message.includes("can not be activated"))return await o.fetchWorkflow(w);throw new Error(I)})},evaluatedPruneTime:r,shouldUpgrade:v}}),nt=B({__name:"WorkflowHistory",setup(b){const y=["restore","clone","open","download"],o=y.reduce((s,u)=>({...s,[u.toUpperCase()]:u}),{}),e=ce(),f=we(),r=K(),v=ke(),c=st(),i=ye(),_=X(),g=$(!0),A=$(!0),w=$(20),a=$(0),d=T(()=>({name:U.WORKFLOW,params:{name:e.params.workflowId}})),t=$(null),n=$([]),l=$(null),W=T(()=>y.map(s=>({label:r.baseText(`workflowHistory.item.actions.${s}`),disabled:!1,value:s}))),I=T(()=>{var s;return((s=n.value[0])==null?void 0:s.versionId)===e.params.versionId}),q=T(()=>Math.floor(c.evaluatedPruneTime/24)),L=s=>{_e.track(s,{instance_id:G().instanceId,workflow_id:e.params.workflowId})},z=async s=>{const u=await c.getWorkflowHistory(e.params.workflowId,s);a.value=u.length,n.value=n.value.concat(u)};de(async()=>{L("User opened workflow history");try{const[s]=await Promise.all([_.fetchWorkflow(e.params.workflowId),z({take:w.value})]);t.value=s,A.value=!1,!e.params.versionId&&n.value.length&&await f.replace({name:U.WORKFLOW_HISTORY,params:{workflowId:e.params.workflowId,versionId:n.value[0].versionId}})}catch(s){g.value=!1,v.showError(s,r.baseText("workflowHistory.title"))}});const Y=s=>{const{href:u}=f.resolve({name:U.WORKFLOW_HISTORY,params:{workflowId:e.params.workflowId,versionId:s}});window.open(u,"_blank")},ee=async(s,u)=>await new Promise((h,O)=>{const M=[{text:r.baseText("workflowHistory.action.restore.modal.button.cancel"),type:"tertiary",action:()=>{h("cancel")}}];s&&M.push({text:r.baseText("workflowHistory.action.restore.modal.button.deactivateAndRestore"),type:"tertiary",action:()=>{h("deactivateAndRestore")}}),M.push({text:r.baseText("workflowHistory.action.restore.modal.button.restore"),type:"primary",action:()=>{h("restore")}});try{i.openModalWithData({name:he,data:{beforeClose:()=>{h("cancel")},isWorkflowActivated:s,formattedCreatedAt:u,buttons:M}})}catch(F){O(F)}}),te=async(s,u)=>{const h=await c.cloneIntoNewWorkflow(e.params.workflowId,s,u),{href:O}=f.resolve({name:U.WORKFLOW,params:{name:h.id}});v.showMessage({title:r.baseText("workflowHistory.action.clone.success.title"),message:me("a",{href:O,target:"_blank"},r.baseText("workflowHistory.action.clone.success.message")),type:"success",duration:1e4})},oe=async(s,u)=>{const h=await _.fetchWorkflow(e.params.workflowId),O=await ee(h.active,u.formattedCreatedAt);if(O==="cancel")return;t.value=await c.restoreWorkflow(e.params.workflowId,s,O==="deactivateAndRestore");const M=await c.getWorkflowHistory(e.params.workflowId,{take:1});n.value=M.concat(n.value),v.showMessage({title:r.baseText("workflowHistory.action.restore.success.title"),type:"success"})},j=async({action:s,id:u,data:h})=>{try{switch(s){case o.OPEN:Y(u),L("User opened version in new tab");break;case o.DOWNLOAD:await c.downloadVersion(e.params.workflowId,u,h),L("User downloaded version");break;case o.CLONE:await te(u,h),L("User cloned version");break;case o.RESTORE:await oe(u,h),L("User restored version");break}}catch(O){v.showError(O,r.baseText("workflowHistory.action.error.title",{interpolate:{action:r.baseText(`workflowHistory.item.actions.${s}`).toLowerCase()}}))}},se=async({event:s,id:u})=>{s.metaKey||s.ctrlKey?(Y(u),L("User opened version in new tab")):await f.push({name:U.WORKFLOW_HISTORY,params:{workflowId:e.params.workflowId,versionId:u}})},ne=()=>{i.goToUpgrade("workflow-history","upgrade-workflow-history")};return ue(async()=>{if(e.params.versionId){try{l.value=await c.getWorkflowVersion(e.params.workflowId,e.params.versionId),L("User selected version")}catch(s){v.showError(new Error(`${s.message} "${e.params.versionId}"&nbsp;`),r.baseText("workflowHistory.title"))}try{t.value=await _.fetchWorkflow(e.params.workflowId)}catch(s){g.value=!1,v.showError(s,r.baseText("workflowHistory.title"))}}}),(s,u)=>{const h=S("n8n-heading"),O=S("n8n-button"),M=S("router-link");return H(),R("div",{class:p(s.$style.view)},[V(h,{class:p(s.$style.header),tag:"h2",size:"medium"},{default:C(()=>{var F;return[N(k((F=t.value)==null?void 0:F.name),1)]}),_:1},8,["class"]),m("div",{class:p(s.$style.corner)},[V(h,{tag:"h2",size:"medium",bold:""},{default:C(()=>[N(k(x(r).baseText("workflowHistory.title")),1)]),_:1}),V(M,{to:d.value,"data-test-id":"workflow-history-close-button"},{default:C(()=>[V(O,{type:"tertiary",icon:"times",size:"small",text:"",square:""})]),_:1},8,["to"])],2),m("div",{class:p(s.$style.listComponentWrapper)},[g.value?(H(),P(Ke,{key:0,items:n.value,"last-received-items-length":a.value,"active-item":l.value,actions:W.value,"request-number-of-items":w.value,"should-upgrade":x(c).shouldUpgrade,"evaluated-prune-time":q.value,"is-list-loading":A.value,onAction:j,onPreview:se,onLoadMore:z,onUpgrade:ne},null,8,["items","last-received-items-length","active-item","actions","request-number-of-items","should-upgrade","evaluated-prune-time","is-list-loading"])):E("",!0)],2),m("div",{class:p(s.$style.contentComponentWrapper)},[g.value?(H(),P(et,{key:0,workflow:t.value,"workflow-version":l.value,actions:W.value,"is-list-loading":A.value,"is-first-item-shown":I.value,onAction:j},null,8,["workflow","workflow-version","actions","is-list-loading","is-first-item-shown"])):E("",!0)],2)],2)}}}),at="_view_1ax7n_5",rt="_header_1ax7n_15",it="_corner_1ax7n_23",lt="_contentComponentWrapper_1ax7n_34",ct="_listComponentWrapper_1ax7n_39",wt={view:at,header:rt,corner:it,contentComponentWrapper:lt,listComponentWrapper:ct},dt={$style:wt},Ft=D(nt,[["__cssModules",dt]]);export{Ft as default};
2
- //# sourceMappingURL=WorkflowHistory-_c2_b4mu.js.map
1
+ import{v as B,r as $,e as T,b as ae,f as H,h as R,x as J,i as m,I as k,K as V,E as C,J as N,D as P,u as x,H as E,y as p,V as re,a6 as S,F as ie,_ as le,aw as ce,ar as we,q as de,w as ue,a5 as me}from"./vendor-3VD3vVJy.js";import{dy as fe,x as K,_ as D,ap as Q,m as G,l as pe,v as X,fQ as ve,e as ke,u as ye,V as U,fW as _e,dM as he}from"./n8n-uKoDE8Qf.js";import{aw as be}from"./index-9xnnd4cn.js";import{d as ge}from"./pinia-e-gLcRJ1.js";import{F as We}from"./file-saver-1UKPYnQ-.js";import"./lodash-es-JdX4GWLn.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-lH03nmRE.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-MkmfYvll.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-feLn5IS9.js";import"./@lezer/common-1hBQ1gIF.js";import"./codemirror-lang-html-n8n-wWQLhhqk.js";import"./prettier-s3fE3Qyr.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-AlqFM-P6.js";import"./codemirror-lang-n8n-expression-HpIZnV_9.js";import"./fast-json-stable-stringify-LPGjnXm6.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-B6sLPrrf.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const Ie=["datetime"],$e=["value"],He=B({__name:"WorkflowHistoryListItem",props:{item:{},index:{},actions:{},isActive:{type:Boolean}},emits:["action","preview","mounted"],setup(b,{emit:y}){const o=b,e=y,f=K(),r=$(!1),v=$(null),c=$(null),i=$(!1),_=T(()=>{const t=new Date().getFullYear().toString(),[n,l]=fe(o.item.createdAt,`${o.item.createdAt.startsWith(t)?"":"yyyy "}mmm d"#"HH:MM:ss`).split("#");return f.baseText("workflowHistory.item.createdAt",{interpolate:{date:n,time:l}})}),g=T(()=>{const t=o.item.authors.split(", ");let n=t[0];return t.length>1&&(n=`${n} + ${t.length-1}`),{size:t.length,label:n}}),A=T(()=>f.baseText("workflowHistory.item.id",{interpolate:{id:o.item.versionId}})),w=t=>{e("action",{action:t,id:o.item.versionId,data:{formattedCreatedAt:_.value}})},a=t=>{r.value=t},d=t=>{e("preview",{event:t,id:o.item.versionId})};return ae(()=>{var t,n,l;e("mounted",{index:o.index,offsetTop:((t=v.value)==null?void 0:t.offsetTop)??0,isActive:o.isActive}),i.value=((n=c.value)==null?void 0:n.scrollWidth)>((l=c.value)==null?void 0:l.clientWidth)}),(t,n)=>{const l=S("n8n-tooltip"),W=S("n8n-badge"),I=S("n8n-action-toggle");return H(),R("li",{ref_key:"itemElement",ref:v,"data-test-id":"workflow-history-list-item",class:p({[t.$style.item]:!0,[t.$style.active]:o.isActive,[t.$style.actionsVisible]:r.value})},[J(t.$slots,"default",{formattedCreatedAt:_.value},()=>[m("p",{onClick:d},[m("time",{datetime:t.item.createdAt},k(_.value),9,Ie),V(l,{placement:"right-end",disabled:g.value.size<2&&!i.value},{content:C(()=>[N(k(o.item.authors),1)]),default:C(()=>[m("span",{ref_key:"authorElement",ref:c},k(g.value.label),513)]),_:1},8,["disabled"]),m("data",{value:t.item.versionId},k(A.value),9,$e)])]),m("div",{class:p(t.$style.tail)},[o.index===0?(H(),P(W,{key:0},{default:C(()=>[N(k(x(f).baseText("workflowHistory.item.latest")),1)]),_:1})):E("",!0),V(I,{theme:"dark",class:p(t.$style.actions),actions:o.actions,placement:"bottom-end",onAction:w,onClick:n[0]||(n[0]=re(()=>{},["stop"])),onVisibleChange:a},{default:C(()=>[J(t.$slots,"action-toggle-button")]),_:3},8,["class","actions"])],2)],2)}}}),Te="_item_1bawd_5",xe="_tail_1bawd_37",Ve="_active_1bawd_42",Ce="_actionsVisible_1bawd_49",Ae="_actions_1bawd_49",Oe={item:Te,tail:xe,active:Ve,actionsVisible:Ce,actions:Ae},Se={$style:Oe},Z=D(He,[["__cssModules",Se]]),Le=m("br",null,null,-1),Re=["aria-label"],Ee=B({__name:"WorkflowHistoryList",props:{items:{},activeItem:{},actions:{},requestNumberOfItems:{},lastReceivedItemsLength:{},evaluatedPruneTime:{},shouldUpgrade:{type:Boolean},isListLoading:{type:Boolean}},emits:["action","preview","loadMore","upgrade"],setup(b,{emit:y}){const o=b,e=y,f=K(),r=$(null),v=$(!0),c=$(null),i=a=>a===0?o.actions.filter(d=>d.value!=="restore"):o.actions,_=a=>{c.value=new IntersectionObserver(([d])=>{var t,n;d.isIntersecting&&((t=c.value)==null||t.unobserve(a),(n=c.value)==null||n.disconnect(),c.value=null,e("loadMore",{take:o.requestNumberOfItems,skip:o.items.length}))},{root:r.value,threshold:.01}),c.value.observe(a)},g=({action:a,id:d,data:t})=>{v.value=!1,e("action",{action:a,id:d,data:t})},A=({event:a,id:d})=>{v.value=!1,e("preview",{event:a,id:d})},w=({index:a,offsetTop:d,isActive:t})=>{var n,l;t&&v.value&&(v.value=!1,(n=r.value)==null||n.scrollTo({top:d,behavior:"smooth"})),a===o.items.length-1&&o.lastReceivedItemsLength===o.requestNumberOfItems&&_((l=r.value)==null?void 0:l.children[a])};return(a,d)=>{const t=S("n8n-loading"),n=S("i18n-t");return H(),R("ul",{ref_key:"listElement",ref:r,class:p(a.$style.list),"data-test-id":"workflow-history-list"},[(H(!0),R(ie,null,le(o.items,(l,W)=>{var I;return H(),P(Z,{key:l.versionId,index:W,item:l,"is-active":l.versionId===((I=o.activeItem)==null?void 0:I.versionId),actions:i(W),onAction:g,onPreview:A,onMounted:w},null,8,["index","item","is-active","actions"])}),128)),!o.items.length&&!o.isListLoading?(H(),R("li",{key:0,class:p(a.$style.empty)},[N(k(x(f).baseText("workflowHistory.empty"))+" ",1),Le,N(" "+k(x(f).baseText("workflowHistory.hint")),1)],2)):E("",!0),o.isListLoading?(H(),R("li",{key:1,class:p(a.$style.loader),role:"status","aria-live":"polite","aria-busy":"true","aria-label":x(f).baseText("generic.loading")},[V(t,{rows:3,class:"mb-xs"}),V(t,{rows:3,class:"mb-xs"}),V(t,{rows:3,class:"mb-xs"})],10,Re)):E("",!0),o.shouldUpgrade?(H(),R("li",{key:2,class:p(a.$style.retention)},[m("span",null,k(x(f).baseText("workflowHistory.limit",{interpolate:{evaluatedPruneTime:o.evaluatedPruneTime}})),1),V(n,{keypath:"workflowHistory.upgrade",tag:"span"},{link:C(()=>[m("a",{href:"#",onClick:d[0]||(d[0]=l=>e("upgrade"))},k(x(f).baseText("workflowHistory.upgrade.link")),1)]),_:1})],2)):E("",!0)],2)}}}),Me="_list_1h1nd_5",Ne="_empty_1h1nd_14",Pe="_loader_1h1nd_27",Ue="_retention_1h1nd_31",Fe={list:Me,empty:Ne,loader:Pe,retention:Ue},Be={$style:Fe},Ke=D(Ee,[["__cssModules",Be]]),De=["datetime"],qe=["value"],ze=B({__name:"WorkflowHistoryContent",props:{workflow:{},workflowVersion:{},actions:{},isListLoading:{type:Boolean},isFirstItemShown:{type:Boolean}},emits:["action"],setup(b,{emit:y}){const o=K(),e=b,f=y,r=T(()=>{if(!e.workflowVersion||!e.workflow)return;const{pinData:i,..._}=e.workflow;return{..._,nodes:e.workflowVersion.nodes,connections:e.workflowVersion.connections}}),v=T(()=>e.isFirstItemShown?e.actions.filter(i=>i.value!=="restore"):e.actions),c=({action:i,id:_,data:g})=>{f("action",{action:i,id:_,data:g})};return(i,_)=>{const g=S("n8n-icon"),A=S("n8n-button");return H(),R("div",{class:p(i.$style.content)},[e.workflowVersion?(H(),P(be,{key:0,workflow:r.value,loading:e.isListLoading,"loader-type":"spinner"},null,8,["workflow","loading"])):E("",!0),m("ul",{class:p(i.$style.info)},[e.workflowVersion?(H(),P(Z,{key:0,class:p(i.$style.card),index:-1,item:e.workflowVersion,"is-active":!1,actions:v.value,onAction:c},{default:C(({formattedCreatedAt:w})=>[m("section",{class:p(i.$style.text)},[m("p",null,[m("span",{class:p(i.$style.label)},k(x(o).baseText("workflowHistory.content.title"))+": ",3),m("time",{datetime:e.workflowVersion.createdAt},k(w),9,De)]),m("p",null,[m("span",{class:p(i.$style.label)},k(x(o).baseText("workflowHistory.content.editedBy"))+": ",3),m("span",null,k(e.workflowVersion.authors),1)]),m("p",null,[m("span",{class:p(i.$style.label)},k(x(o).baseText("workflowHistory.content.versionId"))+": ",3),m("data",{value:e.workflowVersion.versionId},k(e.workflowVersion.versionId),9,qe)])],2)]),"action-toggle-button":C(()=>[V(A,{type:"tertiary",size:"large","data-test-id":"action-toggle-button"},{default:C(()=>[N(k(x(o).baseText("workflowHistory.content.actions"))+" ",1),V(g,{class:"ml-3xs",icon:"chevron-down",size:"small"})]),_:1})]),_:1},8,["class","item","actions"])):E("",!0)],2)],2)}}}),Ye="_content_1xe4n_5",je="_info_1xe4n_15",Je="_card_1xe4n_23",Qe="_text_1xe4n_28",Ge="_label_1xe4n_53",Xe={content:Ye,info:je,card:Je,text:Qe,label:Ge},Ze={$style:Xe},et=D(ze,[["__cssModules",Ze]]),tt=async(b,y,o)=>{const{data:e}=await Q(b.baseUrl,`/workflow-history/workflow/${y}`,o);return e},ot=async(b,y,o)=>{const{data:e}=await Q(b.baseUrl,`/workflow-history/workflow/${y}/version/${o}`);return e},st=ge("workflowHistory",()=>{const b=G(),y=pe(),o=X(),e=T(()=>y.settings.workflowHistory.licensePruneTime),f=T(()=>y.settings.workflowHistory.pruneTime),r=T(()=>Math.min(f.value,e.value)),v=T(()=>e.value!==-1&&e.value===f.value),c=async(w,a)=>await tt(b.getRestApiContext,w,a),i=async(w,a)=>await ot(b.getRestApiContext,w,a);return{getWorkflowHistory:c,getWorkflowVersion:i,downloadVersion:async(w,a,d)=>{const[t,n]=await Promise.all([o.fetchWorkflow(w),i(w,a)]),{connections:l,nodes:W}=n,I=new Blob([JSON.stringify({...t,nodes:W,connections:l},null,2)],{type:"application/json;charset=utf-8"});We.saveAs(I,`${t.name}(${d.formattedCreatedAt}).json`)},cloneIntoNewWorkflow:async(w,a,d)=>{const[t,n]=await Promise.all([o.fetchWorkflow(w),i(w,a)]),{connections:l,nodes:W}=n,{name:I}=t,q=await ve(b.getRestApiContext,`${I} (${d.formattedCreatedAt})`),L={nodes:W,connections:l,name:q.name};return await o.createNewWorkflow(L)},restoreWorkflow:async(w,a,d)=>{const t=await i(w,a),{connections:n,nodes:l}=t,W={connections:n,nodes:l};return d&&(W.active=!1),await o.updateWorkflow(w,W,!0).catch(async I=>{if(I.httpStatusCode===400&&I.message.includes("can not be activated"))return await o.fetchWorkflow(w);throw new Error(I)})},evaluatedPruneTime:r,shouldUpgrade:v}}),nt=B({__name:"WorkflowHistory",setup(b){const y=["restore","clone","open","download"],o=y.reduce((s,u)=>({...s,[u.toUpperCase()]:u}),{}),e=ce(),f=we(),r=K(),v=ke(),c=st(),i=ye(),_=X(),g=$(!0),A=$(!0),w=$(20),a=$(0),d=T(()=>({name:U.WORKFLOW,params:{name:e.params.workflowId}})),t=$(null),n=$([]),l=$(null),W=T(()=>y.map(s=>({label:r.baseText(`workflowHistory.item.actions.${s}`),disabled:!1,value:s}))),I=T(()=>{var s;return((s=n.value[0])==null?void 0:s.versionId)===e.params.versionId}),q=T(()=>Math.floor(c.evaluatedPruneTime/24)),L=s=>{_e.track(s,{instance_id:G().instanceId,workflow_id:e.params.workflowId})},z=async s=>{const u=await c.getWorkflowHistory(e.params.workflowId,s);a.value=u.length,n.value=n.value.concat(u)};de(async()=>{L("User opened workflow history");try{const[s]=await Promise.all([_.fetchWorkflow(e.params.workflowId),z({take:w.value})]);t.value=s,A.value=!1,!e.params.versionId&&n.value.length&&await f.replace({name:U.WORKFLOW_HISTORY,params:{workflowId:e.params.workflowId,versionId:n.value[0].versionId}})}catch(s){g.value=!1,v.showError(s,r.baseText("workflowHistory.title"))}});const Y=s=>{const{href:u}=f.resolve({name:U.WORKFLOW_HISTORY,params:{workflowId:e.params.workflowId,versionId:s}});window.open(u,"_blank")},ee=async(s,u)=>await new Promise((h,O)=>{const M=[{text:r.baseText("workflowHistory.action.restore.modal.button.cancel"),type:"tertiary",action:()=>{h("cancel")}}];s&&M.push({text:r.baseText("workflowHistory.action.restore.modal.button.deactivateAndRestore"),type:"tertiary",action:()=>{h("deactivateAndRestore")}}),M.push({text:r.baseText("workflowHistory.action.restore.modal.button.restore"),type:"primary",action:()=>{h("restore")}});try{i.openModalWithData({name:he,data:{beforeClose:()=>{h("cancel")},isWorkflowActivated:s,formattedCreatedAt:u,buttons:M}})}catch(F){O(F)}}),te=async(s,u)=>{const h=await c.cloneIntoNewWorkflow(e.params.workflowId,s,u),{href:O}=f.resolve({name:U.WORKFLOW,params:{name:h.id}});v.showMessage({title:r.baseText("workflowHistory.action.clone.success.title"),message:me("a",{href:O,target:"_blank"},r.baseText("workflowHistory.action.clone.success.message")),type:"success",duration:1e4})},oe=async(s,u)=>{const h=await _.fetchWorkflow(e.params.workflowId),O=await ee(h.active,u.formattedCreatedAt);if(O==="cancel")return;t.value=await c.restoreWorkflow(e.params.workflowId,s,O==="deactivateAndRestore");const M=await c.getWorkflowHistory(e.params.workflowId,{take:1});n.value=M.concat(n.value),v.showMessage({title:r.baseText("workflowHistory.action.restore.success.title"),type:"success"})},j=async({action:s,id:u,data:h})=>{try{switch(s){case o.OPEN:Y(u),L("User opened version in new tab");break;case o.DOWNLOAD:await c.downloadVersion(e.params.workflowId,u,h),L("User downloaded version");break;case o.CLONE:await te(u,h),L("User cloned version");break;case o.RESTORE:await oe(u,h),L("User restored version");break}}catch(O){v.showError(O,r.baseText("workflowHistory.action.error.title",{interpolate:{action:r.baseText(`workflowHistory.item.actions.${s}`).toLowerCase()}}))}},se=async({event:s,id:u})=>{s.metaKey||s.ctrlKey?(Y(u),L("User opened version in new tab")):await f.push({name:U.WORKFLOW_HISTORY,params:{workflowId:e.params.workflowId,versionId:u}})},ne=()=>{i.goToUpgrade("workflow-history","upgrade-workflow-history")};return ue(async()=>{if(e.params.versionId){try{l.value=await c.getWorkflowVersion(e.params.workflowId,e.params.versionId),L("User selected version")}catch(s){v.showError(new Error(`${s.message} "${e.params.versionId}"&nbsp;`),r.baseText("workflowHistory.title"))}try{t.value=await _.fetchWorkflow(e.params.workflowId)}catch(s){g.value=!1,v.showError(s,r.baseText("workflowHistory.title"))}}}),(s,u)=>{const h=S("n8n-heading"),O=S("n8n-button"),M=S("router-link");return H(),R("div",{class:p(s.$style.view)},[V(h,{class:p(s.$style.header),tag:"h2",size:"medium"},{default:C(()=>{var F;return[N(k((F=t.value)==null?void 0:F.name),1)]}),_:1},8,["class"]),m("div",{class:p(s.$style.corner)},[V(h,{tag:"h2",size:"medium",bold:""},{default:C(()=>[N(k(x(r).baseText("workflowHistory.title")),1)]),_:1}),V(M,{to:d.value,"data-test-id":"workflow-history-close-button"},{default:C(()=>[V(O,{type:"tertiary",icon:"times",size:"small",text:"",square:""})]),_:1},8,["to"])],2),m("div",{class:p(s.$style.listComponentWrapper)},[g.value?(H(),P(Ke,{key:0,items:n.value,"last-received-items-length":a.value,"active-item":l.value,actions:W.value,"request-number-of-items":w.value,"should-upgrade":x(c).shouldUpgrade,"evaluated-prune-time":q.value,"is-list-loading":A.value,onAction:j,onPreview:se,onLoadMore:z,onUpgrade:ne},null,8,["items","last-received-items-length","active-item","actions","request-number-of-items","should-upgrade","evaluated-prune-time","is-list-loading"])):E("",!0)],2),m("div",{class:p(s.$style.contentComponentWrapper)},[g.value?(H(),P(et,{key:0,workflow:t.value,"workflow-version":l.value,actions:W.value,"is-list-loading":A.value,"is-first-item-shown":I.value,onAction:j},null,8,["workflow","workflow-version","actions","is-list-loading","is-first-item-shown"])):E("",!0)],2)],2)}}}),at="_view_1ax7n_5",rt="_header_1ax7n_15",it="_corner_1ax7n_23",lt="_contentComponentWrapper_1ax7n_34",ct="_listComponentWrapper_1ax7n_39",wt={view:at,header:rt,corner:it,contentComponentWrapper:lt,listComponentWrapper:ct},dt={$style:wt},Ft=D(nt,[["__cssModules",dt]]);export{Ft as default};
2
+ //# sourceMappingURL=WorkflowHistory-gufVg7PC.js.map