n8n-editor-ui 1.22.0 → 1.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +62 -62
- package/dist/assets/{AuthView-_5lvIORY.js → AuthView--On8E3VP.js} +2 -2
- package/dist/assets/{AuthView-_5lvIORY.js.map → AuthView--On8E3VP.js.map} +1 -1
- package/dist/assets/{CanvasControls-_S6dAUFr.js → CanvasControls-ebFBI-_5.js} +2 -2
- package/dist/assets/{CanvasControls-_S6dAUFr.js.map → CanvasControls-ebFBI-_5.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-Gto324pL.js → ChangePasswordView-gj93rkzc.js} +2 -2
- package/dist/assets/{ChangePasswordView-Gto324pL.js.map → ChangePasswordView-gj93rkzc.js.map} +1 -1
- package/dist/assets/{CollectionParameter-ThiBAc6J.js → CollectionParameter-V1n0L6ao.js} +2 -2
- package/dist/assets/CollectionParameter-V1n0L6ao.js.map +1 -0
- package/dist/assets/{CredentialsView-WF2GuXwX.js → CredentialsView-9Nq2fOpi.js} +2 -2
- package/dist/assets/{CredentialsView-WF2GuXwX.js.map → CredentialsView-9Nq2fOpi.js.map} +1 -1
- package/dist/assets/{ExecutionFilter-6e5m1hky.js → ExecutionFilter-dfrYJ_Rf.js} +2 -2
- package/dist/assets/{ExecutionFilter-6e5m1hky.js.map → ExecutionFilter-dfrYJ_Rf.js.map} +1 -1
- package/dist/assets/{ExecutionPreview-qQdwo4nO.js → ExecutionPreview-yFW7oTRf.js} +2 -2
- package/dist/assets/{ExecutionPreview-qQdwo4nO.js.map → ExecutionPreview-yFW7oTRf.js.map} +1 -1
- package/dist/assets/{ExecutionsInfoAccordion-HQZywboM.js → ExecutionsInfoAccordion-EztI4QOE.js} +2 -2
- package/dist/assets/{ExecutionsInfoAccordion-HQZywboM.js.map → ExecutionsInfoAccordion-EztI4QOE.js.map} +1 -1
- package/dist/assets/{ExecutionsLandingPage-FEiybFSK.js → ExecutionsLandingPage-ygQGHLu2.js} +2 -2
- package/dist/assets/{ExecutionsLandingPage-FEiybFSK.js.map → ExecutionsLandingPage-ygQGHLu2.js.map} +1 -1
- package/dist/assets/{ExecutionsList-9Pc2Zrql.js → ExecutionsList-H9VKc4jb.js} +2 -2
- package/dist/assets/{ExecutionsList-9Pc2Zrql.js.map → ExecutionsList-H9VKc4jb.js.map} +1 -1
- package/dist/assets/{ExecutionsView-Li55aBU0.js → ExecutionsView-NdkXn6EA.js} +2 -2
- package/dist/assets/{ExecutionsView-Li55aBU0.js.map → ExecutionsView-NdkXn6EA.js.map} +1 -1
- package/dist/assets/{FixedCollectionParameter-d68rB1aT.js → FixedCollectionParameter-tJFyljoK.js} +3 -3
- package/dist/assets/{FixedCollectionParameter-d68rB1aT.js.map → FixedCollectionParameter-tJFyljoK.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-3lTe1SvY.js → ForgotMyPasswordView-VxAVQQgB.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-3lTe1SvY.js.map → ForgotMyPasswordView-VxAVQQgB.js.map} +1 -1
- package/dist/assets/{MainHeader-wtrPt4Uz.js → MainHeader-luMJdQn2.js} +2 -2
- package/dist/assets/{MainHeader-wtrPt4Uz.js.map → MainHeader-luMJdQn2.js.map} +1 -1
- package/dist/assets/{MainSidebar-dKXNC9E9.js → MainSidebar-nf-k1wHF.js} +2 -2
- package/dist/assets/{MainSidebar-dKXNC9E9.js.map → MainSidebar-nf-k1wHF.js.map} +1 -1
- package/dist/assets/{NodeCreation-lpcdOti7.js → NodeCreation-RvlbocPg.js} +3 -3
- package/dist/assets/{NodeCreation-lpcdOti7.js.map → NodeCreation-RvlbocPg.js.map} +1 -1
- package/dist/assets/{NodeCreator-YAF-VpA5.js → NodeCreator-zDLKC62A.js} +2 -2
- package/dist/assets/{NodeCreator-YAF-VpA5.js.map → NodeCreator-zDLKC62A.js.map} +1 -1
- package/dist/assets/{NodeList-8URsrxUQ.js → NodeList-U4qs88M0.js} +2 -2
- package/dist/assets/{NodeList-8URsrxUQ.js.map → NodeList-U4qs88M0.js.map} +1 -1
- package/dist/assets/{NodeView-caDno-kw.js → NodeView-fUdpq96X.js} +3 -3
- package/dist/assets/{NodeView-caDno-kw.js.map → NodeView-fUdpq96X.js.map} +1 -1
- package/dist/assets/{ResourcesListLayout-N4zg03Vf.js → ResourcesListLayout-y5FSwJeu.js} +2 -2
- package/dist/assets/{ResourcesListLayout-N4zg03Vf.js.map → ResourcesListLayout-y5FSwJeu.js.map} +1 -1
- package/dist/assets/{RunDataAi-EdxjRrVc.js → RunDataAi-dgEyN_Yl.js} +2 -2
- package/dist/assets/{RunDataAi-EdxjRrVc.js.map → RunDataAi-dgEyN_Yl.js.map} +1 -1
- package/dist/assets/{RunDataJson-wqxHrAY5.js → RunDataJson-RuNn5FTw.js} +3 -3
- package/dist/assets/{RunDataJson-wqxHrAY5.js.map → RunDataJson-RuNn5FTw.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-MfJV4quL.js → RunDataJsonActions-wMN8ObC3.js} +2 -2
- package/dist/assets/{RunDataJsonActions-MfJV4quL.js.map → RunDataJsonActions-wMN8ObC3.js.map} +1 -1
- package/dist/assets/{RunDataSchema-rxgd4Q_M.js → RunDataSchema-NrdiV0Bv.js} +2 -2
- package/dist/assets/{RunDataSchema-rxgd4Q_M.js.map → RunDataSchema-NrdiV0Bv.js.map} +1 -1
- package/dist/assets/{RunDataTable-2IMpD8oi.js → RunDataTable-vThTeakV.js} +2 -2
- package/dist/assets/{RunDataTable-2IMpD8oi.js.map → RunDataTable-vThTeakV.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-RIlvbmgY.js → SamlOnboarding-7ZeWtOoT.js} +2 -2
- package/dist/assets/{SamlOnboarding-RIlvbmgY.js.map → SamlOnboarding-7ZeWtOoT.js.map} +1 -1
- package/dist/assets/SettingsApiView-d7znGVgB.js +2 -0
- package/dist/assets/SettingsApiView-d7znGVgB.js.map +1 -0
- package/dist/assets/{SettingsCommunityNodesView-xqn73tJO.js → SettingsCommunityNodesView-U2OqH5_g.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-xqn73tJO.js.map → SettingsCommunityNodesView-U2OqH5_g.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-yr_g8DWk.js → SettingsExternalSecrets-OK2zcF3w.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-yr_g8DWk.js.map → SettingsExternalSecrets-OK2zcF3w.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-ogkrrHSL.js → SettingsFakeDoorView-wbngwN3n.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-ogkrrHSL.js.map → SettingsFakeDoorView-wbngwN3n.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-aWCvc1gM.js → SettingsLdapView-rYSjSdpv.js} +2 -2
- package/dist/assets/{SettingsLdapView-aWCvc1gM.js.map → SettingsLdapView-rYSjSdpv.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-IdWAQAEz.js → SettingsLogStreamingView-r4yJe9rt.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-IdWAQAEz.js.map → SettingsLogStreamingView-r4yJe9rt.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-s8B2f1Et.js → SettingsSourceControl-2sJrfiQZ.js} +2 -2
- package/dist/assets/{SettingsSourceControl-s8B2f1Et.js.map → SettingsSourceControl-2sJrfiQZ.js.map} +1 -1
- package/dist/assets/{SettingsSso-xhUlnU8v.js → SettingsSso-F08fTaoT.js} +2 -2
- package/dist/assets/{SettingsSso-xhUlnU8v.js.map → SettingsSso-F08fTaoT.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-qguburG-.js → SettingsUsageAndPlan-P3NemeAe.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-qguburG-.js.map → SettingsUsageAndPlan-P3NemeAe.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-mRes9Qkr.js → SettingsUsersView-qkwybUvB.js} +2 -2
- package/dist/assets/{SettingsUsersView-mRes9Qkr.js.map → SettingsUsersView-qkwybUvB.js.map} +1 -1
- package/dist/assets/{SettingsView-3Vqg8kdv.js → SettingsView-9Bw0MXcT.js} +2 -2
- package/dist/assets/{SettingsView-3Vqg8kdv.js.map → SettingsView-9Bw0MXcT.js.map} +1 -1
- package/dist/assets/{SetupView-RR2VulZH.js → SetupView-s0yzV7Gm.js} +2 -2
- package/dist/assets/{SetupView-RR2VulZH.js.map → SetupView-s0yzV7Gm.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-BbMhs31Z.js → SetupWorkflowFromTemplateView-6De7ws36.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-BbMhs31Z.js.map → SetupWorkflowFromTemplateView-6De7ws36.js.map} +1 -1
- package/dist/assets/{SigninView-hIeIEews.js → SigninView-QvYhHXWz.js} +2 -2
- package/dist/assets/{SigninView-hIeIEews.js.map → SigninView-QvYhHXWz.js.map} +1 -1
- package/dist/assets/{SignupView-iaO_BXyp.js → SignupView-ZLqXA-fI.js} +2 -2
- package/dist/assets/{SignupView-iaO_BXyp.js.map → SignupView-ZLqXA-fI.js.map} +1 -1
- package/dist/assets/{TemplateDetails-HasVFCUO.js → TemplateDetails-qWnefMYx.js} +2 -2
- package/dist/assets/{TemplateDetails-HasVFCUO.js.map → TemplateDetails-qWnefMYx.js.map} +1 -1
- package/dist/assets/{TemplateList-uT0I7BC-.js → TemplateList-Ek8NkQLd.js} +2 -2
- package/dist/assets/{TemplateList-uT0I7BC-.js.map → TemplateList-Ek8NkQLd.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-WwdzPK0w.js → TemplatesCollectionView-xoRz-QfG.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-WwdzPK0w.js.map → TemplatesCollectionView-xoRz-QfG.js.map} +1 -1
- package/dist/assets/{TemplatesInfoCarousel-WUt6CUAt.js → TemplatesInfoCarousel-TKGxiVaR.js} +2 -2
- package/dist/assets/{TemplatesInfoCarousel-WUt6CUAt.js.map → TemplatesInfoCarousel-TKGxiVaR.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-pwVBF7_m.js → TemplatesSearchView-gwbhQE6_.js} +2 -2
- package/dist/assets/{TemplatesSearchView-pwVBF7_m.js.map → TemplatesSearchView-gwbhQE6_.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-OxfZO4yX.js → TemplatesWorkflowView-VbJuwYVl.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-OxfZO4yX.js.map → TemplatesWorkflowView-VbJuwYVl.js.map} +1 -1
- package/dist/assets/{VariablesView-O1dh47w6.js → VariablesView-ZNxPDs_G.js} +2 -2
- package/dist/assets/{VariablesView-O1dh47w6.js.map → VariablesView-ZNxPDs_G.js.map} +1 -1
- package/dist/assets/{WorkerView-ehe17h1Q.js → WorkerView-Rzm_p5Pv.js} +2 -2
- package/dist/assets/{WorkerView-ehe17h1Q.js.map → WorkerView-Rzm_p5Pv.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-EK3d11st.js → WorkflowActivator-H10vhdIV.js} +2 -2
- package/dist/assets/{WorkflowActivator-EK3d11st.js.map → WorkflowActivator-H10vhdIV.js.map} +1 -1
- package/dist/assets/{WorkflowHistory-mqWH3nQZ.js → WorkflowHistory-diO3ekal.js} +2 -2
- package/dist/assets/{WorkflowHistory-mqWH3nQZ.js.map → WorkflowHistory-diO3ekal.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-LZfOfbX4.js → WorkflowOnboardingView-gUVzVQsZ.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-LZfOfbX4.js.map → WorkflowOnboardingView-gUVzVQsZ.js.map} +1 -1
- package/dist/assets/{WorkflowsView-NL0wKv4C.js → WorkflowsView-Qqq1sZTo.js} +2 -2
- package/dist/assets/{WorkflowsView-NL0wKv4C.js.map → WorkflowsView-Qqq1sZTo.js.map} +1 -1
- package/dist/assets/{cloud-JhkwKZAE.js → cloud-g7GqwUFZ.js} +2 -2
- package/dist/assets/{cloud-JhkwKZAE.js.map → cloud-g7GqwUFZ.js.map} +1 -1
- package/dist/assets/{executionsHelpers-Gkj6bYJi.js → executionsHelpers-gnbzcx5j.js} +2 -2
- package/dist/assets/{executionsHelpers-Gkj6bYJi.js.map → executionsHelpers-gnbzcx5j.js.map} +1 -1
- package/dist/assets/{index--RuZ5wHr.js → index-RXjMHIPR.js} +11 -11
- package/dist/assets/{index--RuZ5wHr.js.map → index-RXjMHIPR.js.map} +1 -1
- package/dist/assets/{pushConnection-UpdxMjHa.js → pushConnection-HdjAqr4R.js} +2 -2
- package/dist/assets/{pushConnection-UpdxMjHa.js.map → pushConnection-HdjAqr4R.js.map} +1 -1
- package/dist/assets/{templateActions-CZfTXoBx.js → templateActions-y8msVyEB.js} +2 -2
- package/dist/assets/{templateActions-CZfTXoBx.js.map → templateActions-y8msVyEB.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-FPo5qMF0.js → useExecutionDebugging-Yog1CJXv.js} +2 -2
- package/dist/assets/{useExecutionDebugging-FPo5qMF0.js.map → useExecutionDebugging-Yog1CJXv.js.map} +1 -1
- package/dist/assets/{workflowActivate-FltKJaAB.js → workflowActivate-IRvCsxq5.js} +2 -2
- package/dist/assets/{workflowActivate-FltKJaAB.js.map → workflowActivate-IRvCsxq5.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-ThiBAc6J.js.map +0 -1
- package/dist/assets/SettingsApiView-_7qUJ2zm.js +0 -2
- package/dist/assets/SettingsApiView-_7qUJ2zm.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{G as B,r as g,e as T,b as re,ag as O,l as I,m as C,H as G,p as d,M as P,O as V,Q as M,T as H,I as f,a2 as ae,R as k,S as N,u as $,F as ie,a7 as le,aG as ce,aH as we,D as de,w as ue,af as me}from"./vendor-2CfOYFi2.js";import{T as fe,M as D,_ as K,aF as J,v as Q,t as pe,B as X,fI as ke,o as ve,u as ye,V as U,fR as _e,dI as he}from"./n8n-ZKR6bms9.js";import{aN as be}from"./index--RuZ5wHr.js";import{d as ge}from"./pinia-jX93eZRS.js";import{F as Ie}from"./file-saver-PQ97zATM.js";import"./lodash-es-s_m9YyW7.js";import"./axios-QLjAsgXu.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-viEZCtbZ.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-2T2QU_2c.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./prettier-s3fE3Qyr.js";import"./codemirror-lang-html-n8n-qoVuUIQR.js";import"./@n8n/codemirror-lang-sql-zd5sOTQ9.js";import"./@lezer/common-aP6EPErF.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-QL7QI0sV.js";import"./codemirror-lang-n8n-expression-qGXLqLTr.js";import"./fast-json-stable-stringify-RhDdw38P.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-f7Vn5Pkq.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const We=["datetime"],Te=["value"],$e=B({__name:"WorkflowHistoryListItem",props:{item:{},index:{},actions:{},isActive:{type:Boolean}},emits:["action","preview","mounted"],setup(_,{emit:u}){const e=_,o=D(),v=g(!1),c=g(null),m=g(null),i=g(!1),p=T(()=>{const t=new Date().getFullYear().toString(),[r,a]=fe(e.item.createdAt,`${e.item.createdAt.startsWith(t)?"":"yyyy "}mmm d"#"HH:MM:ss`).split("#");return o.baseText("workflowHistory.item.createdAt",{interpolate:{date:r,time:a}})}),W=T(()=>{const t=e.item.authors.split(", ");let r=t[0];return t.length>1&&(r=`${r} + ${t.length-1}`),{size:t.length,label:r}}),L=T(()=>o.baseText("workflowHistory.item.id",{interpolate:{id:e.item.versionId}})),x=t=>{u("action",{action:t,id:e.item.versionId,data:{formattedCreatedAt:p.value}})},n=t=>{v.value=t},l=t=>{u("preview",{event:t,id:e.item.versionId})};return re(()=>{var t,r,a;u("mounted",{index:e.index,offsetTop:((t=c.value)==null?void 0:t.offsetTop)??0,isActive:e.isActive}),i.value=((r=m.value)==null?void 0:r.scrollWidth)>((a=m.value)==null?void 0:a.clientWidth)}),(t,r)=>{const a=O("n8n-tooltip"),h=O("n8n-badge"),b=O("n8n-action-toggle");return I(),C("li",{ref_key:"itemElement",ref:c,"data-test-id":"workflow-history-list-item",class:f({[t.$style.item]:!0,[t.$style.active]:e.isActive,[t.$style.actionsVisible]:v.value})},[G(t.$slots,"default",{formattedCreatedAt:p.value},()=>[d("p",{onClick:l},[d("time",{datetime:t.item.createdAt},k(p.value),9,We),H(a,{placement:"right-end",disabled:W.value.size<2&&!i.value},{content:V(()=>[N(k(e.item.authors),1)]),default:V(()=>[d("span",{ref_key:"authorElement",ref:m},k(W.value.label),513)]),_:1},8,["disabled"]),d("data",{value:t.item.versionId},k(L.value),9,Te)])]),d("div",{class:f(t.$style.tail)},[e.index===0?(I(),P(h,{key:0},{default:V(()=>[N(k($(o).baseText("workflowHistory.item.latest")),1)]),_:1})):M("",!0),H(b,{theme:"dark",class:f(t.$style.actions),actions:e.actions,placement:"bottom-end",onAction:x,onClick:r[0]||(r[0]=ae(()=>{},["stop"])),onVisibleChange:n},{default:V(()=>[G(t.$slots,"action-toggle-button")]),_:3},8,["class","actions"])],2)],2)}}}),He="_item_1bawd_5",Le="_tail_1bawd_37",Ve="_active_1bawd_42",xe="_actionsVisible_1bawd_49",Ae="_actions_1bawd_49",Oe={item:He,tail:Le,active:Ve,actionsVisible:xe,actions:Ae},Re={$style:Oe},Z=K($e,[["__cssModules",Re]]),Se=d("br",null,null,-1),Ce=["aria-label"],Me=B({__name:"WorkflowHistoryList",props:{items:{},activeItem:{},actions:{},requestNumberOfItems:{},lastReceivedItemsLength:{},evaluatedPruneTime:{},shouldUpgrade:{type:Boolean},isListLoading:{type:Boolean}},emits:["action","preview","loadMore","upgrade"],setup(_,{emit:u}){const e=_,o=D(),v=g(null),c=g(!0),m=g(null),i=n=>n===0?e.actions.filter(l=>l.value!=="restore"):e.actions,p=n=>{m.value=new IntersectionObserver(([l])=>{var t,r;l.isIntersecting&&((t=m.value)==null||t.unobserve(n),(r=m.value)==null||r.disconnect(),m.value=null,u("loadMore",{take:e.requestNumberOfItems,skip:e.items.length}))},{root:v.value,threshold:.01}),m.value.observe(n)},W=({action:n,id:l,data:t})=>{c.value=!1,u("action",{action:n,id:l,data:t})},L=({event:n,id:l})=>{c.value=!1,u("preview",{event:n,id:l})},x=({index:n,offsetTop:l,isActive:t})=>{var r,a;t&&c.value&&(c.value=!1,(r=v.value)==null||r.scrollTo({top:l,behavior:"smooth"})),n===e.items.length-1&&e.lastReceivedItemsLength===e.requestNumberOfItems&&p((a=v.value)==null?void 0:a.children[n])};return(n,l)=>{const t=O("n8n-loading"),r=O("i18n-t");return I(),C("ul",{class:f(n.$style.list),ref_key:"listElement",ref:v,"data-test-id":"workflow-history-list"},[(I(!0),C(ie,null,le(e.items,(a,h)=>{var b;return I(),P(Z,{key:a.versionId,index:h,item:a,isActive:a.versionId===((b=e.activeItem)==null?void 0:b.versionId),actions:i(h),onAction:W,onPreview:L,onMounted:x},null,8,["index","item","isActive","actions"])}),128)),!e.items.length&&!e.isListLoading?(I(),C("li",{key:0,class:f(n.$style.empty)},[N(k($(o).baseText("workflowHistory.empty"))+" ",1),Se,N(" "+k($(o).baseText("workflowHistory.hint")),1)],2)):M("",!0),e.isListLoading?(I(),C("li",{key:1,class:f(n.$style.loader),role:"status","aria-live":"polite","aria-busy":"true","aria-label":$(o).baseText("generic.loading")},[H(t,{rows:3,class:"mb-xs"}),H(t,{rows:3,class:"mb-xs"}),H(t,{rows:3,class:"mb-xs"})],10,Ce)):M("",!0),e.shouldUpgrade?(I(),C("li",{key:2,class:f(n.$style.retention)},[d("span",null,k($(o).baseText("workflowHistory.limit",{interpolate:{evaluatedPruneTime:e.evaluatedPruneTime}})),1),H(r,{keypath:"workflowHistory.upgrade",tag:"span"},{link:V(()=>[d("a",{href:"#",onClick:l[0]||(l[0]=a=>u("upgrade"))},k($(o).baseText("workflowHistory.upgrade.link")),1)]),_:1})],2)):M("",!0)],2)}}}),Ee="_list_1h1nd_5",Ne="_empty_1h1nd_14",Pe="_loader_1h1nd_27",Ue="_retention_1h1nd_31",Fe={list:Ee,empty:Ne,loader:Pe,retention:Ue},Be={$style:Fe},De=K(Me,[["__cssModules",Be]]),Ke=["datetime"],ze=["value"],qe=B({__name:"WorkflowHistoryContent",props:{workflow:{},workflowVersion:{},actions:{},isListLoading:{type:Boolean},isFirstItemShown:{type:Boolean}},emits:["action"],setup(_,{emit:u}){const e=_,o=D(),v=T(()=>{if(!e.workflowVersion||!e.workflow)return;const{pinData:i,...p}=e.workflow;return{...p,nodes:e.workflowVersion.nodes,connections:e.workflowVersion.connections}}),c=T(()=>e.isFirstItemShown?e.actions.filter(i=>i.value!=="restore"):e.actions),m=({action:i,id:p,data:W})=>{u("action",{action:i,id:p,data:W})};return(i,p)=>{const W=O("n8n-icon"),L=O("n8n-button");return I(),C("div",{class:f(i.$style.content)},[e.workflowVersion?(I(),P(be,{key:0,workflow:v.value,loading:e.isListLoading,loaderType:"spinner"},null,8,["workflow","loading"])):M("",!0),d("ul",{class:f(i.$style.info)},[e.workflowVersion?(I(),P(Z,{key:0,class:f(i.$style.card),index:-1,item:e.workflowVersion,isActive:!1,actions:c.value,onAction:m},{default:V(({formattedCreatedAt:x})=>[d("section",{class:f(i.$style.text)},[d("p",null,[d("span",{class:f(i.$style.label)},k($(o).baseText("workflowHistory.content.title"))+": ",3),d("time",{datetime:e.workflowVersion.createdAt},k(x),9,Ke)]),d("p",null,[d("span",{class:f(i.$style.label)},k($(o).baseText("workflowHistory.content.editedBy"))+": ",3),d("span",null,k(e.workflowVersion.authors),1)]),d("p",null,[d("span",{class:f(i.$style.label)},k($(o).baseText("workflowHistory.content.versionId"))+": ",3),d("data",{value:e.workflowVersion.versionId},k(e.workflowVersion.versionId),9,ze)])],2)]),"action-toggle-button":V(()=>[H(L,{type:"tertiary",size:"large","data-test-id":"action-toggle-button"},{default:V(()=>[N(k($(o).baseText("workflowHistory.content.actions"))+" ",1),H(W,{class:"ml-3xs",icon:"chevron-down",size:"small"})]),_:1})]),_:1},8,["class","item","actions"])):M("",!0)],2)],2)}}}),Ye="_content_1xe4n_5",je="_info_1xe4n_15",Ge="_card_1xe4n_23",Je="_text_1xe4n_28",Qe="_label_1xe4n_53",Xe={content:Ye,info:je,card:Ge,text:Je,label:Qe},Ze={$style:Xe},et=K(qe,[["__cssModules",Ze]]),tt=async(_,u,e)=>{const{data:o}=await J(_.baseUrl,`/workflow-history/workflow/${u}`,e);return o},ot=async(_,u,e)=>{const{data:o}=await J(_.baseUrl,`/workflow-history/workflow/${u}/version/${e}`);return o},st=ge("workflowHistory",()=>{const _=Q(),u=pe(),e=X(),o=T(()=>u.settings.workflowHistory.licensePruneTime),v=T(()=>u.settings.workflowHistory.pruneTime),c=T(()=>Math.min(v.value,o.value)),m=T(()=>o.value!==-1&&o.value===v.value),i=async(n,l)=>tt(_.getRestApiContext,n,l),p=async(n,l)=>ot(_.getRestApiContext,n,l);return{getWorkflowHistory:i,getWorkflowVersion:p,downloadVersion:async(n,l,t)=>{const[r,a]=await Promise.all([e.fetchWorkflow(n),p(n,l)]),{connections:h,nodes:b}=a,R=new Blob([JSON.stringify({...r,nodes:b,connections:h},null,2)],{type:"application/json;charset=utf-8"});Ie.saveAs(R,`${r.name}(${t.formattedCreatedAt}).json`)},cloneIntoNewWorkflow:async(n,l,t)=>{const[r,a]=await Promise.all([e.fetchWorkflow(n),p(n,l)]),{connections:h,nodes:b}=a,{name:R}=r,z=await ke(_.getRestApiContext,`${R} (${t.formattedCreatedAt})`),S={nodes:b,connections:h,name:z.name};return e.createNewWorkflow(S)},restoreWorkflow:async(n,l,t)=>{const r=await p(n,l),{connections:a,nodes:h}=r,b={connections:a,nodes:h};return t&&(b.active=!1),e.updateWorkflow(n,b,!0).catch(async R=>{if(R.httpStatusCode===400&&R.message.includes("can not be activated"))return e.fetchWorkflow(n);throw new Error(R)})},evaluatedPruneTime:c,shouldUpgrade:m}}),nt=B({__name:"WorkflowHistory",setup(_){const u=["restore","clone","open","download"],e=u.reduce((s,w)=>({...s,[w.toUpperCase()]:w}),{}),o=ce(),v=we(),c=D(),m=ve(),i=st(),p=ye(),W=X(),L=g(!0),x=g(!0),n=g(20),l=g(0),t=T(()=>({name:U.WORKFLOW,params:{name:o.params.workflowId}})),r=g(null),a=g([]),h=g(null),b=T(()=>u.map(s=>({label:c.baseText(`workflowHistory.item.actions.${s}`),disabled:!1,value:s}))),R=T(()=>{var s;return((s=a.value[0])==null?void 0:s.versionId)===o.params.versionId}),z=T(()=>Math.floor(i.evaluatedPruneTime/24)),S=s=>{_e.track(s,{instance_id:Q().instanceId,workflow_id:o.params.workflowId})},q=async s=>{const w=await i.getWorkflowHistory(o.params.workflowId,s);l.value=w.length,a.value=a.value.concat(w)};de(async()=>{S("User opened workflow history");try{const[s]=await Promise.all([W.fetchWorkflow(o.params.workflowId),q({take:n.value})]);r.value=s,x.value=!1,!o.params.versionId&&a.value.length&&await v.replace({name:U.WORKFLOW_HISTORY,params:{workflowId:o.params.workflowId,versionId:a.value[0].versionId}})}catch(s){L.value=!1,m.showError(s,c.baseText("workflowHistory.title"))}});const Y=s=>{const{href:w}=v.resolve({name:U.WORKFLOW_HISTORY,params:{workflowId:o.params.workflowId,versionId:s}});window.open(w,"_blank")},ee=async(s,w)=>new Promise((y,A)=>{const E=[{text:c.baseText("workflowHistory.action.restore.modal.button.cancel"),type:"tertiary",action:()=>{y("cancel")}}];s&&E.push({text:c.baseText("workflowHistory.action.restore.modal.button.deactivateAndRestore"),type:"tertiary",action:()=>{y("deactivateAndRestore")}}),E.push({text:c.baseText("workflowHistory.action.restore.modal.button.restore"),type:"primary",action:()=>{y("restore")}});try{p.openModalWithData({name:he,data:{beforeClose:()=>{y("cancel")},isWorkflowActivated:s,formattedCreatedAt:w,buttons:E}})}catch(F){A(F)}}),te=async(s,w)=>{const y=await i.cloneIntoNewWorkflow(o.params.workflowId,s,w),{href:A}=v.resolve({name:U.WORKFLOW,params:{name:y.id}});m.showMessage({title:c.baseText("workflowHistory.action.clone.success.title"),message:me("a",{href:A,target:"_blank"},c.baseText("workflowHistory.action.clone.success.message")),type:"success",duration:1e4})},oe=async(s,w)=>{const y=await W.fetchWorkflow(o.params.workflowId),A=await ee(y.active,w.formattedCreatedAt);if(A==="cancel")return;r.value=await i.restoreWorkflow(o.params.workflowId,s,A==="deactivateAndRestore");const E=await i.getWorkflowHistory(o.params.workflowId,{take:1});a.value=E.concat(a.value),m.showMessage({title:c.baseText("workflowHistory.action.restore.success.title"),type:"success"})},j=async({action:s,id:w,data:y})=>{try{switch(s){case e.OPEN:Y(w),S("User opened version in new tab");break;case e.DOWNLOAD:await i.downloadVersion(o.params.workflowId,w,y),S("User downloaded version");break;case e.CLONE:await te(w,y),S("User cloned version");break;case e.RESTORE:await oe(w,y),S("User restored version");break}}catch(A){m.showError(A,c.baseText("workflowHistory.action.error.title",{interpolate:{action:c.baseText(`workflowHistory.item.actions.${s}`).toLowerCase()}}))}},se=async({event:s,id:w})=>{s.metaKey||s.ctrlKey?(Y(w),S("User opened version in new tab")):await v.push({name:U.WORKFLOW_HISTORY,params:{workflowId:o.params.workflowId,versionId:w}})},ne=()=>{p.goToUpgrade("workflow-history","upgrade-workflow-history")};return ue(async()=>{if(o.params.versionId){try{h.value=await i.getWorkflowVersion(o.params.workflowId,o.params.versionId),S("User selected version")}catch(s){m.showError(new Error(`${s.message} "${o.params.versionId}" `),c.baseText("workflowHistory.title"))}try{r.value=await W.fetchWorkflow(o.params.workflowId)}catch(s){L.value=!1,m.showError(s,c.baseText("workflowHistory.title"))}}}),(s,w)=>{const y=O("n8n-heading"),A=O("n8n-button"),E=O("router-link");return I(),C("div",{class:f(s.$style.view)},[H(y,{class:f(s.$style.header),tag:"h2",size:"medium"},{default:V(()=>{var F;return[N(k((F=r.value)==null?void 0:F.name),1)]}),_:1},8,["class"]),d("div",{class:f(s.$style.corner)},[H(y,{tag:"h2",size:"medium",bold:""},{default:V(()=>[N(k($(c).baseText("workflowHistory.title")),1)]),_:1}),H(E,{to:t.value,"data-test-id":"workflow-history-close-button"},{default:V(()=>[H(A,{type:"tertiary",icon:"times",size:"small",text:"",square:""})]),_:1},8,["to"])],2),d("div",{class:f(s.$style.listComponentWrapper)},[L.value?(I(),P(De,{key:0,items:a.value,lastReceivedItemsLength:l.value,activeItem:h.value,actions:b.value,requestNumberOfItems:n.value,shouldUpgrade:$(i).shouldUpgrade,evaluatedPruneTime:z.value,isListLoading:x.value,onAction:j,onPreview:se,onLoadMore:q,onUpgrade:ne},null,8,["items","lastReceivedItemsLength","activeItem","actions","requestNumberOfItems","shouldUpgrade","evaluatedPruneTime","isListLoading"])):M("",!0)],2),d("div",{class:f(s.$style.contentComponentWrapper)},[L.value?(I(),P(et,{key:0,workflow:r.value,workflowVersion:h.value,actions:b.value,isListLoading:x.value,isFirstItemShown:R.value,onAction:j},null,8,["workflow","workflowVersion","actions","isListLoading","isFirstItemShown"])):M("",!0)],2)],2)}}}),rt="_view_1ax7n_5",at="_header_1ax7n_15",it="_corner_1ax7n_23",lt="_contentComponentWrapper_1ax7n_34",ct="_listComponentWrapper_1ax7n_39",wt={view:rt,header:at,corner:it,contentComponentWrapper:lt,listComponentWrapper:ct},dt={$style:wt},Ft=K(nt,[["__cssModules",dt]]);export{Ft as default};
|
|
2
|
-
//# sourceMappingURL=WorkflowHistory-
|
|
1
|
+
import{G as B,r as g,e as T,b as re,ag as O,l as I,m as C,H as G,p as d,M as P,O as V,Q as M,T as H,I as f,a2 as ae,R as k,S as N,u as $,F as ie,a7 as le,aG as ce,aH as we,D as de,w as ue,af as me}from"./vendor-2CfOYFi2.js";import{T as fe,M as D,_ as K,aF as J,v as Q,t as pe,B as X,fI as ke,o as ve,u as ye,V as U,fR as _e,dI as he}from"./n8n-ZKR6bms9.js";import{aN as be}from"./index-RXjMHIPR.js";import{d as ge}from"./pinia-jX93eZRS.js";import{F as Ie}from"./file-saver-PQ97zATM.js";import"./lodash-es-s_m9YyW7.js";import"./axios-QLjAsgXu.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-viEZCtbZ.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-2T2QU_2c.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./prettier-s3fE3Qyr.js";import"./codemirror-lang-html-n8n-qoVuUIQR.js";import"./@n8n/codemirror-lang-sql-zd5sOTQ9.js";import"./@lezer/common-aP6EPErF.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-QL7QI0sV.js";import"./codemirror-lang-n8n-expression-qGXLqLTr.js";import"./fast-json-stable-stringify-RhDdw38P.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-f7Vn5Pkq.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const We=["datetime"],Te=["value"],$e=B({__name:"WorkflowHistoryListItem",props:{item:{},index:{},actions:{},isActive:{type:Boolean}},emits:["action","preview","mounted"],setup(_,{emit:u}){const e=_,o=D(),v=g(!1),c=g(null),m=g(null),i=g(!1),p=T(()=>{const t=new Date().getFullYear().toString(),[r,a]=fe(e.item.createdAt,`${e.item.createdAt.startsWith(t)?"":"yyyy "}mmm d"#"HH:MM:ss`).split("#");return o.baseText("workflowHistory.item.createdAt",{interpolate:{date:r,time:a}})}),W=T(()=>{const t=e.item.authors.split(", ");let r=t[0];return t.length>1&&(r=`${r} + ${t.length-1}`),{size:t.length,label:r}}),L=T(()=>o.baseText("workflowHistory.item.id",{interpolate:{id:e.item.versionId}})),x=t=>{u("action",{action:t,id:e.item.versionId,data:{formattedCreatedAt:p.value}})},n=t=>{v.value=t},l=t=>{u("preview",{event:t,id:e.item.versionId})};return re(()=>{var t,r,a;u("mounted",{index:e.index,offsetTop:((t=c.value)==null?void 0:t.offsetTop)??0,isActive:e.isActive}),i.value=((r=m.value)==null?void 0:r.scrollWidth)>((a=m.value)==null?void 0:a.clientWidth)}),(t,r)=>{const a=O("n8n-tooltip"),h=O("n8n-badge"),b=O("n8n-action-toggle");return I(),C("li",{ref_key:"itemElement",ref:c,"data-test-id":"workflow-history-list-item",class:f({[t.$style.item]:!0,[t.$style.active]:e.isActive,[t.$style.actionsVisible]:v.value})},[G(t.$slots,"default",{formattedCreatedAt:p.value},()=>[d("p",{onClick:l},[d("time",{datetime:t.item.createdAt},k(p.value),9,We),H(a,{placement:"right-end",disabled:W.value.size<2&&!i.value},{content:V(()=>[N(k(e.item.authors),1)]),default:V(()=>[d("span",{ref_key:"authorElement",ref:m},k(W.value.label),513)]),_:1},8,["disabled"]),d("data",{value:t.item.versionId},k(L.value),9,Te)])]),d("div",{class:f(t.$style.tail)},[e.index===0?(I(),P(h,{key:0},{default:V(()=>[N(k($(o).baseText("workflowHistory.item.latest")),1)]),_:1})):M("",!0),H(b,{theme:"dark",class:f(t.$style.actions),actions:e.actions,placement:"bottom-end",onAction:x,onClick:r[0]||(r[0]=ae(()=>{},["stop"])),onVisibleChange:n},{default:V(()=>[G(t.$slots,"action-toggle-button")]),_:3},8,["class","actions"])],2)],2)}}}),He="_item_1bawd_5",Le="_tail_1bawd_37",Ve="_active_1bawd_42",xe="_actionsVisible_1bawd_49",Ae="_actions_1bawd_49",Oe={item:He,tail:Le,active:Ve,actionsVisible:xe,actions:Ae},Re={$style:Oe},Z=K($e,[["__cssModules",Re]]),Se=d("br",null,null,-1),Ce=["aria-label"],Me=B({__name:"WorkflowHistoryList",props:{items:{},activeItem:{},actions:{},requestNumberOfItems:{},lastReceivedItemsLength:{},evaluatedPruneTime:{},shouldUpgrade:{type:Boolean},isListLoading:{type:Boolean}},emits:["action","preview","loadMore","upgrade"],setup(_,{emit:u}){const e=_,o=D(),v=g(null),c=g(!0),m=g(null),i=n=>n===0?e.actions.filter(l=>l.value!=="restore"):e.actions,p=n=>{m.value=new IntersectionObserver(([l])=>{var t,r;l.isIntersecting&&((t=m.value)==null||t.unobserve(n),(r=m.value)==null||r.disconnect(),m.value=null,u("loadMore",{take:e.requestNumberOfItems,skip:e.items.length}))},{root:v.value,threshold:.01}),m.value.observe(n)},W=({action:n,id:l,data:t})=>{c.value=!1,u("action",{action:n,id:l,data:t})},L=({event:n,id:l})=>{c.value=!1,u("preview",{event:n,id:l})},x=({index:n,offsetTop:l,isActive:t})=>{var r,a;t&&c.value&&(c.value=!1,(r=v.value)==null||r.scrollTo({top:l,behavior:"smooth"})),n===e.items.length-1&&e.lastReceivedItemsLength===e.requestNumberOfItems&&p((a=v.value)==null?void 0:a.children[n])};return(n,l)=>{const t=O("n8n-loading"),r=O("i18n-t");return I(),C("ul",{class:f(n.$style.list),ref_key:"listElement",ref:v,"data-test-id":"workflow-history-list"},[(I(!0),C(ie,null,le(e.items,(a,h)=>{var b;return I(),P(Z,{key:a.versionId,index:h,item:a,isActive:a.versionId===((b=e.activeItem)==null?void 0:b.versionId),actions:i(h),onAction:W,onPreview:L,onMounted:x},null,8,["index","item","isActive","actions"])}),128)),!e.items.length&&!e.isListLoading?(I(),C("li",{key:0,class:f(n.$style.empty)},[N(k($(o).baseText("workflowHistory.empty"))+" ",1),Se,N(" "+k($(o).baseText("workflowHistory.hint")),1)],2)):M("",!0),e.isListLoading?(I(),C("li",{key:1,class:f(n.$style.loader),role:"status","aria-live":"polite","aria-busy":"true","aria-label":$(o).baseText("generic.loading")},[H(t,{rows:3,class:"mb-xs"}),H(t,{rows:3,class:"mb-xs"}),H(t,{rows:3,class:"mb-xs"})],10,Ce)):M("",!0),e.shouldUpgrade?(I(),C("li",{key:2,class:f(n.$style.retention)},[d("span",null,k($(o).baseText("workflowHistory.limit",{interpolate:{evaluatedPruneTime:e.evaluatedPruneTime}})),1),H(r,{keypath:"workflowHistory.upgrade",tag:"span"},{link:V(()=>[d("a",{href:"#",onClick:l[0]||(l[0]=a=>u("upgrade"))},k($(o).baseText("workflowHistory.upgrade.link")),1)]),_:1})],2)):M("",!0)],2)}}}),Ee="_list_1h1nd_5",Ne="_empty_1h1nd_14",Pe="_loader_1h1nd_27",Ue="_retention_1h1nd_31",Fe={list:Ee,empty:Ne,loader:Pe,retention:Ue},Be={$style:Fe},De=K(Me,[["__cssModules",Be]]),Ke=["datetime"],ze=["value"],qe=B({__name:"WorkflowHistoryContent",props:{workflow:{},workflowVersion:{},actions:{},isListLoading:{type:Boolean},isFirstItemShown:{type:Boolean}},emits:["action"],setup(_,{emit:u}){const e=_,o=D(),v=T(()=>{if(!e.workflowVersion||!e.workflow)return;const{pinData:i,...p}=e.workflow;return{...p,nodes:e.workflowVersion.nodes,connections:e.workflowVersion.connections}}),c=T(()=>e.isFirstItemShown?e.actions.filter(i=>i.value!=="restore"):e.actions),m=({action:i,id:p,data:W})=>{u("action",{action:i,id:p,data:W})};return(i,p)=>{const W=O("n8n-icon"),L=O("n8n-button");return I(),C("div",{class:f(i.$style.content)},[e.workflowVersion?(I(),P(be,{key:0,workflow:v.value,loading:e.isListLoading,loaderType:"spinner"},null,8,["workflow","loading"])):M("",!0),d("ul",{class:f(i.$style.info)},[e.workflowVersion?(I(),P(Z,{key:0,class:f(i.$style.card),index:-1,item:e.workflowVersion,isActive:!1,actions:c.value,onAction:m},{default:V(({formattedCreatedAt:x})=>[d("section",{class:f(i.$style.text)},[d("p",null,[d("span",{class:f(i.$style.label)},k($(o).baseText("workflowHistory.content.title"))+": ",3),d("time",{datetime:e.workflowVersion.createdAt},k(x),9,Ke)]),d("p",null,[d("span",{class:f(i.$style.label)},k($(o).baseText("workflowHistory.content.editedBy"))+": ",3),d("span",null,k(e.workflowVersion.authors),1)]),d("p",null,[d("span",{class:f(i.$style.label)},k($(o).baseText("workflowHistory.content.versionId"))+": ",3),d("data",{value:e.workflowVersion.versionId},k(e.workflowVersion.versionId),9,ze)])],2)]),"action-toggle-button":V(()=>[H(L,{type:"tertiary",size:"large","data-test-id":"action-toggle-button"},{default:V(()=>[N(k($(o).baseText("workflowHistory.content.actions"))+" ",1),H(W,{class:"ml-3xs",icon:"chevron-down",size:"small"})]),_:1})]),_:1},8,["class","item","actions"])):M("",!0)],2)],2)}}}),Ye="_content_1xe4n_5",je="_info_1xe4n_15",Ge="_card_1xe4n_23",Je="_text_1xe4n_28",Qe="_label_1xe4n_53",Xe={content:Ye,info:je,card:Ge,text:Je,label:Qe},Ze={$style:Xe},et=K(qe,[["__cssModules",Ze]]),tt=async(_,u,e)=>{const{data:o}=await J(_.baseUrl,`/workflow-history/workflow/${u}`,e);return o},ot=async(_,u,e)=>{const{data:o}=await J(_.baseUrl,`/workflow-history/workflow/${u}/version/${e}`);return o},st=ge("workflowHistory",()=>{const _=Q(),u=pe(),e=X(),o=T(()=>u.settings.workflowHistory.licensePruneTime),v=T(()=>u.settings.workflowHistory.pruneTime),c=T(()=>Math.min(v.value,o.value)),m=T(()=>o.value!==-1&&o.value===v.value),i=async(n,l)=>tt(_.getRestApiContext,n,l),p=async(n,l)=>ot(_.getRestApiContext,n,l);return{getWorkflowHistory:i,getWorkflowVersion:p,downloadVersion:async(n,l,t)=>{const[r,a]=await Promise.all([e.fetchWorkflow(n),p(n,l)]),{connections:h,nodes:b}=a,R=new Blob([JSON.stringify({...r,nodes:b,connections:h},null,2)],{type:"application/json;charset=utf-8"});Ie.saveAs(R,`${r.name}(${t.formattedCreatedAt}).json`)},cloneIntoNewWorkflow:async(n,l,t)=>{const[r,a]=await Promise.all([e.fetchWorkflow(n),p(n,l)]),{connections:h,nodes:b}=a,{name:R}=r,z=await ke(_.getRestApiContext,`${R} (${t.formattedCreatedAt})`),S={nodes:b,connections:h,name:z.name};return e.createNewWorkflow(S)},restoreWorkflow:async(n,l,t)=>{const r=await p(n,l),{connections:a,nodes:h}=r,b={connections:a,nodes:h};return t&&(b.active=!1),e.updateWorkflow(n,b,!0).catch(async R=>{if(R.httpStatusCode===400&&R.message.includes("can not be activated"))return e.fetchWorkflow(n);throw new Error(R)})},evaluatedPruneTime:c,shouldUpgrade:m}}),nt=B({__name:"WorkflowHistory",setup(_){const u=["restore","clone","open","download"],e=u.reduce((s,w)=>({...s,[w.toUpperCase()]:w}),{}),o=ce(),v=we(),c=D(),m=ve(),i=st(),p=ye(),W=X(),L=g(!0),x=g(!0),n=g(20),l=g(0),t=T(()=>({name:U.WORKFLOW,params:{name:o.params.workflowId}})),r=g(null),a=g([]),h=g(null),b=T(()=>u.map(s=>({label:c.baseText(`workflowHistory.item.actions.${s}`),disabled:!1,value:s}))),R=T(()=>{var s;return((s=a.value[0])==null?void 0:s.versionId)===o.params.versionId}),z=T(()=>Math.floor(i.evaluatedPruneTime/24)),S=s=>{_e.track(s,{instance_id:Q().instanceId,workflow_id:o.params.workflowId})},q=async s=>{const w=await i.getWorkflowHistory(o.params.workflowId,s);l.value=w.length,a.value=a.value.concat(w)};de(async()=>{S("User opened workflow history");try{const[s]=await Promise.all([W.fetchWorkflow(o.params.workflowId),q({take:n.value})]);r.value=s,x.value=!1,!o.params.versionId&&a.value.length&&await v.replace({name:U.WORKFLOW_HISTORY,params:{workflowId:o.params.workflowId,versionId:a.value[0].versionId}})}catch(s){L.value=!1,m.showError(s,c.baseText("workflowHistory.title"))}});const Y=s=>{const{href:w}=v.resolve({name:U.WORKFLOW_HISTORY,params:{workflowId:o.params.workflowId,versionId:s}});window.open(w,"_blank")},ee=async(s,w)=>new Promise((y,A)=>{const E=[{text:c.baseText("workflowHistory.action.restore.modal.button.cancel"),type:"tertiary",action:()=>{y("cancel")}}];s&&E.push({text:c.baseText("workflowHistory.action.restore.modal.button.deactivateAndRestore"),type:"tertiary",action:()=>{y("deactivateAndRestore")}}),E.push({text:c.baseText("workflowHistory.action.restore.modal.button.restore"),type:"primary",action:()=>{y("restore")}});try{p.openModalWithData({name:he,data:{beforeClose:()=>{y("cancel")},isWorkflowActivated:s,formattedCreatedAt:w,buttons:E}})}catch(F){A(F)}}),te=async(s,w)=>{const y=await i.cloneIntoNewWorkflow(o.params.workflowId,s,w),{href:A}=v.resolve({name:U.WORKFLOW,params:{name:y.id}});m.showMessage({title:c.baseText("workflowHistory.action.clone.success.title"),message:me("a",{href:A,target:"_blank"},c.baseText("workflowHistory.action.clone.success.message")),type:"success",duration:1e4})},oe=async(s,w)=>{const y=await W.fetchWorkflow(o.params.workflowId),A=await ee(y.active,w.formattedCreatedAt);if(A==="cancel")return;r.value=await i.restoreWorkflow(o.params.workflowId,s,A==="deactivateAndRestore");const E=await i.getWorkflowHistory(o.params.workflowId,{take:1});a.value=E.concat(a.value),m.showMessage({title:c.baseText("workflowHistory.action.restore.success.title"),type:"success"})},j=async({action:s,id:w,data:y})=>{try{switch(s){case e.OPEN:Y(w),S("User opened version in new tab");break;case e.DOWNLOAD:await i.downloadVersion(o.params.workflowId,w,y),S("User downloaded version");break;case e.CLONE:await te(w,y),S("User cloned version");break;case e.RESTORE:await oe(w,y),S("User restored version");break}}catch(A){m.showError(A,c.baseText("workflowHistory.action.error.title",{interpolate:{action:c.baseText(`workflowHistory.item.actions.${s}`).toLowerCase()}}))}},se=async({event:s,id:w})=>{s.metaKey||s.ctrlKey?(Y(w),S("User opened version in new tab")):await v.push({name:U.WORKFLOW_HISTORY,params:{workflowId:o.params.workflowId,versionId:w}})},ne=()=>{p.goToUpgrade("workflow-history","upgrade-workflow-history")};return ue(async()=>{if(o.params.versionId){try{h.value=await i.getWorkflowVersion(o.params.workflowId,o.params.versionId),S("User selected version")}catch(s){m.showError(new Error(`${s.message} "${o.params.versionId}" `),c.baseText("workflowHistory.title"))}try{r.value=await W.fetchWorkflow(o.params.workflowId)}catch(s){L.value=!1,m.showError(s,c.baseText("workflowHistory.title"))}}}),(s,w)=>{const y=O("n8n-heading"),A=O("n8n-button"),E=O("router-link");return I(),C("div",{class:f(s.$style.view)},[H(y,{class:f(s.$style.header),tag:"h2",size:"medium"},{default:V(()=>{var F;return[N(k((F=r.value)==null?void 0:F.name),1)]}),_:1},8,["class"]),d("div",{class:f(s.$style.corner)},[H(y,{tag:"h2",size:"medium",bold:""},{default:V(()=>[N(k($(c).baseText("workflowHistory.title")),1)]),_:1}),H(E,{to:t.value,"data-test-id":"workflow-history-close-button"},{default:V(()=>[H(A,{type:"tertiary",icon:"times",size:"small",text:"",square:""})]),_:1},8,["to"])],2),d("div",{class:f(s.$style.listComponentWrapper)},[L.value?(I(),P(De,{key:0,items:a.value,lastReceivedItemsLength:l.value,activeItem:h.value,actions:b.value,requestNumberOfItems:n.value,shouldUpgrade:$(i).shouldUpgrade,evaluatedPruneTime:z.value,isListLoading:x.value,onAction:j,onPreview:se,onLoadMore:q,onUpgrade:ne},null,8,["items","lastReceivedItemsLength","activeItem","actions","requestNumberOfItems","shouldUpgrade","evaluatedPruneTime","isListLoading"])):M("",!0)],2),d("div",{class:f(s.$style.contentComponentWrapper)},[L.value?(I(),P(et,{key:0,workflow:r.value,workflowVersion:h.value,actions:b.value,isListLoading:x.value,isFirstItemShown:R.value,onAction:j},null,8,["workflow","workflowVersion","actions","isListLoading","isFirstItemShown"])):M("",!0)],2)],2)}}}),rt="_view_1ax7n_5",at="_header_1ax7n_15",it="_corner_1ax7n_23",lt="_contentComponentWrapper_1ax7n_34",ct="_listComponentWrapper_1ax7n_39",wt={view:rt,header:at,corner:it,contentComponentWrapper:lt,listComponentWrapper:ct},dt={$style:wt},Ft=K(nt,[["__cssModules",dt]]);export{Ft as default};
|
|
2
|
+
//# sourceMappingURL=WorkflowHistory-diO3ekal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowHistory-mqWH3nQZ.js","sources":["../../src/components/WorkflowHistory/WorkflowHistoryListItem.vue","../../src/components/WorkflowHistory/WorkflowHistoryList.vue","../../src/components/WorkflowHistory/WorkflowHistoryContent.vue","../../src/api/workflowHistory.ts","../../src/stores/workflowHistory.store.ts","../../src/views/WorkflowHistory.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, onMounted } from 'vue';\nimport dateformat from 'dateformat';\nimport type { UserAction } from 'n8n-design-system';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n} from '@/types/workflowHistory';\nimport { useI18n } from '@/composables/useI18n';\n\nconst props = defineProps<{\n\titem: WorkflowHistory;\n\tindex: number;\n\tactions: UserAction[];\n\tisActive: boolean;\n}>();\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'mounted', value: { index: number; offsetTop: number; isActive: boolean }): void;\n}>();\n\nconst i18n = useI18n();\n\nconst actionsVisible = ref(false);\nconst itemElement = ref<HTMLElement | null>(null);\nconst authorElement = ref<HTMLElement | null>(null);\nconst isAuthorElementTruncated = ref(false);\n\nconst formattedCreatedAt = computed<string>(() => {\n\tconst currentYear = new Date().getFullYear().toString();\n\tconst [date, time] = dateformat(\n\t\tprops.item.createdAt,\n\t\t`${props.item.createdAt.startsWith(currentYear) ? '' : 'yyyy '}mmm d\"#\"HH:MM:ss`,\n\t).split('#');\n\n\treturn i18n.baseText('workflowHistory.item.createdAt', { interpolate: { date, time } });\n});\n\nconst authors = computed<{ size: number; label: string }>(() => {\n\tconst allAuthors = props.item.authors.split(', ');\n\tlet label = allAuthors[0];\n\n\tif (allAuthors.length > 1) {\n\t\tlabel = `${label} + ${allAuthors.length - 1}`;\n\t}\n\n\treturn {\n\t\tsize: allAuthors.length,\n\t\tlabel,\n\t};\n});\n\nconst idLabel = computed<string>(() =>\n\ti18n.baseText('workflowHistory.item.id', { interpolate: { id: props.item.versionId } }),\n);\n\nconst onAction = (action: WorkflowHistoryActionTypes[number]) => {\n\temit('action', {\n\t\taction,\n\t\tid: props.item.versionId,\n\t\tdata: { formattedCreatedAt: formattedCreatedAt.value },\n\t});\n};\n\nconst onVisibleChange = (visible: boolean) => {\n\tactionsVisible.value = visible;\n};\n\nconst onItemClick = (event: MouseEvent) => {\n\temit('preview', { event, id: props.item.versionId });\n};\n\nonMounted(() => {\n\temit('mounted', {\n\t\tindex: props.index,\n\t\toffsetTop: itemElement.value?.offsetTop ?? 0,\n\t\tisActive: props.isActive,\n\t});\n\tisAuthorElementTruncated.value =\n\t\tauthorElement.value?.scrollWidth > authorElement.value?.clientWidth;\n});\n</script>\n<template>\n\t<li\n\t\tref=\"itemElement\"\n\t\tdata-test-id=\"workflow-history-list-item\"\n\t\t:class=\"{\n\t\t\t[$style.item]: true,\n\t\t\t[$style.active]: props.isActive,\n\t\t\t[$style.actionsVisible]: actionsVisible,\n\t\t}\"\n\t>\n\t\t<slot :formattedCreatedAt=\"formattedCreatedAt\">\n\t\t\t<p @click=\"onItemClick\">\n\t\t\t\t<time :datetime=\"item.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t:disabled=\"authors.size < 2 && !isAuthorElementTruncated\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ props.item.authors }}</template>\n\t\t\t\t\t<span ref=\"authorElement\">{{ authors.label }}</span>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<data :value=\"item.versionId\">{{ idLabel }}</data>\n\t\t\t</p>\n\t\t</slot>\n\t\t<div :class=\"$style.tail\">\n\t\t\t<n8n-badge v-if=\"props.index === 0\">\n\t\t\t\t{{ i18n.baseText('workflowHistory.item.latest') }}\n\t\t\t</n8n-badge>\n\t\t\t<n8n-action-toggle\n\t\t\t\ttheme=\"dark\"\n\t\t\t\t:class=\"$style.actions\"\n\t\t\t\t:actions=\"props.actions\"\n\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@click.stop\n\t\t\t\t@visible-change=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<slot name=\"action-toggle-button\" />\n\t\t\t</n8n-action-toggle>\n\t\t</div>\n\t</li>\n</template>\n<style module lang=\"scss\">\n.item {\n\tdisplay: flex;\n\tposition: relative;\n\talign-items: center;\n\tjustify-content: space-between;\n\tborder-left: 2px var(--border-style-base) transparent;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-2xs);\n\n\tp {\n\t\tdisplay: grid;\n\t\tpadding: var(--spacing-s);\n\t\tcursor: pointer;\n\t\tflex: 1 1 auto;\n\n\t\ttime {\n\t\t\tpadding: 0 0 var(--spacing-5xs);\n\t\t\tcolor: var(--color-text-dark);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t}\n\n\t\tspan,\n\t\tdata {\n\t\t\tjustify-self: start;\n\t\t\tmax-width: 160px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tmargin-top: calc(var(--spacing-4xs) * -1);\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\t}\n\n\t.tail {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t}\n\n\t&.active {\n\t\tbackground-color: var(--color-background-base);\n\t\tborder-left-color: var(--color-primary);\n\n\t\tp {\n\t\t\tcursor: default;\n\t\t}\n\t}\n\n\t&:hover,\n\t&.actionsVisible {\n\t\tborder-left-color: var(--color-foreground-xdark);\n\t}\n}\n\n.actions {\n\tdisplay: block;\n\tpadding: var(--spacing-3xs);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { UserAction } from 'n8n-design-system';\nimport { useI18n } from '@/composables/useI18n';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\n\nconst props = defineProps<{\n\titems: WorkflowHistory[];\n\tactiveItem: WorkflowHistory | null;\n\tactions: UserAction[];\n\trequestNumberOfItems: number;\n\tlastReceivedItemsLength: number;\n\tevaluatedPruneTime: number;\n\tshouldUpgrade?: boolean;\n\tisListLoading?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'loadMore', value: WorkflowHistoryRequestParams): void;\n\t(event: 'upgrade'): void;\n}>();\n\nconst i18n = useI18n();\n\nconst listElement = ref<Element | null>(null);\nconst shouldAutoScroll = ref(true);\nconst observer = ref<IntersectionObserver | null>(null);\n\nconst getActions = (index: number) =>\n\tindex === 0 ? props.actions.filter((action) => action.value !== 'restore') : props.actions;\n\nconst observeElement = (element: Element) => {\n\tobserver.value = new IntersectionObserver(\n\t\t([entry]) => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tobserver.value?.unobserve(element);\n\t\t\t\tobserver.value?.disconnect();\n\t\t\t\tobserver.value = null;\n\t\t\t\temit('loadMore', { take: props.requestNumberOfItems, skip: props.items.length });\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: listElement.value,\n\t\t\tthreshold: 0.01,\n\t\t},\n\t);\n\n\tobserver.value.observe(element);\n};\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\tshouldAutoScroll.value = false;\n\temit('action', { action, id, data });\n};\n\nconst onPreview = ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tshouldAutoScroll.value = false;\n\temit('preview', { event, id });\n};\n\nconst onItemMounted = ({\n\tindex,\n\toffsetTop,\n\tisActive,\n}: {\n\tindex: number;\n\toffsetTop: number;\n\tisActive: boolean;\n}) => {\n\tif (isActive && shouldAutoScroll.value) {\n\t\tshouldAutoScroll.value = false;\n\t\tlistElement.value?.scrollTo({ top: offsetTop, behavior: 'smooth' });\n\t}\n\n\tif (\n\t\tindex === props.items.length - 1 &&\n\t\tprops.lastReceivedItemsLength === props.requestNumberOfItems\n\t) {\n\t\tobserveElement(listElement.value?.children[index] as Element);\n\t}\n};\n</script>\n\n<template>\n\t<ul :class=\"$style.list\" ref=\"listElement\" data-test-id=\"workflow-history-list\">\n\t\t<workflow-history-list-item\n\t\t\tv-for=\"(item, index) in props.items\"\n\t\t\t:key=\"item.versionId\"\n\t\t\t:index=\"index\"\n\t\t\t:item=\"item\"\n\t\t\t:isActive=\"item.versionId === props.activeItem?.versionId\"\n\t\t\t:actions=\"getActions(index)\"\n\t\t\t@action=\"onAction\"\n\t\t\t@preview=\"onPreview\"\n\t\t\t@mounted=\"onItemMounted\"\n\t\t/>\n\t\t<li v-if=\"!props.items.length && !props.isListLoading\" :class=\"$style.empty\">\n\t\t\t{{ i18n.baseText('workflowHistory.empty') }}\n\t\t\t<br />\n\t\t\t{{ i18n.baseText('workflowHistory.hint') }}\n\t\t</li>\n\t\t<li\n\t\t\tv-if=\"props.isListLoading\"\n\t\t\t:class=\"$style.loader\"\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-busy=\"true\"\n\t\t\t:aria-label=\"i18n.baseText('generic.loading')\"\n\t\t>\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t</li>\n\t\t<li v-if=\"props.shouldUpgrade\" :class=\"$style.retention\">\n\t\t\t<span>\n\t\t\t\t{{\n\t\t\t\t\ti18n.baseText('workflowHistory.limit', {\n\t\t\t\t\t\tinterpolate: { evaluatedPruneTime: props.evaluatedPruneTime },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</span>\n\t\t\t<i18n-t keypath=\"workflowHistory.upgrade\" tag=\"span\">\n\t\t\t\t<template #link>\n\t\t\t\t\t<a href=\"#\" @click=\"emit('upgrade')\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.upgrade.link') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</li>\n\t</ul>\n</template>\n\n<style module lang=\"scss\">\n.list {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.empty {\n\tdisplay: flex;\n\tposition: absolute;\n\theight: 100%;\n\tpadding: 0 25%;\n\tjustify-content: center;\n\talign-items: center;\n\ttext-align: center;\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-s);\n\tline-height: var(--font-line-height-loose);\n}\n\n.loader {\n\tpadding: 0 var(--spacing-s);\n}\n\n.retention {\n\tdisplay: grid;\n\tpadding: var(--spacing-s);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-loose);\n\ttext-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport type {\n\tWorkflowVersion,\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport WorkflowPreview from '@/components/WorkflowPreview.vue';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\n\nconst props = defineProps<{\n\tworkflow: IWorkflowDb | null;\n\tworkflowVersion: WorkflowVersion | null;\n\tactions: UserAction[];\n\tisListLoading?: boolean;\n\tisFirstItemShown?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n}>();\n\nconst workflowVersionPreview = computed<IWorkflowDb | undefined>(() => {\n\tif (!props.workflowVersion || !props.workflow) {\n\t\treturn;\n\t}\n\tconst { pinData, ...workflow } = props.workflow;\n\treturn {\n\t\t...workflow,\n\t\tnodes: props.workflowVersion.nodes,\n\t\tconnections: props.workflowVersion.connections,\n\t};\n});\n\nconst actions = computed(() =>\n\tprops.isFirstItemShown\n\t\t? props.actions.filter((action) => action.value !== 'restore')\n\t\t: props.actions,\n);\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\temit('action', { action, id, data });\n};\n</script>\n\n<template>\n\t<div :class=\"$style.content\">\n\t\t<WorkflowPreview\n\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t:workflow=\"workflowVersionPreview\"\n\t\t\t:loading=\"props.isListLoading\"\n\t\t\tloaderType=\"spinner\"\n\t\t/>\n\t\t<ul :class=\"$style.info\">\n\t\t\t<workflow-history-list-item\n\t\t\t\t:class=\"$style.card\"\n\t\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t\t:index=\"-1\"\n\t\t\t\t:item=\"props.workflowVersion\"\n\t\t\t\t:isActive=\"false\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t>\n\t\t\t\t<template #default=\"{ formattedCreatedAt }\">\n\t\t\t\t\t<section :class=\"$style.text\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.title') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<time :datetime=\"props.workflowVersion.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.editedBy') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>{{ props.workflowVersion.authors }}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.versionId') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<data :value=\"props.workflowVersion.versionId\">{{\n\t\t\t\t\t\t\t\tprops.workflowVersion.versionId\n\t\t\t\t\t\t\t}}</data>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\t\t\t\t</template>\n\t\t\t\t<template #action-toggle-button>\n\t\t\t\t\t<n8n-button type=\"tertiary\" size=\"large\" data-test-id=\"action-toggle-button\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.actions') }}\n\t\t\t\t\t\t<n8n-icon class=\"ml-3xs\" icon=\"chevron-down\" size=\"small\" />\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</template>\n\t\t\t</workflow-history-list-item>\n\t\t</ul>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.content {\n\tposition: absolute;\n\tdisplay: block;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.info {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n\n.card {\n\tpadding: var(--spacing-s) var(--spacing-l) 0 var(--spacing-xl);\n\tborder: 0;\n\talign-items: start;\n\n\t.text {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex: 1 1 auto;\n\n\t\tp {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tpadding: 0;\n\t\t\tcursor: default;\n\n\t\t\t&:first-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\t\t\t\tpadding-bottom: var(--spacing-4xs);\n\t\t\t\t* {\n\t\t\t\t\tmargin-top: auto;\n\t\t\t\t\tfont-size: var(--font-size-m);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:last-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\n\t\t\t\t* {\n\t\t\t\t\tfont-size: var(--font-size-2xs);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.label {\n\t\t\t\tcolor: var(--color-text-light);\n\t\t\t\tpadding-right: var(--spacing-4xs);\n\t\t\t}\n\n\t\t\t* {\n\t\t\t\tmax-width: unset;\n\t\t\t\tjustify-self: unset;\n\t\t\t\twhite-space: unset;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: unset;\n\t\t\t\tpadding: 0;\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\n\nexport const getWorkflowHistory = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tqueryParams: WorkflowHistoryRequestParams,\n): Promise<WorkflowHistory[]> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}`,\n\t\tqueryParams,\n\t);\n\treturn data;\n};\n\nexport const getWorkflowVersion = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tversionId: string,\n): Promise<WorkflowVersion> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}/version/${versionId}`,\n\t);\n\treturn data;\n};\n","import { computed } from 'vue';\nimport { defineStore } from 'pinia';\nimport { saveAs } from 'file-saver';\nimport type { IWorkflowDataUpdate, IWorkflowDb } from '@/Interface';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport * as whApi from '@/api/workflowHistory';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getNewWorkflow } from '@/api/workflows';\n\nexport const useWorkflowHistoryStore = defineStore('workflowHistory', () => {\n\tconst rootStore = useRootStore();\n\tconst settingsStore = useSettingsStore();\n\tconst workflowsStore = useWorkflowsStore();\n\n\tconst licensePruneTime = computed(() => settingsStore.settings.workflowHistory.licensePruneTime);\n\tconst pruneTime = computed(() => settingsStore.settings.workflowHistory.pruneTime);\n\tconst evaluatedPruneTime = computed(() => Math.min(pruneTime.value, licensePruneTime.value));\n\tconst shouldUpgrade = computed(\n\t\t() => licensePruneTime.value !== -1 && licensePruneTime.value === pruneTime.value,\n\t);\n\n\tconst getWorkflowHistory = async (\n\t\tworkflowId: string,\n\t\tqueryParams: WorkflowHistoryRequestParams,\n\t): Promise<WorkflowHistory[]> =>\n\t\twhApi.getWorkflowHistory(rootStore.getRestApiContext, workflowId, queryParams);\n\n\tconst getWorkflowVersion = async (\n\t\tworkflowId: string,\n\t\tversionId: string,\n\t): Promise<WorkflowVersion> =>\n\t\twhApi.getWorkflowVersion(rootStore.getRestApiContext, workflowId, versionId);\n\n\tconst downloadVersion = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: WorkflowVersionId,\n\t\tdata: { formattedCreatedAt: string },\n\t) => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst blob = new Blob([JSON.stringify({ ...workflow, nodes, connections }, null, 2)], {\n\t\t\ttype: 'application/json;charset=utf-8',\n\t\t});\n\t\tsaveAs(blob, `${workflow.name}(${data.formattedCreatedAt}).json`);\n\t};\n\n\tconst cloneIntoNewWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tdata: { formattedCreatedAt: string },\n\t): Promise<IWorkflowDb> => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst { name } = workflow;\n\t\tconst newWorkflow = await getNewWorkflow(\n\t\t\trootStore.getRestApiContext,\n\t\t\t`${name} (${data.formattedCreatedAt})`,\n\t\t);\n\t\tconst newWorkflowData: IWorkflowDataUpdate = {\n\t\t\tnodes,\n\t\t\tconnections,\n\t\t\tname: newWorkflow.name,\n\t\t};\n\t\treturn workflowsStore.createNewWorkflow(newWorkflowData);\n\t};\n\n\tconst restoreWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tshouldDeactivate: boolean,\n\t): Promise<IWorkflowDb> => {\n\t\tconst workflowVersion = await getWorkflowVersion(workflowId, workflowVersionId);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst updateData: IWorkflowDataUpdate = { connections, nodes };\n\n\t\tif (shouldDeactivate) {\n\t\t\tupdateData.active = false;\n\t\t}\n\n\t\treturn workflowsStore.updateWorkflow(workflowId, updateData, true).catch(async (error) => {\n\t\t\tif (error.httpStatusCode === 400 && error.message.includes('can not be activated')) {\n\t\t\t\treturn workflowsStore.fetchWorkflow(workflowId);\n\t\t\t} else {\n\t\t\t\tthrow new Error(error);\n\t\t\t}\n\t\t});\n\t};\n\n\treturn {\n\t\tgetWorkflowHistory,\n\t\tgetWorkflowVersion,\n\t\tdownloadVersion,\n\t\tcloneIntoNewWorkflow,\n\t\trestoreWorkflow,\n\t\tevaluatedPruneTime,\n\t\tshouldUpgrade,\n\t};\n});\n","<script setup lang=\"ts\">\nimport { onBeforeMount, ref, watchEffect, computed, h } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport { VIEWS, WORKFLOW_HISTORY_VERSION_RESTORE } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type {\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n\tWorkflowHistoryRequestParams,\n\tWorkflowHistory,\n\tWorkflowVersion,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryList from '@/components/WorkflowHistory/WorkflowHistoryList.vue';\nimport WorkflowHistoryContent from '@/components/WorkflowHistory/WorkflowHistoryContent.vue';\nimport { useWorkflowHistoryStore } from '@/stores/workflowHistory.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { telemetry } from '@/plugins/telemetry';\nimport { useRootStore } from '@/stores/n8nRoot.store';\n\ntype WorkflowHistoryActionRecord = {\n\t[K in Uppercase<WorkflowHistoryActionTypes[number]>]: Lowercase<K>;\n};\n\nconst enum WorkflowHistoryVersionRestoreModalActions {\n\trestore = 'restore',\n\tdeactivateAndRestore = 'deactivateAndRestore',\n\tcancel = 'cancel',\n}\n\nconst workflowHistoryActionTypes: WorkflowHistoryActionTypes = [\n\t'restore',\n\t'clone',\n\t'open',\n\t'download',\n];\nconst WORKFLOW_HISTORY_ACTIONS = workflowHistoryActionTypes.reduce(\n\t(record, key) => ({ ...record, [key.toUpperCase()]: key }),\n\t{} as WorkflowHistoryActionRecord,\n);\n\nconst route = useRoute();\nconst router = useRouter();\nconst i18n = useI18n();\nconst toast = useToast();\nconst workflowHistoryStore = useWorkflowHistoryStore();\nconst uiStore = useUIStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst canRender = ref(true);\nconst isListLoading = ref(true);\nconst requestNumberOfItems = ref(20);\nconst lastReceivedItemsLength = ref(0);\nconst editorRoute = computed(() => ({\n\tname: VIEWS.WORKFLOW,\n\tparams: {\n\t\tname: route.params.workflowId,\n\t},\n}));\nconst activeWorkflow = ref<IWorkflowDb | null>(null);\nconst workflowHistory = ref<WorkflowHistory[]>([]);\nconst activeWorkflowVersion = ref<WorkflowVersion | null>(null);\nconst actions = computed<UserAction[]>(() =>\n\tworkflowHistoryActionTypes.map((value) => ({\n\t\tlabel: i18n.baseText(`workflowHistory.item.actions.${value}`),\n\t\tdisabled: false,\n\t\tvalue,\n\t})),\n);\n\nconst isFirstItemShown = computed(\n\t() => workflowHistory.value[0]?.versionId === route.params.versionId,\n);\nconst evaluatedPruneTime = computed(() => Math.floor(workflowHistoryStore.evaluatedPruneTime / 24));\n\nconst sendTelemetry = (event: string) => {\n\ttelemetry.track(event, {\n\t\tinstance_id: useRootStore().instanceId,\n\t\tworkflow_id: route.params.workflowId,\n\t});\n};\n\nconst loadMore = async (queryParams: WorkflowHistoryRequestParams) => {\n\tconst history = await workflowHistoryStore.getWorkflowHistory(\n\t\troute.params.workflowId,\n\t\tqueryParams,\n\t);\n\tlastReceivedItemsLength.value = history.length;\n\tworkflowHistory.value = workflowHistory.value.concat(history);\n};\n\nonBeforeMount(async () => {\n\tsendTelemetry('User opened workflow history');\n\ttry {\n\t\tconst [workflow] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(route.params.workflowId),\n\t\t\tloadMore({ take: requestNumberOfItems.value }),\n\t\t]);\n\t\tactiveWorkflow.value = workflow;\n\t\tisListLoading.value = false;\n\n\t\tif (!route.params.versionId && workflowHistory.value.length) {\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\t\tparams: {\n\t\t\t\t\tworkflowId: route.params.workflowId,\n\t\t\t\t\tversionId: workflowHistory.value[0].versionId,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n\nconst openInNewTab = (id: WorkflowVersionId) => {\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: route.params.workflowId,\n\t\t\tversionId: id,\n\t\t},\n\t});\n\twindow.open(href, '_blank');\n};\n\nconst openRestorationModal = async (\n\tisWorkflowActivated: boolean,\n\tformattedCreatedAt: string,\n): Promise<WorkflowHistoryVersionRestoreModalActions> => {\n\treturn new Promise((resolve, reject) => {\n\t\tconst buttons = [\n\t\t\t{\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.cancel'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tif (isWorkflowActivated) {\n\t\t\tbuttons.push({\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.deactivateAndRestore'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tbuttons.push({\n\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.restore'),\n\t\t\ttype: 'primary',\n\t\t\taction: () => {\n\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.restore);\n\t\t\t},\n\t\t});\n\n\t\ttry {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: WORKFLOW_HISTORY_VERSION_RESTORE,\n\t\t\t\tdata: {\n\t\t\t\t\tbeforeClose: () => {\n\t\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t\t},\n\t\t\t\t\tisWorkflowActivated,\n\t\t\t\t\tformattedCreatedAt,\n\t\t\t\t\tbuttons,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n};\n\nconst cloneWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst clonedWorkflow = await workflowHistoryStore.cloneIntoNewWorkflow(\n\t\troute.params.workflowId,\n\t\tid,\n\t\tdata,\n\t);\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW,\n\t\tparams: {\n\t\t\tname: clonedWorkflow.id,\n\t\t},\n\t});\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.clone.success.title'),\n\t\tmessage: h(\n\t\t\t'a',\n\t\t\t{ href, target: '_blank' },\n\t\t\ti18n.baseText('workflowHistory.action.clone.success.message'),\n\t\t),\n\t\ttype: 'success',\n\t\tduration: 10000,\n\t});\n};\n\nconst restoreWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst workflow = await workflowsStore.fetchWorkflow(route.params.workflowId);\n\tconst modalAction = await openRestorationModal(workflow.active, data.formattedCreatedAt);\n\tif (modalAction === WorkflowHistoryVersionRestoreModalActions.cancel) {\n\t\treturn;\n\t}\n\tactiveWorkflow.value = await workflowHistoryStore.restoreWorkflow(\n\t\troute.params.workflowId,\n\t\tid,\n\t\tmodalAction === WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore,\n\t);\n\tconst history = await workflowHistoryStore.getWorkflowHistory(route.params.workflowId, {\n\t\ttake: 1,\n\t});\n\tworkflowHistory.value = history.concat(workflowHistory.value);\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.restore.success.title'),\n\t\ttype: 'success',\n\t});\n};\n\nconst onAction = async ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.OPEN:\n\t\t\t\topenInNewTab(id);\n\t\t\t\tsendTelemetry('User opened version in new tab');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.DOWNLOAD:\n\t\t\t\tawait workflowHistoryStore.downloadVersion(route.params.workflowId, id, data);\n\t\t\t\tsendTelemetry('User downloaded version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.CLONE:\n\t\t\t\tawait cloneWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User cloned version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.RESTORE:\n\t\t\t\tawait restoreWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User restored version');\n\t\t\t\tbreak;\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowHistory.action.error.title', {\n\t\t\t\tinterpolate: {\n\t\t\t\t\taction: i18n.baseText(`workflowHistory.item.actions.${action}`).toLowerCase(),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n};\n\nconst onPreview = async ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tif (event.metaKey || event.ctrlKey) {\n\t\topenInNewTab(id);\n\t\tsendTelemetry('User opened version in new tab');\n\t} else {\n\t\tawait router.push({\n\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\tparams: {\n\t\t\t\tworkflowId: route.params.workflowId,\n\t\t\t\tversionId: id,\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onUpgrade = () => {\n\tvoid uiStore.goToUpgrade('workflow-history', 'upgrade-workflow-history');\n};\n\nwatchEffect(async () => {\n\tif (!route.params.versionId) {\n\t\treturn;\n\t}\n\ttry {\n\t\tactiveWorkflowVersion.value = await workflowHistoryStore.getWorkflowVersion(\n\t\t\troute.params.workflowId,\n\t\t\troute.params.versionId,\n\t\t);\n\t\tsendTelemetry('User selected version');\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\tnew Error(`${error.message} \"${route.params.versionId}\" `),\n\t\t\ti18n.baseText('workflowHistory.title'),\n\t\t);\n\t}\n\n\ttry {\n\t\tactiveWorkflow.value = await workflowsStore.fetchWorkflow(route.params.workflowId);\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n</script>\n<template>\n\t<div :class=\"$style.view\">\n\t\t<n8n-heading :class=\"$style.header\" tag=\"h2\" size=\"medium\">\n\t\t\t{{ activeWorkflow?.name }}\n\t\t</n8n-heading>\n\t\t<div :class=\"$style.corner\">\n\t\t\t<n8n-heading tag=\"h2\" size=\"medium\" bold>\n\t\t\t\t{{ i18n.baseText('workflowHistory.title') }}\n\t\t\t</n8n-heading>\n\t\t\t<router-link :to=\"editorRoute\" data-test-id=\"workflow-history-close-button\">\n\t\t\t\t<n8n-button type=\"tertiary\" icon=\"times\" size=\"small\" text square />\n\t\t\t</router-link>\n\t\t</div>\n\t\t<div :class=\"$style.listComponentWrapper\">\n\t\t\t<workflow-history-list\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:items=\"workflowHistory\"\n\t\t\t\t:lastReceivedItemsLength=\"lastReceivedItemsLength\"\n\t\t\t\t:activeItem=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:requestNumberOfItems=\"requestNumberOfItems\"\n\t\t\t\t:shouldUpgrade=\"workflowHistoryStore.shouldUpgrade\"\n\t\t\t\t:evaluatedPruneTime=\"evaluatedPruneTime\"\n\t\t\t\t:isListLoading=\"isListLoading\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@preview=\"onPreview\"\n\t\t\t\t@load-more=\"loadMore\"\n\t\t\t\t@upgrade=\"onUpgrade\"\n\t\t\t/>\n\t\t</div>\n\t\t<div :class=\"$style.contentComponentWrapper\">\n\t\t\t<workflow-history-content\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:workflow=\"activeWorkflow\"\n\t\t\t\t:workflowVersion=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:isListLoading=\"isListLoading\"\n\t\t\t\t:isFirstItemShown=\"isFirstItemShown\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n<style module lang=\"scss\">\n.view {\n\tposition: relative;\n\tdisplay: grid;\n\twidth: 100%;\n\tgrid-template-areas: 'header corner' 'content list';\n\tgrid-template-columns: auto 330px;\n\tgrid-template-rows: 65px auto;\n\tbackground-color: var(--color-background-xlight);\n}\n\n.header {\n\tgrid-area: header;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 var(--spacing-l);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.corner {\n\tgrid-area: corner;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 0 var(--spacing-3xs) 0 var(--spacing-s);\n\tbackground-color: var(--color-background-lighter);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-left: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.contentComponentWrapper {\n\tgrid-area: content;\n\tposition: relative;\n}\n\n.listComponentWrapper {\n\tgrid-area: list;\n\tposition: relative;\n\n\t&::before {\n\t\tcontent: '';\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\twidth: var(--border-width-base);\n\t\tbackground-color: var(--color-foreground-base);\n\t}\n}\n</style>\n"],"names":["i18n","useI18n","actionsVisible","ref","itemElement","authorElement","isAuthorElementTruncated","formattedCreatedAt","computed","currentYear","date","time","dateformat","props","authors","allAuthors","label","idLabel","onAction","action","emit","onVisibleChange","visible","onItemClick","event","onMounted","_a","_b","_c","listElement","shouldAutoScroll","observer","getActions","index","observeElement","element","entry","id","data","onPreview","onItemMounted","offsetTop","isActive","workflowVersionPreview","pinData","workflow","actions","getWorkflowHistory","context","workflowId","queryParams","get","getWorkflowVersion","versionId","useWorkflowHistoryStore","defineStore","rootStore","useRootStore","settingsStore","useSettingsStore","workflowsStore","useWorkflowsStore","licensePruneTime","pruneTime","evaluatedPruneTime","shouldUpgrade","whApi.getWorkflowHistory","whApi.getWorkflowVersion","workflowVersionId","workflowVersion","connections","nodes","blob","saveAs","name","newWorkflow","getNewWorkflow","newWorkflowData","shouldDeactivate","updateData","error","workflowHistoryActionTypes","WORKFLOW_HISTORY_ACTIONS","record","key","route","useRoute","router","useRouter","toast","useToast","workflowHistoryStore","uiStore","useUIStore","canRender","isListLoading","requestNumberOfItems","lastReceivedItemsLength","editorRoute","VIEWS","activeWorkflow","workflowHistory","activeWorkflowVersion","value","isFirstItemShown","sendTelemetry","telemetry","loadMore","history","onBeforeMount","openInNewTab","href","openRestorationModal","isWorkflowActivated","resolve","reject","buttons","WORKFLOW_HISTORY_VERSION_RESTORE","cloneWorkflowVersion","clonedWorkflow","h","restoreWorkflowVersion","modalAction","onUpgrade","watchEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowHistory-diO3ekal.js","sources":["../../src/components/WorkflowHistory/WorkflowHistoryListItem.vue","../../src/components/WorkflowHistory/WorkflowHistoryList.vue","../../src/components/WorkflowHistory/WorkflowHistoryContent.vue","../../src/api/workflowHistory.ts","../../src/stores/workflowHistory.store.ts","../../src/views/WorkflowHistory.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, onMounted } from 'vue';\nimport dateformat from 'dateformat';\nimport type { UserAction } from 'n8n-design-system';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n} from '@/types/workflowHistory';\nimport { useI18n } from '@/composables/useI18n';\n\nconst props = defineProps<{\n\titem: WorkflowHistory;\n\tindex: number;\n\tactions: UserAction[];\n\tisActive: boolean;\n}>();\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'mounted', value: { index: number; offsetTop: number; isActive: boolean }): void;\n}>();\n\nconst i18n = useI18n();\n\nconst actionsVisible = ref(false);\nconst itemElement = ref<HTMLElement | null>(null);\nconst authorElement = ref<HTMLElement | null>(null);\nconst isAuthorElementTruncated = ref(false);\n\nconst formattedCreatedAt = computed<string>(() => {\n\tconst currentYear = new Date().getFullYear().toString();\n\tconst [date, time] = dateformat(\n\t\tprops.item.createdAt,\n\t\t`${props.item.createdAt.startsWith(currentYear) ? '' : 'yyyy '}mmm d\"#\"HH:MM:ss`,\n\t).split('#');\n\n\treturn i18n.baseText('workflowHistory.item.createdAt', { interpolate: { date, time } });\n});\n\nconst authors = computed<{ size: number; label: string }>(() => {\n\tconst allAuthors = props.item.authors.split(', ');\n\tlet label = allAuthors[0];\n\n\tif (allAuthors.length > 1) {\n\t\tlabel = `${label} + ${allAuthors.length - 1}`;\n\t}\n\n\treturn {\n\t\tsize: allAuthors.length,\n\t\tlabel,\n\t};\n});\n\nconst idLabel = computed<string>(() =>\n\ti18n.baseText('workflowHistory.item.id', { interpolate: { id: props.item.versionId } }),\n);\n\nconst onAction = (action: WorkflowHistoryActionTypes[number]) => {\n\temit('action', {\n\t\taction,\n\t\tid: props.item.versionId,\n\t\tdata: { formattedCreatedAt: formattedCreatedAt.value },\n\t});\n};\n\nconst onVisibleChange = (visible: boolean) => {\n\tactionsVisible.value = visible;\n};\n\nconst onItemClick = (event: MouseEvent) => {\n\temit('preview', { event, id: props.item.versionId });\n};\n\nonMounted(() => {\n\temit('mounted', {\n\t\tindex: props.index,\n\t\toffsetTop: itemElement.value?.offsetTop ?? 0,\n\t\tisActive: props.isActive,\n\t});\n\tisAuthorElementTruncated.value =\n\t\tauthorElement.value?.scrollWidth > authorElement.value?.clientWidth;\n});\n</script>\n<template>\n\t<li\n\t\tref=\"itemElement\"\n\t\tdata-test-id=\"workflow-history-list-item\"\n\t\t:class=\"{\n\t\t\t[$style.item]: true,\n\t\t\t[$style.active]: props.isActive,\n\t\t\t[$style.actionsVisible]: actionsVisible,\n\t\t}\"\n\t>\n\t\t<slot :formattedCreatedAt=\"formattedCreatedAt\">\n\t\t\t<p @click=\"onItemClick\">\n\t\t\t\t<time :datetime=\"item.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t:disabled=\"authors.size < 2 && !isAuthorElementTruncated\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ props.item.authors }}</template>\n\t\t\t\t\t<span ref=\"authorElement\">{{ authors.label }}</span>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<data :value=\"item.versionId\">{{ idLabel }}</data>\n\t\t\t</p>\n\t\t</slot>\n\t\t<div :class=\"$style.tail\">\n\t\t\t<n8n-badge v-if=\"props.index === 0\">\n\t\t\t\t{{ i18n.baseText('workflowHistory.item.latest') }}\n\t\t\t</n8n-badge>\n\t\t\t<n8n-action-toggle\n\t\t\t\ttheme=\"dark\"\n\t\t\t\t:class=\"$style.actions\"\n\t\t\t\t:actions=\"props.actions\"\n\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@click.stop\n\t\t\t\t@visible-change=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<slot name=\"action-toggle-button\" />\n\t\t\t</n8n-action-toggle>\n\t\t</div>\n\t</li>\n</template>\n<style module lang=\"scss\">\n.item {\n\tdisplay: flex;\n\tposition: relative;\n\talign-items: center;\n\tjustify-content: space-between;\n\tborder-left: 2px var(--border-style-base) transparent;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-2xs);\n\n\tp {\n\t\tdisplay: grid;\n\t\tpadding: var(--spacing-s);\n\t\tcursor: pointer;\n\t\tflex: 1 1 auto;\n\n\t\ttime {\n\t\t\tpadding: 0 0 var(--spacing-5xs);\n\t\t\tcolor: var(--color-text-dark);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t}\n\n\t\tspan,\n\t\tdata {\n\t\t\tjustify-self: start;\n\t\t\tmax-width: 160px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tmargin-top: calc(var(--spacing-4xs) * -1);\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\t}\n\n\t.tail {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t}\n\n\t&.active {\n\t\tbackground-color: var(--color-background-base);\n\t\tborder-left-color: var(--color-primary);\n\n\t\tp {\n\t\t\tcursor: default;\n\t\t}\n\t}\n\n\t&:hover,\n\t&.actionsVisible {\n\t\tborder-left-color: var(--color-foreground-xdark);\n\t}\n}\n\n.actions {\n\tdisplay: block;\n\tpadding: var(--spacing-3xs);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { UserAction } from 'n8n-design-system';\nimport { useI18n } from '@/composables/useI18n';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\n\nconst props = defineProps<{\n\titems: WorkflowHistory[];\n\tactiveItem: WorkflowHistory | null;\n\tactions: UserAction[];\n\trequestNumberOfItems: number;\n\tlastReceivedItemsLength: number;\n\tevaluatedPruneTime: number;\n\tshouldUpgrade?: boolean;\n\tisListLoading?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'loadMore', value: WorkflowHistoryRequestParams): void;\n\t(event: 'upgrade'): void;\n}>();\n\nconst i18n = useI18n();\n\nconst listElement = ref<Element | null>(null);\nconst shouldAutoScroll = ref(true);\nconst observer = ref<IntersectionObserver | null>(null);\n\nconst getActions = (index: number) =>\n\tindex === 0 ? props.actions.filter((action) => action.value !== 'restore') : props.actions;\n\nconst observeElement = (element: Element) => {\n\tobserver.value = new IntersectionObserver(\n\t\t([entry]) => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tobserver.value?.unobserve(element);\n\t\t\t\tobserver.value?.disconnect();\n\t\t\t\tobserver.value = null;\n\t\t\t\temit('loadMore', { take: props.requestNumberOfItems, skip: props.items.length });\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: listElement.value,\n\t\t\tthreshold: 0.01,\n\t\t},\n\t);\n\n\tobserver.value.observe(element);\n};\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\tshouldAutoScroll.value = false;\n\temit('action', { action, id, data });\n};\n\nconst onPreview = ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tshouldAutoScroll.value = false;\n\temit('preview', { event, id });\n};\n\nconst onItemMounted = ({\n\tindex,\n\toffsetTop,\n\tisActive,\n}: {\n\tindex: number;\n\toffsetTop: number;\n\tisActive: boolean;\n}) => {\n\tif (isActive && shouldAutoScroll.value) {\n\t\tshouldAutoScroll.value = false;\n\t\tlistElement.value?.scrollTo({ top: offsetTop, behavior: 'smooth' });\n\t}\n\n\tif (\n\t\tindex === props.items.length - 1 &&\n\t\tprops.lastReceivedItemsLength === props.requestNumberOfItems\n\t) {\n\t\tobserveElement(listElement.value?.children[index] as Element);\n\t}\n};\n</script>\n\n<template>\n\t<ul :class=\"$style.list\" ref=\"listElement\" data-test-id=\"workflow-history-list\">\n\t\t<workflow-history-list-item\n\t\t\tv-for=\"(item, index) in props.items\"\n\t\t\t:key=\"item.versionId\"\n\t\t\t:index=\"index\"\n\t\t\t:item=\"item\"\n\t\t\t:isActive=\"item.versionId === props.activeItem?.versionId\"\n\t\t\t:actions=\"getActions(index)\"\n\t\t\t@action=\"onAction\"\n\t\t\t@preview=\"onPreview\"\n\t\t\t@mounted=\"onItemMounted\"\n\t\t/>\n\t\t<li v-if=\"!props.items.length && !props.isListLoading\" :class=\"$style.empty\">\n\t\t\t{{ i18n.baseText('workflowHistory.empty') }}\n\t\t\t<br />\n\t\t\t{{ i18n.baseText('workflowHistory.hint') }}\n\t\t</li>\n\t\t<li\n\t\t\tv-if=\"props.isListLoading\"\n\t\t\t:class=\"$style.loader\"\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-busy=\"true\"\n\t\t\t:aria-label=\"i18n.baseText('generic.loading')\"\n\t\t>\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t</li>\n\t\t<li v-if=\"props.shouldUpgrade\" :class=\"$style.retention\">\n\t\t\t<span>\n\t\t\t\t{{\n\t\t\t\t\ti18n.baseText('workflowHistory.limit', {\n\t\t\t\t\t\tinterpolate: { evaluatedPruneTime: props.evaluatedPruneTime },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</span>\n\t\t\t<i18n-t keypath=\"workflowHistory.upgrade\" tag=\"span\">\n\t\t\t\t<template #link>\n\t\t\t\t\t<a href=\"#\" @click=\"emit('upgrade')\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.upgrade.link') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</li>\n\t</ul>\n</template>\n\n<style module lang=\"scss\">\n.list {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.empty {\n\tdisplay: flex;\n\tposition: absolute;\n\theight: 100%;\n\tpadding: 0 25%;\n\tjustify-content: center;\n\talign-items: center;\n\ttext-align: center;\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-s);\n\tline-height: var(--font-line-height-loose);\n}\n\n.loader {\n\tpadding: 0 var(--spacing-s);\n}\n\n.retention {\n\tdisplay: grid;\n\tpadding: var(--spacing-s);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-loose);\n\ttext-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport type {\n\tWorkflowVersion,\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport WorkflowPreview from '@/components/WorkflowPreview.vue';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\n\nconst props = defineProps<{\n\tworkflow: IWorkflowDb | null;\n\tworkflowVersion: WorkflowVersion | null;\n\tactions: UserAction[];\n\tisListLoading?: boolean;\n\tisFirstItemShown?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n}>();\n\nconst workflowVersionPreview = computed<IWorkflowDb | undefined>(() => {\n\tif (!props.workflowVersion || !props.workflow) {\n\t\treturn;\n\t}\n\tconst { pinData, ...workflow } = props.workflow;\n\treturn {\n\t\t...workflow,\n\t\tnodes: props.workflowVersion.nodes,\n\t\tconnections: props.workflowVersion.connections,\n\t};\n});\n\nconst actions = computed(() =>\n\tprops.isFirstItemShown\n\t\t? props.actions.filter((action) => action.value !== 'restore')\n\t\t: props.actions,\n);\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\temit('action', { action, id, data });\n};\n</script>\n\n<template>\n\t<div :class=\"$style.content\">\n\t\t<WorkflowPreview\n\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t:workflow=\"workflowVersionPreview\"\n\t\t\t:loading=\"props.isListLoading\"\n\t\t\tloaderType=\"spinner\"\n\t\t/>\n\t\t<ul :class=\"$style.info\">\n\t\t\t<workflow-history-list-item\n\t\t\t\t:class=\"$style.card\"\n\t\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t\t:index=\"-1\"\n\t\t\t\t:item=\"props.workflowVersion\"\n\t\t\t\t:isActive=\"false\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t>\n\t\t\t\t<template #default=\"{ formattedCreatedAt }\">\n\t\t\t\t\t<section :class=\"$style.text\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.title') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<time :datetime=\"props.workflowVersion.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.editedBy') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>{{ props.workflowVersion.authors }}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.versionId') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<data :value=\"props.workflowVersion.versionId\">{{\n\t\t\t\t\t\t\t\tprops.workflowVersion.versionId\n\t\t\t\t\t\t\t}}</data>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\t\t\t\t</template>\n\t\t\t\t<template #action-toggle-button>\n\t\t\t\t\t<n8n-button type=\"tertiary\" size=\"large\" data-test-id=\"action-toggle-button\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.actions') }}\n\t\t\t\t\t\t<n8n-icon class=\"ml-3xs\" icon=\"chevron-down\" size=\"small\" />\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</template>\n\t\t\t</workflow-history-list-item>\n\t\t</ul>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.content {\n\tposition: absolute;\n\tdisplay: block;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.info {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n\n.card {\n\tpadding: var(--spacing-s) var(--spacing-l) 0 var(--spacing-xl);\n\tborder: 0;\n\talign-items: start;\n\n\t.text {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex: 1 1 auto;\n\n\t\tp {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tpadding: 0;\n\t\t\tcursor: default;\n\n\t\t\t&:first-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\t\t\t\tpadding-bottom: var(--spacing-4xs);\n\t\t\t\t* {\n\t\t\t\t\tmargin-top: auto;\n\t\t\t\t\tfont-size: var(--font-size-m);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:last-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\n\t\t\t\t* {\n\t\t\t\t\tfont-size: var(--font-size-2xs);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.label {\n\t\t\t\tcolor: var(--color-text-light);\n\t\t\t\tpadding-right: var(--spacing-4xs);\n\t\t\t}\n\n\t\t\t* {\n\t\t\t\tmax-width: unset;\n\t\t\t\tjustify-self: unset;\n\t\t\t\twhite-space: unset;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: unset;\n\t\t\t\tpadding: 0;\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\n\nexport const getWorkflowHistory = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tqueryParams: WorkflowHistoryRequestParams,\n): Promise<WorkflowHistory[]> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}`,\n\t\tqueryParams,\n\t);\n\treturn data;\n};\n\nexport const getWorkflowVersion = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tversionId: string,\n): Promise<WorkflowVersion> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}/version/${versionId}`,\n\t);\n\treturn data;\n};\n","import { computed } from 'vue';\nimport { defineStore } from 'pinia';\nimport { saveAs } from 'file-saver';\nimport type { IWorkflowDataUpdate, IWorkflowDb } from '@/Interface';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport * as whApi from '@/api/workflowHistory';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getNewWorkflow } from '@/api/workflows';\n\nexport const useWorkflowHistoryStore = defineStore('workflowHistory', () => {\n\tconst rootStore = useRootStore();\n\tconst settingsStore = useSettingsStore();\n\tconst workflowsStore = useWorkflowsStore();\n\n\tconst licensePruneTime = computed(() => settingsStore.settings.workflowHistory.licensePruneTime);\n\tconst pruneTime = computed(() => settingsStore.settings.workflowHistory.pruneTime);\n\tconst evaluatedPruneTime = computed(() => Math.min(pruneTime.value, licensePruneTime.value));\n\tconst shouldUpgrade = computed(\n\t\t() => licensePruneTime.value !== -1 && licensePruneTime.value === pruneTime.value,\n\t);\n\n\tconst getWorkflowHistory = async (\n\t\tworkflowId: string,\n\t\tqueryParams: WorkflowHistoryRequestParams,\n\t): Promise<WorkflowHistory[]> =>\n\t\twhApi.getWorkflowHistory(rootStore.getRestApiContext, workflowId, queryParams);\n\n\tconst getWorkflowVersion = async (\n\t\tworkflowId: string,\n\t\tversionId: string,\n\t): Promise<WorkflowVersion> =>\n\t\twhApi.getWorkflowVersion(rootStore.getRestApiContext, workflowId, versionId);\n\n\tconst downloadVersion = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: WorkflowVersionId,\n\t\tdata: { formattedCreatedAt: string },\n\t) => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst blob = new Blob([JSON.stringify({ ...workflow, nodes, connections }, null, 2)], {\n\t\t\ttype: 'application/json;charset=utf-8',\n\t\t});\n\t\tsaveAs(blob, `${workflow.name}(${data.formattedCreatedAt}).json`);\n\t};\n\n\tconst cloneIntoNewWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tdata: { formattedCreatedAt: string },\n\t): Promise<IWorkflowDb> => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst { name } = workflow;\n\t\tconst newWorkflow = await getNewWorkflow(\n\t\t\trootStore.getRestApiContext,\n\t\t\t`${name} (${data.formattedCreatedAt})`,\n\t\t);\n\t\tconst newWorkflowData: IWorkflowDataUpdate = {\n\t\t\tnodes,\n\t\t\tconnections,\n\t\t\tname: newWorkflow.name,\n\t\t};\n\t\treturn workflowsStore.createNewWorkflow(newWorkflowData);\n\t};\n\n\tconst restoreWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tshouldDeactivate: boolean,\n\t): Promise<IWorkflowDb> => {\n\t\tconst workflowVersion = await getWorkflowVersion(workflowId, workflowVersionId);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst updateData: IWorkflowDataUpdate = { connections, nodes };\n\n\t\tif (shouldDeactivate) {\n\t\t\tupdateData.active = false;\n\t\t}\n\n\t\treturn workflowsStore.updateWorkflow(workflowId, updateData, true).catch(async (error) => {\n\t\t\tif (error.httpStatusCode === 400 && error.message.includes('can not be activated')) {\n\t\t\t\treturn workflowsStore.fetchWorkflow(workflowId);\n\t\t\t} else {\n\t\t\t\tthrow new Error(error);\n\t\t\t}\n\t\t});\n\t};\n\n\treturn {\n\t\tgetWorkflowHistory,\n\t\tgetWorkflowVersion,\n\t\tdownloadVersion,\n\t\tcloneIntoNewWorkflow,\n\t\trestoreWorkflow,\n\t\tevaluatedPruneTime,\n\t\tshouldUpgrade,\n\t};\n});\n","<script setup lang=\"ts\">\nimport { onBeforeMount, ref, watchEffect, computed, h } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport { VIEWS, WORKFLOW_HISTORY_VERSION_RESTORE } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type {\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n\tWorkflowHistoryRequestParams,\n\tWorkflowHistory,\n\tWorkflowVersion,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryList from '@/components/WorkflowHistory/WorkflowHistoryList.vue';\nimport WorkflowHistoryContent from '@/components/WorkflowHistory/WorkflowHistoryContent.vue';\nimport { useWorkflowHistoryStore } from '@/stores/workflowHistory.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { telemetry } from '@/plugins/telemetry';\nimport { useRootStore } from '@/stores/n8nRoot.store';\n\ntype WorkflowHistoryActionRecord = {\n\t[K in Uppercase<WorkflowHistoryActionTypes[number]>]: Lowercase<K>;\n};\n\nconst enum WorkflowHistoryVersionRestoreModalActions {\n\trestore = 'restore',\n\tdeactivateAndRestore = 'deactivateAndRestore',\n\tcancel = 'cancel',\n}\n\nconst workflowHistoryActionTypes: WorkflowHistoryActionTypes = [\n\t'restore',\n\t'clone',\n\t'open',\n\t'download',\n];\nconst WORKFLOW_HISTORY_ACTIONS = workflowHistoryActionTypes.reduce(\n\t(record, key) => ({ ...record, [key.toUpperCase()]: key }),\n\t{} as WorkflowHistoryActionRecord,\n);\n\nconst route = useRoute();\nconst router = useRouter();\nconst i18n = useI18n();\nconst toast = useToast();\nconst workflowHistoryStore = useWorkflowHistoryStore();\nconst uiStore = useUIStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst canRender = ref(true);\nconst isListLoading = ref(true);\nconst requestNumberOfItems = ref(20);\nconst lastReceivedItemsLength = ref(0);\nconst editorRoute = computed(() => ({\n\tname: VIEWS.WORKFLOW,\n\tparams: {\n\t\tname: route.params.workflowId,\n\t},\n}));\nconst activeWorkflow = ref<IWorkflowDb | null>(null);\nconst workflowHistory = ref<WorkflowHistory[]>([]);\nconst activeWorkflowVersion = ref<WorkflowVersion | null>(null);\nconst actions = computed<UserAction[]>(() =>\n\tworkflowHistoryActionTypes.map((value) => ({\n\t\tlabel: i18n.baseText(`workflowHistory.item.actions.${value}`),\n\t\tdisabled: false,\n\t\tvalue,\n\t})),\n);\n\nconst isFirstItemShown = computed(\n\t() => workflowHistory.value[0]?.versionId === route.params.versionId,\n);\nconst evaluatedPruneTime = computed(() => Math.floor(workflowHistoryStore.evaluatedPruneTime / 24));\n\nconst sendTelemetry = (event: string) => {\n\ttelemetry.track(event, {\n\t\tinstance_id: useRootStore().instanceId,\n\t\tworkflow_id: route.params.workflowId,\n\t});\n};\n\nconst loadMore = async (queryParams: WorkflowHistoryRequestParams) => {\n\tconst history = await workflowHistoryStore.getWorkflowHistory(\n\t\troute.params.workflowId,\n\t\tqueryParams,\n\t);\n\tlastReceivedItemsLength.value = history.length;\n\tworkflowHistory.value = workflowHistory.value.concat(history);\n};\n\nonBeforeMount(async () => {\n\tsendTelemetry('User opened workflow history');\n\ttry {\n\t\tconst [workflow] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(route.params.workflowId),\n\t\t\tloadMore({ take: requestNumberOfItems.value }),\n\t\t]);\n\t\tactiveWorkflow.value = workflow;\n\t\tisListLoading.value = false;\n\n\t\tif (!route.params.versionId && workflowHistory.value.length) {\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\t\tparams: {\n\t\t\t\t\tworkflowId: route.params.workflowId,\n\t\t\t\t\tversionId: workflowHistory.value[0].versionId,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n\nconst openInNewTab = (id: WorkflowVersionId) => {\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: route.params.workflowId,\n\t\t\tversionId: id,\n\t\t},\n\t});\n\twindow.open(href, '_blank');\n};\n\nconst openRestorationModal = async (\n\tisWorkflowActivated: boolean,\n\tformattedCreatedAt: string,\n): Promise<WorkflowHistoryVersionRestoreModalActions> => {\n\treturn new Promise((resolve, reject) => {\n\t\tconst buttons = [\n\t\t\t{\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.cancel'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tif (isWorkflowActivated) {\n\t\t\tbuttons.push({\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.deactivateAndRestore'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tbuttons.push({\n\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.restore'),\n\t\t\ttype: 'primary',\n\t\t\taction: () => {\n\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.restore);\n\t\t\t},\n\t\t});\n\n\t\ttry {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: WORKFLOW_HISTORY_VERSION_RESTORE,\n\t\t\t\tdata: {\n\t\t\t\t\tbeforeClose: () => {\n\t\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t\t},\n\t\t\t\t\tisWorkflowActivated,\n\t\t\t\t\tformattedCreatedAt,\n\t\t\t\t\tbuttons,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n};\n\nconst cloneWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst clonedWorkflow = await workflowHistoryStore.cloneIntoNewWorkflow(\n\t\troute.params.workflowId,\n\t\tid,\n\t\tdata,\n\t);\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW,\n\t\tparams: {\n\t\t\tname: clonedWorkflow.id,\n\t\t},\n\t});\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.clone.success.title'),\n\t\tmessage: h(\n\t\t\t'a',\n\t\t\t{ href, target: '_blank' },\n\t\t\ti18n.baseText('workflowHistory.action.clone.success.message'),\n\t\t),\n\t\ttype: 'success',\n\t\tduration: 10000,\n\t});\n};\n\nconst restoreWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst workflow = await workflowsStore.fetchWorkflow(route.params.workflowId);\n\tconst modalAction = await openRestorationModal(workflow.active, data.formattedCreatedAt);\n\tif (modalAction === WorkflowHistoryVersionRestoreModalActions.cancel) {\n\t\treturn;\n\t}\n\tactiveWorkflow.value = await workflowHistoryStore.restoreWorkflow(\n\t\troute.params.workflowId,\n\t\tid,\n\t\tmodalAction === WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore,\n\t);\n\tconst history = await workflowHistoryStore.getWorkflowHistory(route.params.workflowId, {\n\t\ttake: 1,\n\t});\n\tworkflowHistory.value = history.concat(workflowHistory.value);\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.restore.success.title'),\n\t\ttype: 'success',\n\t});\n};\n\nconst onAction = async ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.OPEN:\n\t\t\t\topenInNewTab(id);\n\t\t\t\tsendTelemetry('User opened version in new tab');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.DOWNLOAD:\n\t\t\t\tawait workflowHistoryStore.downloadVersion(route.params.workflowId, id, data);\n\t\t\t\tsendTelemetry('User downloaded version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.CLONE:\n\t\t\t\tawait cloneWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User cloned version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.RESTORE:\n\t\t\t\tawait restoreWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User restored version');\n\t\t\t\tbreak;\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowHistory.action.error.title', {\n\t\t\t\tinterpolate: {\n\t\t\t\t\taction: i18n.baseText(`workflowHistory.item.actions.${action}`).toLowerCase(),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n};\n\nconst onPreview = async ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tif (event.metaKey || event.ctrlKey) {\n\t\topenInNewTab(id);\n\t\tsendTelemetry('User opened version in new tab');\n\t} else {\n\t\tawait router.push({\n\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\tparams: {\n\t\t\t\tworkflowId: route.params.workflowId,\n\t\t\t\tversionId: id,\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onUpgrade = () => {\n\tvoid uiStore.goToUpgrade('workflow-history', 'upgrade-workflow-history');\n};\n\nwatchEffect(async () => {\n\tif (!route.params.versionId) {\n\t\treturn;\n\t}\n\ttry {\n\t\tactiveWorkflowVersion.value = await workflowHistoryStore.getWorkflowVersion(\n\t\t\troute.params.workflowId,\n\t\t\troute.params.versionId,\n\t\t);\n\t\tsendTelemetry('User selected version');\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\tnew Error(`${error.message} \"${route.params.versionId}\" `),\n\t\t\ti18n.baseText('workflowHistory.title'),\n\t\t);\n\t}\n\n\ttry {\n\t\tactiveWorkflow.value = await workflowsStore.fetchWorkflow(route.params.workflowId);\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n</script>\n<template>\n\t<div :class=\"$style.view\">\n\t\t<n8n-heading :class=\"$style.header\" tag=\"h2\" size=\"medium\">\n\t\t\t{{ activeWorkflow?.name }}\n\t\t</n8n-heading>\n\t\t<div :class=\"$style.corner\">\n\t\t\t<n8n-heading tag=\"h2\" size=\"medium\" bold>\n\t\t\t\t{{ i18n.baseText('workflowHistory.title') }}\n\t\t\t</n8n-heading>\n\t\t\t<router-link :to=\"editorRoute\" data-test-id=\"workflow-history-close-button\">\n\t\t\t\t<n8n-button type=\"tertiary\" icon=\"times\" size=\"small\" text square />\n\t\t\t</router-link>\n\t\t</div>\n\t\t<div :class=\"$style.listComponentWrapper\">\n\t\t\t<workflow-history-list\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:items=\"workflowHistory\"\n\t\t\t\t:lastReceivedItemsLength=\"lastReceivedItemsLength\"\n\t\t\t\t:activeItem=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:requestNumberOfItems=\"requestNumberOfItems\"\n\t\t\t\t:shouldUpgrade=\"workflowHistoryStore.shouldUpgrade\"\n\t\t\t\t:evaluatedPruneTime=\"evaluatedPruneTime\"\n\t\t\t\t:isListLoading=\"isListLoading\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@preview=\"onPreview\"\n\t\t\t\t@load-more=\"loadMore\"\n\t\t\t\t@upgrade=\"onUpgrade\"\n\t\t\t/>\n\t\t</div>\n\t\t<div :class=\"$style.contentComponentWrapper\">\n\t\t\t<workflow-history-content\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:workflow=\"activeWorkflow\"\n\t\t\t\t:workflowVersion=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:isListLoading=\"isListLoading\"\n\t\t\t\t:isFirstItemShown=\"isFirstItemShown\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n<style module lang=\"scss\">\n.view {\n\tposition: relative;\n\tdisplay: grid;\n\twidth: 100%;\n\tgrid-template-areas: 'header corner' 'content list';\n\tgrid-template-columns: auto 330px;\n\tgrid-template-rows: 65px auto;\n\tbackground-color: var(--color-background-xlight);\n}\n\n.header {\n\tgrid-area: header;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 var(--spacing-l);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.corner {\n\tgrid-area: corner;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 0 var(--spacing-3xs) 0 var(--spacing-s);\n\tbackground-color: var(--color-background-lighter);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-left: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.contentComponentWrapper {\n\tgrid-area: content;\n\tposition: relative;\n}\n\n.listComponentWrapper {\n\tgrid-area: list;\n\tposition: relative;\n\n\t&::before {\n\t\tcontent: '';\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\twidth: var(--border-width-base);\n\t\tbackground-color: var(--color-foreground-base);\n\t}\n}\n</style>\n"],"names":["i18n","useI18n","actionsVisible","ref","itemElement","authorElement","isAuthorElementTruncated","formattedCreatedAt","computed","currentYear","date","time","dateformat","props","authors","allAuthors","label","idLabel","onAction","action","emit","onVisibleChange","visible","onItemClick","event","onMounted","_a","_b","_c","listElement","shouldAutoScroll","observer","getActions","index","observeElement","element","entry","id","data","onPreview","onItemMounted","offsetTop","isActive","workflowVersionPreview","pinData","workflow","actions","getWorkflowHistory","context","workflowId","queryParams","get","getWorkflowVersion","versionId","useWorkflowHistoryStore","defineStore","rootStore","useRootStore","settingsStore","useSettingsStore","workflowsStore","useWorkflowsStore","licensePruneTime","pruneTime","evaluatedPruneTime","shouldUpgrade","whApi.getWorkflowHistory","whApi.getWorkflowVersion","workflowVersionId","workflowVersion","connections","nodes","blob","saveAs","name","newWorkflow","getNewWorkflow","newWorkflowData","shouldDeactivate","updateData","error","workflowHistoryActionTypes","WORKFLOW_HISTORY_ACTIONS","record","key","route","useRoute","router","useRouter","toast","useToast","workflowHistoryStore","uiStore","useUIStore","canRender","isListLoading","requestNumberOfItems","lastReceivedItemsLength","editorRoute","VIEWS","activeWorkflow","workflowHistory","activeWorkflowVersion","value","isFirstItemShown","sendTelemetry","telemetry","loadMore","history","onBeforeMount","openInNewTab","href","openRestorationModal","isWorkflowActivated","resolve","reject","buttons","WORKFLOW_HISTORY_VERSION_RESTORE","cloneWorkflowVersion","clonedWorkflow","h","restoreWorkflowVersion","modalAction","onUpgrade","watchEffect"],"mappings":"kiDA8BMA,EAAOC,IAEPC,EAAiBC,EAAI,EAAK,EAC1BC,EAAcD,EAAwB,IAAI,EAC1CE,EAAgBF,EAAwB,IAAI,EAC5CG,EAA2BH,EAAI,EAAK,EAEpCI,EAAqBC,EAAiB,IAAM,CACjD,MAAMC,EAAkB,IAAA,KAAO,EAAA,YAAA,EAAc,WACvC,CAACC,EAAMC,CAAI,EAAIC,GACpBC,EAAM,KAAK,UACX,GAAGA,EAAM,KAAK,UAAU,WAAWJ,CAAW,EAAI,GAAK,OAAO,kBAAA,EAC7D,MAAM,GAAG,EAEJ,OAAAT,EAAK,SAAS,iCAAkC,CAAE,YAAa,CAAE,KAAAU,EAAM,KAAAC,CAAK,CAAA,CAAG,CAAA,CACtF,EAEKG,EAAUN,EAA0C,IAAM,CAC/D,MAAMO,EAAaF,EAAM,KAAK,QAAQ,MAAM,IAAI,EAC5C,IAAAG,EAAQD,EAAW,CAAC,EAEpB,OAAAA,EAAW,OAAS,IACvBC,EAAQ,GAAGA,CAAK,MAAMD,EAAW,OAAS,CAAC,IAGrC,CACN,KAAMA,EAAW,OACjB,MAAAC,CAAA,CACD,CACA,EAEKC,EAAUT,EAAiB,IAChCR,EAAK,SAAS,0BAA2B,CAAE,YAAa,CAAE,GAAIa,EAAM,KAAK,SAAU,EAAG,CAAA,EAGjFK,EAAYC,GAA+C,CAChEC,EAAK,SAAU,CACd,OAAAD,EACA,GAAIN,EAAM,KAAK,UACf,KAAM,CAAE,mBAAoBN,EAAmB,KAAM,CAAA,CACrD,CAAA,EAGIc,EAAmBC,GAAqB,CAC7CpB,EAAe,MAAQoB,CAAA,EAGlBC,EAAeC,GAAsB,CAC1CJ,EAAK,UAAW,CAAE,MAAAI,EAAO,GAAIX,EAAM,KAAK,UAAW,CAAA,EAGpD,OAAAY,GAAU,IAAM,WACfL,EAAK,UAAW,CACf,MAAOP,EAAM,MACb,YAAWa,EAAAtB,EAAY,QAAZ,YAAAsB,EAAmB,YAAa,EAC3C,SAAUb,EAAM,QAAA,CAChB,EACDP,EAAyB,QACxBqB,EAAAtB,EAAc,QAAd,YAAAsB,EAAqB,eAAcC,EAAAvB,EAAc,QAAd,YAAAuB,EAAqB,YAAA,CACzD,0jDCpDK5B,EAAOC,IAEP4B,EAAc1B,EAAoB,IAAI,EACtC2B,EAAmB3B,EAAI,EAAI,EAC3B4B,EAAW5B,EAAiC,IAAI,EAEhD6B,EAAcC,GACnBA,IAAU,EAAIpB,EAAM,QAAQ,OAAQM,GAAWA,EAAO,QAAU,SAAS,EAAIN,EAAM,QAE9EqB,EAAkBC,GAAqB,CAC5CJ,EAAS,MAAQ,IAAI,qBACpB,CAAC,CAACK,CAAK,IAAM,SACRA,EAAM,kBACAV,EAAAK,EAAA,QAAA,MAAAL,EAAO,UAAUS,IAC1BR,EAAAI,EAAS,QAAT,MAAAJ,EAAgB,aAChBI,EAAS,MAAQ,KACZX,EAAA,WAAY,CAAE,KAAMP,EAAM,qBAAsB,KAAMA,EAAM,MAAM,MAAA,CAAQ,EAEjF,EACA,CACC,KAAMgB,EAAY,MAClB,UAAW,GACZ,CAAA,EAGQE,EAAA,MAAM,QAAQI,CAAO,CAAA,EAGzBjB,EAAW,CAAC,CACjB,OAAAC,EACA,GAAAkB,EACA,KAAAC,CAAA,IAKK,CACLR,EAAiB,MAAQ,GACzBV,EAAK,SAAU,CAAE,OAAAD,EAAQ,GAAAkB,EAAI,KAAAC,CAAM,CAAA,CAAA,EAG9BC,EAAY,CAAC,CAAE,MAAAf,EAAO,GAAAa,KAAuD,CAClFP,EAAiB,MAAQ,GACzBV,EAAK,UAAW,CAAE,MAAAI,EAAO,GAAAa,CAAI,CAAA,CAAA,EAGxBG,EAAgB,CAAC,CACtB,MAAAP,EACA,UAAAQ,EACA,SAAAC,CAAA,IAKK,SACDA,GAAYZ,EAAiB,QAChCA,EAAiB,MAAQ,IACzBJ,EAAAG,EAAY,QAAZ,MAAAH,EAAmB,SAAS,CAAE,IAAKe,EAAW,SAAU,YAIxDR,IAAUpB,EAAM,MAAM,OAAS,GAC/BA,EAAM,0BAA4BA,EAAM,sBAExCqB,GAAeP,EAAAE,EAAY,QAAZ,YAAAF,EAAmB,SAASM,EAAiB,CAC7D,moDC1FKjC,EAAOC,IAqBP0C,EAAyBnC,EAAkC,IAAM,CACtE,GAAI,CAACK,EAAM,iBAAmB,CAACA,EAAM,SACpC,OAED,KAAM,CAAE,QAAA+B,EAAS,GAAGC,CAAA,EAAahC,EAAM,SAChC,MAAA,CACN,GAAGgC,EACH,MAAOhC,EAAM,gBAAgB,MAC7B,YAAaA,EAAM,gBAAgB,WAAA,CACpC,CACA,EAEKiC,EAAUtC,EAAS,IACxBK,EAAM,iBACHA,EAAM,QAAQ,OAAQM,GAAWA,EAAO,QAAU,SAAS,EAC3DN,EAAM,OAAA,EAGJK,EAAW,CAAC,CACjB,OAAAC,EACA,GAAAkB,EACA,KAAAC,CAAA,IAKK,CACLlB,EAAK,SAAU,CAAE,OAAAD,EAAQ,GAAAkB,EAAI,KAAAC,CAAM,CAAA,CAAA,89CCpDvBS,GAAqB,MACjCC,EACAC,EACAC,IACgC,CAC1B,KAAA,CAAE,KAAAZ,CAAK,EAAI,MAAMa,EACtBH,EAAQ,QACR,8BAA8BC,CAAU,GACxCC,CAAA,EAEM,OAAAZ,CACR,EAEac,GAAqB,MACjCJ,EACAC,EACAI,IAC8B,CACxB,KAAA,CAAE,KAAAf,CAAK,EAAI,MAAMa,EACtBH,EAAQ,QACR,8BAA8BC,CAAU,YAAYI,CAAS,EAAA,EAEvD,OAAAf,CACR,ECfagB,GAA0BC,GAAY,kBAAmB,IAAM,CAC3E,MAAMC,EAAYC,IACZC,EAAgBC,KAChBC,EAAiBC,IAEjBC,EAAmBtD,EAAS,IAAMkD,EAAc,SAAS,gBAAgB,gBAAgB,EACzFK,EAAYvD,EAAS,IAAMkD,EAAc,SAAS,gBAAgB,SAAS,EAC3EM,EAAqBxD,EAAS,IAAM,KAAK,IAAIuD,EAAU,MAAOD,EAAiB,KAAK,CAAC,EACrFG,EAAgBzD,EACrB,IAAMsD,EAAiB,QAAU,IAAMA,EAAiB,QAAUC,EAAU,KAAA,EAGvEhB,EAAqB,MAC1BE,EACAC,IAEAgB,GAAyBV,EAAU,kBAAmBP,EAAYC,CAAW,EAExEE,EAAqB,MAC1BH,EACAI,IAEAc,GAAyBX,EAAU,kBAAmBP,EAAYI,CAAS,EA+DrE,MAAA,CAAA,mBACNN,EAAA,mBACAK,EACA,gBAhEuB,MACvBH,EACAmB,EACA9B,IACI,CACJ,KAAM,CAACO,EAAUwB,CAAe,EAAI,MAAM,QAAQ,IAAI,CACrDT,EAAe,cAAcX,CAAU,EACvCG,EAAmBH,EAAYmB,CAAiB,CAAA,CAChD,EACK,CAAE,YAAAE,EAAa,MAAAC,CAAU,EAAAF,EACzBG,EAAO,IAAI,KAAK,CAAC,KAAK,UAAU,CAAE,GAAG3B,EAAU,MAAA0B,EAAO,YAAAD,CAAY,EAAG,KAAM,CAAC,CAAC,EAAG,CACrF,KAAM,gCAAA,CACN,EACDG,UAAOD,EAAM,GAAG3B,EAAS,IAAI,IAAIP,EAAK,kBAAkB,QAAQ,CAAA,EAoDhE,qBAjD4B,MAC5BW,EACAmB,EACA9B,IAC0B,CAC1B,KAAM,CAACO,EAAUwB,CAAe,EAAI,MAAM,QAAQ,IAAI,CACrDT,EAAe,cAAcX,CAAU,EACvCG,EAAmBH,EAAYmB,CAAiB,CAAA,CAChD,EACK,CAAE,YAAAE,EAAa,MAAAC,CAAU,EAAAF,EACzB,CAAE,KAAAK,CAAS,EAAA7B,EACX8B,EAAc,MAAMC,GACzBpB,EAAU,kBACV,GAAGkB,CAAI,KAAKpC,EAAK,kBAAkB,GAAA,EAE9BuC,EAAuC,CAC5C,MAAAN,EACA,YAAAD,EACA,KAAMK,EAAY,IAAA,EAEZ,OAAAf,EAAe,kBAAkBiB,CAAe,CAAA,EA8BvD,gBA3BuB,MACvB5B,EACAmB,EACAU,IAC0B,CAC1B,MAAMT,EAAkB,MAAMjB,EAAmBH,EAAYmB,CAAiB,EACxE,CAAE,YAAAE,EAAa,MAAAC,CAAU,EAAAF,EACzBU,EAAkC,CAAE,YAAAT,EAAa,MAAAC,GAEvD,OAAIO,IACHC,EAAW,OAAS,IAGdnB,EAAe,eAAeX,EAAY8B,EAAY,EAAI,EAAE,MAAM,MAAOC,GAAU,CACzF,GAAIA,EAAM,iBAAmB,KAAOA,EAAM,QAAQ,SAAS,sBAAsB,EACzE,OAAApB,EAAe,cAAcX,CAAU,EAExC,MAAA,IAAI,MAAM+B,CAAK,CACtB,CACA,CAAA,EASD,mBAAAhB,EACA,cAAAC,CAAA,CAEF,CAAC,0CC9ED,MAAMgB,EAAyD,CAC9D,UACA,QACA,OACA,UAAA,EAEKC,EAA2BD,EAA2B,OAC3D,CAACE,EAAQC,KAAS,CAAE,GAAGD,EAAQ,CAACC,EAAI,aAAa,EAAGA,IACpD,CAAC,CAAA,EAGIC,EAAQC,KACRC,EAASC,KACTxF,EAAOC,IACPwF,EAAQC,KACRC,EAAuBrC,KACvBsC,EAAUC,KACVjC,EAAiBC,IAEjBiC,EAAY3F,EAAI,EAAI,EACpB4F,EAAgB5F,EAAI,EAAI,EACxB6F,EAAuB7F,EAAI,EAAE,EAC7B8F,EAA0B9F,EAAI,CAAC,EAC/B+F,EAAc1F,EAAS,KAAO,CACnC,KAAM2F,EAAM,SACZ,OAAQ,CACP,KAAMd,EAAM,OAAO,UACpB,CACC,EAAA,EACIe,EAAiBjG,EAAwB,IAAI,EAC7CkG,EAAkBlG,EAAuB,CAAA,CAAE,EAC3CmG,EAAwBnG,EAA4B,IAAI,EACxD2C,EAAUtC,EAAuB,IACtCyE,EAA2B,IAAKsB,IAAW,CAC1C,MAAOvG,EAAK,SAAS,gCAAgCuG,CAAK,EAAE,EAC5D,SAAU,GACV,MAAAA,CAAA,EACC,CAAA,EAGGC,EAAmBhG,EACxB,IAAM,OAAA,QAAAkB,EAAA2E,EAAgB,MAAM,CAAC,IAAvB,YAAA3E,EAA0B,aAAc2D,EAAM,OAAO,UAAA,EAEtDrB,EAAqBxD,EAAS,IAAM,KAAK,MAAMmF,EAAqB,mBAAqB,EAAE,CAAC,EAE5Fc,EAAiBjF,GAAkB,CACxCkF,GAAU,MAAMlF,EAAO,CACtB,YAAaiC,IAAe,WAC5B,YAAa4B,EAAM,OAAO,UAAA,CAC1B,CAAA,EAGIsB,EAAW,MAAOzD,GAA8C,CAC/D,MAAA0D,EAAU,MAAMjB,EAAqB,mBAC1CN,EAAM,OAAO,WACbnC,CAAA,EAED+C,EAAwB,MAAQW,EAAQ,OACxCP,EAAgB,MAAQA,EAAgB,MAAM,OAAOO,CAAO,CAAA,EAG7DC,GAAc,SAAY,CACzBJ,EAAc,8BAA8B,EACxC,GAAA,CACH,KAAM,CAAC5D,CAAQ,EAAI,MAAM,QAAQ,IAAI,CACpCe,EAAe,cAAcyB,EAAM,OAAO,UAAU,EACpDsB,EAAS,CAAE,KAAMX,EAAqB,MAAO,CAAA,CAC7C,EACDI,EAAe,MAAQvD,EACvBkD,EAAc,MAAQ,GAElB,CAACV,EAAM,OAAO,WAAagB,EAAgB,MAAM,QACpD,MAAMd,EAAO,QAAQ,CACpB,KAAMY,EAAM,iBACZ,OAAQ,CACP,WAAYd,EAAM,OAAO,WACzB,UAAWgB,EAAgB,MAAM,CAAC,EAAE,SACrC,CAAA,CACA,QAEMrB,EAAO,CACfc,EAAU,MAAQ,GAClBL,EAAM,UAAUT,EAAOhF,EAAK,SAAS,uBAAuB,CAAC,CAC9D,CAAA,CACA,EAEK,MAAA8G,EAAgBzE,GAA0B,CAC/C,KAAM,CAAE,KAAA0E,CAAA,EAASxB,EAAO,QAAQ,CAC/B,KAAMY,EAAM,iBACZ,OAAQ,CACP,WAAYd,EAAM,OAAO,WACzB,UAAWhD,CACZ,CAAA,CACA,EACM,OAAA,KAAK0E,EAAM,QAAQ,CAAA,EAGrBC,GAAuB,MAC5BC,EACA1G,IAEO,IAAI,QAAQ,CAAC2G,EAASC,IAAW,CACvC,MAAMC,EAAU,CACf,CACC,KAAMpH,EAAK,SAAS,oDAAoD,EACxE,KAAM,WACN,OAAQ,IAAM,CACbkH,EAAQ,QAAgD,CACzD,CACD,CAAA,EAGGD,GACHG,EAAQ,KAAK,CACZ,KAAMpH,EAAK,SAAS,kEAAkE,EACtF,KAAM,WACN,OAAQ,IAAM,CACbkH,EAAQ,sBAA8D,CACvE,CAAA,CACA,EAGFE,EAAQ,KAAK,CACZ,KAAMpH,EAAK,SAAS,qDAAqD,EACzE,KAAM,UACN,OAAQ,IAAM,CACbkH,EAAQ,SAAiD,CAC1D,CAAA,CACA,EAEG,GAAA,CACHtB,EAAQ,kBAAkB,CACzB,KAAMyB,GACN,KAAM,CACL,YAAa,IAAM,CAClBH,EAAQ,QAAgD,CACzD,EACA,oBAAAD,EACA,mBAAA1G,EACA,QAAA6G,CACD,CAAA,CACA,QACOpC,EAAO,CACfmC,EAAOnC,CAAK,CACb,CAAA,CACA,EAGIsC,GAAuB,MAC5BjF,EACAC,IACI,CACE,MAAAiF,EAAiB,MAAM5B,EAAqB,qBACjDN,EAAM,OAAO,WACbhD,EACAC,CAAA,EAEK,CAAE,KAAAyE,CAAA,EAASxB,EAAO,QAAQ,CAC/B,KAAMY,EAAM,SACZ,OAAQ,CACP,KAAMoB,EAAe,EACtB,CAAA,CACA,EAED9B,EAAM,YAAY,CACjB,MAAOzF,EAAK,SAAS,4CAA4C,EACjE,QAASwH,GACR,IACA,CAAE,KAAAT,EAAM,OAAQ,QAAS,EACzB/G,EAAK,SAAS,8CAA8C,CAC7D,EACA,KAAM,UACN,SAAU,GAAA,CACV,CAAA,EAGIyH,GAAyB,MAC9BpF,EACAC,IACI,CACJ,MAAMO,EAAW,MAAMe,EAAe,cAAcyB,EAAM,OAAO,UAAU,EACrEqC,EAAc,MAAMV,GAAqBnE,EAAS,OAAQP,EAAK,kBAAkB,EACvF,GAAIoF,IAAgB,SACnB,OAEctB,EAAA,MAAQ,MAAMT,EAAqB,gBACjDN,EAAM,OAAO,WACbhD,EACAqF,IAAgB,sBAAA,EAEjB,MAAMd,EAAU,MAAMjB,EAAqB,mBAAmBN,EAAM,OAAO,WAAY,CACtF,KAAM,CAAA,CACN,EACDgB,EAAgB,MAAQO,EAAQ,OAAOP,EAAgB,KAAK,EAC5DZ,EAAM,YAAY,CACjB,MAAOzF,EAAK,SAAS,8CAA8C,EACnE,KAAM,SAAA,CACN,CAAA,EAGIkB,EAAW,MAAO,CACvB,OAAAC,EACA,GAAAkB,EACA,KAAAC,CAAA,IAKK,CACD,GAAA,CACH,OAAQnB,EAAQ,CACf,KAAK+D,EAAyB,KAC7B4B,EAAazE,CAAE,EACfoE,EAAc,gCAAgC,EAC9C,MACD,KAAKvB,EAAyB,SAC7B,MAAMS,EAAqB,gBAAgBN,EAAM,OAAO,WAAYhD,EAAIC,CAAI,EAC5EmE,EAAc,yBAAyB,EACvC,MACD,KAAKvB,EAAyB,MACvB,MAAAoC,GAAqBjF,EAAIC,CAAI,EACnCmE,EAAc,qBAAqB,EACnC,MACD,KAAKvB,EAAyB,QACvB,MAAAuC,GAAuBpF,EAAIC,CAAI,EACrCmE,EAAc,uBAAuB,EACrC,KACF,QACQzB,EAAO,CACTS,EAAA,UACLT,EACAhF,EAAK,SAAS,qCAAsC,CACnD,YAAa,CACZ,OAAQA,EAAK,SAAS,gCAAgCmB,CAAM,EAAE,EAAE,YAAY,CAC7E,CAAA,CACA,CAAA,CAEH,CAAA,EAGKoB,GAAY,MAAO,CAAE,MAAAf,EAAO,GAAAa,KAAuD,CACpFb,EAAM,SAAWA,EAAM,SAC1BsF,EAAazE,CAAE,EACfoE,EAAc,gCAAgC,GAE9C,MAAMlB,EAAO,KAAK,CACjB,KAAMY,EAAM,iBACZ,OAAQ,CACP,WAAYd,EAAM,OAAO,WACzB,UAAWhD,CACZ,CAAA,CACA,CACF,EAGKsF,GAAY,IAAM,CAClB/B,EAAQ,YAAY,mBAAoB,0BAA0B,CAAA,EAGxE,OAAAgC,GAAY,SAAY,CACnB,GAACvC,EAAM,OAAO,UAGd,IAAA,CACmBiB,EAAA,MAAQ,MAAMX,EAAqB,mBACxDN,EAAM,OAAO,WACbA,EAAM,OAAO,SAAA,EAEdoB,EAAc,uBAAuB,QAC7BzB,EAAO,CACTS,EAAA,UACL,IAAI,MAAM,GAAGT,EAAM,OAAO,KAAKK,EAAM,OAAO,SAAS,SAAS,EAC9DrF,EAAK,SAAS,uBAAuB,CAAA,CAEvC,CAEI,GAAA,CACHoG,EAAe,MAAQ,MAAMxC,EAAe,cAAcyB,EAAM,OAAO,UAAU,QACzEL,EAAO,CACfc,EAAU,MAAQ,GAClBL,EAAM,UAAUT,EAAOhF,EAAK,SAAS,uBAAuB,CAAC,CAC9D,EAAA,CACA"}
|
package/dist/assets/{WorkflowOnboardingView-LZfOfbX4.js → WorkflowOnboardingView-gUVzVQsZ.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{e as l,a7 as d}from"./index
|
|
2
|
-
//# sourceMappingURL=WorkflowOnboardingView-
|
|
1
|
+
import{e as l,a7 as d}from"./index-RXjMHIPR.js";import{B as f,V as a,M as u}from"./n8n-ZKR6bms9.js";import{G as g,aH as W,aG as k,b as _,l as b,m as L}from"./vendor-2CfOYFi2.js";import"./pinia-jX93eZRS.js";import"./prettier-s3fE3Qyr.js";import"./codemirror-lang-html-n8n-qoVuUIQR.js";import"./@n8n/codemirror-lang-sql-zd5sOTQ9.js";import"./@lezer/common-aP6EPErF.js";import"./lodash-es-s_m9YyW7.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-QL7QI0sV.js";import"./uuid-McvpxQtQ.js";import"./luxon-ZRIU05qF.js";import"./esprima-next-ulPLCZ1Z.js";import"./@vueuse/core-viEZCtbZ.js";import"./codemirror-lang-n8n-expression-qGXLqLTr.js";import"./fast-json-stable-stringify-RhDdw38P.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-f7Vn5Pkq.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";import"./axios-QLjAsgXu.js";import"./flatted-jPn12Tq4.js";import"./vue-i18n-2T2QU_2c.js";import"./@n8n/permissions-8yMqUF1Y.js";const X=g({__name:"WorkflowOnboardingView",setup(O){const r=l(),n=d(),i=f(),e=W(),s=k(),m=u(),p=async o=>{try{r.startLoading();const t=await n.getFixedWorkflowTemplate(o);if(!t)throw new Error;const c=m.baseText("onboarding.title",{interpolate:{name:t.name}}),w=await i.createNewWorkflow({name:c,connections:t.workflow.connections,nodes:t.workflow.nodes,pinData:t.workflow.pinData,settings:t.workflow.settings,meta:{onboardingId:o}});await e.replace({name:a.WORKFLOW,params:{name:w.id},query:{onboardingId:o}}),r.stopLoading()}catch{throw await e.replace({name:a.NEW_WORKFLOW}),r.stopLoading(),new Error(`Could not load onboarding template ${o}`)}};return _(async()=>{const o=s.params.id;if(!o||typeof o!="string"){await e.replace({name:a.NEW_WORKFLOW});return}await p(o)}),(o,t)=>(b(),L("div"))}});export{X as default};
|
|
2
|
+
//# sourceMappingURL=WorkflowOnboardingView-gUVzVQsZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowOnboardingView-
|
|
1
|
+
{"version":3,"file":"WorkflowOnboardingView-gUVzVQsZ.js","sources":["../../src/views/WorkflowOnboardingView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS } from '@/constants';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { onMounted } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nconst loadingService = useLoadingService();\nconst templateStore = useTemplatesStore();\nconst workfowStore = useWorkflowsStore();\nconst router = useRouter();\nconst route = useRoute();\nconst i18n = useI18n();\n\nconst openWorkflowTemplate = async (templateId: string) => {\n\ttry {\n\t\tloadingService.startLoading();\n\t\tconst template = await templateStore.getFixedWorkflowTemplate(templateId);\n\t\tif (!template) {\n\t\t\tthrow new Error();\n\t\t}\n\n\t\tconst name: string = i18n.baseText('onboarding.title', {\n\t\t\tinterpolate: { name: template.name },\n\t\t});\n\n\t\tconst workflow = await workfowStore.createNewWorkflow({\n\t\t\tname,\n\t\t\tconnections: template.workflow.connections,\n\t\t\tnodes: template.workflow.nodes,\n\t\t\tpinData: template.workflow.pinData,\n\t\t\tsettings: template.workflow.settings,\n\t\t\tmeta: {\n\t\t\t\tonboardingId: templateId,\n\t\t\t},\n\t\t});\n\n\t\tawait router.replace({\n\t\t\tname: VIEWS.WORKFLOW,\n\t\t\tparams: { name: workflow.id },\n\t\t\tquery: { onboardingId: templateId },\n\t\t});\n\n\t\tloadingService.stopLoading();\n\t} catch (e) {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\tloadingService.stopLoading();\n\n\t\tthrow new Error(`Could not load onboarding template ${templateId}`); // sentry reporing\n\t}\n};\n\nonMounted(async () => {\n\tconst templateId = route.params.id;\n\tif (!templateId || typeof templateId !== 'string') {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\treturn;\n\t}\n\n\tawait openWorkflowTemplate(templateId);\n});\n</script>\n\n<template>\n\t<div></div>\n</template>\n\n<style lang=\"scss\" module></style>\n"],"names":["loadingService","useLoadingService","templateStore","useTemplatesStore","workfowStore","useWorkflowsStore","router","useRouter","route","useRoute","i18n","useI18n","openWorkflowTemplate","templateId","template","name","workflow","VIEWS","onMounted"],"mappings":"unCASA,MAAMA,EAAiBC,IACjBC,EAAgBC,IAChBC,EAAeC,IACfC,EAASC,IACTC,EAAQC,IACRC,EAAOC,IAEPC,EAAuB,MAAOC,GAAuB,CACtD,GAAA,CACHb,EAAe,aAAa,EAC5B,MAAMc,EAAW,MAAMZ,EAAc,yBAAyBW,CAAU,EACxE,GAAI,CAACC,EACJ,MAAM,IAAI,MAGL,MAAAC,EAAeL,EAAK,SAAS,mBAAoB,CACtD,YAAa,CAAE,KAAMI,EAAS,IAAK,CAAA,CACnC,EAEKE,EAAW,MAAMZ,EAAa,kBAAkB,CACrD,KAAAW,EACA,YAAaD,EAAS,SAAS,YAC/B,MAAOA,EAAS,SAAS,MACzB,QAASA,EAAS,SAAS,QAC3B,SAAUA,EAAS,SAAS,SAC5B,KAAM,CACL,aAAcD,CACf,CAAA,CACA,EAED,MAAMP,EAAO,QAAQ,CACpB,KAAMW,EAAM,SACZ,OAAQ,CAAE,KAAMD,EAAS,EAAG,EAC5B,MAAO,CAAE,aAAcH,CAAW,CAAA,CAClC,EAEDb,EAAe,YAAY,OAChB,CACX,YAAMM,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjDjB,EAAe,YAAY,EAErB,IAAI,MAAM,sCAAsCa,CAAU,EAAE,CACnE,CAAA,EAGD,OAAAK,EAAU,SAAY,CACf,MAAAL,EAAaL,EAAM,OAAO,GAChC,GAAI,CAACK,GAAc,OAAOA,GAAe,SAAU,CAClD,MAAMP,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjD,MACD,CAEA,MAAML,EAAqBC,CAAU,CAAA,CACrC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{R as J}from"./ResourcesListLayout-N4zg03Vf.js";import{R as K,o as X,B as H,p as P,u as F,t as j,a3 as Z,T as ee,V as A,dG as te,di as se,ac as ae,_ as I,dC as oe,O as ne,y as re}from"./n8n-ZKR6bms9.js";import{a as ie,aS as le,g as de,T as ce,u as ue,b as me}from"./index--RuZ5wHr.js";import{W as pe}from"./WorkflowActivator-EK3d11st.js";import{m as q}from"./pinia-jX93eZRS.js";import{G as V,ag as s,l as c,M as E,O as o,T as a,S as y,R as f,I as h,p as _,Q as L,a2 as fe,V as M,U as N,m as T,e as U,aH as he,F as z,a7 as B,u as ge}from"./vendor-2CfOYFi2.js";import{T as we}from"./TemplatesInfoCarousel-WUt6CUAt.js";import"./lodash-es-s_m9YyW7.js";import"./axios-QLjAsgXu.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-viEZCtbZ.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-2T2QU_2c.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./prettier-s3fE3Qyr.js";import"./codemirror-lang-html-n8n-qoVuUIQR.js";import"./@n8n/codemirror-lang-sql-zd5sOTQ9.js";import"./@lezer/common-aP6EPErF.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-QL7QI0sV.js";import"./codemirror-lang-n8n-expression-qGXLqLTr.js";import"./fast-json-stable-stringify-RhDdw38P.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-f7Vn5Pkq.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";import"./workflowActivate-FltKJaAB.js";import"./NodeList-8URsrxUQ.js";import"./vue-agile-TyH1pReu.js";const $={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},ke=V({data(){return{EnterpriseEditionFeature:K}},setup(){return{...X(),...ie()}},components:{TimeAgo:le,WorkflowActivator:pe},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWith:[],ownedBy:{},versionId:""})},readOnly:{type:Boolean,default:!1}},computed:{...q(j,F,P,H),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return Z(this.currentUser,this.data)},actions(){const e=[{label:this.$locale.baseText("workflows.item.open"),value:$.OPEN},{label:this.$locale.baseText("workflows.item.share"),value:$.SHARE}];return this.readOnly||e.push({label:this.$locale.baseText("workflows.item.duplicate"),value:$.DUPLICATE}),this.workflowPermissions.delete&&!this.readOnly&&e.push({label:this.$locale.baseText("workflows.item.delete"),value:$.DELETE}),e},formattedCreatedAtDate(){const e=new Date().getFullYear();return ee(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:A.WORKFLOW,params:{name:this.data.id}});window.open(r.href,"_blank");return}await this.$router.push({name:A.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===$.OPEN)await this.onClick();else if(e===$.DUPLICATE)this.uiStore.openModalWithData({name:te,data:{id:this.data.id,name:this.data.name,tags:(this.data.tags||[]).map(t=>t.id)}});else if(e===$.SHARE)this.uiStore.openModalWithData({name:se,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===A.WORKFLOWS?"Workflows listing":"Workflow editor"});else if(e===$.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")})!==ae)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"})}}}}),ye="_cardLink_523op_5",_e="_cardHeading_523op_15",be="_cardDescription_523op_21",Te="_cardActions_523op_28",Se={cardLink:ye,cardHeading:_e,cardDescription:be,cardActions:Te},$e={key:0};function Ce(e,t,r,d,p,i){const l=s("n8n-heading"),u=s("time-ago"),m=s("n8n-tags"),v=s("n8n-text"),n=s("n8n-badge"),b=s("enterprise-edition"),g=s("workflow-activator"),S=s("n8n-action-toggle"),O=s("n8n-card");return c(),E(O,{class:h(e.$style.cardLink),onClick:e.onClick},{header:o(()=>[a(l,{tag:"h2",bold:"",class:h(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:o(()=>[y(f(e.data.name),1)]),_:1},8,["class"])]),append:o(()=>[_("div",{class:h(e.$style.cardActions),ref:"cardActions"},[a(b,{features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[e.workflowPermissions.isOwner?(c(),E(n,{key:0,class:"mr-xs",theme:"tertiary",bold:""},{default:o(()=>[y(f(e.$locale.baseText("workflows.item.owner")),1)]),_:1})):L("",!0)]),_:1},8,["features"]),a(g,{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"]),a(S,{actions:e.actions,theme:"dark",onAction:e.onAction,onClick:t[0]||(t[0]=fe(()=>{},["stop"])),"data-test-id":"workflow-card-actions"},null,8,["actions","onAction"])],2)]),default:o(()=>[_("div",{class:h(e.$style.cardDescription)},[a(v,{color:"text-light",size:"small"},{default:o(()=>[M(_("span",null,[y(f(e.$locale.baseText("workflows.item.updated"))+" ",1),a(u,{date:e.data.updatedAt},null,8,["date"]),y(" | ")],512),[[N,e.data]]),M(_("span",{class:"mr-2xs"},f(e.$locale.baseText("workflows.item.created"))+" "+f(e.formattedCreatedAtDate),513),[[N,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?M((c(),T("span",$e,[a(m,{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)),[[N,e.data]]):L("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const Ee={$style:Se},ve=I(ke,[["render",Ce],["__cssModules",Ee]]),We=V({__name:"SuggestedTemplatesSection",props:{section:{type:Object,required:!0},title:{type:String,required:!1},showTitle:{type:Boolean,default:!0}},setup(e){const t=e,r=F(),d=ne(),p=U(()=>{const l=Array();return r.suggestedTemplates&&t.section.workflows.forEach((u,m)=>{l.push({id:m,name:u.title,workflows:[{id:m}],nodes:u.nodes})}),l});function i({id:l}){r.openModalWithData({name:oe,data:{workflow:t.section.workflows[l]}}),d.track("User clicked template recommendation",{templateName:t.section.workflows[l].title},{withPostHog:!0})}return(l,u)=>{const m=s("n8n-text");return c(),T("div",{class:h(l.$style.container),"data-test-id":"suggested-templates-section-container"},[e.showTitle?(c(),T("div",{key:0,class:h(l.$style.header)},[a(m,{size:"large",color:"text-base",bold:!0},{default:o(()=>[y(f(t.title??e.section.title),1)]),_:1})],2)):L("",!0),_("div",{class:h(l.$style.content)},[a(we,{collections:p.value,loading:!1,showItemCount:!1,showNavigation:!1,cardsWidth:"24%",onOpenCollection:i},null,8,["collections"])],2)],2)}}}),Ae="_container_a9sun_5",Oe={container:Ae},De={$style:Oe},Q=I(We,[["__cssModules",De]]),Le=V({__name:"SuggestedTemplatesPage",setup(e,{expose:t}){const r=P(),d=F(),p=he(),i=U(()=>r.currentUser),l=n=>{var b,g,S;if(!(!n||!n.firstName))return((g=(b=n.firstName)==null?void 0:b.charAt(0))==null?void 0:g.toUpperCase())+((S=n==null?void 0:n.firstName)==null?void 0:S.slice(1))},u=U(()=>d.suggestedTemplates?d.suggestedTemplates.sections[0]:null),m=U(()=>{const n=Array();return!d.suggestedTemplates||!u.value||u.value.workflows.forEach((b,g)=>{n.push({id:g,name:b.title,workflows:[{id:g}],nodes:b.nodes})}),n});function v(){d.nodeViewInitialized=!1,p.push({name:A.NEW_WORKFLOW})}return t({currentUser:i,openCanvas:v,suggestedTemplates:m}),(n,b)=>{var D;const g=s("n8n-heading"),S=s("n8n-text"),O=s("n8n-button");return c(),T("div",{class:h(n.$style.container),"data-test-id":"suggested-templates-page-container"},[_("div",{class:h(n.$style.header)},[a(g,{tag:"h1",size:"2xlarge",class:"mb-2xs"},{default:o(()=>[y(f(n.$locale.baseText("suggestedTemplates.heading",{interpolate:{name:l(i.value)||n.$locale.baseText("generic.welcome")}})),1)]),_:1}),a(S,{size:"large",color:"text-base","data-test-id":"suggested-template-section-description"},{default:o(()=>{var C;return[y(f((C=u.value)==null?void 0:C.description),1)]}),_:1})],2),_("div",{class:h(n.$style.content)},[(c(!0),T(z,null,B((D=ge(d).suggestedTemplates)==null?void 0:D.sections,C=>(c(),E(Q,{key:C.title,section:C,showTitle:!1},null,8,["section"]))),128))],2),_("div",null,[a(O,{label:n.$locale.baseText("suggestedTemplates.newWorkflowButton"),type:"secondary",size:"medium",icon:"plus","data-test-id":"suggested-templates-new-workflow-button",onClick:v},null,8,["label"])])],2)}}}),Ue="_container_to7oy_5",Fe="_header_to7oy_11",Ie={container:Ue,header:Fe},Ve={$style:Ie},Me=I(Le,[["__cssModules",Ve]]),W={ACTIVE:!0,DEACTIVATED:!1,ALL:""},Ne=V({name:"WorkflowsView",mixins:[de],components:{ResourcesListLayout:J,WorkflowCard:ve,TagsDropdown:ce,SuggestedTemplatesPage:Me,SuggestedTemplatesSection:Q},data(){return{filters:{search:"",ownedBy:"",sharedWith:"",status:W.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...q(j,F,P,H,re,me,ue),currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(K.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:W.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:W.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:W.DEACTIVATED}]},suggestedTemplates(){return this.uiStore.suggestedTemplates}},methods:{addWorkflow(){this.uiStore.nodeViewInitialized=!1,this.$router.push({name:A.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(d=>{var p;return(p=e.tags)==null?void 0:p.find(i=>typeof i=="object"?`${i.id}`==`${d}`:`${i}`==`${d}`)})),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:A.WORKFLOWS,query:e})},isValidUserId(e){return Object.keys(this.usersStore.users).includes(e)},setFiltersFromQueryString(){const{tags:e,status:t,search:r,ownedBy:d,sharedWith:p}=this.$route.query,i={};if(d&&typeof d=="string"&&this.isValidUserId(d)&&(i.ownedBy=d),p&&typeof p=="string"&&this.isValidUserId(p)&&(i.sharedWith=p),r&&typeof r=="string"&&(i.search=r),e&&typeof e=="string"){const l=this.tagsStore.allTags.map(m=>m.id),u=e.split(",").filter(m=>l.includes(m));u.length&&(i.tags=u)}t&&typeof t=="string"&&[W.ACTIVE.toString(),W.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()}}),ze=Ne,Be="_actionsContainer_51pcb_5",Pe="_emptyStateCard_51pcb_10",Re="_emptyStateCardIcon_51pcb_23",Ke={actionsContainer:Be,emptyStateCard:Pe,emptyStateCardIcon:Re},He={key:1},je={class:"text-center mt-s"},qe={key:0,class:"mb-s"},Qe={class:"mb-s"};function Ye(e,t,r,d,p,i){const l=s("n8n-button"),u=s("n8n-tooltip"),m=s("workflow-card"),v=s("suggested-templates-section"),n=s("suggested-templates-page"),b=s("n8n-heading"),g=s("n8n-text"),S=s("n8n-icon"),O=s("n8n-card"),D=s("n8n-input-label"),C=s("TagsDropdown"),Y=s("n8n-option"),x=s("n8n-select"),G=s("resources-list-layout");return c(),E(G,{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]=w=>e.filters=w)},{"add-button":o(({disabled:w})=>[a(u,{disabled:!e.readOnlyEnv},{content:o(()=>[y(f(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")),1)]),default:o(()=>[_("div",null,[a(l,{size:"large",block:"",disabled:w,onClick:e.addWorkflow,"data-test-id":"resources-list-add"},{default:o(()=>[y(f(e.$locale.baseText("workflows.add")),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:o(({data:w,updateItemSize:k})=>[a(m,{"data-test-id":"resources-list-item",class:"mb-2xs",data:w,"onExpand:tags":R=>k(w),"onClick:tag":e.onClickTag,readOnly:e.readOnlyEnv},null,8,["data","onExpand:tags","onClick:tag","readOnly"])]),postListContent:o(()=>{var w;return[(c(!0),T(z,null,B((w=e.suggestedTemplates)==null?void 0:w.sections,(k,R)=>(c(),E(v,{key:R,section:k,title:e.$locale.baseText("suggestedTemplates.sectionTitle",{interpolate:{sectionName:k.name.toLocaleLowerCase()}})},null,8,["section","title"]))),128))]}),empty:o(()=>[e.suggestedTemplates?(c(),E(n,{key:0})):(c(),T("div",He,[_("div",je,[a(b,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:o(()=>[y(f(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),a(g,{size:"large",color:"text-base"},{default:o(()=>[y(f(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?L("",!0):(c(),T("div",{key:0,class:h(["text-center","mt-2xl",e.$style.actionsContainer])},[a(O,{class:h(e.$style.emptyStateCard),hoverable:"",onClick:e.addWorkflow,"data-test-id":"new-workflow-card"},{default:o(()=>[a(S,{class:h(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),a(g,{size:"large",class:"mt-xs",color:"text-base"},{default:o(()=>[y(f(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]))]),filters:o(({setKeyValue:w})=>[e.settingsStore.areTagsEnabled?(c(),T("div",qe,[a(D,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),a(C,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),modelValue:e.filters.tags,createEnabled:!1,"onUpdate:modelValue":k=>w("tags",k)},null,8,["placeholder","modelValue","onUpdate:modelValue"])])):L("",!0),_("div",Qe,[a(D,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),a(x,{"data-test-id":"status-dropdown",modelValue:e.filters.status,"onUpdate:modelValue":k=>w("status",k)},{default:o(()=>[(c(!0),T(z,null,B(e.statusFilterOptions,k=>(c(),E(Y,{key:k.label,label:k.label,value:k.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 xe={$style:Ke},Ot=I(ze,[["render",Ye],["__cssModules",xe]]);export{Ot as default};
|
|
2
|
-
//# sourceMappingURL=WorkflowsView-
|
|
1
|
+
import{R as J}from"./ResourcesListLayout-y5FSwJeu.js";import{R as K,o as X,B as H,p as P,u as F,t as j,a3 as Z,T as ee,V as A,dG as te,di as se,ac as ae,_ as I,dC as oe,O as ne,y as re}from"./n8n-ZKR6bms9.js";import{a as ie,aS as le,g as de,T as ce,u as ue,b as me}from"./index-RXjMHIPR.js";import{W as pe}from"./WorkflowActivator-H10vhdIV.js";import{m as q}from"./pinia-jX93eZRS.js";import{G as V,ag as s,l as c,M as E,O as o,T as a,S as y,R as f,I as h,p as _,Q as L,a2 as fe,V as M,U as N,m as T,e as U,aH as he,F as z,a7 as B,u as ge}from"./vendor-2CfOYFi2.js";import{T as we}from"./TemplatesInfoCarousel-TKGxiVaR.js";import"./lodash-es-s_m9YyW7.js";import"./axios-QLjAsgXu.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-viEZCtbZ.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-2T2QU_2c.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./prettier-s3fE3Qyr.js";import"./codemirror-lang-html-n8n-qoVuUIQR.js";import"./@n8n/codemirror-lang-sql-zd5sOTQ9.js";import"./@lezer/common-aP6EPErF.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-QL7QI0sV.js";import"./codemirror-lang-n8n-expression-qGXLqLTr.js";import"./fast-json-stable-stringify-RhDdw38P.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-f7Vn5Pkq.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";import"./workflowActivate-IRvCsxq5.js";import"./NodeList-U4qs88M0.js";import"./vue-agile-TyH1pReu.js";const $={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},ke=V({data(){return{EnterpriseEditionFeature:K}},setup(){return{...X(),...ie()}},components:{TimeAgo:le,WorkflowActivator:pe},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWith:[],ownedBy:{},versionId:""})},readOnly:{type:Boolean,default:!1}},computed:{...q(j,F,P,H),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return Z(this.currentUser,this.data)},actions(){const e=[{label:this.$locale.baseText("workflows.item.open"),value:$.OPEN},{label:this.$locale.baseText("workflows.item.share"),value:$.SHARE}];return this.readOnly||e.push({label:this.$locale.baseText("workflows.item.duplicate"),value:$.DUPLICATE}),this.workflowPermissions.delete&&!this.readOnly&&e.push({label:this.$locale.baseText("workflows.item.delete"),value:$.DELETE}),e},formattedCreatedAtDate(){const e=new Date().getFullYear();return ee(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:A.WORKFLOW,params:{name:this.data.id}});window.open(r.href,"_blank");return}await this.$router.push({name:A.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===$.OPEN)await this.onClick();else if(e===$.DUPLICATE)this.uiStore.openModalWithData({name:te,data:{id:this.data.id,name:this.data.name,tags:(this.data.tags||[]).map(t=>t.id)}});else if(e===$.SHARE)this.uiStore.openModalWithData({name:se,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===A.WORKFLOWS?"Workflows listing":"Workflow editor"});else if(e===$.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")})!==ae)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"})}}}}),ye="_cardLink_523op_5",_e="_cardHeading_523op_15",be="_cardDescription_523op_21",Te="_cardActions_523op_28",Se={cardLink:ye,cardHeading:_e,cardDescription:be,cardActions:Te},$e={key:0};function Ce(e,t,r,d,p,i){const l=s("n8n-heading"),u=s("time-ago"),m=s("n8n-tags"),v=s("n8n-text"),n=s("n8n-badge"),b=s("enterprise-edition"),g=s("workflow-activator"),S=s("n8n-action-toggle"),O=s("n8n-card");return c(),E(O,{class:h(e.$style.cardLink),onClick:e.onClick},{header:o(()=>[a(l,{tag:"h2",bold:"",class:h(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:o(()=>[y(f(e.data.name),1)]),_:1},8,["class"])]),append:o(()=>[_("div",{class:h(e.$style.cardActions),ref:"cardActions"},[a(b,{features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[e.workflowPermissions.isOwner?(c(),E(n,{key:0,class:"mr-xs",theme:"tertiary",bold:""},{default:o(()=>[y(f(e.$locale.baseText("workflows.item.owner")),1)]),_:1})):L("",!0)]),_:1},8,["features"]),a(g,{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"]),a(S,{actions:e.actions,theme:"dark",onAction:e.onAction,onClick:t[0]||(t[0]=fe(()=>{},["stop"])),"data-test-id":"workflow-card-actions"},null,8,["actions","onAction"])],2)]),default:o(()=>[_("div",{class:h(e.$style.cardDescription)},[a(v,{color:"text-light",size:"small"},{default:o(()=>[M(_("span",null,[y(f(e.$locale.baseText("workflows.item.updated"))+" ",1),a(u,{date:e.data.updatedAt},null,8,["date"]),y(" | ")],512),[[N,e.data]]),M(_("span",{class:"mr-2xs"},f(e.$locale.baseText("workflows.item.created"))+" "+f(e.formattedCreatedAtDate),513),[[N,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?M((c(),T("span",$e,[a(m,{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)),[[N,e.data]]):L("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const Ee={$style:Se},ve=I(ke,[["render",Ce],["__cssModules",Ee]]),We=V({__name:"SuggestedTemplatesSection",props:{section:{type:Object,required:!0},title:{type:String,required:!1},showTitle:{type:Boolean,default:!0}},setup(e){const t=e,r=F(),d=ne(),p=U(()=>{const l=Array();return r.suggestedTemplates&&t.section.workflows.forEach((u,m)=>{l.push({id:m,name:u.title,workflows:[{id:m}],nodes:u.nodes})}),l});function i({id:l}){r.openModalWithData({name:oe,data:{workflow:t.section.workflows[l]}}),d.track("User clicked template recommendation",{templateName:t.section.workflows[l].title},{withPostHog:!0})}return(l,u)=>{const m=s("n8n-text");return c(),T("div",{class:h(l.$style.container),"data-test-id":"suggested-templates-section-container"},[e.showTitle?(c(),T("div",{key:0,class:h(l.$style.header)},[a(m,{size:"large",color:"text-base",bold:!0},{default:o(()=>[y(f(t.title??e.section.title),1)]),_:1})],2)):L("",!0),_("div",{class:h(l.$style.content)},[a(we,{collections:p.value,loading:!1,showItemCount:!1,showNavigation:!1,cardsWidth:"24%",onOpenCollection:i},null,8,["collections"])],2)],2)}}}),Ae="_container_a9sun_5",Oe={container:Ae},De={$style:Oe},Q=I(We,[["__cssModules",De]]),Le=V({__name:"SuggestedTemplatesPage",setup(e,{expose:t}){const r=P(),d=F(),p=he(),i=U(()=>r.currentUser),l=n=>{var b,g,S;if(!(!n||!n.firstName))return((g=(b=n.firstName)==null?void 0:b.charAt(0))==null?void 0:g.toUpperCase())+((S=n==null?void 0:n.firstName)==null?void 0:S.slice(1))},u=U(()=>d.suggestedTemplates?d.suggestedTemplates.sections[0]:null),m=U(()=>{const n=Array();return!d.suggestedTemplates||!u.value||u.value.workflows.forEach((b,g)=>{n.push({id:g,name:b.title,workflows:[{id:g}],nodes:b.nodes})}),n});function v(){d.nodeViewInitialized=!1,p.push({name:A.NEW_WORKFLOW})}return t({currentUser:i,openCanvas:v,suggestedTemplates:m}),(n,b)=>{var D;const g=s("n8n-heading"),S=s("n8n-text"),O=s("n8n-button");return c(),T("div",{class:h(n.$style.container),"data-test-id":"suggested-templates-page-container"},[_("div",{class:h(n.$style.header)},[a(g,{tag:"h1",size:"2xlarge",class:"mb-2xs"},{default:o(()=>[y(f(n.$locale.baseText("suggestedTemplates.heading",{interpolate:{name:l(i.value)||n.$locale.baseText("generic.welcome")}})),1)]),_:1}),a(S,{size:"large",color:"text-base","data-test-id":"suggested-template-section-description"},{default:o(()=>{var C;return[y(f((C=u.value)==null?void 0:C.description),1)]}),_:1})],2),_("div",{class:h(n.$style.content)},[(c(!0),T(z,null,B((D=ge(d).suggestedTemplates)==null?void 0:D.sections,C=>(c(),E(Q,{key:C.title,section:C,showTitle:!1},null,8,["section"]))),128))],2),_("div",null,[a(O,{label:n.$locale.baseText("suggestedTemplates.newWorkflowButton"),type:"secondary",size:"medium",icon:"plus","data-test-id":"suggested-templates-new-workflow-button",onClick:v},null,8,["label"])])],2)}}}),Ue="_container_to7oy_5",Fe="_header_to7oy_11",Ie={container:Ue,header:Fe},Ve={$style:Ie},Me=I(Le,[["__cssModules",Ve]]),W={ACTIVE:!0,DEACTIVATED:!1,ALL:""},Ne=V({name:"WorkflowsView",mixins:[de],components:{ResourcesListLayout:J,WorkflowCard:ve,TagsDropdown:ce,SuggestedTemplatesPage:Me,SuggestedTemplatesSection:Q},data(){return{filters:{search:"",ownedBy:"",sharedWith:"",status:W.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...q(j,F,P,H,re,me,ue),currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(K.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:W.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:W.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:W.DEACTIVATED}]},suggestedTemplates(){return this.uiStore.suggestedTemplates}},methods:{addWorkflow(){this.uiStore.nodeViewInitialized=!1,this.$router.push({name:A.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(d=>{var p;return(p=e.tags)==null?void 0:p.find(i=>typeof i=="object"?`${i.id}`==`${d}`:`${i}`==`${d}`)})),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:A.WORKFLOWS,query:e})},isValidUserId(e){return Object.keys(this.usersStore.users).includes(e)},setFiltersFromQueryString(){const{tags:e,status:t,search:r,ownedBy:d,sharedWith:p}=this.$route.query,i={};if(d&&typeof d=="string"&&this.isValidUserId(d)&&(i.ownedBy=d),p&&typeof p=="string"&&this.isValidUserId(p)&&(i.sharedWith=p),r&&typeof r=="string"&&(i.search=r),e&&typeof e=="string"){const l=this.tagsStore.allTags.map(m=>m.id),u=e.split(",").filter(m=>l.includes(m));u.length&&(i.tags=u)}t&&typeof t=="string"&&[W.ACTIVE.toString(),W.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()}}),ze=Ne,Be="_actionsContainer_51pcb_5",Pe="_emptyStateCard_51pcb_10",Re="_emptyStateCardIcon_51pcb_23",Ke={actionsContainer:Be,emptyStateCard:Pe,emptyStateCardIcon:Re},He={key:1},je={class:"text-center mt-s"},qe={key:0,class:"mb-s"},Qe={class:"mb-s"};function Ye(e,t,r,d,p,i){const l=s("n8n-button"),u=s("n8n-tooltip"),m=s("workflow-card"),v=s("suggested-templates-section"),n=s("suggested-templates-page"),b=s("n8n-heading"),g=s("n8n-text"),S=s("n8n-icon"),O=s("n8n-card"),D=s("n8n-input-label"),C=s("TagsDropdown"),Y=s("n8n-option"),x=s("n8n-select"),G=s("resources-list-layout");return c(),E(G,{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]=w=>e.filters=w)},{"add-button":o(({disabled:w})=>[a(u,{disabled:!e.readOnlyEnv},{content:o(()=>[y(f(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")),1)]),default:o(()=>[_("div",null,[a(l,{size:"large",block:"",disabled:w,onClick:e.addWorkflow,"data-test-id":"resources-list-add"},{default:o(()=>[y(f(e.$locale.baseText("workflows.add")),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:o(({data:w,updateItemSize:k})=>[a(m,{"data-test-id":"resources-list-item",class:"mb-2xs",data:w,"onExpand:tags":R=>k(w),"onClick:tag":e.onClickTag,readOnly:e.readOnlyEnv},null,8,["data","onExpand:tags","onClick:tag","readOnly"])]),postListContent:o(()=>{var w;return[(c(!0),T(z,null,B((w=e.suggestedTemplates)==null?void 0:w.sections,(k,R)=>(c(),E(v,{key:R,section:k,title:e.$locale.baseText("suggestedTemplates.sectionTitle",{interpolate:{sectionName:k.name.toLocaleLowerCase()}})},null,8,["section","title"]))),128))]}),empty:o(()=>[e.suggestedTemplates?(c(),E(n,{key:0})):(c(),T("div",He,[_("div",je,[a(b,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:o(()=>[y(f(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),a(g,{size:"large",color:"text-base"},{default:o(()=>[y(f(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?L("",!0):(c(),T("div",{key:0,class:h(["text-center","mt-2xl",e.$style.actionsContainer])},[a(O,{class:h(e.$style.emptyStateCard),hoverable:"",onClick:e.addWorkflow,"data-test-id":"new-workflow-card"},{default:o(()=>[a(S,{class:h(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),a(g,{size:"large",class:"mt-xs",color:"text-base"},{default:o(()=>[y(f(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]))]),filters:o(({setKeyValue:w})=>[e.settingsStore.areTagsEnabled?(c(),T("div",qe,[a(D,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),a(C,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),modelValue:e.filters.tags,createEnabled:!1,"onUpdate:modelValue":k=>w("tags",k)},null,8,["placeholder","modelValue","onUpdate:modelValue"])])):L("",!0),_("div",Qe,[a(D,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),a(x,{"data-test-id":"status-dropdown",modelValue:e.filters.status,"onUpdate:modelValue":k=>w("status",k)},{default:o(()=>[(c(!0),T(z,null,B(e.statusFilterOptions,k=>(c(),E(Y,{key:k.label,label:k.label,value:k.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 xe={$style:Ke},Ot=I(ze,[["render",Ye],["__cssModules",xe]]);export{Ot as default};
|
|
2
|
+
//# sourceMappingURL=WorkflowsView-Qqq1sZTo.js.map
|