n8n-editor-ui 1.18.1 → 1.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/.turbo/turbo-build.log +44 -44
  2. package/dist/assets/{CanvasControls-9693cb18.js → CanvasControls-6e03b599.js} +2 -2
  3. package/dist/assets/{CanvasControls-9693cb18.js.map → CanvasControls-6e03b599.js.map} +1 -1
  4. package/dist/assets/{CredentialsView-ff501c21.js → CredentialsView-7fc541bb.js} +2 -2
  5. package/dist/assets/{CredentialsView-ff501c21.js.map → CredentialsView-7fc541bb.js.map} +1 -1
  6. package/dist/assets/{ExecutionFilter-9839fa2f.js → ExecutionFilter-4dcfda5f.js} +2 -2
  7. package/dist/assets/{ExecutionFilter-9839fa2f.js.map → ExecutionFilter-4dcfda5f.js.map} +1 -1
  8. package/dist/assets/{ExecutionPreview-ee3acb1c.js → ExecutionPreview-8436d908.js} +2 -2
  9. package/dist/assets/{ExecutionPreview-ee3acb1c.js.map → ExecutionPreview-8436d908.js.map} +1 -1
  10. package/dist/assets/{ExecutionsInfoAccordion-55c2a107.js → ExecutionsInfoAccordion-021dc499.js} +2 -2
  11. package/dist/assets/{ExecutionsInfoAccordion-55c2a107.js.map → ExecutionsInfoAccordion-021dc499.js.map} +1 -1
  12. package/dist/assets/{ExecutionsLandingPage-97aa7e15.js → ExecutionsLandingPage-3d48310c.js} +2 -2
  13. package/dist/assets/{ExecutionsLandingPage-97aa7e15.js.map → ExecutionsLandingPage-3d48310c.js.map} +1 -1
  14. package/dist/assets/{ExecutionsList-cf5f6b88.js → ExecutionsList-a1b490e4.js} +2 -2
  15. package/dist/assets/ExecutionsList-a1b490e4.js.map +1 -0
  16. package/dist/assets/{ExecutionsView-5ae73302.js → ExecutionsView-7703b595.js} +2 -2
  17. package/dist/assets/{ExecutionsView-5ae73302.js.map → ExecutionsView-7703b595.js.map} +1 -1
  18. package/dist/assets/{FixedCollectionParameter-78836f67.js → FixedCollectionParameter-90a3210f.js} +2 -2
  19. package/dist/assets/{FixedCollectionParameter-78836f67.js.map → FixedCollectionParameter-90a3210f.js.map} +1 -1
  20. package/dist/assets/{MainHeader-408d9087.js → MainHeader-7eaf030e.js} +2 -2
  21. package/dist/assets/{MainHeader-408d9087.js.map → MainHeader-7eaf030e.js.map} +1 -1
  22. package/dist/assets/{MainSidebar-5f622fc9.js → MainSidebar-b0a38e3c.js} +2 -2
  23. package/dist/assets/{MainSidebar-5f622fc9.js.map → MainSidebar-b0a38e3c.js.map} +1 -1
  24. package/dist/assets/{NodeCreation-0715d8da.js → NodeCreation-787a187a.js} +2 -2
  25. package/dist/assets/{NodeCreation-0715d8da.js.map → NodeCreation-787a187a.js.map} +1 -1
  26. package/dist/assets/{NodeCreator-96b100ef.js → NodeCreator-6f839eb9.js} +2 -2
  27. package/dist/assets/{NodeCreator-96b100ef.js.map → NodeCreator-6f839eb9.js.map} +1 -1
  28. package/dist/assets/{NodeView-5651414a.js → NodeView-ef40797d.js} +2 -2
  29. package/dist/assets/{NodeView-5651414a.js.map → NodeView-ef40797d.js.map} +1 -1
  30. package/dist/assets/{ResourcesListLayout-df5d1ba9.js → ResourcesListLayout-88dfcefc.js} +2 -2
  31. package/dist/assets/{ResourcesListLayout-df5d1ba9.js.map → ResourcesListLayout-88dfcefc.js.map} +1 -1
  32. package/dist/assets/{RunDataAi-97c7f732.js → RunDataAi-8d5bd68e.js} +2 -2
  33. package/dist/assets/{RunDataAi-97c7f732.js.map → RunDataAi-8d5bd68e.js.map} +1 -1
  34. package/dist/assets/{RunDataJson-df1dc721.js → RunDataJson-a3e1ca39.js} +2 -2
  35. package/dist/assets/{RunDataJson-df1dc721.js.map → RunDataJson-a3e1ca39.js.map} +1 -1
  36. package/dist/assets/{RunDataJsonActions-25336578.js → RunDataJsonActions-6b0ffebb.js} +2 -2
  37. package/dist/assets/{RunDataJsonActions-25336578.js.map → RunDataJsonActions-6b0ffebb.js.map} +1 -1
  38. package/dist/assets/{RunDataSchema-101b201c.js → RunDataSchema-60c0baf0.js} +2 -2
  39. package/dist/assets/{RunDataSchema-101b201c.js.map → RunDataSchema-60c0baf0.js.map} +1 -1
  40. package/dist/assets/{RunDataTable-17daf3ee.js → RunDataTable-dcf4902d.js} +2 -2
  41. package/dist/assets/{RunDataTable-17daf3ee.js.map → RunDataTable-dcf4902d.js.map} +1 -1
  42. package/dist/assets/{SettingsApiView-e4fc36d4.js → SettingsApiView-667aa889.js} +2 -2
  43. package/dist/assets/{SettingsApiView-e4fc36d4.js.map → SettingsApiView-667aa889.js.map} +1 -1
  44. package/dist/assets/{SettingsCommunityNodesView-32ccd1bd.js → SettingsCommunityNodesView-27bf1a31.js} +2 -2
  45. package/dist/assets/{SettingsCommunityNodesView-32ccd1bd.js.map → SettingsCommunityNodesView-27bf1a31.js.map} +1 -1
  46. package/dist/assets/{SettingsExternalSecrets-b409d644.js → SettingsExternalSecrets-7996830e.js} +2 -2
  47. package/dist/assets/{SettingsExternalSecrets-b409d644.js.map → SettingsExternalSecrets-7996830e.js.map} +1 -1
  48. package/dist/assets/{SettingsFakeDoorView-09162f67.js → SettingsFakeDoorView-3d488495.js} +2 -2
  49. package/dist/assets/{SettingsFakeDoorView-09162f67.js.map → SettingsFakeDoorView-3d488495.js.map} +1 -1
  50. package/dist/assets/{SettingsSourceControl-5fa4c1a5.js → SettingsSourceControl-1c188575.js} +2 -2
  51. package/dist/assets/{SettingsSourceControl-5fa4c1a5.js.map → SettingsSourceControl-1c188575.js.map} +1 -1
  52. package/dist/assets/{SettingsSso-0616c11d.js → SettingsSso-b6867d69.js} +2 -2
  53. package/dist/assets/{SettingsSso-0616c11d.js.map → SettingsSso-b6867d69.js.map} +1 -1
  54. package/dist/assets/{SettingsUsersView-5c377b5a.js → SettingsUsersView-df9ac304.js} +2 -2
  55. package/dist/assets/{SettingsUsersView-5c377b5a.js.map → SettingsUsersView-df9ac304.js.map} +1 -1
  56. package/dist/assets/{SettingsView-97e1b2e3.js → SettingsView-f00add58.js} +2 -2
  57. package/dist/assets/{SettingsView-97e1b2e3.js.map → SettingsView-f00add58.js.map} +1 -1
  58. package/dist/assets/{SigninView-3a4f05d7.js → SigninView-bb78c29d.js} +2 -2
  59. package/dist/assets/{SigninView-3a4f05d7.js.map → SigninView-bb78c29d.js.map} +1 -1
  60. package/dist/assets/{TemplateDetails-afb767a3.js → TemplateDetails-e6bea627.js} +2 -2
  61. package/dist/assets/{TemplateDetails-afb767a3.js.map → TemplateDetails-e6bea627.js.map} +1 -1
  62. package/dist/assets/{TemplateList-8ab2d9d4.js → TemplateList-f0b309ec.js} +2 -2
  63. package/dist/assets/{TemplateList-8ab2d9d4.js.map → TemplateList-f0b309ec.js.map} +1 -1
  64. package/dist/assets/{TemplatesCollectionView-278d0d0c.js → TemplatesCollectionView-c11299ee.js} +2 -2
  65. package/dist/assets/{TemplatesCollectionView-278d0d0c.js.map → TemplatesCollectionView-c11299ee.js.map} +1 -1
  66. package/dist/assets/{TemplatesSearchView-75c82b34.js → TemplatesSearchView-822c8b1c.js} +2 -2
  67. package/dist/assets/{TemplatesSearchView-75c82b34.js.map → TemplatesSearchView-822c8b1c.js.map} +1 -1
  68. package/dist/assets/{TemplatesWorkflowView-8d955f12.js → TemplatesWorkflowView-349f3155.js} +2 -2
  69. package/dist/assets/{TemplatesWorkflowView-8d955f12.js.map → TemplatesWorkflowView-349f3155.js.map} +1 -1
  70. package/dist/assets/{VariablesView-b222c8d4.js → VariablesView-f075cbd4.js} +2 -2
  71. package/dist/assets/{VariablesView-b222c8d4.js.map → VariablesView-f075cbd4.js.map} +1 -1
  72. package/dist/assets/{WorkerView-55c8d5d4.js → WorkerView-5b9d29af.js} +2 -2
  73. package/dist/assets/{WorkerView-55c8d5d4.js.map → WorkerView-5b9d29af.js.map} +1 -1
  74. package/dist/assets/{WorkflowActivator-8fba9207.js → WorkflowActivator-163f4fb5.js} +2 -2
  75. package/dist/assets/{WorkflowActivator-8fba9207.js.map → WorkflowActivator-163f4fb5.js.map} +1 -1
  76. package/dist/assets/{WorkflowsView-323b177e.js → WorkflowsView-bf74dadd.js} +2 -2
  77. package/dist/assets/{WorkflowsView-323b177e.js.map → WorkflowsView-bf74dadd.js.map} +1 -1
  78. package/dist/assets/{executionsHelpers-f6f8f8af.js → executionsHelpers-a9dfda49.js} +2 -2
  79. package/dist/assets/{executionsHelpers-f6f8f8af.js.map → executionsHelpers-a9dfda49.js.map} +1 -1
  80. package/dist/assets/{index-1f0f487e.js → index-ac03fd2d.js} +3 -3
  81. package/dist/assets/{index-1f0f487e.js.map → index-ac03fd2d.js.map} +1 -1
  82. package/dist/assets/{pushConnection-4f2192a6.js → pushConnection-a1ddc3b4.js} +2 -2
  83. package/dist/assets/{pushConnection-4f2192a6.js.map → pushConnection-a1ddc3b4.js.map} +1 -1
  84. package/dist/assets/{workflowActivate-417a26ee.js → workflowActivate-c971eb19.js} +2 -2
  85. package/dist/assets/{workflowActivate-417a26ee.js.map → workflowActivate-c971eb19.js.map} +1 -1
  86. package/dist/index.html +1 -1
  87. package/package.json +1 -1
  88. package/dist/assets/ExecutionsList-cf5f6b88.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{u as J,v as ee,q as ae,gh as te,a2 as se,an as le,gi as ie,_ as ne,a6 as re,n as ue,z as de,gj as ce,ar as be,a1 as ve,R as pe}from"./n8n-6b07beca.js";import"./@fortawesome/vue-fontawesome-237f4675.js";import{R as me}from"./ResourcesListLayout-df5d1ba9.js";import{d as oe,r as T,c as S,z as ye,D as fe,g as M,o as r,i as k,j as g,t as c,b as U,p as n,h as _,w as l,s as h,n as j,q as Q,A as Y,U as _e,Q as ge,ab as ke}from"./vendor-f46c350a.js";import"./lodash-es-bad8e3ee.js";import"./esprima-next-8c7e8ff9.js";import"./luxon-19e1de07.js";import"./pinia-af9c3f71.js";import"./flatted-8b14da7d.js";import"./@vueuse/core-9fb50532.js";import"./uuid-cf522c50.js";import"./vue-i18n-cb04cc7a.js";import"./@jsplumb/util-d5a5fff8.js";import"./@jsplumb/core-8d347a89.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-5b4468a6.js";import"./@jsplumb/browser-ui-715581dc.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./index-1f0f487e.js";import"./prettier-51497383.js";import"./codemirror-lang-html-n8n-2834c921.js";import"./@n8n/codemirror-lang-sql-c830a767.js";import"./@lezer/common-4a878264.js";import"./codemirror-lang-n8n-expression-53c11692.js";import"./fast-json-stable-stringify-2d2dc6c9.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-065a6dad.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-49fe6185.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";import"./chart.js-58383f81.js";const Te={class:"variables-key-column"},xe={key:0},Ce={class:"variables-value-column"},he={key:0},we={class:"variables-usage-column"},Ve={key:0},$e=oe({__name:"VariablesRow",props:{data:{type:Object,default:()=>({})},editing:{type:Boolean,default:!1}},emits:["save","cancel","edit","delete"],setup(w,{emit:E}){const p=w,o=le(),F=ie(),{showMessage:q}=J(),d=ee(),G=ae(),x=te(G.currentUser),i=T({...p.data}),b=T({key:!1,value:!1}),N=S(()=>b.value.key&&b.value.value),t=T(),V=T(),B=T(`$vars.${p.data.key}`),v=S(()=>d.isEnterpriseFeatureEnabled(se.Variables));S(()=>v.value&&(x.edit||x.delete)),ye(()=>{W()});const A=[{name:"REQUIRED"},{name:"MAX_LENGTH",config:{maximum:50}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z]/,message:o.baseText("variables.editing.key.error.startsWithLetter")}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z][a-zA-Z0-9_]*$/,message:o.baseText("variables.editing.key.error.jsonKey")}}],H=[{name:"MAX_LENGTH",config:{maximum:220}}];fe(()=>i.value.key,async()=>{await Y(),b.value.key&&C()});function C(){B.value=`$vars.${i.value.key||p.data.key}`}async function m(){i.value={...p.data},E("cancel",i.value)}async function z(){E("save",i.value)}async function P(){E("edit",i.value),await Y(),W()}async function X(){E("delete",i.value)}function I(u,s){b.value[u]=s}function L(){F(B.value),q({title:o.baseText("variables.row.usage.copiedToClipboard"),type:"success"})}function W(){var u,s,$;($=(s=(u=t.value)==null?void 0:u.inputRef)==null?void 0:s.focus)==null||$.call(s)}return(u,s)=>{const $=M("n8n-form-input"),R=M("n8n-tooltip"),y=M("n8n-button");return r(),k("tr",{class:j(u.$style.variablesRow),"data-test-id":"variables-row"},[g("td",Te,[g("div",null,[w.editing?(r(),U($,{key:1,label:"",name:"key","data-test-id":"variable-row-key-input",placeholder:n(o).baseText("variables.editing.key.placeholder"),required:"",validateOnBlur:"",validationRules:A,modelValue:i.value.key,"onUpdate:modelValue":s[0]||(s[0]=e=>i.value.key=e),ref_key:"keyInputRef",ref:t,onValidate:s[1]||(s[1]=e=>I("key",e))},null,8,["placeholder","modelValue"])):(r(),k("span",xe,c(w.data.key),1))])]),g("td",Ce,[g("div",null,[w.editing?(r(),U($,{key:1,label:"",name:"value","data-test-id":"variable-row-value-input",placeholder:n(o).baseText("variables.editing.value.placeholder"),validateOnBlur:"",validationRules:H,modelValue:i.value.value,"onUpdate:modelValue":s[2]||(s[2]=e=>i.value.value=e),ref_key:"valueInputRef",ref:V,onValidate:s[3]||(s[3]=e=>I("value",e))},null,8,["placeholder","modelValue"])):(r(),k("span",he,c(w.data.value),1))])]),g("td",we,[g("div",null,[_(R,{placement:"top"},{content:l(()=>[h(c(n(o).baseText("variables.row.usage.copyToClipboard")),1)]),default:l(()=>[i.value.key&&B.value?(r(),k("span",{key:0,class:j(u.$style.usageSyntax),onClick:L},c(B.value),3)):Q("",!0)]),_:1})])]),v.value?(r(),k("td",Ve,[w.editing?(r(),k("div",{key:0,class:j(u.$style.buttons)},[_(y,{"data-test-id":"variable-row-cancel-button",type:"tertiary",class:"mr-xs",onClick:m},{default:l(()=>[h(c(n(o).baseText("variables.row.button.cancel")),1)]),_:1}),_(y,{"data-test-id":"variable-row-save-button",disabled:!N.value,type:"primary",onClick:z},{default:l(()=>[h(c(n(o).baseText("variables.row.button.save")),1)]),_:1},8,["disabled"])],2)):(r(),k("div",{key:1,class:j([u.$style.buttons,u.$style.hoverButtons])},[_(R,{disabled:n(x).edit,placement:"top"},{content:l(()=>[h(c(n(o).baseText("variables.row.button.edit.onlyOwnerCanSave")),1)]),default:l(()=>[g("div",null,[_(y,{"data-test-id":"variable-row-edit-button",type:"tertiary",class:"mr-xs",disabled:!n(x).edit,onClick:P},{default:l(()=>[h(c(n(o).baseText("variables.row.button.edit")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"]),_(R,{disabled:n(x).delete,placement:"top"},{content:l(()=>[h(c(n(o).baseText("variables.row.button.delete.onlyOwnerCanDelete")),1)]),default:l(()=>[g("div",null,[_(y,{"data-test-id":"variable-row-delete-button",type:"tertiary",disabled:!n(x).delete,onClick:X},{default:l(()=>[h(c(n(o).baseText("variables.row.button.delete")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])],2))])):Q("",!0)],2)}}}),Re="_variablesRow_rbd77_5",Se="_hoverButtons_rbd77_5",Ee="_buttons_rbd77_14",Be="_usageSyntax_rbd77_25",Ae={variablesRow:Re,hoverButtons:Se,buttons:Ee,usageSyntax:Be},Ue={$style:Ae},Me=ne($e,[["__cssModules",Ue]]),Ie={key:0},Oe={key:1},D="@tmpvar",De=oe({__name:"VariablesView",setup(w){const E=ee(),p=re(),o=ae(),F=ue(),q=be(),d=le(),G=pe(),x=de();let i=()=>{};const b=T(null),{showError:N}=J(),t=T([]),V=T({}),B=te(o.currentUser),v=S(()=>E.isEnterpriseFeatureEnabled(se.Variables)),A=S(()=>v.value&&B.create),H=S(()=>[{id:0,path:"name",label:d.baseText("variables.table.key"),classes:["variables-key-column"]},{id:1,path:"value",label:d.baseText("variables.table.value"),classes:["variables-value-column"]},{id:2,path:"usage",label:d.baseText("variables.table.usage"),classes:["variables-usage-column"]},...v.value?[{id:3,path:"actions",label:""}]:[]]),C=S(()=>F.contextBasedTranslationKeys),m=T([]),z=(e,a,f)=>`${e.id}`.startsWith(D)?-1:`${a.id}`.startsWith(D)?1:m.value.includes(e.id)&&m.value.includes(a.id)?m.value.indexOf(e.id)-m.value.indexOf(a.id):m.value.includes(e.id)?-1:m.value.includes(a.id)?1:f==="asc"?y(e).trim().localeCompare(y(a).trim()):y(a).trim().localeCompare(y(e).trim()),P={nameAsc:(e,a)=>z(e,a,"asc"),nameDesc:(e,a)=>z(e,a,"desc")};function X(){m.value=[]}async function I(){await p.fetchAllVariables(),t.value=[...p.variables]}function L(){const e={id:ce(D),key:"",value:""};b.value&&(b.value.$refs.listWrapperRef&&(b.value.$refs.listWrapperRef.scrollTop=0),b.value.currentPage!==1&&b.value.setCurrentPage(1)),t.value.unshift(e),V.value[e.id]=!0,q.track("User clicked add variable button")}async function W(e){let a;try{if(typeof e.id=="string"&&e.id.startsWith(D)){const{id:f,...K}=e;a=await p.createVariable(K),t.value.unshift(a),t.value=t.value.filter(O=>O.id!==e.id),m.value.unshift(a.id)}else a=await p.updateVariable(e),t.value=t.value.filter(f=>f.id!==e.id),t.value.push(a),u(a)}catch(f){N(f,d.baseText("variables.errors.save"))}}function u(e){V.value={...V.value,[e.id]:!V.value[e.id]}}function s(e){typeof e.id=="string"&&e.id.startsWith(D)?t.value=t.value.filter(a=>a.id!==e.id):u(e)}async function $(e){try{if(await G.confirm(d.baseText("variables.modals.deleteConfirm.message",{interpolate:{name:e.key}}),d.baseText("variables.modals.deleteConfirm.title"),{confirmButtonText:d.baseText("variables.modals.deleteConfirm.confirmButton"),cancelButtonText:d.baseText("variables.modals.deleteConfirm.cancelButton")})!==ve)return;await p.deleteVariable(e),t.value=t.value.filter(f=>f.id!==e.id)}catch(a){N(a,d.baseText("variables.errors.delete"))}}function R(){F.goToUpgrade("variables","upgrade-variables")}function y(e){return e.key}return _e(()=>{i=x.$onAction(({name:e,after:a})=>{e==="pullWorkfolder"&&a&&a(()=>{I()})})}),ge(()=>{i()}),(e,a)=>{const f=M("n8n-button"),K=M("n8n-tooltip"),O=M("n8n-action-box");return r(),U(me,{class:"variables-view",ref_key:"layoutRef",ref:b,"resource-key":"variables",disabled:!v.value,resources:t.value,initialize:I,shareable:!1,displayName:y,sortFns:P,sortOptions:["nameAsc","nameDesc"],showFiltersDropdown:!1,type:"datatable","type-props":{columns:H.value},onSort:X,"onClick:add":L},ke({"add-button":l(()=>[_(K,{placement:"top",disabled:A.value},{content:l(()=>[v.value?(r(),k("span",Oe,c(n(d).baseText("variables.add.onlyOwnerCanCreate")),1)):(r(),k("span",Ie,c(n(d).baseText(`variables.add.unavailable${t.value.length===0?".empty":""}`)),1))]),default:l(()=>[g("div",null,[_(f,{size:"large",block:"",disabled:!A.value,onClick:L,"data-test-id":"resources-list-add"},{default:l(()=>[h(c(e.$locale.baseText("variables.add")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])]),default:l(({data:Z})=>[(r(),U(Me,{key:Z.id,editing:V.value[Z.id],data:Z,onSave:W,onEdit:u,onCancel:s,onDelete:$},null,8,["editing","data"]))]),_:2},[v.value?void 0:{name:"preamble",fn:l(()=>[_(O,{class:"mb-m","data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(C.value.variables.unavailable.title),description:e.$locale.baseText(C.value.variables.unavailable.description),buttonText:e.$locale.baseText(C.value.variables.unavailable.button),buttonType:"secondary","onClick:button":R},null,8,["heading","description","buttonText"])]),key:"0"},!v.value||v.value&&!A.value?{name:"empty",fn:l(()=>[v.value?A.value?Q("",!0):(r(),U(O,{key:1,"data-test-id":"cannot-create-variables",emoji:"👋",heading:e.$locale.baseText("variables.empty.notAllowedToCreate.heading",{interpolate:{name:n(o).currentUser.firstName}}),description:e.$locale.baseText("variables.empty.notAllowedToCreate.description"),onClick:R},null,8,["heading","description"])):(r(),U(O,{key:0,"data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(C.value.variables.unavailable.title),description:e.$locale.baseText(C.value.variables.unavailable.description),buttonText:e.$locale.baseText(C.value.variables.unavailable.button),buttonType:"secondary","onClick:button":R},null,8,["heading","description","buttonText"]))]),key:"1"}:void 0]),1032,["disabled","resources","type-props"])}}}),Fe="_sidebarContainer_1qflh_9",Ne={"type-input":"_type-input_1qflh_5",sidebarContainer:Fe};const ze={$style:Ne},_a=ne(De,[["__cssModules",ze],["__scopeId","data-v-efe5d219"]]);export{_a as default};
2
- //# sourceMappingURL=VariablesView-b222c8d4.js.map
1
+ import{u as J,v as ee,q as ae,gh as te,a2 as se,an as le,gi as ie,_ as ne,a6 as re,n as ue,z as de,gj as ce,ar as be,a1 as ve,R as pe}from"./n8n-6b07beca.js";import"./@fortawesome/vue-fontawesome-237f4675.js";import{R as me}from"./ResourcesListLayout-88dfcefc.js";import{d as oe,r as T,c as S,z as ye,D as fe,g as M,o as r,i as k,j as g,t as c,b as U,p as n,h as _,w as l,s as h,n as j,q as Q,A as Y,U as _e,Q as ge,ab as ke}from"./vendor-f46c350a.js";import"./lodash-es-bad8e3ee.js";import"./esprima-next-8c7e8ff9.js";import"./luxon-19e1de07.js";import"./pinia-af9c3f71.js";import"./flatted-8b14da7d.js";import"./@vueuse/core-9fb50532.js";import"./uuid-cf522c50.js";import"./vue-i18n-cb04cc7a.js";import"./@jsplumb/util-d5a5fff8.js";import"./@jsplumb/core-8d347a89.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-5b4468a6.js";import"./@jsplumb/browser-ui-715581dc.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./index-ac03fd2d.js";import"./prettier-51497383.js";import"./codemirror-lang-html-n8n-2834c921.js";import"./@n8n/codemirror-lang-sql-c830a767.js";import"./@lezer/common-4a878264.js";import"./codemirror-lang-n8n-expression-53c11692.js";import"./fast-json-stable-stringify-2d2dc6c9.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-065a6dad.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-49fe6185.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";import"./chart.js-58383f81.js";const Te={class:"variables-key-column"},xe={key:0},Ce={class:"variables-value-column"},he={key:0},we={class:"variables-usage-column"},Ve={key:0},$e=oe({__name:"VariablesRow",props:{data:{type:Object,default:()=>({})},editing:{type:Boolean,default:!1}},emits:["save","cancel","edit","delete"],setup(w,{emit:E}){const p=w,o=le(),F=ie(),{showMessage:q}=J(),d=ee(),G=ae(),x=te(G.currentUser),i=T({...p.data}),b=T({key:!1,value:!1}),N=S(()=>b.value.key&&b.value.value),t=T(),V=T(),B=T(`$vars.${p.data.key}`),v=S(()=>d.isEnterpriseFeatureEnabled(se.Variables));S(()=>v.value&&(x.edit||x.delete)),ye(()=>{W()});const A=[{name:"REQUIRED"},{name:"MAX_LENGTH",config:{maximum:50}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z]/,message:o.baseText("variables.editing.key.error.startsWithLetter")}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z][a-zA-Z0-9_]*$/,message:o.baseText("variables.editing.key.error.jsonKey")}}],H=[{name:"MAX_LENGTH",config:{maximum:220}}];fe(()=>i.value.key,async()=>{await Y(),b.value.key&&C()});function C(){B.value=`$vars.${i.value.key||p.data.key}`}async function m(){i.value={...p.data},E("cancel",i.value)}async function z(){E("save",i.value)}async function P(){E("edit",i.value),await Y(),W()}async function X(){E("delete",i.value)}function I(u,s){b.value[u]=s}function L(){F(B.value),q({title:o.baseText("variables.row.usage.copiedToClipboard"),type:"success"})}function W(){var u,s,$;($=(s=(u=t.value)==null?void 0:u.inputRef)==null?void 0:s.focus)==null||$.call(s)}return(u,s)=>{const $=M("n8n-form-input"),R=M("n8n-tooltip"),y=M("n8n-button");return r(),k("tr",{class:j(u.$style.variablesRow),"data-test-id":"variables-row"},[g("td",Te,[g("div",null,[w.editing?(r(),U($,{key:1,label:"",name:"key","data-test-id":"variable-row-key-input",placeholder:n(o).baseText("variables.editing.key.placeholder"),required:"",validateOnBlur:"",validationRules:A,modelValue:i.value.key,"onUpdate:modelValue":s[0]||(s[0]=e=>i.value.key=e),ref_key:"keyInputRef",ref:t,onValidate:s[1]||(s[1]=e=>I("key",e))},null,8,["placeholder","modelValue"])):(r(),k("span",xe,c(w.data.key),1))])]),g("td",Ce,[g("div",null,[w.editing?(r(),U($,{key:1,label:"",name:"value","data-test-id":"variable-row-value-input",placeholder:n(o).baseText("variables.editing.value.placeholder"),validateOnBlur:"",validationRules:H,modelValue:i.value.value,"onUpdate:modelValue":s[2]||(s[2]=e=>i.value.value=e),ref_key:"valueInputRef",ref:V,onValidate:s[3]||(s[3]=e=>I("value",e))},null,8,["placeholder","modelValue"])):(r(),k("span",he,c(w.data.value),1))])]),g("td",we,[g("div",null,[_(R,{placement:"top"},{content:l(()=>[h(c(n(o).baseText("variables.row.usage.copyToClipboard")),1)]),default:l(()=>[i.value.key&&B.value?(r(),k("span",{key:0,class:j(u.$style.usageSyntax),onClick:L},c(B.value),3)):Q("",!0)]),_:1})])]),v.value?(r(),k("td",Ve,[w.editing?(r(),k("div",{key:0,class:j(u.$style.buttons)},[_(y,{"data-test-id":"variable-row-cancel-button",type:"tertiary",class:"mr-xs",onClick:m},{default:l(()=>[h(c(n(o).baseText("variables.row.button.cancel")),1)]),_:1}),_(y,{"data-test-id":"variable-row-save-button",disabled:!N.value,type:"primary",onClick:z},{default:l(()=>[h(c(n(o).baseText("variables.row.button.save")),1)]),_:1},8,["disabled"])],2)):(r(),k("div",{key:1,class:j([u.$style.buttons,u.$style.hoverButtons])},[_(R,{disabled:n(x).edit,placement:"top"},{content:l(()=>[h(c(n(o).baseText("variables.row.button.edit.onlyOwnerCanSave")),1)]),default:l(()=>[g("div",null,[_(y,{"data-test-id":"variable-row-edit-button",type:"tertiary",class:"mr-xs",disabled:!n(x).edit,onClick:P},{default:l(()=>[h(c(n(o).baseText("variables.row.button.edit")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"]),_(R,{disabled:n(x).delete,placement:"top"},{content:l(()=>[h(c(n(o).baseText("variables.row.button.delete.onlyOwnerCanDelete")),1)]),default:l(()=>[g("div",null,[_(y,{"data-test-id":"variable-row-delete-button",type:"tertiary",disabled:!n(x).delete,onClick:X},{default:l(()=>[h(c(n(o).baseText("variables.row.button.delete")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])],2))])):Q("",!0)],2)}}}),Re="_variablesRow_rbd77_5",Se="_hoverButtons_rbd77_5",Ee="_buttons_rbd77_14",Be="_usageSyntax_rbd77_25",Ae={variablesRow:Re,hoverButtons:Se,buttons:Ee,usageSyntax:Be},Ue={$style:Ae},Me=ne($e,[["__cssModules",Ue]]),Ie={key:0},Oe={key:1},D="@tmpvar",De=oe({__name:"VariablesView",setup(w){const E=ee(),p=re(),o=ae(),F=ue(),q=be(),d=le(),G=pe(),x=de();let i=()=>{};const b=T(null),{showError:N}=J(),t=T([]),V=T({}),B=te(o.currentUser),v=S(()=>E.isEnterpriseFeatureEnabled(se.Variables)),A=S(()=>v.value&&B.create),H=S(()=>[{id:0,path:"name",label:d.baseText("variables.table.key"),classes:["variables-key-column"]},{id:1,path:"value",label:d.baseText("variables.table.value"),classes:["variables-value-column"]},{id:2,path:"usage",label:d.baseText("variables.table.usage"),classes:["variables-usage-column"]},...v.value?[{id:3,path:"actions",label:""}]:[]]),C=S(()=>F.contextBasedTranslationKeys),m=T([]),z=(e,a,f)=>`${e.id}`.startsWith(D)?-1:`${a.id}`.startsWith(D)?1:m.value.includes(e.id)&&m.value.includes(a.id)?m.value.indexOf(e.id)-m.value.indexOf(a.id):m.value.includes(e.id)?-1:m.value.includes(a.id)?1:f==="asc"?y(e).trim().localeCompare(y(a).trim()):y(a).trim().localeCompare(y(e).trim()),P={nameAsc:(e,a)=>z(e,a,"asc"),nameDesc:(e,a)=>z(e,a,"desc")};function X(){m.value=[]}async function I(){await p.fetchAllVariables(),t.value=[...p.variables]}function L(){const e={id:ce(D),key:"",value:""};b.value&&(b.value.$refs.listWrapperRef&&(b.value.$refs.listWrapperRef.scrollTop=0),b.value.currentPage!==1&&b.value.setCurrentPage(1)),t.value.unshift(e),V.value[e.id]=!0,q.track("User clicked add variable button")}async function W(e){let a;try{if(typeof e.id=="string"&&e.id.startsWith(D)){const{id:f,...K}=e;a=await p.createVariable(K),t.value.unshift(a),t.value=t.value.filter(O=>O.id!==e.id),m.value.unshift(a.id)}else a=await p.updateVariable(e),t.value=t.value.filter(f=>f.id!==e.id),t.value.push(a),u(a)}catch(f){N(f,d.baseText("variables.errors.save"))}}function u(e){V.value={...V.value,[e.id]:!V.value[e.id]}}function s(e){typeof e.id=="string"&&e.id.startsWith(D)?t.value=t.value.filter(a=>a.id!==e.id):u(e)}async function $(e){try{if(await G.confirm(d.baseText("variables.modals.deleteConfirm.message",{interpolate:{name:e.key}}),d.baseText("variables.modals.deleteConfirm.title"),{confirmButtonText:d.baseText("variables.modals.deleteConfirm.confirmButton"),cancelButtonText:d.baseText("variables.modals.deleteConfirm.cancelButton")})!==ve)return;await p.deleteVariable(e),t.value=t.value.filter(f=>f.id!==e.id)}catch(a){N(a,d.baseText("variables.errors.delete"))}}function R(){F.goToUpgrade("variables","upgrade-variables")}function y(e){return e.key}return _e(()=>{i=x.$onAction(({name:e,after:a})=>{e==="pullWorkfolder"&&a&&a(()=>{I()})})}),ge(()=>{i()}),(e,a)=>{const f=M("n8n-button"),K=M("n8n-tooltip"),O=M("n8n-action-box");return r(),U(me,{class:"variables-view",ref_key:"layoutRef",ref:b,"resource-key":"variables",disabled:!v.value,resources:t.value,initialize:I,shareable:!1,displayName:y,sortFns:P,sortOptions:["nameAsc","nameDesc"],showFiltersDropdown:!1,type:"datatable","type-props":{columns:H.value},onSort:X,"onClick:add":L},ke({"add-button":l(()=>[_(K,{placement:"top",disabled:A.value},{content:l(()=>[v.value?(r(),k("span",Oe,c(n(d).baseText("variables.add.onlyOwnerCanCreate")),1)):(r(),k("span",Ie,c(n(d).baseText(`variables.add.unavailable${t.value.length===0?".empty":""}`)),1))]),default:l(()=>[g("div",null,[_(f,{size:"large",block:"",disabled:!A.value,onClick:L,"data-test-id":"resources-list-add"},{default:l(()=>[h(c(e.$locale.baseText("variables.add")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])]),default:l(({data:Z})=>[(r(),U(Me,{key:Z.id,editing:V.value[Z.id],data:Z,onSave:W,onEdit:u,onCancel:s,onDelete:$},null,8,["editing","data"]))]),_:2},[v.value?void 0:{name:"preamble",fn:l(()=>[_(O,{class:"mb-m","data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(C.value.variables.unavailable.title),description:e.$locale.baseText(C.value.variables.unavailable.description),buttonText:e.$locale.baseText(C.value.variables.unavailable.button),buttonType:"secondary","onClick:button":R},null,8,["heading","description","buttonText"])]),key:"0"},!v.value||v.value&&!A.value?{name:"empty",fn:l(()=>[v.value?A.value?Q("",!0):(r(),U(O,{key:1,"data-test-id":"cannot-create-variables",emoji:"👋",heading:e.$locale.baseText("variables.empty.notAllowedToCreate.heading",{interpolate:{name:n(o).currentUser.firstName}}),description:e.$locale.baseText("variables.empty.notAllowedToCreate.description"),onClick:R},null,8,["heading","description"])):(r(),U(O,{key:0,"data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(C.value.variables.unavailable.title),description:e.$locale.baseText(C.value.variables.unavailable.description),buttonText:e.$locale.baseText(C.value.variables.unavailable.button),buttonType:"secondary","onClick:button":R},null,8,["heading","description","buttonText"]))]),key:"1"}:void 0]),1032,["disabled","resources","type-props"])}}}),Fe="_sidebarContainer_1qflh_9",Ne={"type-input":"_type-input_1qflh_5",sidebarContainer:Fe};const ze={$style:Ne},_a=ne(De,[["__cssModules",ze],["__scopeId","data-v-efe5d219"]]);export{_a as default};
2
+ //# sourceMappingURL=VariablesView-f075cbd4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VariablesView-b222c8d4.js","sources":["../../src/components/VariablesRow.vue","../../src/views/VariablesView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ComponentPublicInstance, PropType } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\nimport type { EnvironmentVariable, Rule, RuleGroup } from '@/Interface';\nimport { useI18n, useToast, useCopyToClipboard } from '@/composables';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { getVariablesPermissions } from '@/permissions';\n\nconst i18n = useI18n();\nconst copyToClipboard = useCopyToClipboard();\nconst { showMessage } = useToast();\nconst settingsStore = useSettingsStore();\nconst usersStore = useUsersStore();\n\nconst emit = defineEmits(['save', 'cancel', 'edit', 'delete']);\n\nconst props = defineProps({\n\tdata: {\n\t\ttype: Object as PropType<EnvironmentVariable>,\n\t\tdefault: () => ({}),\n\t},\n\tediting: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\nconst modelValue = ref<EnvironmentVariable>({ ...props.data });\n\nconst formValidationStatus = ref<Record<string, boolean>>({\n\tkey: false,\n\tvalue: false,\n});\nconst formValid = computed(() => {\n\treturn formValidationStatus.value.key && formValidationStatus.value.value;\n});\n\nconst keyInputRef = ref<ComponentPublicInstance & { inputRef?: HTMLElement }>();\nconst valueInputRef = ref<HTMLElement>();\n\nconst usage = ref(`$vars.${props.data.key}`);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nconst showActions = computed(\n\t() => isFeatureEnabled.value && (permissions.edit || permissions.delete),\n);\n\nonMounted(() => {\n\tfocusFirstInput();\n});\n\nconst keyValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'REQUIRED' },\n\t{ name: 'MAX_LENGTH', config: { maximum: 50 } },\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z]/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.startsWithLetter'),\n\t\t},\n\t},\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z][a-zA-Z0-9_]*$/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.jsonKey'),\n\t\t},\n\t},\n];\n\nconst valueValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'MAX_LENGTH', config: { maximum: 220 } },\n];\n\nwatch(\n\t() => modelValue.value.key,\n\tasync () => {\n\t\tawait nextTick();\n\t\tif (formValidationStatus.value.key) {\n\t\t\tupdateUsageSyntax();\n\t\t}\n\t},\n);\n\nfunction updateUsageSyntax() {\n\tusage.value = `$vars.${modelValue.value.key || props.data.key}`;\n}\n\nasync function onCancel() {\n\tmodelValue.value = { ...props.data };\n\temit('cancel', modelValue.value);\n}\n\nasync function onSave() {\n\temit('save', modelValue.value);\n}\n\nasync function onEdit() {\n\temit('edit', modelValue.value);\n\n\tawait nextTick();\n\n\tfocusFirstInput();\n}\n\nasync function onDelete() {\n\temit('delete', modelValue.value);\n}\n\nfunction onValidate(key: string, value: boolean) {\n\tformValidationStatus.value[key] = value;\n}\n\nfunction onUsageClick() {\n\tcopyToClipboard(usage.value);\n\tshowMessage({\n\t\ttitle: i18n.baseText('variables.row.usage.copiedToClipboard'),\n\t\ttype: 'success',\n\t});\n}\n\nfunction focusFirstInput() {\n\tkeyInputRef.value?.inputRef?.focus?.();\n}\n</script>\n\n<template>\n\t<tr :class=\"$style.variablesRow\" data-test-id=\"variables-row\">\n\t\t<td class=\"variables-key-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.key }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"key\"\n\t\t\t\t\tdata-test-id=\"variable-row-key-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.key.placeholder')\"\n\t\t\t\t\trequired\n\t\t\t\t\tvalidateOnBlur\n\t\t\t\t\t:validationRules=\"keyValidationRules\"\n\t\t\t\t\tv-model=\"modelValue.key\"\n\t\t\t\t\tref=\"keyInputRef\"\n\t\t\t\t\t@validate=\"(value) => onValidate('key', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-value-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.value }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"value\"\n\t\t\t\t\tdata-test-id=\"variable-row-value-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.value.placeholder')\"\n\t\t\t\t\tvalidateOnBlur\n\t\t\t\t\t:validationRules=\"valueValidationRules\"\n\t\t\t\t\tv-model=\"modelValue.value\"\n\t\t\t\t\tref=\"valueInputRef\"\n\t\t\t\t\t@validate=\"(value) => onValidate('value', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-usage-column\">\n\t\t\t<div>\n\t\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t\t<span v-if=\"modelValue.key && usage\" :class=\"$style.usageSyntax\" @click=\"onUsageClick\">{{\n\t\t\t\t\t\tusage\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.usage.copyToClipboard') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t\t<td v-if=\"isFeatureEnabled\">\n\t\t\t<div v-if=\"editing\" :class=\"$style.buttons\">\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-cancel-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t@click=\"onCancel\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.cancel') }}\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-save-button\"\n\t\t\t\t\t:disabled=\"!formValid\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t@click=\"onSave\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.save') }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"[$style.buttons, $style.hoverButtons]\">\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.edit\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-edit-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.edit\"\n\t\t\t\t\t\t\t@click=\"onEdit\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit.onlyOwnerCanSave') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.delete\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-delete-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.delete\"\n\t\t\t\t\t\t\t@click=\"onDelete\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete.onlyOwnerCanDelete') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t</tr>\n</template>\n\n<style lang=\"scss\" module>\n.variablesRow {\n\t&:hover {\n\t\t.hoverButtons {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\ttd {\n\t\t> div {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tmin-height: 40px;\n\t\t}\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tflex-wrap: nowrap;\n\tjustify-content: flex-end;\n}\n\n.hoverButtons {\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n}\n\n.usageSyntax {\n\tcursor: pointer;\n\tbackground: var(--color-variables-usage-syntax-bg);\n\tcolor: var(--color-variables-usage-font);\n\tfont-family: var(--font-family-monospace);\n\tfont-size: var(--font-size-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, ref, onBeforeMount, onBeforeUnmount } from 'vue';\nimport {\n\tuseEnvironmentsStore,\n\tuseUIStore,\n\tuseSettingsStore,\n\tuseUsersStore,\n\tuseSourceControlStore,\n} from '@/stores';\nimport { useI18n, useTelemetry, useToast, useMessage } from '@/composables';\n\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport VariablesRow from '@/components/VariablesRow.vue';\n\nimport { EnterpriseEditionFeature, MODAL_CONFIRM } from '@/constants';\nimport type {\n\tDatatableColumn,\n\tEnvironmentVariable,\n\tTemporaryEnvironmentVariable,\n} from '@/Interface';\nimport { uid } from 'n8n-design-system/utils';\nimport { getVariablesPermissions } from '@/permissions';\n\nconst settingsStore = useSettingsStore();\nconst environmentsStore = useEnvironmentsStore();\nconst usersStore = useUsersStore();\nconst uiStore = useUIStore();\nconst telemetry = useTelemetry();\nconst i18n = useI18n();\nconst message = useMessage();\nconst sourceControlStore = useSourceControlStore();\nlet sourceControlStoreUnsubscribe = () => {};\n\nconst layoutRef = ref<InstanceType<typeof ResourcesListLayout> | null>(null);\n\nconst { showError } = useToast();\n\nconst TEMPORARY_VARIABLE_UID_BASE = '@tmpvar';\n\nconst allVariables = ref<Array<EnvironmentVariable | TemporaryEnvironmentVariable>>([]);\nconst editMode = ref<Record<string, boolean>>({});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\nconst canCreateVariables = computed(() => isFeatureEnabled.value && permissions.create);\n\nconst datatableColumns = computed<DatatableColumn[]>(() => [\n\t{\n\t\tid: 0,\n\t\tpath: 'name',\n\t\tlabel: i18n.baseText('variables.table.key'),\n\t\tclasses: ['variables-key-column'],\n\t},\n\t{\n\t\tid: 1,\n\t\tpath: 'value',\n\t\tlabel: i18n.baseText('variables.table.value'),\n\t\tclasses: ['variables-value-column'],\n\t},\n\t{\n\t\tid: 2,\n\t\tpath: 'usage',\n\t\tlabel: i18n.baseText('variables.table.usage'),\n\t\tclasses: ['variables-usage-column'],\n\t},\n\t...(isFeatureEnabled.value\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: 3,\n\t\t\t\t\tpath: 'actions',\n\t\t\t\t\tlabel: '',\n\t\t\t\t},\n\t\t ]\n\t\t: []),\n]);\n\nconst contextBasedTranslationKeys = computed(() => uiStore.contextBasedTranslationKeys);\n\nconst newlyAddedVariableIds = ref<number[]>([]);\n\nconst nameSortFn = (a: EnvironmentVariable, b: EnvironmentVariable, direction: 'asc' | 'desc') => {\n\tif (`${a.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn -1;\n\t} else if (`${b.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn 1;\n\t} else if (\n\t\tnewlyAddedVariableIds.value.includes(a.id) &&\n\t\tnewlyAddedVariableIds.value.includes(b.id)\n\t) {\n\t\treturn newlyAddedVariableIds.value.indexOf(a.id) - newlyAddedVariableIds.value.indexOf(b.id);\n\t} else if (newlyAddedVariableIds.value.includes(a.id)) {\n\t\treturn -1;\n\t} else if (newlyAddedVariableIds.value.includes(b.id)) {\n\t\treturn 1;\n\t}\n\n\treturn direction === 'asc'\n\t\t? displayName(a).trim().localeCompare(displayName(b).trim())\n\t\t: displayName(b).trim().localeCompare(displayName(a).trim());\n};\nconst sortFns = {\n\tnameAsc: (a: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'asc');\n\t},\n\tnameDesc: (a: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'desc');\n\t},\n};\n\nfunction resetNewVariablesList() {\n\tnewlyAddedVariableIds.value = [];\n}\n\nasync function initialize() {\n\tawait environmentsStore.fetchAllVariables();\n\n\tallVariables.value = [...environmentsStore.variables];\n}\n\nfunction addTemporaryVariable() {\n\tconst temporaryVariable: TemporaryEnvironmentVariable = {\n\t\tid: uid(TEMPORARY_VARIABLE_UID_BASE),\n\t\tkey: '',\n\t\tvalue: '',\n\t};\n\n\tif (layoutRef.value) {\n\t\t// Reset scroll position\n\t\tif (layoutRef.value.$refs.listWrapperRef) {\n\t\t\tlayoutRef.value.$refs.listWrapperRef.scrollTop = 0;\n\t\t}\n\n\t\t// Reset pagination\n\t\tif (layoutRef.value.currentPage !== 1) {\n\t\t\tlayoutRef.value.setCurrentPage(1);\n\t\t}\n\t}\n\n\tallVariables.value.unshift(temporaryVariable);\n\teditMode.value[temporaryVariable.id] = true;\n\n\ttelemetry.track('User clicked add variable button');\n}\n\nasync function saveVariable(data: EnvironmentVariable | TemporaryEnvironmentVariable) {\n\tlet updatedVariable: EnvironmentVariable;\n\n\ttry {\n\t\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\t\tconst { id, ...rest } = data;\n\t\t\tupdatedVariable = await environmentsStore.createVariable(rest);\n\t\t\tallVariables.value.unshift(updatedVariable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tnewlyAddedVariableIds.value.unshift(updatedVariable.id);\n\t\t} else {\n\t\t\tupdatedVariable = await environmentsStore.updateVariable(data as EnvironmentVariable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tallVariables.value.push(updatedVariable);\n\t\t\ttoggleEditing(updatedVariable);\n\t\t}\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.save'));\n\t}\n}\n\nfunction toggleEditing(data: EnvironmentVariable) {\n\teditMode.value = {\n\t\t...editMode.value,\n\t\t[data.id]: !editMode.value[data.id],\n\t};\n}\n\nfunction cancelEditing(data: EnvironmentVariable | TemporaryEnvironmentVariable) {\n\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} else {\n\t\ttoggleEditing(data as EnvironmentVariable);\n\t}\n}\n\nasync function deleteVariable(data: EnvironmentVariable) {\n\ttry {\n\t\tconst confirmed = await message.confirm(\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.message', { interpolate: { name: data.key } }),\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: i18n.baseText('variables.modals.deleteConfirm.confirmButton'),\n\t\t\t\tcancelButtonText: i18n.baseText('variables.modals.deleteConfirm.cancelButton'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmed !== MODAL_CONFIRM) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait environmentsStore.deleteVariable(data);\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.delete'));\n\t}\n}\n\nfunction goToUpgrade() {\n\tvoid uiStore.goToUpgrade('variables', 'upgrade-variables');\n}\n\nfunction displayName(resource: EnvironmentVariable) {\n\treturn resource.key;\n}\n\nonBeforeMount(() => {\n\tsourceControlStoreUnsubscribe = sourceControlStore.$onAction(({ name, after }) => {\n\t\tif (name === 'pullWorkfolder' && after) {\n\t\t\tafter(() => {\n\t\t\t\tvoid initialize();\n\t\t\t});\n\t\t}\n\t});\n});\n\nonBeforeUnmount(() => {\n\tsourceControlStoreUnsubscribe();\n});\n</script>\n\n<template>\n\t<ResourcesListLayout\n\t\tclass=\"variables-view\"\n\t\tref=\"layoutRef\"\n\t\tresource-key=\"variables\"\n\t\t:disabled=\"!isFeatureEnabled\"\n\t\t:resources=\"allVariables\"\n\t\t:initialize=\"initialize\"\n\t\t:shareable=\"false\"\n\t\t:displayName=\"displayName\"\n\t\t:sortFns=\"sortFns\"\n\t\t:sortOptions=\"['nameAsc', 'nameDesc']\"\n\t\t:showFiltersDropdown=\"false\"\n\t\ttype=\"datatable\"\n\t\t:type-props=\"{ columns: datatableColumns }\"\n\t\t@sort=\"resetNewVariablesList\"\n\t\t@click:add=\"addTemporaryVariable\"\n\t>\n\t\t<template #add-button>\n\t\t\t<n8n-tooltip placement=\"top\" :disabled=\"canCreateVariables\">\n\t\t\t\t<div>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"!canCreateVariables\"\n\t\t\t\t\t\t@click=\"addTemporaryVariable\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText(`variables.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #content>\n\t\t\t\t\t<span v-if=\"!isFeatureEnabled\">{{\n\t\t\t\t\t\ti18n.baseText(`variables.add.unavailable${allVariables.length === 0 ? '.empty' : ''}`)\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<span v-else>{{ i18n.baseText('variables.add.onlyOwnerCanCreate') }}</span>\n\t\t\t\t</template>\n\t\t\t</n8n-tooltip>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled\" #preamble>\n\t\t\t<n8n-action-box\n\t\t\t\tclass=\"mb-m\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:buttonText=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\n\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled || (isFeatureEnabled && !canCreateVariables)\" #empty>\n\t\t\t<n8n-action-box\n\t\t\t\tv-if=\"!isFeatureEnabled\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:buttonText=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\n\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t\t<n8n-action-box\n\t\t\t\tv-else-if=\"!canCreateVariables\"\n\t\t\t\tdata-test-id=\"cannot-create-variables\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText('variables.empty.notAllowedToCreate.heading', {\n\t\t\t\t\t\tinterpolate: { name: usersStore.currentUser.firstName },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t\t:description=\"$locale.baseText('variables.empty.notAllowedToCreate.description')\"\n\t\t\t\t@click=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #default=\"{ data }\">\n\t\t\t<VariablesRow\n\t\t\t\t:key=\"data.id\"\n\t\t\t\t:editing=\"editMode[data.id]\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t@save=\"saveVariable\"\n\t\t\t\t@edit=\"toggleEditing\"\n\t\t\t\t@cancel=\"cancelEditing\"\n\t\t\t\t@delete=\"deleteVariable\"\n\t\t\t/>\n\t\t</template>\n\t</ResourcesListLayout>\n</template>\n\n<style lang=\"scss\" module>\n.type-input {\n\t--max-width: 265px;\n}\n\n.sidebarContainer ul {\n\tpadding: 0 !important;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@use 'n8n-design-system/css/common/var.scss';\n\n.variables-view {\n\t:deep(.datatable) {\n\t\ttable {\n\t\t\ttable-layout: fixed;\n\t\t}\n\n\t\tth,\n\t\ttd {\n\t\t\twidth: 25%;\n\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\twidth: 33.33%;\n\t\t\t}\n\n\t\t\t&.variables-value-column,\n\t\t\t&.variables-key-column,\n\t\t\t&.variables-usage-column {\n\t\t\t\t> div {\n\t\t\t\t\twidth: 100%;\n\n\t\t\t\t\t> span {\n\t\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\t\toverflow: hidden;\n\t\t\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\t\theight: 18px;\n\t\t\t\t\t}\n\n\t\t\t\t\t> div {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.variables-usage-column {\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n"],"names":["i18n","useI18n","copyToClipboard","useCopyToClipboard","showMessage","useToast","settingsStore","useSettingsStore","usersStore","useUsersStore","permissions","getVariablesPermissions","modelValue","ref","props","formValidationStatus","formValid","computed","keyInputRef","valueInputRef","usage","isFeatureEnabled","EnterpriseEditionFeature","onMounted","focusFirstInput","keyValidationRules","valueValidationRules","watch","nextTick","updateUsageSyntax","onCancel","emit","onSave","onEdit","onDelete","onValidate","key","value","onUsageClick","_c","_b","_a","TEMPORARY_VARIABLE_UID_BASE","environmentsStore","useEnvironmentsStore","uiStore","useUIStore","telemetry","useTelemetry","message","useMessage","sourceControlStore","useSourceControlStore","sourceControlStoreUnsubscribe","layoutRef","showError","allVariables","editMode","canCreateVariables","datatableColumns","contextBasedTranslationKeys","newlyAddedVariableIds","nameSortFn","a","b","direction","displayName","sortFns","resetNewVariablesList","initialize","addTemporaryVariable","temporaryVariable","uid","saveVariable","data","updatedVariable","id","rest","variable","toggleEditing","error","cancelEditing","deleteVariable","MODAL_CONFIRM","goToUpgrade","resource","onBeforeMount","name","after","onBeforeUnmount"],"mappings":"wxDAUMA,EAAOC,KACPC,EAAkBC,KAClB,CAAE,YAAAC,GAAgBC,IAClBC,EAAgBC,KAChBC,EAAaC,KAebC,EAAcC,GAAwBH,EAAW,WAAW,EAC5DI,EAAaC,EAAyB,CAAE,GAAGC,EAAM,IAAM,CAAA,EAEvDC,EAAuBF,EAA6B,CACzD,IAAK,GACL,MAAO,EAAA,CACP,EACKG,EAAYC,EAAS,IACnBF,EAAqB,MAAM,KAAOA,EAAqB,MAAM,KACpE,EAEKG,EAAcL,IACdM,EAAgBN,IAEhBO,EAAQP,EAAI,SAASC,EAAM,KAAK,GAAG,EAAE,EAErCO,EAAmBJ,EAAS,IACjCX,EAAc,2BAA2BgB,GAAyB,SAAS,CAAA,EAGxDL,EACnB,IAAMI,EAAiB,QAAUX,EAAY,MAAQA,EAAY,OAClE,EAEAa,GAAU,IAAM,CACCC,GAAA,CAChB,EAED,MAAMC,EAA8C,CACnD,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,aAAc,OAAQ,CAAE,QAAS,GAAK,EAC9C,CACC,KAAM,cACN,OAAQ,CACP,MAAO,YACP,QAASzB,EAAK,SAAS,8CAA8C,CACtE,CACD,EACA,CACC,KAAM,cACN,OAAQ,CACP,MAAO,0BACP,QAASA,EAAK,SAAS,qCAAqC,CAC7D,CACD,CAAA,EAGK0B,EAAgD,CACrD,CAAE,KAAM,aAAc,OAAQ,CAAE,QAAS,IAAM,CAAA,EAGhDC,GACC,IAAMf,EAAW,MAAM,IACvB,SAAY,CACX,MAAMgB,EAAS,EACXb,EAAqB,MAAM,KACZc,GAEpB,CAAA,EAGD,SAASA,GAAoB,CAC5BT,EAAM,MAAQ,SAASR,EAAW,MAAM,KAAOE,EAAM,KAAK,GAAG,EAC9D,CAEA,eAAegB,GAAW,CACzBlB,EAAW,MAAQ,CAAE,GAAGE,EAAM,IAAK,EAC9BiB,EAAA,SAAUnB,EAAW,KAAK,CAChC,CAEA,eAAeoB,GAAS,CAClBD,EAAA,OAAQnB,EAAW,KAAK,CAC9B,CAEA,eAAeqB,GAAS,CAClBF,EAAA,OAAQnB,EAAW,KAAK,EAE7B,MAAMgB,EAAS,EAECJ,GACjB,CAEA,eAAeU,GAAW,CACpBH,EAAA,SAAUnB,EAAW,KAAK,CAChC,CAES,SAAAuB,EAAWC,EAAaC,EAAgB,CAC3BtB,EAAA,MAAMqB,CAAG,EAAIC,CACnC,CAEA,SAASC,GAAe,CACvBpC,EAAgBkB,EAAM,KAAK,EACfhB,EAAA,CACX,MAAOJ,EAAK,SAAS,uCAAuC,EAC5D,KAAM,SAAA,CACN,CACF,CAEA,SAASwB,GAAkB,YACde,GAAAC,GAAAC,EAAAvB,EAAA,QAAA,YAAAuB,EAAO,WAAP,YAAAD,EAAiB,QAAjB,MAAAD,EAAA,KAAAC,EACb,ixFC5FME,EAA8B,iDAdpC,MAAMpC,EAAgBC,KAChBoC,EAAoBC,KACpBpC,EAAaC,KACboC,EAAUC,KACVC,EAAYC,KACZhD,EAAOC,KACPgD,EAAUC,KACVC,EAAqBC,KAC3B,IAAIC,EAAgC,IAAM,CAAA,EAEpC,MAAAC,EAAYzC,EAAqD,IAAI,EAErE,CAAE,UAAA0C,GAAclD,IAIhBmD,EAAe3C,EAA+D,CAAA,CAAE,EAChF4C,EAAW5C,EAA6B,CAAA,CAAE,EAE1CH,EAAcC,GAAwBH,EAAW,WAAW,EAE5Da,EAAmBJ,EAAS,IACjCX,EAAc,2BAA2BgB,GAAyB,SAAS,CAAA,EAEtEoC,EAAqBzC,EAAS,IAAMI,EAAiB,OAASX,EAAY,MAAM,EAEhFiD,EAAmB1C,EAA4B,IAAM,CAC1D,CACC,GAAI,EACJ,KAAM,OACN,MAAOjB,EAAK,SAAS,qBAAqB,EAC1C,QAAS,CAAC,sBAAsB,CACjC,EACA,CACC,GAAI,EACJ,KAAM,QACN,MAAOA,EAAK,SAAS,uBAAuB,EAC5C,QAAS,CAAC,wBAAwB,CACnC,EACA,CACC,GAAI,EACJ,KAAM,QACN,MAAOA,EAAK,SAAS,uBAAuB,EAC5C,QAAS,CAAC,wBAAwB,CACnC,EACA,GAAIqB,EAAiB,MAClB,CACA,CACC,GAAI,EACJ,KAAM,UACN,MAAO,EACR,CAAA,EAEA,CAAC,CAAA,CACJ,EAEKuC,EAA8B3C,EAAS,IAAM4B,EAAQ,2BAA2B,EAEhFgB,EAAwBhD,EAAc,CAAA,CAAE,EAExCiD,EAAa,CAACC,EAAwBC,EAAwBC,IAC/D,GAAGF,EAAE,EAAE,GAAG,WAAWrB,CAA2B,EAC5C,GACG,GAAGsB,EAAE,EAAE,GAAG,WAAWtB,CAA2B,EACnD,EAEPmB,EAAsB,MAAM,SAASE,EAAE,EAAE,GACzCF,EAAsB,MAAM,SAASG,EAAE,EAAE,EAElCH,EAAsB,MAAM,QAAQE,EAAE,EAAE,EAAIF,EAAsB,MAAM,QAAQG,EAAE,EAAE,EACjFH,EAAsB,MAAM,SAASE,EAAE,EAAE,EAC5C,GACGF,EAAsB,MAAM,SAASG,EAAE,EAAE,EAC5C,EAGDC,IAAc,MAClBC,EAAYH,CAAC,EAAE,OAAO,cAAcG,EAAYF,CAAC,EAAE,KAAM,CAAA,EACzDE,EAAYF,CAAC,EAAE,KAAK,EAAE,cAAcE,EAAYH,CAAC,EAAE,KAAA,CAAM,EAEvDI,EAAU,CACf,QAAS,CAACJ,EAAwBC,IAC1BF,EAAWC,EAAGC,EAAG,KAAK,EAE9B,SAAU,CAACD,EAAwBC,IAC3BF,EAAWC,EAAGC,EAAG,MAAM,CAC/B,EAGD,SAASI,GAAwB,CAChCP,EAAsB,MAAQ,EAC/B,CAEA,eAAeQ,GAAa,CAC3B,MAAM1B,EAAkB,oBAExBa,EAAa,MAAQ,CAAC,GAAGb,EAAkB,SAAS,CACrD,CAEA,SAAS2B,GAAuB,CAC/B,MAAMC,EAAkD,CACvD,GAAIC,GAAI9B,CAA2B,EACnC,IAAK,GACL,MAAO,EAAA,EAGJY,EAAU,QAETA,EAAU,MAAM,MAAM,iBACfA,EAAA,MAAM,MAAM,eAAe,UAAY,GAI9CA,EAAU,MAAM,cAAgB,GACzBA,EAAA,MAAM,eAAe,CAAC,GAIrBE,EAAA,MAAM,QAAQe,CAAiB,EACnCd,EAAA,MAAMc,EAAkB,EAAE,EAAI,GAEvCxB,EAAU,MAAM,kCAAkC,CACnD,CAEA,eAAe0B,EAAaC,EAA0D,CACjF,IAAAC,EAEA,GAAA,CACC,GAAA,OAAOD,EAAK,IAAO,UAAYA,EAAK,GAAG,WAAWhC,CAA2B,EAAG,CACnF,KAAM,CAAE,GAAAkC,EAAI,GAAGC,CAAA,EAASH,EACNC,EAAA,MAAMhC,EAAkB,eAAekC,CAAI,EAChDrB,EAAA,MAAM,QAAQmB,CAAe,EAC7BnB,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,EAC9Db,EAAA,MAAM,QAAQc,EAAgB,EAAE,CAAA,MAEpCA,EAAA,MAAMhC,EAAkB,eAAe+B,CAA2B,EACvElB,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,EACvElB,EAAA,MAAM,KAAKmB,CAAe,EACvCI,EAAcJ,CAAe,QAEtBK,EAAO,CACfzB,EAAUyB,EAAOhF,EAAK,SAAS,uBAAuB,CAAC,CACxD,CACD,CAEA,SAAS+E,EAAcL,EAA2B,CACjDjB,EAAS,MAAQ,CAChB,GAAGA,EAAS,MACZ,CAACiB,EAAK,EAAE,EAAG,CAACjB,EAAS,MAAMiB,EAAK,EAAE,CAAA,CAEpC,CAEA,SAASO,EAAcP,EAA0D,CAC5E,OAAOA,EAAK,IAAO,UAAYA,EAAK,GAAG,WAAWhC,CAA2B,EACnEc,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,EAEpFK,EAAcL,CAA2B,CAE3C,CAEA,eAAeQ,EAAeR,EAA2B,CACpD,GAAA,CAUH,GATkB,MAAMzB,EAAQ,QAC/BjD,EAAK,SAAS,yCAA0C,CAAE,YAAa,CAAE,KAAM0E,EAAK,GAAI,EAAG,EAC3F1E,EAAK,SAAS,sCAAsC,EACpD,CACC,kBAAmBA,EAAK,SAAS,8CAA8C,EAC/E,iBAAkBA,EAAK,SAAS,6CAA6C,CAC9E,CAAA,IAGiBmF,GACjB,OAGK,MAAAxC,EAAkB,eAAe+B,CAAI,EAC9BlB,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,QAC5EM,EAAO,CACfzB,EAAUyB,EAAOhF,EAAK,SAAS,yBAAyB,CAAC,CAC1D,CACD,CAEA,SAASoF,GAAc,CACjBvC,EAAQ,YAAY,YAAa,mBAAmB,CAC1D,CAEA,SAASqB,EAAYmB,EAA+B,CACnD,OAAOA,EAAS,GACjB,CAEA,OAAAC,GAAc,IAAM,CACnBjC,EAAgCF,EAAmB,UAAU,CAAC,CAAE,KAAAoC,EAAM,MAAAC,KAAY,CAC7ED,IAAS,kBAAoBC,GAChCA,EAAM,IAAM,CACNnB,EAAW,CAAA,CAChB,CACF,CACA,CAAA,CACD,EAEDoB,GAAgB,IAAM,CACSpC,GAAA,CAC9B"}
1
+ {"version":3,"file":"VariablesView-f075cbd4.js","sources":["../../src/components/VariablesRow.vue","../../src/views/VariablesView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ComponentPublicInstance, PropType } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\nimport type { EnvironmentVariable, Rule, RuleGroup } from '@/Interface';\nimport { useI18n, useToast, useCopyToClipboard } from '@/composables';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { getVariablesPermissions } from '@/permissions';\n\nconst i18n = useI18n();\nconst copyToClipboard = useCopyToClipboard();\nconst { showMessage } = useToast();\nconst settingsStore = useSettingsStore();\nconst usersStore = useUsersStore();\n\nconst emit = defineEmits(['save', 'cancel', 'edit', 'delete']);\n\nconst props = defineProps({\n\tdata: {\n\t\ttype: Object as PropType<EnvironmentVariable>,\n\t\tdefault: () => ({}),\n\t},\n\tediting: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\nconst modelValue = ref<EnvironmentVariable>({ ...props.data });\n\nconst formValidationStatus = ref<Record<string, boolean>>({\n\tkey: false,\n\tvalue: false,\n});\nconst formValid = computed(() => {\n\treturn formValidationStatus.value.key && formValidationStatus.value.value;\n});\n\nconst keyInputRef = ref<ComponentPublicInstance & { inputRef?: HTMLElement }>();\nconst valueInputRef = ref<HTMLElement>();\n\nconst usage = ref(`$vars.${props.data.key}`);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nconst showActions = computed(\n\t() => isFeatureEnabled.value && (permissions.edit || permissions.delete),\n);\n\nonMounted(() => {\n\tfocusFirstInput();\n});\n\nconst keyValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'REQUIRED' },\n\t{ name: 'MAX_LENGTH', config: { maximum: 50 } },\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z]/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.startsWithLetter'),\n\t\t},\n\t},\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z][a-zA-Z0-9_]*$/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.jsonKey'),\n\t\t},\n\t},\n];\n\nconst valueValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'MAX_LENGTH', config: { maximum: 220 } },\n];\n\nwatch(\n\t() => modelValue.value.key,\n\tasync () => {\n\t\tawait nextTick();\n\t\tif (formValidationStatus.value.key) {\n\t\t\tupdateUsageSyntax();\n\t\t}\n\t},\n);\n\nfunction updateUsageSyntax() {\n\tusage.value = `$vars.${modelValue.value.key || props.data.key}`;\n}\n\nasync function onCancel() {\n\tmodelValue.value = { ...props.data };\n\temit('cancel', modelValue.value);\n}\n\nasync function onSave() {\n\temit('save', modelValue.value);\n}\n\nasync function onEdit() {\n\temit('edit', modelValue.value);\n\n\tawait nextTick();\n\n\tfocusFirstInput();\n}\n\nasync function onDelete() {\n\temit('delete', modelValue.value);\n}\n\nfunction onValidate(key: string, value: boolean) {\n\tformValidationStatus.value[key] = value;\n}\n\nfunction onUsageClick() {\n\tcopyToClipboard(usage.value);\n\tshowMessage({\n\t\ttitle: i18n.baseText('variables.row.usage.copiedToClipboard'),\n\t\ttype: 'success',\n\t});\n}\n\nfunction focusFirstInput() {\n\tkeyInputRef.value?.inputRef?.focus?.();\n}\n</script>\n\n<template>\n\t<tr :class=\"$style.variablesRow\" data-test-id=\"variables-row\">\n\t\t<td class=\"variables-key-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.key }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"key\"\n\t\t\t\t\tdata-test-id=\"variable-row-key-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.key.placeholder')\"\n\t\t\t\t\trequired\n\t\t\t\t\tvalidateOnBlur\n\t\t\t\t\t:validationRules=\"keyValidationRules\"\n\t\t\t\t\tv-model=\"modelValue.key\"\n\t\t\t\t\tref=\"keyInputRef\"\n\t\t\t\t\t@validate=\"(value) => onValidate('key', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-value-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.value }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"value\"\n\t\t\t\t\tdata-test-id=\"variable-row-value-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.value.placeholder')\"\n\t\t\t\t\tvalidateOnBlur\n\t\t\t\t\t:validationRules=\"valueValidationRules\"\n\t\t\t\t\tv-model=\"modelValue.value\"\n\t\t\t\t\tref=\"valueInputRef\"\n\t\t\t\t\t@validate=\"(value) => onValidate('value', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-usage-column\">\n\t\t\t<div>\n\t\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t\t<span v-if=\"modelValue.key && usage\" :class=\"$style.usageSyntax\" @click=\"onUsageClick\">{{\n\t\t\t\t\t\tusage\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.usage.copyToClipboard') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t\t<td v-if=\"isFeatureEnabled\">\n\t\t\t<div v-if=\"editing\" :class=\"$style.buttons\">\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-cancel-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t@click=\"onCancel\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.cancel') }}\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-save-button\"\n\t\t\t\t\t:disabled=\"!formValid\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t@click=\"onSave\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.save') }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"[$style.buttons, $style.hoverButtons]\">\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.edit\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-edit-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.edit\"\n\t\t\t\t\t\t\t@click=\"onEdit\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit.onlyOwnerCanSave') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.delete\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-delete-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.delete\"\n\t\t\t\t\t\t\t@click=\"onDelete\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete.onlyOwnerCanDelete') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t</tr>\n</template>\n\n<style lang=\"scss\" module>\n.variablesRow {\n\t&:hover {\n\t\t.hoverButtons {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\ttd {\n\t\t> div {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tmin-height: 40px;\n\t\t}\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tflex-wrap: nowrap;\n\tjustify-content: flex-end;\n}\n\n.hoverButtons {\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n}\n\n.usageSyntax {\n\tcursor: pointer;\n\tbackground: var(--color-variables-usage-syntax-bg);\n\tcolor: var(--color-variables-usage-font);\n\tfont-family: var(--font-family-monospace);\n\tfont-size: var(--font-size-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, ref, onBeforeMount, onBeforeUnmount } from 'vue';\nimport {\n\tuseEnvironmentsStore,\n\tuseUIStore,\n\tuseSettingsStore,\n\tuseUsersStore,\n\tuseSourceControlStore,\n} from '@/stores';\nimport { useI18n, useTelemetry, useToast, useMessage } from '@/composables';\n\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport VariablesRow from '@/components/VariablesRow.vue';\n\nimport { EnterpriseEditionFeature, MODAL_CONFIRM } from '@/constants';\nimport type {\n\tDatatableColumn,\n\tEnvironmentVariable,\n\tTemporaryEnvironmentVariable,\n} from '@/Interface';\nimport { uid } from 'n8n-design-system/utils';\nimport { getVariablesPermissions } from '@/permissions';\n\nconst settingsStore = useSettingsStore();\nconst environmentsStore = useEnvironmentsStore();\nconst usersStore = useUsersStore();\nconst uiStore = useUIStore();\nconst telemetry = useTelemetry();\nconst i18n = useI18n();\nconst message = useMessage();\nconst sourceControlStore = useSourceControlStore();\nlet sourceControlStoreUnsubscribe = () => {};\n\nconst layoutRef = ref<InstanceType<typeof ResourcesListLayout> | null>(null);\n\nconst { showError } = useToast();\n\nconst TEMPORARY_VARIABLE_UID_BASE = '@tmpvar';\n\nconst allVariables = ref<Array<EnvironmentVariable | TemporaryEnvironmentVariable>>([]);\nconst editMode = ref<Record<string, boolean>>({});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\nconst canCreateVariables = computed(() => isFeatureEnabled.value && permissions.create);\n\nconst datatableColumns = computed<DatatableColumn[]>(() => [\n\t{\n\t\tid: 0,\n\t\tpath: 'name',\n\t\tlabel: i18n.baseText('variables.table.key'),\n\t\tclasses: ['variables-key-column'],\n\t},\n\t{\n\t\tid: 1,\n\t\tpath: 'value',\n\t\tlabel: i18n.baseText('variables.table.value'),\n\t\tclasses: ['variables-value-column'],\n\t},\n\t{\n\t\tid: 2,\n\t\tpath: 'usage',\n\t\tlabel: i18n.baseText('variables.table.usage'),\n\t\tclasses: ['variables-usage-column'],\n\t},\n\t...(isFeatureEnabled.value\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: 3,\n\t\t\t\t\tpath: 'actions',\n\t\t\t\t\tlabel: '',\n\t\t\t\t},\n\t\t ]\n\t\t: []),\n]);\n\nconst contextBasedTranslationKeys = computed(() => uiStore.contextBasedTranslationKeys);\n\nconst newlyAddedVariableIds = ref<number[]>([]);\n\nconst nameSortFn = (a: EnvironmentVariable, b: EnvironmentVariable, direction: 'asc' | 'desc') => {\n\tif (`${a.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn -1;\n\t} else if (`${b.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn 1;\n\t} else if (\n\t\tnewlyAddedVariableIds.value.includes(a.id) &&\n\t\tnewlyAddedVariableIds.value.includes(b.id)\n\t) {\n\t\treturn newlyAddedVariableIds.value.indexOf(a.id) - newlyAddedVariableIds.value.indexOf(b.id);\n\t} else if (newlyAddedVariableIds.value.includes(a.id)) {\n\t\treturn -1;\n\t} else if (newlyAddedVariableIds.value.includes(b.id)) {\n\t\treturn 1;\n\t}\n\n\treturn direction === 'asc'\n\t\t? displayName(a).trim().localeCompare(displayName(b).trim())\n\t\t: displayName(b).trim().localeCompare(displayName(a).trim());\n};\nconst sortFns = {\n\tnameAsc: (a: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'asc');\n\t},\n\tnameDesc: (a: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'desc');\n\t},\n};\n\nfunction resetNewVariablesList() {\n\tnewlyAddedVariableIds.value = [];\n}\n\nasync function initialize() {\n\tawait environmentsStore.fetchAllVariables();\n\n\tallVariables.value = [...environmentsStore.variables];\n}\n\nfunction addTemporaryVariable() {\n\tconst temporaryVariable: TemporaryEnvironmentVariable = {\n\t\tid: uid(TEMPORARY_VARIABLE_UID_BASE),\n\t\tkey: '',\n\t\tvalue: '',\n\t};\n\n\tif (layoutRef.value) {\n\t\t// Reset scroll position\n\t\tif (layoutRef.value.$refs.listWrapperRef) {\n\t\t\tlayoutRef.value.$refs.listWrapperRef.scrollTop = 0;\n\t\t}\n\n\t\t// Reset pagination\n\t\tif (layoutRef.value.currentPage !== 1) {\n\t\t\tlayoutRef.value.setCurrentPage(1);\n\t\t}\n\t}\n\n\tallVariables.value.unshift(temporaryVariable);\n\teditMode.value[temporaryVariable.id] = true;\n\n\ttelemetry.track('User clicked add variable button');\n}\n\nasync function saveVariable(data: EnvironmentVariable | TemporaryEnvironmentVariable) {\n\tlet updatedVariable: EnvironmentVariable;\n\n\ttry {\n\t\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\t\tconst { id, ...rest } = data;\n\t\t\tupdatedVariable = await environmentsStore.createVariable(rest);\n\t\t\tallVariables.value.unshift(updatedVariable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tnewlyAddedVariableIds.value.unshift(updatedVariable.id);\n\t\t} else {\n\t\t\tupdatedVariable = await environmentsStore.updateVariable(data as EnvironmentVariable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tallVariables.value.push(updatedVariable);\n\t\t\ttoggleEditing(updatedVariable);\n\t\t}\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.save'));\n\t}\n}\n\nfunction toggleEditing(data: EnvironmentVariable) {\n\teditMode.value = {\n\t\t...editMode.value,\n\t\t[data.id]: !editMode.value[data.id],\n\t};\n}\n\nfunction cancelEditing(data: EnvironmentVariable | TemporaryEnvironmentVariable) {\n\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} else {\n\t\ttoggleEditing(data as EnvironmentVariable);\n\t}\n}\n\nasync function deleteVariable(data: EnvironmentVariable) {\n\ttry {\n\t\tconst confirmed = await message.confirm(\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.message', { interpolate: { name: data.key } }),\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: i18n.baseText('variables.modals.deleteConfirm.confirmButton'),\n\t\t\t\tcancelButtonText: i18n.baseText('variables.modals.deleteConfirm.cancelButton'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmed !== MODAL_CONFIRM) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait environmentsStore.deleteVariable(data);\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.delete'));\n\t}\n}\n\nfunction goToUpgrade() {\n\tvoid uiStore.goToUpgrade('variables', 'upgrade-variables');\n}\n\nfunction displayName(resource: EnvironmentVariable) {\n\treturn resource.key;\n}\n\nonBeforeMount(() => {\n\tsourceControlStoreUnsubscribe = sourceControlStore.$onAction(({ name, after }) => {\n\t\tif (name === 'pullWorkfolder' && after) {\n\t\t\tafter(() => {\n\t\t\t\tvoid initialize();\n\t\t\t});\n\t\t}\n\t});\n});\n\nonBeforeUnmount(() => {\n\tsourceControlStoreUnsubscribe();\n});\n</script>\n\n<template>\n\t<ResourcesListLayout\n\t\tclass=\"variables-view\"\n\t\tref=\"layoutRef\"\n\t\tresource-key=\"variables\"\n\t\t:disabled=\"!isFeatureEnabled\"\n\t\t:resources=\"allVariables\"\n\t\t:initialize=\"initialize\"\n\t\t:shareable=\"false\"\n\t\t:displayName=\"displayName\"\n\t\t:sortFns=\"sortFns\"\n\t\t:sortOptions=\"['nameAsc', 'nameDesc']\"\n\t\t:showFiltersDropdown=\"false\"\n\t\ttype=\"datatable\"\n\t\t:type-props=\"{ columns: datatableColumns }\"\n\t\t@sort=\"resetNewVariablesList\"\n\t\t@click:add=\"addTemporaryVariable\"\n\t>\n\t\t<template #add-button>\n\t\t\t<n8n-tooltip placement=\"top\" :disabled=\"canCreateVariables\">\n\t\t\t\t<div>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"!canCreateVariables\"\n\t\t\t\t\t\t@click=\"addTemporaryVariable\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText(`variables.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #content>\n\t\t\t\t\t<span v-if=\"!isFeatureEnabled\">{{\n\t\t\t\t\t\ti18n.baseText(`variables.add.unavailable${allVariables.length === 0 ? '.empty' : ''}`)\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<span v-else>{{ i18n.baseText('variables.add.onlyOwnerCanCreate') }}</span>\n\t\t\t\t</template>\n\t\t\t</n8n-tooltip>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled\" #preamble>\n\t\t\t<n8n-action-box\n\t\t\t\tclass=\"mb-m\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:buttonText=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\n\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled || (isFeatureEnabled && !canCreateVariables)\" #empty>\n\t\t\t<n8n-action-box\n\t\t\t\tv-if=\"!isFeatureEnabled\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:buttonText=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\n\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t\t<n8n-action-box\n\t\t\t\tv-else-if=\"!canCreateVariables\"\n\t\t\t\tdata-test-id=\"cannot-create-variables\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText('variables.empty.notAllowedToCreate.heading', {\n\t\t\t\t\t\tinterpolate: { name: usersStore.currentUser.firstName },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t\t:description=\"$locale.baseText('variables.empty.notAllowedToCreate.description')\"\n\t\t\t\t@click=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #default=\"{ data }\">\n\t\t\t<VariablesRow\n\t\t\t\t:key=\"data.id\"\n\t\t\t\t:editing=\"editMode[data.id]\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t@save=\"saveVariable\"\n\t\t\t\t@edit=\"toggleEditing\"\n\t\t\t\t@cancel=\"cancelEditing\"\n\t\t\t\t@delete=\"deleteVariable\"\n\t\t\t/>\n\t\t</template>\n\t</ResourcesListLayout>\n</template>\n\n<style lang=\"scss\" module>\n.type-input {\n\t--max-width: 265px;\n}\n\n.sidebarContainer ul {\n\tpadding: 0 !important;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@use 'n8n-design-system/css/common/var.scss';\n\n.variables-view {\n\t:deep(.datatable) {\n\t\ttable {\n\t\t\ttable-layout: fixed;\n\t\t}\n\n\t\tth,\n\t\ttd {\n\t\t\twidth: 25%;\n\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\twidth: 33.33%;\n\t\t\t}\n\n\t\t\t&.variables-value-column,\n\t\t\t&.variables-key-column,\n\t\t\t&.variables-usage-column {\n\t\t\t\t> div {\n\t\t\t\t\twidth: 100%;\n\n\t\t\t\t\t> span {\n\t\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\t\toverflow: hidden;\n\t\t\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\t\theight: 18px;\n\t\t\t\t\t}\n\n\t\t\t\t\t> div {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.variables-usage-column {\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n"],"names":["i18n","useI18n","copyToClipboard","useCopyToClipboard","showMessage","useToast","settingsStore","useSettingsStore","usersStore","useUsersStore","permissions","getVariablesPermissions","modelValue","ref","props","formValidationStatus","formValid","computed","keyInputRef","valueInputRef","usage","isFeatureEnabled","EnterpriseEditionFeature","onMounted","focusFirstInput","keyValidationRules","valueValidationRules","watch","nextTick","updateUsageSyntax","onCancel","emit","onSave","onEdit","onDelete","onValidate","key","value","onUsageClick","_c","_b","_a","TEMPORARY_VARIABLE_UID_BASE","environmentsStore","useEnvironmentsStore","uiStore","useUIStore","telemetry","useTelemetry","message","useMessage","sourceControlStore","useSourceControlStore","sourceControlStoreUnsubscribe","layoutRef","showError","allVariables","editMode","canCreateVariables","datatableColumns","contextBasedTranslationKeys","newlyAddedVariableIds","nameSortFn","a","b","direction","displayName","sortFns","resetNewVariablesList","initialize","addTemporaryVariable","temporaryVariable","uid","saveVariable","data","updatedVariable","id","rest","variable","toggleEditing","error","cancelEditing","deleteVariable","MODAL_CONFIRM","goToUpgrade","resource","onBeforeMount","name","after","onBeforeUnmount"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{m as oe}from"./pinia-af9c3f71.js";import{e as se,g as re}from"./index-1f0f487e.js";import{P as ne}from"./PushConnectionTracker-7d4bf97b.js";import{e as ae}from"./executionsHelpers-f6f8f8af.js";import"./@fortawesome/vue-fontawesome-237f4675.js";import{_ as M,u as X,an as Z,gi as ce,g9 as ie,n as ee,v as le}from"./n8n-6b07beca.js";import{u as P,W as L,p as de}from"./pushConnection-4f2192a6.js";import{d as I,r as v,g,o as l,i as u,j as k,h as p,w as m,e as K,n as a,q as J,b as C,s as $,t as s,O as F,a9 as E,p as y,c as Y,z as ue,Q as pe}from"./vendor-f46c350a.js";import{C as R}from"./vue-chartjs-bdee826a.js";import"./prettier-51497383.js";import"./codemirror-lang-html-n8n-2834c921.js";import"./@n8n/codemirror-lang-sql-c830a767.js";import"./@lezer/common-4a878264.js";import"./lodash-es-bad8e3ee.js";import"./uuid-cf522c50.js";import"./luxon-19e1de07.js";import"./esprima-next-8c7e8ff9.js";import"./@vueuse/core-9fb50532.js";import"./codemirror-lang-n8n-expression-53c11692.js";import"./fast-json-stable-stringify-2d2dc6c9.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-065a6dad.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./@fortawesome/free-solid-svg-icons-49fe6185.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";import"./@jsplumb/core-8d347a89.js";import"./@jsplumb/util-d5a5fff8.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/browser-ui-715581dc.js";import"./chart.js-58383f81.js";import"./flatted-8b14da7d.js";import"./vue-i18n-cb04cc7a.js";import"./@jsplumb/connector-bezier-5b4468a6.js";function te(t){return t.reduce((c,n)=>c+n,0)/t.length}function me(t){return te(t).toFixed(2)}function B(t){return t/1024/1024/1024}const _e=I({__name:"WorkerAccordion.ee",props:{icon:{type:String,default:"tasks"},iconColor:{type:String,default:"black"},initialExpanded:{type:Boolean,default:!0}},setup(t){const n=v(t.initialExpanded);function i(){n.value=!n.value}return(o,d)=>{const e=g("n8n-icon"),h=g("n8n-text");return l(),u("div",{class:a(["accordion",o.$style.container])},[k("div",{class:a({[o.$style.header]:!0,[o.$style.expanded]:n.value}),onClick:i},[p(e,{icon:t.icon,color:t.iconColor,size:"small",class:"mr-2xs"},null,8,["icon","color"]),p(h,{class:a(o.$style.headerText),color:"text-base",size:"small",align:"left",bold:""},{default:m(()=>[K(o.$slots,"title")]),_:3},8,["class"]),p(e,{icon:n.value?"chevron-up":"chevron-down",bold:""},null,8,["icon"])],2),n.value?(l(),u("div",{key:0,class:a({[o.$style.description]:!0,[o.$style.collapsed]:!n.value})},[K(o.$slots,"content")],2)):J("",!0)],2)}}}),he="_container_jb2mu_5",ke="_header_jb2mu_9",ye="_headerText_jb2mu_15",ge="_expanded_jb2mu_19",fe="_description_jb2mu_23",$e={container:he,header:ke,headerText:ye,expanded:ge,description:fe},be={$style:$e},N=M(_e,[["__cssModules",be]]),ve=["href"],we=["href"],Me=I({__name:"WorkerJobAccordion.ee",props:{items:{}},setup(t){const c=t;function n(i){let o=Math.floor((new Date().getTime()-i.getTime())/1e3);const d=Math.floor(o/3600);o-=d*3600;const e=Math.floor(o/60);return o-=e*60,`${d}h ${e}m ${Math.floor(o)}s`}return(i,o)=>{const d=g("n8n-text");return l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!0},{title:m(()=>[$(s(i.$locale.baseText("workerList.item.jobListTitle"))+" ("+s(i.items.length)+") ",1)]),content:m(()=>[c.items.length>0?(l(),u("div",{key:0,class:a(i.$style.accordionItems)},[(l(!0),u(F,null,E(c.items,e=>(l(),u("div",{key:e.executionId,class:a(i.$style.accordionItem)},[k("a",{href:"/workflow/"+e.workflowId+"/executions/"+e.executionId}," Execution "+s(e.executionId)+" - "+s(e.workflowName),9,ve),p(d,{color:"text-base",size:"small",align:"left"},{default:m(()=>{var h;return[$(" | 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,we)],2))),128))],2)):(l(),u("div",{key:1,class:a(i.$style.accordionItems)},[k("span",{class:a(i.$style.empty)},s(i.$locale.baseText("workerList.item.jobList.empty")),3)],2))]),_:1})}}}),Ie="_accordionItems_lupqv_5",Te="_accordionItem_lupqv_5",Le="_empty_lupqv_18",Ce={accordionItems:Ie,accordionItem:Te,empty:Le},Se={$style:Ce},xe=M(Me,[["__cssModules",Se]]),Ae=["onClick"],We=I({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const c=t,n=Z();function i(o){const d=ce(),{showMessage:e}=X();try{d(o),e({title:n.baseText("workerList.item.copyAddressToClipboard"),type:"success"})}catch{}}return(o,d)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:m(()=>[$(s(o.$locale.baseText("workerList.item.netListTitle"))+" ("+s(o.items.length)+") ",1)]),content:m(()=>[c.items.length>0?(l(),u("div",{key:0,class:a(o.$style.accordionItems)},[(l(!0),u(F,null,E(c.items,e=>(l(),u("div",{key:e.address,class:a(o.$style.accordionItem),onClick:h=>i(e.address)},[$(s(e.family)+": ",1),k("span",{class:a(o.$style.clickable)},s(e.address),3),$(" "+s(e.internal?"(internal)":""),1)],10,Ae))),128))],2)):J("",!0)]),_:1}))}}),Ue="_accordionItems_v7u0l_5",Be="_accordionItem_v7u0l_5",je="_clickable_v7u0l_19",De={accordionItems:Ue,accordionItem:Be,clickable:je},He={$style:De},Re=M(We,[["__cssModules",He]]),Pe=I({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var V,q,z;const c=t,n=(b,x,T=0)=>({datasets:[{label:b,backgroundColor:x,data:T?Array(Math.min(L,T)).fill(0):[]}],labels:Array(Math.min(L,T)).fill("")}),i=P(),o=v(void 0),d=v(void 0),e=v(void 0),h=()=>({responsive:!0,maintainAspectRatio:!0,scales:{y:{type:"linear",display:!0,position:"left",min:0,suggestedMax:5}}}),S=h(),r=h();(V=r.scales)!=null&&V.y&&(r.scales.y.suggestedMax=100);const _=B((q=i.workers[c.workerId])==null?void 0:q.totalMem)??1,f=h();(z=f.scales)!=null&&z.y&&(f.scales.y.suggestedMax=_);const w=v(n("Job Count","rgb(255, 111, 92)",L)),W=v(n("Processor Usage","rgb(19, 205, 103)",L)),O=v(n("Memory Usage","rgb(244, 216, 174)",L));return i.$onAction(({name:b,store:x})=>{var T,G;if(b==="updateWorkerStatus"){const j=L-(((T=x.workersHistory[c.workerId])==null?void 0:T.length)??0),A=n("Job Count","rgb(255, 111, 92)",j),D=n("Processor Usage","rgb(19, 205, 103)",j),H=n("Memory Usage","rgb(244, 216, 174)",j);(G=x.workersHistory[c.workerId])==null||G.forEach(U=>{var Q;A.datasets[0].data.push(U.data.runningJobsSummary.length),(Q=A.labels)==null||Q.push(new Date(U.timestamp).toLocaleTimeString()),D.datasets[0].data.push(te(U.data.loadAvg)),D.labels=A.labels,H.datasets[0].data.push(_-B(U.data.freeMem)),H.labels=A.labels}),w.value=A,W.value=D,O.value=H}}),(b,x)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:m(()=>[$(s(b.$locale.baseText("workerList.item.chartsTitle")),1)]),content:m(()=>[k("div",{class:a(b.$style.charts)},[p(y(R),{ref_key:"chartRefJobs",ref:o,type:"line",data:w.value,options:y(S),class:a(b.$style.chart)},null,8,["data","options","class"]),p(y(R),{ref_key:"chartRefCPU",ref:d,type:"line",data:W.value,options:y(r),class:a(b.$style.chart)},null,8,["data","options","class"]),p(y(R),{ref_key:"chartRefMemory",ref:e,type:"line",data:O.value,options:y(f),class:a(b.$style.chart)},null,8,["data","options","class"])],2)]),_:1}))}}),Je="_accordionItems_1k0p0_5",Fe="_accordionItem_1k0p0_5",Ee="_charts_1k0p0_18",Ne="_chart_1k0p0_18",Oe={accordionItems:Je,accordionItem:Fe,charts:Ee,chart:Ne},Ve={$style:Oe},qe=M(Pe,[["__cssModules",Ve]]),ze=k("br",null,null,-1),Ge=I({__name:"WorkerCard.ee",props:{workerId:{}},setup(t){const c=t;let n;const i=P(),o=v("0"),d=v(!1),e=Y(()=>i.getWorkerStatus(c.workerId)),h=Y(()=>{var r;return((r=e.value)==null?void 0:r.interfaces.toSorted((_,f)=>_.family.localeCompare(f.family)))??[]});function S(r){const _=Math.floor(r/86400);r-=_*3600*24;const f=Math.floor(r/3600);r-=f*3600;const w=Math.floor(r/60);return r-=w*60,`${_}d ${f}h ${w}m ${Math.floor(r)}s`}return ue(()=>{n=setInterval(()=>{const r=i.getWorkerLastUpdated(c.workerId);if(!r)return;const _=Math.ceil((Date.now()-r)/1e3);d.value=_>10,o.value=_.toFixed(0)},500)}),pe(()=>{clearInterval(n)}),(r,_)=>{const f=g("n8n-heading"),w=g("n8n-text"),W=g("n8n-card");return e.value?(l(),C(W,{key:0,class:a(r.$style.cardLink)},{header:m(()=>[p(f,{tag:"h2",bold:"",class:a(d.value?[r.$style.cardHeading,r.$style.stale]:[r.$style.cardHeading]),"data-test-id":"worker-card-name"},{default:m(()=>[$(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),ze,$(" Average Load: "+s(y(me)(e.value.loadAvg??[0]))+" | Free Memory: "+s(y(B)(e.value.freeMem).toFixed(2))+"GB / "+s(y(B)(e.value.totalMem).toFixed(2))+"GB "+s(d.value?" (stale)":""),1)]),_:1},8,["class"])]),append:m(()=>[k("div",{class:a(r.$style.cardActions),ref:"cardActions"},null,2)]),default:m(()=>[k("div",{class:a(r.$style.cardDescription)},[p(w,{color:"text-light",size:"small",class:a(r.$style.container)},{default:m(()=>[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(S(e.value.uptime)),1),p(xe,{items:e.value.runningJobsSummary},null,8,["items"]),p(Re,{items:h.value},null,8,["items"]),p(qe,{"worker-id":e.value.workerId},null,8,["worker-id"])]),_:1},8,["class"])],2)]),_:1},8,["class"])):J("",!0)}}}),Qe="_container_124hj_5",Ke="_cardLink_124hj_9",Ye="_cardHeading_124hj_19",Xe="_stale_124hj_25",Ze="_cardDescription_124hj_29",et="_cardActions_124hj_36",tt={container:Qe,cardLink:Ke,cardHeading:Ye,stale:Xe,cardDescription:Ze,cardActions:et},ot={$style:tt},st=M(Ge,[["__cssModules",ot]]),rt=I({name:"WorkerList",mixins:[de,se,re,ae],components:{PushConnectionTracker:ne,WorkerCard:st},props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(){return{i18n:Z(),...X()}},data(){return{isMounting:!0}},mounted(){ie(`n8n - ${this.pageTitle}`),this.isMounting=!1},beforeMount(){window.Cypress===void 0&&(this.pushConnect(),this.orchestrationManagerStore.startWorkerStatusPolling())},beforeUnmount(){window.Cypress===void 0&&(this.orchestrationManagerStore.stopWorkerStatusPolling(),this.pushDisconnect())},computed:{...oe(ee,P),combinedWorkers(){const t=[];for(const c in this.orchestrationManagerStore.workers)t.push(this.orchestrationManagerStore.workers[c]);return t},workerIds(){return Object.keys(this.orchestrationManagerStore.workers)},pageTitle(){return this.i18n.baseText("workerList.pageTitle")}},methods:{averageLoadAvg(t){return(t.reduce((c,n)=>c+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(" ")}}}),nt="_workerListHeader_q7mrl_5",at="_card_q7mrl_12",ct="_tableLoader_q7mrl_16",it={workerListHeader:nt,card:at,tableLoader:ct},lt={key:0},dt={key:1},ut={key:0},pt={key:1};function mt(t,c,n,i,o,d){const e=g("PushConnectionTracker"),h=g("n8n-heading"),S=g("n8n-loading"),r=g("WorkerCard");return l(),u("div",null,[p(e,{class:"actions"}),k("div",{class:a(t.$style.workerListHeader)},[p(h,{tag:"h1",size:"2xlarge"},{default:m(()=>[$(s(t.pageTitle),1)]),_:1})],2),t.isMounting?(l(),u("div",lt,[p(S,{class:a(t.$style.tableLoader),variant:"custom"},null,8,["class"])])):(l(),u("div",dt,[t.workerIds.length===0?(l(),u("div",ut,s(t.$locale.baseText("workerList.empty")),1)):(l(),u("div",pt,[(l(!0),u(F,null,E(t.workerIds,_=>(l(),u("div",{key:_,class:a(t.$style.card)},[p(r,{workerId:_,"data-test-id":"worker-card"},null,8,["workerId"])],2))),128))]))]))])}const _t={$style:it},ht=M(rt,[["render",mt],["__cssModules",_t]]),kt=["href"],yt=I({__name:"WorkerView",setup(t){const c=le(),n=ee(),i=()=>{n.goToUpgrade("source-control","upgrade-source-control")};return(o,d)=>{const e=g("n8n-action-box");return y(c).isQueueModeEnabled&&y(c).isWorkerViewAvailable?(l(),C(ht,{key:0,"data-test-id":"worker-view-licensed"})):(l(),C(e,{key:1,"data-test-id":"worker-view-unlicensed",class:a(o.$style.actionBox),description:o.$locale.baseText("workerList.actionBox.description"),buttonText:o.$locale.baseText("workerList.actionBox.buttonText"),"onClick:button":i},{heading:m(()=>[k("span",null,s(o.$locale.baseText("workerList.actionBox.title")),1)]),description:m(()=>[$(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,kt)]),_:1},8,["class","description","buttonText"]))}}}),gt="_actionBox_wwwe5_5",ft={actionBox:gt},$t={$style:ft},to=M(yt,[["__cssModules",$t]]);export{to as default};
2
- //# sourceMappingURL=WorkerView-55c8d5d4.js.map
1
+ import{m as oe}from"./pinia-af9c3f71.js";import{e as se,g as re}from"./index-ac03fd2d.js";import{P as ne}from"./PushConnectionTracker-7d4bf97b.js";import{e as ae}from"./executionsHelpers-a9dfda49.js";import"./@fortawesome/vue-fontawesome-237f4675.js";import{_ as M,u as X,an as Z,gi as ce,g9 as ie,n as ee,v as le}from"./n8n-6b07beca.js";import{u as P,W as L,p as de}from"./pushConnection-a1ddc3b4.js";import{d as I,r as v,g,o as l,i as u,j as k,h as p,w as m,e as K,n as a,q as J,b as C,s as $,t as s,O as F,a9 as E,p as y,c as Y,z as ue,Q as pe}from"./vendor-f46c350a.js";import{C as R}from"./vue-chartjs-bdee826a.js";import"./prettier-51497383.js";import"./codemirror-lang-html-n8n-2834c921.js";import"./@n8n/codemirror-lang-sql-c830a767.js";import"./@lezer/common-4a878264.js";import"./lodash-es-bad8e3ee.js";import"./uuid-cf522c50.js";import"./luxon-19e1de07.js";import"./esprima-next-8c7e8ff9.js";import"./@vueuse/core-9fb50532.js";import"./codemirror-lang-n8n-expression-53c11692.js";import"./fast-json-stable-stringify-2d2dc6c9.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-065a6dad.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./@fortawesome/free-solid-svg-icons-49fe6185.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";import"./@jsplumb/core-8d347a89.js";import"./@jsplumb/util-d5a5fff8.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/browser-ui-715581dc.js";import"./chart.js-58383f81.js";import"./flatted-8b14da7d.js";import"./vue-i18n-cb04cc7a.js";import"./@jsplumb/connector-bezier-5b4468a6.js";function te(t){return t.reduce((c,n)=>c+n,0)/t.length}function me(t){return te(t).toFixed(2)}function B(t){return t/1024/1024/1024}const _e=I({__name:"WorkerAccordion.ee",props:{icon:{type:String,default:"tasks"},iconColor:{type:String,default:"black"},initialExpanded:{type:Boolean,default:!0}},setup(t){const n=v(t.initialExpanded);function i(){n.value=!n.value}return(o,d)=>{const e=g("n8n-icon"),h=g("n8n-text");return l(),u("div",{class:a(["accordion",o.$style.container])},[k("div",{class:a({[o.$style.header]:!0,[o.$style.expanded]:n.value}),onClick:i},[p(e,{icon:t.icon,color:t.iconColor,size:"small",class:"mr-2xs"},null,8,["icon","color"]),p(h,{class:a(o.$style.headerText),color:"text-base",size:"small",align:"left",bold:""},{default:m(()=>[K(o.$slots,"title")]),_:3},8,["class"]),p(e,{icon:n.value?"chevron-up":"chevron-down",bold:""},null,8,["icon"])],2),n.value?(l(),u("div",{key:0,class:a({[o.$style.description]:!0,[o.$style.collapsed]:!n.value})},[K(o.$slots,"content")],2)):J("",!0)],2)}}}),he="_container_jb2mu_5",ke="_header_jb2mu_9",ye="_headerText_jb2mu_15",ge="_expanded_jb2mu_19",fe="_description_jb2mu_23",$e={container:he,header:ke,headerText:ye,expanded:ge,description:fe},be={$style:$e},N=M(_e,[["__cssModules",be]]),ve=["href"],we=["href"],Me=I({__name:"WorkerJobAccordion.ee",props:{items:{}},setup(t){const c=t;function n(i){let o=Math.floor((new Date().getTime()-i.getTime())/1e3);const d=Math.floor(o/3600);o-=d*3600;const e=Math.floor(o/60);return o-=e*60,`${d}h ${e}m ${Math.floor(o)}s`}return(i,o)=>{const d=g("n8n-text");return l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!0},{title:m(()=>[$(s(i.$locale.baseText("workerList.item.jobListTitle"))+" ("+s(i.items.length)+") ",1)]),content:m(()=>[c.items.length>0?(l(),u("div",{key:0,class:a(i.$style.accordionItems)},[(l(!0),u(F,null,E(c.items,e=>(l(),u("div",{key:e.executionId,class:a(i.$style.accordionItem)},[k("a",{href:"/workflow/"+e.workflowId+"/executions/"+e.executionId}," Execution "+s(e.executionId)+" - "+s(e.workflowName),9,ve),p(d,{color:"text-base",size:"small",align:"left"},{default:m(()=>{var h;return[$(" | 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,we)],2))),128))],2)):(l(),u("div",{key:1,class:a(i.$style.accordionItems)},[k("span",{class:a(i.$style.empty)},s(i.$locale.baseText("workerList.item.jobList.empty")),3)],2))]),_:1})}}}),Ie="_accordionItems_lupqv_5",Te="_accordionItem_lupqv_5",Le="_empty_lupqv_18",Ce={accordionItems:Ie,accordionItem:Te,empty:Le},Se={$style:Ce},xe=M(Me,[["__cssModules",Se]]),Ae=["onClick"],We=I({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const c=t,n=Z();function i(o){const d=ce(),{showMessage:e}=X();try{d(o),e({title:n.baseText("workerList.item.copyAddressToClipboard"),type:"success"})}catch{}}return(o,d)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:m(()=>[$(s(o.$locale.baseText("workerList.item.netListTitle"))+" ("+s(o.items.length)+") ",1)]),content:m(()=>[c.items.length>0?(l(),u("div",{key:0,class:a(o.$style.accordionItems)},[(l(!0),u(F,null,E(c.items,e=>(l(),u("div",{key:e.address,class:a(o.$style.accordionItem),onClick:h=>i(e.address)},[$(s(e.family)+": ",1),k("span",{class:a(o.$style.clickable)},s(e.address),3),$(" "+s(e.internal?"(internal)":""),1)],10,Ae))),128))],2)):J("",!0)]),_:1}))}}),Ue="_accordionItems_v7u0l_5",Be="_accordionItem_v7u0l_5",je="_clickable_v7u0l_19",De={accordionItems:Ue,accordionItem:Be,clickable:je},He={$style:De},Re=M(We,[["__cssModules",He]]),Pe=I({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var V,q,z;const c=t,n=(b,x,T=0)=>({datasets:[{label:b,backgroundColor:x,data:T?Array(Math.min(L,T)).fill(0):[]}],labels:Array(Math.min(L,T)).fill("")}),i=P(),o=v(void 0),d=v(void 0),e=v(void 0),h=()=>({responsive:!0,maintainAspectRatio:!0,scales:{y:{type:"linear",display:!0,position:"left",min:0,suggestedMax:5}}}),S=h(),r=h();(V=r.scales)!=null&&V.y&&(r.scales.y.suggestedMax=100);const _=B((q=i.workers[c.workerId])==null?void 0:q.totalMem)??1,f=h();(z=f.scales)!=null&&z.y&&(f.scales.y.suggestedMax=_);const w=v(n("Job Count","rgb(255, 111, 92)",L)),W=v(n("Processor Usage","rgb(19, 205, 103)",L)),O=v(n("Memory Usage","rgb(244, 216, 174)",L));return i.$onAction(({name:b,store:x})=>{var T,G;if(b==="updateWorkerStatus"){const j=L-(((T=x.workersHistory[c.workerId])==null?void 0:T.length)??0),A=n("Job Count","rgb(255, 111, 92)",j),D=n("Processor Usage","rgb(19, 205, 103)",j),H=n("Memory Usage","rgb(244, 216, 174)",j);(G=x.workersHistory[c.workerId])==null||G.forEach(U=>{var Q;A.datasets[0].data.push(U.data.runningJobsSummary.length),(Q=A.labels)==null||Q.push(new Date(U.timestamp).toLocaleTimeString()),D.datasets[0].data.push(te(U.data.loadAvg)),D.labels=A.labels,H.datasets[0].data.push(_-B(U.data.freeMem)),H.labels=A.labels}),w.value=A,W.value=D,O.value=H}}),(b,x)=>(l(),C(N,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:m(()=>[$(s(b.$locale.baseText("workerList.item.chartsTitle")),1)]),content:m(()=>[k("div",{class:a(b.$style.charts)},[p(y(R),{ref_key:"chartRefJobs",ref:o,type:"line",data:w.value,options:y(S),class:a(b.$style.chart)},null,8,["data","options","class"]),p(y(R),{ref_key:"chartRefCPU",ref:d,type:"line",data:W.value,options:y(r),class:a(b.$style.chart)},null,8,["data","options","class"]),p(y(R),{ref_key:"chartRefMemory",ref:e,type:"line",data:O.value,options:y(f),class:a(b.$style.chart)},null,8,["data","options","class"])],2)]),_:1}))}}),Je="_accordionItems_1k0p0_5",Fe="_accordionItem_1k0p0_5",Ee="_charts_1k0p0_18",Ne="_chart_1k0p0_18",Oe={accordionItems:Je,accordionItem:Fe,charts:Ee,chart:Ne},Ve={$style:Oe},qe=M(Pe,[["__cssModules",Ve]]),ze=k("br",null,null,-1),Ge=I({__name:"WorkerCard.ee",props:{workerId:{}},setup(t){const c=t;let n;const i=P(),o=v("0"),d=v(!1),e=Y(()=>i.getWorkerStatus(c.workerId)),h=Y(()=>{var r;return((r=e.value)==null?void 0:r.interfaces.toSorted((_,f)=>_.family.localeCompare(f.family)))??[]});function S(r){const _=Math.floor(r/86400);r-=_*3600*24;const f=Math.floor(r/3600);r-=f*3600;const w=Math.floor(r/60);return r-=w*60,`${_}d ${f}h ${w}m ${Math.floor(r)}s`}return ue(()=>{n=setInterval(()=>{const r=i.getWorkerLastUpdated(c.workerId);if(!r)return;const _=Math.ceil((Date.now()-r)/1e3);d.value=_>10,o.value=_.toFixed(0)},500)}),pe(()=>{clearInterval(n)}),(r,_)=>{const f=g("n8n-heading"),w=g("n8n-text"),W=g("n8n-card");return e.value?(l(),C(W,{key:0,class:a(r.$style.cardLink)},{header:m(()=>[p(f,{tag:"h2",bold:"",class:a(d.value?[r.$style.cardHeading,r.$style.stale]:[r.$style.cardHeading]),"data-test-id":"worker-card-name"},{default:m(()=>[$(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),ze,$(" Average Load: "+s(y(me)(e.value.loadAvg??[0]))+" | Free Memory: "+s(y(B)(e.value.freeMem).toFixed(2))+"GB / "+s(y(B)(e.value.totalMem).toFixed(2))+"GB "+s(d.value?" (stale)":""),1)]),_:1},8,["class"])]),append:m(()=>[k("div",{class:a(r.$style.cardActions),ref:"cardActions"},null,2)]),default:m(()=>[k("div",{class:a(r.$style.cardDescription)},[p(w,{color:"text-light",size:"small",class:a(r.$style.container)},{default:m(()=>[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(S(e.value.uptime)),1),p(xe,{items:e.value.runningJobsSummary},null,8,["items"]),p(Re,{items:h.value},null,8,["items"]),p(qe,{"worker-id":e.value.workerId},null,8,["worker-id"])]),_:1},8,["class"])],2)]),_:1},8,["class"])):J("",!0)}}}),Qe="_container_124hj_5",Ke="_cardLink_124hj_9",Ye="_cardHeading_124hj_19",Xe="_stale_124hj_25",Ze="_cardDescription_124hj_29",et="_cardActions_124hj_36",tt={container:Qe,cardLink:Ke,cardHeading:Ye,stale:Xe,cardDescription:Ze,cardActions:et},ot={$style:tt},st=M(Ge,[["__cssModules",ot]]),rt=I({name:"WorkerList",mixins:[de,se,re,ae],components:{PushConnectionTracker:ne,WorkerCard:st},props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(){return{i18n:Z(),...X()}},data(){return{isMounting:!0}},mounted(){ie(`n8n - ${this.pageTitle}`),this.isMounting=!1},beforeMount(){window.Cypress===void 0&&(this.pushConnect(),this.orchestrationManagerStore.startWorkerStatusPolling())},beforeUnmount(){window.Cypress===void 0&&(this.orchestrationManagerStore.stopWorkerStatusPolling(),this.pushDisconnect())},computed:{...oe(ee,P),combinedWorkers(){const t=[];for(const c in this.orchestrationManagerStore.workers)t.push(this.orchestrationManagerStore.workers[c]);return t},workerIds(){return Object.keys(this.orchestrationManagerStore.workers)},pageTitle(){return this.i18n.baseText("workerList.pageTitle")}},methods:{averageLoadAvg(t){return(t.reduce((c,n)=>c+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(" ")}}}),nt="_workerListHeader_q7mrl_5",at="_card_q7mrl_12",ct="_tableLoader_q7mrl_16",it={workerListHeader:nt,card:at,tableLoader:ct},lt={key:0},dt={key:1},ut={key:0},pt={key:1};function mt(t,c,n,i,o,d){const e=g("PushConnectionTracker"),h=g("n8n-heading"),S=g("n8n-loading"),r=g("WorkerCard");return l(),u("div",null,[p(e,{class:"actions"}),k("div",{class:a(t.$style.workerListHeader)},[p(h,{tag:"h1",size:"2xlarge"},{default:m(()=>[$(s(t.pageTitle),1)]),_:1})],2),t.isMounting?(l(),u("div",lt,[p(S,{class:a(t.$style.tableLoader),variant:"custom"},null,8,["class"])])):(l(),u("div",dt,[t.workerIds.length===0?(l(),u("div",ut,s(t.$locale.baseText("workerList.empty")),1)):(l(),u("div",pt,[(l(!0),u(F,null,E(t.workerIds,_=>(l(),u("div",{key:_,class:a(t.$style.card)},[p(r,{workerId:_,"data-test-id":"worker-card"},null,8,["workerId"])],2))),128))]))]))])}const _t={$style:it},ht=M(rt,[["render",mt],["__cssModules",_t]]),kt=["href"],yt=I({__name:"WorkerView",setup(t){const c=le(),n=ee(),i=()=>{n.goToUpgrade("source-control","upgrade-source-control")};return(o,d)=>{const e=g("n8n-action-box");return y(c).isQueueModeEnabled&&y(c).isWorkerViewAvailable?(l(),C(ht,{key:0,"data-test-id":"worker-view-licensed"})):(l(),C(e,{key:1,"data-test-id":"worker-view-unlicensed",class:a(o.$style.actionBox),description:o.$locale.baseText("workerList.actionBox.description"),buttonText:o.$locale.baseText("workerList.actionBox.buttonText"),"onClick:button":i},{heading:m(()=>[k("span",null,s(o.$locale.baseText("workerList.actionBox.title")),1)]),description:m(()=>[$(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,kt)]),_:1},8,["class","description","buttonText"]))}}}),gt="_actionBox_wwwe5_5",ft={actionBox:gt},$t={$style:ft},to=M(yt,[["__cssModules",$t]]);export{to as default};
2
+ //# sourceMappingURL=WorkerView-5b9d29af.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerView-55c8d5d4.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=\"copyToClipboard(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 { useCopyToClipboard, useToast, useI18n } from '@/composables';\n\nconst props = defineProps<{\n\titems: IPushDataWorkerStatusPayload['interfaces'];\n}>();\n\nconst i18n = useI18n();\n\nfunction copyToClipboard(content: string) {\n\tconst copyToClipboardFn = useCopyToClipboard();\n\tconst { showMessage } = useToast();\n\n\ttry {\n\t\tcopyToClipboardFn(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 :class=\"$style.cardLink\" v-if=\"worker\">\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 :class=\"$style.cardActions\" ref=\"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=\"isMounting\">\n\t\t\t<n8n-loading :class=\"$style.tableLoader\" variant=\"custom\" />\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 :workerId=\"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 { externalHooks } from '@/mixins/externalHooks';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { executionHelpers } from '@/mixins/executionsHelpers';\nimport { useI18n, useToast } from '@/composables';\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';\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\tmixins: [pushConnection, externalHooks, genericHelpers, executionHelpers],\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/naming-convention\n\tcomponents: { PushConnectionTracker, WorkerCard },\n\tprops: {\n\t\tautoRefreshEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst i18n = useI18n();\n\t\treturn {\n\t\t\ti18n,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisMounting: true,\n\t\t};\n\t},\n\tmounted() {\n\t\tsetPageTitle(`n8n - ${this.pageTitle}`);\n\t\tthis.isMounting = false;\n\t},\n\tbeforeMount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.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.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\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:buttonText=\"$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('source-control', 'upgrade-source-control');\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","toggle","runningSince","started","seconds","hrs","mnts","i18n","useI18n","copyToClipboard","content","copyToClipboardFn","useCopyToClipboard","showMessage","useToast","blankDataSet","label","color","prefill","WORKER_HISTORY_LENGTH","orchestrationStore","useOrchestrationStore","chartRefJobs","chartRefCPU","chartRefMemory","optionsBase","optionsJobs","optionsCPU","_a","maxMemory","_b","props","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","pushConnection","externalHooks","genericHelpers","executionHelpers","PushConnectionTracker","WorkerCard","setPageTitle","mapStores","useUIStore","returnData","workerId","payload","_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_PushConnectionTracker","_createElementVNode","_normalizeClass","_ctx","_component_n8n_heading","_hoisted_1","_component_n8n_loading","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_Fragment","_renderList","_component_WorkerCard","settingsStore","useSettingsStore","uiStore","goToUpgrade"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerView-5b9d29af.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=\"copyToClipboard(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 { useCopyToClipboard, useToast, useI18n } from '@/composables';\n\nconst props = defineProps<{\n\titems: IPushDataWorkerStatusPayload['interfaces'];\n}>();\n\nconst i18n = useI18n();\n\nfunction copyToClipboard(content: string) {\n\tconst copyToClipboardFn = useCopyToClipboard();\n\tconst { showMessage } = useToast();\n\n\ttry {\n\t\tcopyToClipboardFn(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 :class=\"$style.cardLink\" v-if=\"worker\">\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 :class=\"$style.cardActions\" ref=\"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=\"isMounting\">\n\t\t\t<n8n-loading :class=\"$style.tableLoader\" variant=\"custom\" />\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 :workerId=\"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 { externalHooks } from '@/mixins/externalHooks';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { executionHelpers } from '@/mixins/executionsHelpers';\nimport { useI18n, useToast } from '@/composables';\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';\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\tmixins: [pushConnection, externalHooks, genericHelpers, executionHelpers],\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/naming-convention\n\tcomponents: { PushConnectionTracker, WorkerCard },\n\tprops: {\n\t\tautoRefreshEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst i18n = useI18n();\n\t\treturn {\n\t\t\ti18n,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisMounting: true,\n\t\t};\n\t},\n\tmounted() {\n\t\tsetPageTitle(`n8n - ${this.pageTitle}`);\n\t\tthis.isMounting = false;\n\t},\n\tbeforeMount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.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.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\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:buttonText=\"$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('source-control', 'upgrade-source-control');\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","toggle","runningSince","started","seconds","hrs","mnts","i18n","useI18n","copyToClipboard","content","copyToClipboardFn","useCopyToClipboard","showMessage","useToast","blankDataSet","label","color","prefill","WORKER_HISTORY_LENGTH","orchestrationStore","useOrchestrationStore","chartRefJobs","chartRefCPU","chartRefMemory","optionsBase","optionsJobs","optionsCPU","_a","maxMemory","_b","props","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","pushConnection","externalHooks","genericHelpers","executionHelpers","PushConnectionTracker","WorkerCard","setPageTitle","mapStores","useUIStore","returnData","workerId","payload","_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_PushConnectionTracker","_createElementVNode","_normalizeClass","_ctx","_component_n8n_heading","_hoisted_1","_component_n8n_loading","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_Fragment","_renderList","_component_WorkerCard","settingsStore","useSettingsStore","uiStore","goToUpgrade"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import"./@fortawesome/vue-fontawesome-237f4675.js";import{u as m,L as A,n as T,d1 as _,_ as b}from"./n8n-6b07beca.js";import{w}from"./workflowActivate-417a26ee.js";import{m as y}from"./pinia-af9c3f71.js";import{d as W,g as s,ar as S,o as r,i as f,j as l,b as v,w as e,n as $,h as a,q as N,s as k,t as n,Y as C}from"./vendor-f46c350a.js";const E=W({name:"WorkflowActivator",props:["workflowActive","workflowId"],mixins:[w],setup(o){var t,i;return{...m(),...(i=(t=w).setup)==null?void 0:i.call(t,o)}},computed:{...y(T,A),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 _(this.workflowsStore.workflowTriggerNodes).length>0}},methods:{async activeChanged(o){return 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})}}}),I="_activeStatusText_1dwsh_5",B={activeStatusText:I};const M={class:"workflow-activator"},V={key:0,class:"could-not-be-started"},x=["innerHTML"];function D(o,t,i,H,L,z){const c=s("n8n-text"),u=s("el-switch"),d=s("n8n-tooltip"),p=s("font-awesome-icon"),h=S("loading");return r(),f("div",M,[l("div",{class:$(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(r(),v(c,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[k(n(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(r(),v(c,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[k(n(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),a(d,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[l("div",null,n(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[C(a(u,{modelValue:o.workflowActive,"onUpdate:modelValue":o.activeChanged,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"},null,8,["modelValue","onUpdate:modelValue","title","disabled","active-color"]),[[h,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(r(),f("div",V,[a(d,{placement:"top"},{content:e(()=>[l("div",{onClick:t[0]||(t[0]=(...g)=>o.displayActivationError&&o.displayActivationError(...g)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,x)]),default:e(()=>[a(p,{onClick:o.displayActivationError,icon:"exclamation-triangle"},null,8,["onClick"])]),_:1})])):N("",!0)])}const U={$style:B},J=b(E,[["render",D],["__cssModules",U],["__scopeId","data-v-87330e39"]]);export{J as W};
2
- //# sourceMappingURL=WorkflowActivator-8fba9207.js.map
1
+ import"./@fortawesome/vue-fontawesome-237f4675.js";import{u as m,L as A,n as T,d1 as _,_ as b}from"./n8n-6b07beca.js";import{w}from"./workflowActivate-c971eb19.js";import{m as y}from"./pinia-af9c3f71.js";import{d as W,g as s,ar as S,o as r,i as f,j as l,b as v,w as e,n as $,h as a,q as N,s as k,t as n,Y as C}from"./vendor-f46c350a.js";const E=W({name:"WorkflowActivator",props:["workflowActive","workflowId"],mixins:[w],setup(o){var t,i;return{...m(),...(i=(t=w).setup)==null?void 0:i.call(t,o)}},computed:{...y(T,A),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 _(this.workflowsStore.workflowTriggerNodes).length>0}},methods:{async activeChanged(o){return 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})}}}),I="_activeStatusText_1dwsh_5",B={activeStatusText:I};const M={class:"workflow-activator"},V={key:0,class:"could-not-be-started"},x=["innerHTML"];function D(o,t,i,H,L,z){const c=s("n8n-text"),u=s("el-switch"),d=s("n8n-tooltip"),p=s("font-awesome-icon"),h=S("loading");return r(),f("div",M,[l("div",{class:$(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(r(),v(c,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[k(n(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(r(),v(c,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[k(n(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),a(d,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[l("div",null,n(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[C(a(u,{modelValue:o.workflowActive,"onUpdate:modelValue":o.activeChanged,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"},null,8,["modelValue","onUpdate:modelValue","title","disabled","active-color"]),[[h,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(r(),f("div",V,[a(d,{placement:"top"},{content:e(()=>[l("div",{onClick:t[0]||(t[0]=(...g)=>o.displayActivationError&&o.displayActivationError(...g)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,x)]),default:e(()=>[a(p,{onClick:o.displayActivationError,icon:"exclamation-triangle"},null,8,["onClick"])]),_:1})])):N("",!0)])}const U={$style:B},J=b(E,[["render",D],["__cssModules",U],["__scopeId","data-v-87330e39"]]);export{J as W};
2
+ //# sourceMappingURL=WorkflowActivator-163f4fb5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowActivator-8fba9207.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:modelValue=\"workflowActive\"\n\t\t\t\t@update:modelValue=\"activeChanged\"\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>\n\t\t\t</el-switch>\n\t\t</n8n-tooltip>\n\n\t\t<div class=\"could-not-be-started\" v-if=\"couldNotBeStarted\">\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 @click=\"displayActivationError\" icon=\"exclamation-triangle\" />\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { useToast } from '@/composables';\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';\n\nexport default defineComponent({\n\tname: 'WorkflowActivator',\n\tprops: ['workflowActive', 'workflowId'],\n\tmixins: [workflowActivate],\n\tsetup(props) {\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),\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 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","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-163f4fb5.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:modelValue=\"workflowActive\"\n\t\t\t\t@update:modelValue=\"activeChanged\"\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>\n\t\t\t</el-switch>\n\t\t</n8n-tooltip>\n\n\t\t<div class=\"could-not-be-started\" v-if=\"couldNotBeStarted\">\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 @click=\"displayActivationError\" icon=\"exclamation-triangle\" />\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { useToast } from '@/composables';\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';\n\nexport default defineComponent({\n\tname: 'WorkflowActivator',\n\tprops: ['workflowActive', 'workflowId'],\n\tmixins: [workflowActivate],\n\tsetup(props) {\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),\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 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","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{R as H}from"./ResourcesListLayout-df5d1ba9.js";import{a2 as U,u as j,R as q,L as F,q as V,n as I,v as M,T as x,y as Q,x as _,dx as Y,db as Z,a1 as G,_ as z,bn as J,z as X,Q as ee}from"./n8n-6b07beca.js";import"./@fortawesome/vue-fontawesome-237f4675.js";import{W as te}from"./WorkflowActivator-8fba9207.js";import{m as B}from"./pinia-af9c3f71.js";import{l as se,g as ae,T as oe}from"./index-1f0f487e.js";import{d as R,g as s,o as p,b as C,w as a,h as o,s as f,t as n,n as w,j as g,q as E,a4 as re,Y as D,Z as L,i as $,a9 as ie,O as ne}from"./vendor-f46c350a.js";import"./lodash-es-bad8e3ee.js";import"./esprima-next-8c7e8ff9.js";import"./luxon-19e1de07.js";import"./flatted-8b14da7d.js";import"./@vueuse/core-9fb50532.js";import"./uuid-cf522c50.js";import"./vue-i18n-cb04cc7a.js";import"./@jsplumb/util-d5a5fff8.js";import"./@jsplumb/core-8d347a89.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-5b4468a6.js";import"./@jsplumb/browser-ui-715581dc.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./workflowActivate-417a26ee.js";import"./prettier-51497383.js";import"./codemirror-lang-html-n8n-2834c921.js";import"./@n8n/codemirror-lang-sql-c830a767.js";import"./@lezer/common-4a878264.js";import"./codemirror-lang-n8n-expression-53c11692.js";import"./fast-json-stable-stringify-2d2dc6c9.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-065a6dad.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-49fe6185.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";import"./chart.js-58383f81.js";const m={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},le=R({data(){return{EnterpriseEditionFeature:U}},setup(){return{...j(),...q()}},components:{TimeAgo:se,WorkflowActivator:te},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWith:[],ownedBy:{},versionId:""})},readOnly:{type:Boolean,default:!1}},computed:{...B(M,I,V,F),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return x(this.currentUser,this.data)},actions(){const e=[{label:this.$locale.baseText("workflows.item.open"),value:m.OPEN},{label:this.$locale.baseText("workflows.item.share"),value:m.SHARE}];return this.readOnly||e.push({label:this.$locale.baseText("workflows.item.duplicate"),value:m.DUPLICATE}),this.workflowPermissions.delete&&!this.readOnly&&e.push({label:this.$locale.baseText("workflows.item.delete"),value:m.DELETE}),e},formattedCreatedAtDate(){const e=new Date().getFullYear();return Q(this.data.createdAt,`d mmmm${this.data.createdAt.startsWith(e)?"":", yyyy"}`)}},methods:{async onClick(e){var t;if(!(this.$refs.cardActions===e.target||(t=this.$refs.cardActions)!=null&&t.contains(e.target))){if(e.metaKey||e.ctrlKey){const r=this.$router.resolve({name:_.WORKFLOW,params:{name:this.data.id}});window.open(r.href,"_blank");return}await this.$router.push({name:_.WORKFLOW,params:{name:this.data.id}})}},onClickTag(e,t){t.stopPropagation(),this.$emit("click:tag",e,t)},onExpandTags(){this.$emit("expand:tags")},async onAction(e){if(e===m.OPEN)await this.onClick();else if(e===m.DUPLICATE)this.uiStore.openModalWithData({name:Y,data:{id:this.data.id,name:this.data.name,tags:(this.data.tags||[]).map(t=>t.id)}});else if(e===m.SHARE)this.uiStore.openModalWithData({name:Z,data:{id:this.data.id}}),this.$telemetry.track("User opened sharing modal",{workflow_id:this.data.id,user_id_sharer:this.currentUser.id,sub_view:this.$route.name===_.WORKFLOWS?"Workflows listing":"Workflow editor"});else if(e===m.DELETE){if(await this.confirm(this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.message",{interpolate:{workflowName:this.data.name}}),this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.headline"),{type:"warning",confirmButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.confirmButtonText"),cancelButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.cancelButtonText")})!==G)return;try{await this.workflowsStore.deleteWorkflow(this.data.id)}catch(r){this.showError(r,this.$locale.baseText("generic.deleteWorkflowError"));return}this.showMessage({title:this.$locale.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}}}),de="_cardLink_523op_5",ce="_cardHeading_523op_15",ue="_cardDescription_523op_21",fe="_cardActions_523op_28",me={cardLink:de,cardHeading:ce,cardDescription:ue,cardActions:fe},pe={key:0};function he(e,t,r,l,d,i){const y=s("n8n-heading"),k=s("time-ago"),h=s("n8n-tags"),v=s("n8n-text"),S=s("n8n-badge"),W=s("enterprise-edition"),A=s("workflow-activator"),T=s("n8n-action-toggle"),O=s("n8n-card");return p(),C(O,{class:w(e.$style.cardLink),onClick:e.onClick},{header:a(()=>[o(y,{tag:"h2",bold:"",class:w(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:a(()=>[f(n(e.data.name),1)]),_:1},8,["class"])]),append:a(()=>[g("div",{class:w(e.$style.cardActions),ref:"cardActions"},[o(W,{features:[e.EnterpriseEditionFeature.Sharing]},{default:a(()=>[e.workflowPermissions.isOwner?(p(),C(S,{key:0,class:"mr-xs",theme:"tertiary",bold:""},{default:a(()=>[f(n(e.$locale.baseText("workflows.item.owner")),1)]),_:1})):E("",!0)]),_:1},8,["features"]),o(A,{class:"mr-s","workflow-active":e.data.active,"workflow-id":e.data.id,"data-test-id":"workflow-card-activator"},null,8,["workflow-active","workflow-id"]),o(T,{actions:e.actions,theme:"dark",onAction:e.onAction,onClick:t[0]||(t[0]=re(()=>{},["stop"])),"data-test-id":"workflow-card-actions"},null,8,["actions","onAction"])],2)]),default:a(()=>[g("div",{class:w(e.$style.cardDescription)},[o(v,{color:"text-light",size:"small"},{default:a(()=>[D(g("span",null,[f(n(e.$locale.baseText("workflows.item.updated"))+" ",1),o(k,{date:e.data.updatedAt},null,8,["date"]),f(" | ")],512),[[L,e.data]]),D(g("span",{class:"mr-2xs"},n(e.$locale.baseText("workflows.item.created"))+" "+n(e.formattedCreatedAtDate),513),[[L,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?D((p(),$("span",pe,[o(h,{tags:e.data.tags,truncateAt:3,truncate:"","onClick:tag":e.onClickTag,onExpand:e.onExpandTags,"data-test-id":"workflow-card-tags"},null,8,["tags","onClick:tag","onExpand"])],512)),[[L,e.data]]):E("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const we={$style:me},ge=z(le,[["render",he],["__cssModules",we]]),b={ACTIVE:!0,DEACTIVATED:!1,ALL:""},ke=R({name:"WorkflowsView",mixins:[ae],components:{ResourcesListLayout:H,WorkflowCard:ge,TagsDropdown:oe},data(){return{filters:{search:"",ownedBy:"",sharedWith:"",status:b.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...B(M,I,V,F,ee,X,J),currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(U.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:b.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:b.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:b.DEACTIVATED}]}},methods:{addWorkflow(){this.uiStore.nodeViewInitialized=!1,this.$router.push({name:_.NEW_WORKFLOW}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},async initialize(){await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows(),this.workflowsStore.fetchActiveWorkflows(),this.credentialsStore.fetchAllCredentials()])},onClickTag(e,t){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,t,r){return this.saveFiltersOnQueryString(),this.settingsStore.areTagsEnabled&&t.tags.length>0&&(r=r&&t.tags.every(l=>{var d;return(d=e.tags)==null?void 0:d.find(i=>typeof i=="object"?`${i.id}`==`${l}`:`${i}`==`${l}`)})),t.status!==""&&(r=r&&e.active===t.status),r},sendFiltersTelemetry(e){this.$refs.layout.sendFiltersTelemetry(e)},saveFiltersOnQueryString(){const e={};this.filters.search&&(e.search=this.filters.search),typeof this.filters.status!="string"&&(e.status=this.filters.status.toString()),this.filters.tags.length&&(e.tags=this.filters.tags.join(",")),this.filters.ownedBy&&(e.ownedBy=this.filters.ownedBy),this.filters.sharedWith&&(e.sharedWith=this.filters.sharedWith),this.$router.replace({name:_.WORKFLOWS,query:e})},isValidUserId(e){return Object.keys(this.usersStore.users).includes(e)},setFiltersFromQueryString(){const{tags:e,status:t,search:r,ownedBy:l,sharedWith:d}=this.$route.query,i={};if(l&&typeof l=="string"&&this.isValidUserId(l)&&(i.ownedBy=l),d&&typeof d=="string"&&this.isValidUserId(d)&&(i.sharedWith=d),r&&typeof r=="string"&&(i.search=r),e&&typeof e=="string"){const y=this.tagsStore.allTags.map(h=>h.id),k=e.split(",").filter(h=>y.includes(h));k.length&&(i.tags=k)}t&&typeof t=="string"&&[b.ACTIVE.toString(),b.DEACTIVATED.toString()].includes(t)&&(i.status=t==="true"),Object.keys(i).length&&(this.filters={...this.filters,...i})}},watch:{"filters.tags"(){this.sendFiltersTelemetry("tags")}},mounted(){this.setFiltersFromQueryString(),this.usersStore.showPersonalizationSurvey(),this.sourceControlStoreUnsubscribe=this.sourceControlStore.$onAction(({name:e,after:t})=>{e==="pullWorkfolder"&&t&&t(()=>{this.initialize()})})},beforeUnmount(){this.sourceControlStoreUnsubscribe()}}),be=ke,ye="_actionsContainer_51pcb_5",_e="_emptyStateCard_51pcb_10",Se="_emptyStateCardIcon_51pcb_23",Te={actionsContainer:ye,emptyStateCard:_e,emptyStateCardIcon:Se},$e={class:"text-center mt-s"},Ce={key:0,class:"mb-s"},Ee={class:"mb-s"};function ve(e,t,r,l,d,i){const y=s("n8n-button"),k=s("n8n-tooltip"),h=s("workflow-card"),v=s("n8n-heading"),S=s("n8n-text"),W=s("n8n-icon"),A=s("n8n-card"),T=s("n8n-input-label"),O=s("TagsDropdown"),N=s("n8n-option"),P=s("n8n-select"),K=s("resources-list-layout");return p(),C(K,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},"show-aside":e.allWorkflows.length>0,shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":t[0]||(t[0]=c=>e.filters=c)},{"add-button":a(({disabled:c})=>[o(k,{disabled:!e.readOnlyEnv},{content:a(()=>[f(n(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")),1)]),default:a(()=>[g("div",null,[o(y,{size:"large",block:"",disabled:c,onClick:e.addWorkflow,"data-test-id":"resources-list-add"},{default:a(()=>[f(n(e.$locale.baseText("workflows.add")),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:a(({data:c,updateItemSize:u})=>[o(h,{"data-test-id":"resources-list-item",class:"mb-2xs",data:c,"onExpand:tags":Ae=>u(c),"onClick:tag":e.onClickTag,readOnly:e.readOnlyEnv},null,8,["data","onExpand:tags","onClick:tag","readOnly"])]),empty:a(()=>[g("div",$e,[o(v,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:a(()=>[f(n(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),o(S,{size:"large",color:"text-base"},{default:a(()=>[f(n(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?E("",!0):(p(),$("div",{key:0,class:w(["text-center","mt-2xl",e.$style.actionsContainer])},[o(A,{class:w(e.$style.emptyStateCard),hoverable:"",onClick:e.addWorkflow,"data-test-id":"new-workflow-card"},{default:a(()=>[o(W,{class:w(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),o(S,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[f(n(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]),filters:a(({setKeyValue:c})=>[e.settingsStore.areTagsEnabled?(p(),$("div",Ce,[o(T,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(O,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),modelValue:e.filters.tags,createEnabled:!1,"onUpdate:modelValue":u=>c("tags",u)},null,8,["placeholder","modelValue","onUpdate:modelValue"])])):E("",!0),g("div",Ee,[o(T,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(P,{"data-test-id":"status-dropdown",modelValue:e.filters.status,"onUpdate:modelValue":u=>c("status",u)},{default:a(()=>[(p(!0),$(ne,null,ie(e.statusFilterOptions,u=>(p(),C(N,{key:u.label,label:u.label,value:u.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","show-aside","shareable","initialize","disabled","onClick:add"])}const We={$style:Te},dt=z(be,[["render",ve],["__cssModules",We]]);export{dt as default};
2
- //# sourceMappingURL=WorkflowsView-323b177e.js.map
1
+ import{R as H}from"./ResourcesListLayout-88dfcefc.js";import{a2 as U,u as j,R as q,L as F,q as V,n as I,v as M,T as x,y as Q,x as _,dx as Y,db as Z,a1 as G,_ as z,bn as J,z as X,Q as ee}from"./n8n-6b07beca.js";import"./@fortawesome/vue-fontawesome-237f4675.js";import{W as te}from"./WorkflowActivator-163f4fb5.js";import{m as B}from"./pinia-af9c3f71.js";import{l as se,g as ae,T as oe}from"./index-ac03fd2d.js";import{d as R,g as s,o as p,b as C,w as a,h as o,s as f,t as n,n as w,j as g,q as E,a4 as re,Y as D,Z as L,i as $,a9 as ie,O as ne}from"./vendor-f46c350a.js";import"./lodash-es-bad8e3ee.js";import"./esprima-next-8c7e8ff9.js";import"./luxon-19e1de07.js";import"./flatted-8b14da7d.js";import"./@vueuse/core-9fb50532.js";import"./uuid-cf522c50.js";import"./vue-i18n-cb04cc7a.js";import"./@jsplumb/util-d5a5fff8.js";import"./@jsplumb/core-8d347a89.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-5b4468a6.js";import"./@jsplumb/browser-ui-715581dc.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./workflowActivate-c971eb19.js";import"./prettier-51497383.js";import"./codemirror-lang-html-n8n-2834c921.js";import"./@n8n/codemirror-lang-sql-c830a767.js";import"./@lezer/common-4a878264.js";import"./codemirror-lang-n8n-expression-53c11692.js";import"./fast-json-stable-stringify-2d2dc6c9.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-065a6dad.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-49fe6185.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";import"./chart.js-58383f81.js";const m={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},le=R({data(){return{EnterpriseEditionFeature:U}},setup(){return{...j(),...q()}},components:{TimeAgo:se,WorkflowActivator:te},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWith:[],ownedBy:{},versionId:""})},readOnly:{type:Boolean,default:!1}},computed:{...B(M,I,V,F),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return x(this.currentUser,this.data)},actions(){const e=[{label:this.$locale.baseText("workflows.item.open"),value:m.OPEN},{label:this.$locale.baseText("workflows.item.share"),value:m.SHARE}];return this.readOnly||e.push({label:this.$locale.baseText("workflows.item.duplicate"),value:m.DUPLICATE}),this.workflowPermissions.delete&&!this.readOnly&&e.push({label:this.$locale.baseText("workflows.item.delete"),value:m.DELETE}),e},formattedCreatedAtDate(){const e=new Date().getFullYear();return Q(this.data.createdAt,`d mmmm${this.data.createdAt.startsWith(e)?"":", yyyy"}`)}},methods:{async onClick(e){var t;if(!(this.$refs.cardActions===e.target||(t=this.$refs.cardActions)!=null&&t.contains(e.target))){if(e.metaKey||e.ctrlKey){const r=this.$router.resolve({name:_.WORKFLOW,params:{name:this.data.id}});window.open(r.href,"_blank");return}await this.$router.push({name:_.WORKFLOW,params:{name:this.data.id}})}},onClickTag(e,t){t.stopPropagation(),this.$emit("click:tag",e,t)},onExpandTags(){this.$emit("expand:tags")},async onAction(e){if(e===m.OPEN)await this.onClick();else if(e===m.DUPLICATE)this.uiStore.openModalWithData({name:Y,data:{id:this.data.id,name:this.data.name,tags:(this.data.tags||[]).map(t=>t.id)}});else if(e===m.SHARE)this.uiStore.openModalWithData({name:Z,data:{id:this.data.id}}),this.$telemetry.track("User opened sharing modal",{workflow_id:this.data.id,user_id_sharer:this.currentUser.id,sub_view:this.$route.name===_.WORKFLOWS?"Workflows listing":"Workflow editor"});else if(e===m.DELETE){if(await this.confirm(this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.message",{interpolate:{workflowName:this.data.name}}),this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.headline"),{type:"warning",confirmButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.confirmButtonText"),cancelButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.cancelButtonText")})!==G)return;try{await this.workflowsStore.deleteWorkflow(this.data.id)}catch(r){this.showError(r,this.$locale.baseText("generic.deleteWorkflowError"));return}this.showMessage({title:this.$locale.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}}}),de="_cardLink_523op_5",ce="_cardHeading_523op_15",ue="_cardDescription_523op_21",fe="_cardActions_523op_28",me={cardLink:de,cardHeading:ce,cardDescription:ue,cardActions:fe},pe={key:0};function he(e,t,r,l,d,i){const y=s("n8n-heading"),k=s("time-ago"),h=s("n8n-tags"),v=s("n8n-text"),S=s("n8n-badge"),W=s("enterprise-edition"),A=s("workflow-activator"),T=s("n8n-action-toggle"),O=s("n8n-card");return p(),C(O,{class:w(e.$style.cardLink),onClick:e.onClick},{header:a(()=>[o(y,{tag:"h2",bold:"",class:w(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:a(()=>[f(n(e.data.name),1)]),_:1},8,["class"])]),append:a(()=>[g("div",{class:w(e.$style.cardActions),ref:"cardActions"},[o(W,{features:[e.EnterpriseEditionFeature.Sharing]},{default:a(()=>[e.workflowPermissions.isOwner?(p(),C(S,{key:0,class:"mr-xs",theme:"tertiary",bold:""},{default:a(()=>[f(n(e.$locale.baseText("workflows.item.owner")),1)]),_:1})):E("",!0)]),_:1},8,["features"]),o(A,{class:"mr-s","workflow-active":e.data.active,"workflow-id":e.data.id,"data-test-id":"workflow-card-activator"},null,8,["workflow-active","workflow-id"]),o(T,{actions:e.actions,theme:"dark",onAction:e.onAction,onClick:t[0]||(t[0]=re(()=>{},["stop"])),"data-test-id":"workflow-card-actions"},null,8,["actions","onAction"])],2)]),default:a(()=>[g("div",{class:w(e.$style.cardDescription)},[o(v,{color:"text-light",size:"small"},{default:a(()=>[D(g("span",null,[f(n(e.$locale.baseText("workflows.item.updated"))+" ",1),o(k,{date:e.data.updatedAt},null,8,["date"]),f(" | ")],512),[[L,e.data]]),D(g("span",{class:"mr-2xs"},n(e.$locale.baseText("workflows.item.created"))+" "+n(e.formattedCreatedAtDate),513),[[L,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?D((p(),$("span",pe,[o(h,{tags:e.data.tags,truncateAt:3,truncate:"","onClick:tag":e.onClickTag,onExpand:e.onExpandTags,"data-test-id":"workflow-card-tags"},null,8,["tags","onClick:tag","onExpand"])],512)),[[L,e.data]]):E("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const we={$style:me},ge=z(le,[["render",he],["__cssModules",we]]),b={ACTIVE:!0,DEACTIVATED:!1,ALL:""},ke=R({name:"WorkflowsView",mixins:[ae],components:{ResourcesListLayout:H,WorkflowCard:ge,TagsDropdown:oe},data(){return{filters:{search:"",ownedBy:"",sharedWith:"",status:b.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...B(M,I,V,F,ee,X,J),currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(U.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:b.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:b.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:b.DEACTIVATED}]}},methods:{addWorkflow(){this.uiStore.nodeViewInitialized=!1,this.$router.push({name:_.NEW_WORKFLOW}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},async initialize(){await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows(),this.workflowsStore.fetchActiveWorkflows(),this.credentialsStore.fetchAllCredentials()])},onClickTag(e,t){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,t,r){return this.saveFiltersOnQueryString(),this.settingsStore.areTagsEnabled&&t.tags.length>0&&(r=r&&t.tags.every(l=>{var d;return(d=e.tags)==null?void 0:d.find(i=>typeof i=="object"?`${i.id}`==`${l}`:`${i}`==`${l}`)})),t.status!==""&&(r=r&&e.active===t.status),r},sendFiltersTelemetry(e){this.$refs.layout.sendFiltersTelemetry(e)},saveFiltersOnQueryString(){const e={};this.filters.search&&(e.search=this.filters.search),typeof this.filters.status!="string"&&(e.status=this.filters.status.toString()),this.filters.tags.length&&(e.tags=this.filters.tags.join(",")),this.filters.ownedBy&&(e.ownedBy=this.filters.ownedBy),this.filters.sharedWith&&(e.sharedWith=this.filters.sharedWith),this.$router.replace({name:_.WORKFLOWS,query:e})},isValidUserId(e){return Object.keys(this.usersStore.users).includes(e)},setFiltersFromQueryString(){const{tags:e,status:t,search:r,ownedBy:l,sharedWith:d}=this.$route.query,i={};if(l&&typeof l=="string"&&this.isValidUserId(l)&&(i.ownedBy=l),d&&typeof d=="string"&&this.isValidUserId(d)&&(i.sharedWith=d),r&&typeof r=="string"&&(i.search=r),e&&typeof e=="string"){const y=this.tagsStore.allTags.map(h=>h.id),k=e.split(",").filter(h=>y.includes(h));k.length&&(i.tags=k)}t&&typeof t=="string"&&[b.ACTIVE.toString(),b.DEACTIVATED.toString()].includes(t)&&(i.status=t==="true"),Object.keys(i).length&&(this.filters={...this.filters,...i})}},watch:{"filters.tags"(){this.sendFiltersTelemetry("tags")}},mounted(){this.setFiltersFromQueryString(),this.usersStore.showPersonalizationSurvey(),this.sourceControlStoreUnsubscribe=this.sourceControlStore.$onAction(({name:e,after:t})=>{e==="pullWorkfolder"&&t&&t(()=>{this.initialize()})})},beforeUnmount(){this.sourceControlStoreUnsubscribe()}}),be=ke,ye="_actionsContainer_51pcb_5",_e="_emptyStateCard_51pcb_10",Se="_emptyStateCardIcon_51pcb_23",Te={actionsContainer:ye,emptyStateCard:_e,emptyStateCardIcon:Se},$e={class:"text-center mt-s"},Ce={key:0,class:"mb-s"},Ee={class:"mb-s"};function ve(e,t,r,l,d,i){const y=s("n8n-button"),k=s("n8n-tooltip"),h=s("workflow-card"),v=s("n8n-heading"),S=s("n8n-text"),W=s("n8n-icon"),A=s("n8n-card"),T=s("n8n-input-label"),O=s("TagsDropdown"),N=s("n8n-option"),P=s("n8n-select"),K=s("resources-list-layout");return p(),C(K,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},"show-aside":e.allWorkflows.length>0,shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":t[0]||(t[0]=c=>e.filters=c)},{"add-button":a(({disabled:c})=>[o(k,{disabled:!e.readOnlyEnv},{content:a(()=>[f(n(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")),1)]),default:a(()=>[g("div",null,[o(y,{size:"large",block:"",disabled:c,onClick:e.addWorkflow,"data-test-id":"resources-list-add"},{default:a(()=>[f(n(e.$locale.baseText("workflows.add")),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:a(({data:c,updateItemSize:u})=>[o(h,{"data-test-id":"resources-list-item",class:"mb-2xs",data:c,"onExpand:tags":Ae=>u(c),"onClick:tag":e.onClickTag,readOnly:e.readOnlyEnv},null,8,["data","onExpand:tags","onClick:tag","readOnly"])]),empty:a(()=>[g("div",$e,[o(v,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:a(()=>[f(n(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),o(S,{size:"large",color:"text-base"},{default:a(()=>[f(n(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?E("",!0):(p(),$("div",{key:0,class:w(["text-center","mt-2xl",e.$style.actionsContainer])},[o(A,{class:w(e.$style.emptyStateCard),hoverable:"",onClick:e.addWorkflow,"data-test-id":"new-workflow-card"},{default:a(()=>[o(W,{class:w(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),o(S,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[f(n(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]),filters:a(({setKeyValue:c})=>[e.settingsStore.areTagsEnabled?(p(),$("div",Ce,[o(T,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(O,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),modelValue:e.filters.tags,createEnabled:!1,"onUpdate:modelValue":u=>c("tags",u)},null,8,["placeholder","modelValue","onUpdate:modelValue"])])):E("",!0),g("div",Ee,[o(T,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(P,{"data-test-id":"status-dropdown",modelValue:e.filters.status,"onUpdate:modelValue":u=>c("status",u)},{default:a(()=>[(p(!0),$(ne,null,ie(e.statusFilterOptions,u=>(p(),C(N,{key:u.label,label:u.label,value:u.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","show-aside","shareable","initialize","disabled","onClick:add"])}const We={$style:Te},dt=z(be,[["render",ve],["__cssModules",We]]);export{dt as default};
2
+ //# sourceMappingURL=WorkflowsView-bf74dadd.js.map