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{m as K}from"./pinia-jX93eZRS.js";import{u as q,_ as v,R as z,p as A,t as G,M as Q}from"./n8n-ZKR6bms9.js";import{G as S,l,m as d,p as y,I as a,H as h,Q as m,ag as r,T as i,M as f,O as o,V as O,U as R,S as u,R as c,a9 as J,F as M,a7 as X,ab as Y,al as Z}from"./vendor-2CfOYFi2.js";import{d as x}from"./index--RuZ5wHr.js";const ee=S({name:"PageViewLayout",data(){return{loading:!1}},computed:{...K(q)}}),se="_wrapper_z85zu_5",te="_container_z85zu_20",re="_aside_z85zu_29",le="_content_z85zu_43",oe={wrapper:se,container:te,aside:re,content:le};function ie(e,s,t,w,p,_){return l(),d("div",{class:a([e.$style.wrapper,!this.uiStore.sidebarMenuCollapsed&&e.$style.expandedSidebar])},[y("div",{class:a(e.$style.container)},[e.$slots.aside?(l(),d("aside",{key:0,class:a(e.$style.aside)},[h(e.$slots,"aside")],2)):m("",!0),y("main",{class:a(e.$style.content)},[h(e.$slots,"default")],2)],2)],2)}const ne={$style:oe},ae=v(ee,[["render",ie],["__cssModules",ne]]),de=S({props:{overflow:{type:Boolean,default:!1}}}),ue="_wrapper_l75f8_5",he="_overflow_l75f8_11",pe="_list_l75f8_11",ce="_body_l75f8_11",fe="_header_l75f8_21",me={wrapper:ue,overflow:he,list:pe,body:ce,header:fe};function ye(e,s,t,w,p,_){return l(),d("div",{class:a({[e.$style.wrapper]:!0,[e.$style.overflow]:e.overflow})},[y("div",{class:a(e.$style.list)},[e.$slots.header?(l(),d("div",{key:0,class:a(e.$style.header)},[h(e.$slots,"header")],2)):m("",!0),y("div",{class:a(e.$style.body)},[h(e.$slots,"default")],2)],2)],2)}const we={$style:me},be=v(de,[["render",ye],["__cssModules",we]]),$e=S({props:{value:{type:Boolean,default:!0},myResourcesLabel:{type:String,default:""},allResourcesLabel:{type:String,default:""}},computed:{menuItems(){return[{id:"all",icon:"globe-americas",label:this.allResourcesLabel,position:"top"},{id:"owner",icon:"user",label:this.myResourcesLabel,position:"top"}]}},methods:{onSelectOwner(e){this.$emit("update:modelValue",e==="owner")}}}),ge={class:"resource-ownership-select"};function ve(e,s,t,w,p,_){const $=r("n8n-menu");return l(),d("div",ge,[i($,{items:e.menuItems,mode:"tabs",modelValue:e.value?"owner":"all","onUpdate:modelValue":e.onSelectOwner},null,8,["items","modelValue","onUpdate:modelValue"])])}const Se=v($e,[["render",ve],["__scopeId","data-v-64775fda"]]),_e=S({props:{modelValue:{type:Object,default:()=>({})},keys:{type:Array,default:()=>[]},shareable:{type:Boolean,default:!0},reset:{type:Function}},data(){return{EnterpriseEditionFeature:z}},computed:{...K(A),ownedByUsers(){return this.usersStore.allUsers.map(e=>e.id===this.modelValue.sharedWith?{...e,disabled:!0}:e)},sharedWithUsers(){return this.usersStore.allUsers.map(e=>e.id===this.modelValue.ownedBy?{...e,disabled:!0}:e)},filtersLength(){let e=0;return this.keys.forEach(s=>{s!=="search"&&(e+=(Array.isArray(this.modelValue[s])?this.modelValue[s].length>0:this.modelValue[s]!=="")?1:0)}),e},hasFilters(){return this.filtersLength>0}},methods:{setKeyValue(e,s){const t={...this.modelValue,[e]:s};this.$emit("update:modelValue",t)},resetFilters(){if(this.reset)this.reset();else{const e={...this.modelValue};this.keys.forEach(s=>{e[s]=Array.isArray(this.modelValue[s])?[]:""}),this.$emit("update:modelValue",e)}}},watch:{filtersLength(e){this.$emit("update:filtersLength",e)}}}),Fe={"filter-button":"_filter-button_157qk_5","filters-dropdown":"_filters-dropdown_157qk_10","filters-dropdown-footer":"_filters-dropdown-footer_157qk_15"};function Ve(e,s,t,w,p,_){const $=r("n8n-badge"),k=r("n8n-button"),F=r("n8n-input-label"),V=r("n8n-user-select"),b=r("enterprise-edition"),T=r("n8n-link"),U=r("n8n-popover");return l(),f(U,{trigger:"click",width:"304",size:"large"},{reference:o(()=>[i(k,{icon:"filter",type:"tertiary",active:e.hasFilters,class:a([e.$style["filter-button"],"ml-2xs"]),"data-test-id":"resources-list-filters-trigger"},{default:o(()=>[O(i($,{theme:"primary",class:"mr-4xs"},{default:o(()=>[u(c(e.filtersLength),1)]),_:1},512),[[R,e.filtersLength>0]]),u(" "+c(e.$locale.baseText("forms.resourceFiltersDropdown.filters")),1)]),_:1},8,["active","class"])]),default:o(()=>[y("div",{class:a(e.$style["filters-dropdown"]),"data-test-id":"resources-list-filters-dropdown"},[h(e.$slots,"default",{filters:e.modelValue,setKeyValue:e.setKeyValue}),e.shareable?(l(),f(b,{key:0,class:"mb-s",features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[i(F,{label:e.$locale.baseText("forms.resourceFiltersDropdown.ownedBy"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),i(V,{users:e.ownedByUsers,currentUserId:e.usersStore.currentUser.id,modelValue:e.modelValue.ownedBy,size:"medium","onUpdate:modelValue":s[0]||(s[0]=g=>e.setKeyValue("ownedBy",g))},null,8,["users","currentUserId","modelValue"])]),_:1},8,["features"])):m("",!0),e.shareable?(l(),f(b,{key:1,features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[i(F,{label:e.$locale.baseText("forms.resourceFiltersDropdown.sharedWith"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),i(V,{users:e.sharedWithUsers,currentUserId:e.usersStore.currentUser.id,modelValue:e.modelValue.sharedWith,size:"medium","onUpdate:modelValue":s[1]||(s[1]=g=>e.setKeyValue("sharedWith",g))},null,8,["users","currentUserId","modelValue"])]),_:1},8,["features"])):m("",!0),e.hasFilters?(l(),d("div",{key:2,class:a([e.$style["filters-dropdown-footer"],"mt-s"])},[i(T,{onClick:e.resetFilters},{default:o(()=>[u(c(e.$locale.baseText("forms.resourceFiltersDropdown.reset")),1)]),_:1},8,["onClick"])],2)):m("",!0)],2)]),_:3})}const ke={$style:Fe},Te=v(_e,[["render",Ve],["__cssModules",ke]]),Ue=S({name:"resources-list-layout",mixins:[x],components:{PageViewLayout:ae,PageViewLayoutList:be,ResourceOwnershipSelect:Se,ResourceFiltersDropdown:Te},props:{resourceKey:{type:String,default:""},displayName:{type:Function,default:e=>e.name},resources:{type:Array,default:()=>[]},disabled:{type:Boolean,default:!1},initialize:{type:Function,default:()=>async()=>{}},filters:{type:Object,default:()=>({search:"",ownedBy:"",sharedWith:""})},additionalFiltersHandler:{type:Function},showAside:{type:Boolean,default:!0},shareable:{type:Boolean,default:!0},showFiltersDropdown:{type:Boolean,default:!0},sortFns:{type:Object,default:()=>({})},sortOptions:{type:Array,default:()=>["lastUpdated","lastCreated","nameAsc","nameDesc"]},type:{type:String,default:"list"},typeProps:{type:Object,default:()=>({itemSize:80})}},setup(){return{i18n:Q()}},data(){return{loading:!0,isOwnerSubview:!1,sortBy:this.sortOptions[0],hasFilters:!1,filtersModel:{...this.filters},currentPage:1,rowsPerPage:10,resettingFilters:!1,EnterpriseEditionFeature:z}},computed:{...K(G,A),subviewResources(){return this.shareable?this.resources.filter(e=>{var s;return this.isOwnerSubview&&this.settingsStore.isEnterpriseFeatureEnabled(z.Sharing)?!!(e.ownedBy&&e.ownedBy.id===((s=this.usersStore.currentUser)==null?void 0:s.id)):!0}):this.resources},filterKeys(){return Object.keys(this.filtersModel)},filteredAndSortedSubviewResources(){return this.subviewResources.filter(s=>{var w;let t=!0;if(this.filtersModel.ownedBy&&(t=t&&!!(s.ownedBy&&s.ownedBy.id===this.filtersModel.ownedBy)),this.filtersModel.sharedWith&&(t=t&&!!((w=s.sharedWith)!=null&&w.find(p=>p.id===this.filtersModel.sharedWith))),this.filtersModel.search){const p=this.filtersModel.search.toLowerCase();t=t&&this.displayName(s).toLowerCase().includes(p)}return this.additionalFiltersHandler&&(t=this.additionalFiltersHandler(s,this.filtersModel,t)),t}).sort((s,t)=>{switch(this.sortBy){case"lastUpdated":return this.sortFns.lastUpdated?this.sortFns.lastUpdated(s,t):new Date(t.updatedAt).valueOf()-new Date(s.updatedAt).valueOf();case"lastCreated":return this.sortFns.lastCreated?this.sortFns.lastCreated(s,t):new Date(t.createdAt).valueOf()-new Date(s.createdAt).valueOf();case"nameAsc":return this.sortFns.nameAsc?this.sortFns.nameAsc(s,t):this.displayName(s).trim().localeCompare(this.displayName(t).trim());case"nameDesc":return this.sortFns.nameDesc?this.sortFns.nameDesc(s,t):this.displayName(t).trim().localeCompare(this.displayName(s).trim());default:return this.sortFns[this.sortBy]?this.sortFns[this.sortBy](s,t):0}})},resourcesNotOwned(){return this.resources.filter(e=>{var s;return e.ownedBy&&e.ownedBy.id!==((s=this.usersStore.currentUser)==null?void 0:s.id)})},shouldSwitchToAllSubview(){return!this.hasFilters&&this.isOwnerSubview&&this.resourcesNotOwned.length>0}},methods:{async onMounted(){await this.initialize(),this.loading=!1,await this.$nextTick(),this.focusSearchInput(),this.hasAppliedFilters()&&(this.hasFilters=!0)},hasAppliedFilters(){return!!this.filterKeys.find(e=>e!=="search"&&(Array.isArray(this.filters[e])?this.filters[e].length>0:this.filters[e]!==""))},setCurrentPage(e){this.currentPage=e},setRowsPerPage(e){this.rowsPerPage=e},resetFilters(){Object.keys(this.filtersModel).forEach(e=>{this.filtersModel[e]=Array.isArray(this.filtersModel[e])?[]:""}),this.resettingFilters=!0,this.sendFiltersTelemetry("reset")},focusSearchInput(){this.$refs.search&&this.$refs.search.focus()},setOwnerSubview(e){this.isOwnerSubview=e},getTelemetrySubview(){return this.i18n.baseText(`${this.resourceKey}.menu.${this.isOwnerSubview?"my":"all"}`)},sendSubviewTelemetry(){this.$telemetry.track(`User changed ${this.resourceKey} sub view`,{sub_view:this.getTelemetrySubview()})},sendSortingTelemetry(){this.$telemetry.track(`User changed sorting in ${this.resourceKey} list`,{sub_view:this.getTelemetrySubview(),sorting:this.sortBy})},sendFiltersTelemetry(e){if(this.resettingFilters){if(e!=="reset")return;setTimeout(()=>this.resettingFilters=!1,1500)}const s=this.filtersModel,t=[],w=[];Object.keys(s).forEach(p=>{s[p]&&(t.push(p),w.push(p==="search"?null:s[p]))}),this.$telemetry.track(`User set filters in ${this.resourceKey} list`,{filters_set:t,filter_values:w,sub_view:this.getTelemetrySubview(),[`${this.resourceKey}_total_in_view`]:this.subviewResources.length,[`${this.resourceKey}_after_filtering`]:this.filteredAndSortedSubviewResources.length})},onUpdateFiltersLength(e){this.hasFilters=e>0},onSearch(e){this.filtersModel.search=e,this.$emit("update:filters",this.filtersModel)}},mounted(){this.onMounted()},watch:{isOwnerSubview(){this.sendSubviewTelemetry()},filters(e){this.filtersModel=e},"filtersModel.ownedBy"(e){e&&this.setOwnerSubview(!1),this.sendFiltersTelemetry("ownedBy")},"filtersModel.sharedWith"(){this.sendFiltersTelemetry("sharedWith")},"filtersModel.search"(){this.callDebounced("sendFiltersTelemetry",{debounceTime:1e3,trailing:!0},"search")},sortBy(e){this.$emit("sort",e),this.sendSortingTelemetry()}}}),Be="_search_1l5ez_16",Pe="_listWrapper_1l5ez_20",Me="_datatable_1l5ez_39",ze={"heading-wrapper":"_heading-wrapper_1l5ez_5","filters-row":"_filters-row_1l5ez_9",search:Be,listWrapper:Pe,"sort-and-filter":"_sort-and-filter_1l5ez_24","header-loading":"_header-loading_1l5ez_31","card-loading":"_card-loading_1l5ez_35",datatable:Me},Ke={class:"mt-xs mb-l"},Ae={key:0},Oe={key:0},Re={class:"mb-xs"},Ce={key:0,class:"mt-xs"},Le=y("div",{class:"pb-xs"},null,-1),De={key:0},We={key:1};function Ee(e,s,t,w,p,_){const $=r("n8n-heading"),k=r("n8n-button"),F=r("resource-ownership-select"),V=r("enterprise-edition"),b=r("n8n-loading"),T=r("n8n-action-box"),U=r("n8n-icon"),g=r("n8n-input"),C=r("n8n-option"),L=r("n8n-select"),D=r("resource-filters-dropdown"),B=r("n8n-link"),W=r("n8n-info-tip"),E=r("n8n-recycle-scroller"),N=r("n8n-datatable"),I=r("n8n-text"),j=r("page-view-layout-list"),H=r("page-view-layout");return l(),f(H,null,J({default:o(()=>[e.loading?(l(),d("div",Ae,[i(b,{class:a([e.$style["header-loading"],"mb-l"]),variant:"custom"},null,8,["class"]),i(b,{class:a([e.$style["card-loading"],"mb-2xs"]),variant:"custom"},null,8,["class"]),i(b,{class:a(e.$style["card-loading"]),variant:"custom"},null,8,["class"])])):(l(),d(M,{key:1},[e.resources.length===0?(l(),d("div",Oe,[h(e.$slots,"empty",{},()=>[i(T,{"data-test-id":"empty-resources-list",emoji:"👋",heading:e.i18n.baseText(e.usersStore.currentUser.firstName?`${e.resourceKey}.empty.heading`:`${e.resourceKey}.empty.heading.userNotSetup`,{interpolate:{name:e.usersStore.currentUser.firstName}}),description:e.i18n.baseText(`${e.resourceKey}.empty.description`),buttonText:e.i18n.baseText(`${e.resourceKey}.empty.button`),buttonType:"secondary","onClick:button":s[2]||(s[2]=n=>e.$emit("click:add",n))},null,8,["heading","description","buttonText"])])])):(l(),f(j,{key:1,overflow:e.type!=="list"},{header:o(()=>[y("div",Re,[y("div",{class:a(e.$style["filters-row"])},[i(g,{modelValue:e.filtersModel.search,class:a([e.$style.search,"mr-2xs"]),placeholder:e.i18n.baseText(`${e.resourceKey}.search.placeholder`),clearable:"",ref:"search","data-test-id":"resources-list-search","onUpdate:modelValue":e.onSearch},{prefix:o(()=>[i(U,{icon:"search"})]),_:1},8,["modelValue","class","placeholder","onUpdate:modelValue"]),y("div",{class:a(e.$style["sort-and-filter"])},[i(L,{modelValue:e.sortBy,"onUpdate:modelValue":s[3]||(s[3]=n=>e.sortBy=n),"data-test-id":"resources-list-sort"},{default:o(()=>[(l(!0),d(M,null,X(e.sortOptions,n=>(l(),f(C,{"data-test-id":"resources-list-sort-item",key:n,value:n,label:e.i18n.baseText(`${e.resourceKey}.sort.${n}`)},null,8,["value","label"]))),128))]),_:1},8,["modelValue"]),e.showFiltersDropdown?(l(),f(D,{key:0,keys:e.filterKeys,reset:e.resetFilters,modelValue:e.filtersModel,shareable:e.shareable,"onUpdate:modelValue":s[4]||(s[4]=n=>e.$emit("update:filters",n)),"onUpdate:filtersLength":e.onUpdateFiltersLength},{default:o(n=>[h(e.$slots,"filters",Y(Z(n)))]),_:3},8,["keys","reset","modelValue","shareable","onUpdate:filtersLength"])):m("",!0)],2)],2)]),h(e.$slots,"callout"),e.showFiltersDropdown?O((l(),d("div",Ce,[i(W,{bold:!1},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.filters.active`))+" ",1),i(B,{"data-test-id":"workflows-filter-reset",onClick:e.resetFilters,size:"small"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.filters.active.reset`)),1)]),_:1},8,["onClick"])]),_:1})],512)),[[R,e.hasFilters]]):m("",!0),Le]),default:o(()=>[h(e.$slots,"preamble"),e.filteredAndSortedSubviewResources.length>0?(l(),d("div",{key:0,class:a(e.$style.listWrapper),ref:"listWrapperRef"},[e.type==="list"?(l(),f(E,{key:0,"data-test-id":"resources-list",class:a([e.$style.list,"list-style-none"]),items:e.filteredAndSortedSubviewResources,"item-size":e.typeProps.itemSize,"item-key":"id"},{default:o(({item:n,updateItemSize:P})=>[h(e.$slots,"default",{data:n,updateItemSize:P})]),postListContent:o(()=>[h(e.$slots,"postListContent")]),_:3},8,["class","items","item-size"])):m("",!0),e.typeProps.columns?(l(),f(N,{key:1,"data-test-id":"resources-table",class:a(e.$style.datatable),columns:e.typeProps.columns,rows:e.filteredAndSortedSubviewResources,currentPage:e.currentPage,rowsPerPage:e.rowsPerPage,"onUpdate:currentPage":e.setCurrentPage,"onUpdate:rowsPerPage":e.setRowsPerPage},{row:o(({columns:n,row:P})=>[h(e.$slots,"default",{data:P,columns:n})]),_:3},8,["class","columns","rows","currentPage","rowsPerPage","onUpdate:currentPage","onUpdate:rowsPerPage"])):m("",!0)],2)):(l(),f(I,{key:1,color:"text-base",size:"medium","data-test-id":"resources-list-empty"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.noResults`))+" ",1),e.shouldSwitchToAllSubview?(l(),d(M,{key:0},[e.filtersModel.search?(l(),d("span",We,[u(" ("+c(e.i18n.baseText(`${e.resourceKey}.noResults.withSearch.switchToShared.preamble`))+" ",1),i(B,{onClick:s[6]||(s[6]=n=>e.setOwnerSubview(!1))},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.noResults.withSearch.switchToShared.link`)),1)]),_:1}),u(") ")])):(l(),d("span",De,[u(" ("+c(e.i18n.baseText(`${e.resourceKey}.noResults.switchToShared.preamble`))+" ",1),i(B,{onClick:s[5]||(s[5]=n=>e.setOwnerSubview(!1))},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.noResults.switchToShared.link`)),1)]),_:1}),u(") ")]))],64)):m("",!0)]),_:1})),h(e.$slots,"postamble")]),_:3},8,["overflow"]))],64))]),_:2},[e.showAside?{name:"aside",fn:o(()=>[y("div",{class:a([e.$style["heading-wrapper"],"mb-xs"])},[i($,{size:"2xlarge"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.heading`)),1)]),_:1})],2),y("div",Ke,[h(e.$slots,"add-button",{disabled:e.disabled},()=>[i(k,{size:"large",block:"",disabled:e.disabled,onClick:s[0]||(s[0]=n=>e.$emit("click:add",n)),"data-test-id":"resources-list-add"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.add`)),1)]),_:1},8,["disabled"])])]),e.shareable?(l(),f(V,{key:0,features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[i(F,{modelValue:e.isOwnerSubview,"onUpdate:modelValue":s[1]||(s[1]=n=>e.isOwnerSubview=n),"my-resources-label":e.i18n.baseText(`${e.resourceKey}.menu.my`),"all-resources-label":e.i18n.baseText(`${e.resourceKey}.menu.all`)},null,8,["modelValue","my-resources-label","all-resources-label"])]),_:1},8,["features"])):m("",!0)]),key:"0"}:void 0]),1024)}const Ne={$style:ze},Ge=v(Ue,[["render",Ee],["__cssModules",Ne]]);export{Ge as R};
|
|
2
|
-
//# sourceMappingURL=ResourcesListLayout-
|
|
1
|
+
import{m as K}from"./pinia-jX93eZRS.js";import{u as q,_ as v,R as z,p as A,t as G,M as Q}from"./n8n-ZKR6bms9.js";import{G as S,l,m as d,p as y,I as a,H as h,Q as m,ag as r,T as i,M as f,O as o,V as O,U as R,S as u,R as c,a9 as J,F as M,a7 as X,ab as Y,al as Z}from"./vendor-2CfOYFi2.js";import{d as x}from"./index-RXjMHIPR.js";const ee=S({name:"PageViewLayout",data(){return{loading:!1}},computed:{...K(q)}}),se="_wrapper_z85zu_5",te="_container_z85zu_20",re="_aside_z85zu_29",le="_content_z85zu_43",oe={wrapper:se,container:te,aside:re,content:le};function ie(e,s,t,w,p,_){return l(),d("div",{class:a([e.$style.wrapper,!this.uiStore.sidebarMenuCollapsed&&e.$style.expandedSidebar])},[y("div",{class:a(e.$style.container)},[e.$slots.aside?(l(),d("aside",{key:0,class:a(e.$style.aside)},[h(e.$slots,"aside")],2)):m("",!0),y("main",{class:a(e.$style.content)},[h(e.$slots,"default")],2)],2)],2)}const ne={$style:oe},ae=v(ee,[["render",ie],["__cssModules",ne]]),de=S({props:{overflow:{type:Boolean,default:!1}}}),ue="_wrapper_l75f8_5",he="_overflow_l75f8_11",pe="_list_l75f8_11",ce="_body_l75f8_11",fe="_header_l75f8_21",me={wrapper:ue,overflow:he,list:pe,body:ce,header:fe};function ye(e,s,t,w,p,_){return l(),d("div",{class:a({[e.$style.wrapper]:!0,[e.$style.overflow]:e.overflow})},[y("div",{class:a(e.$style.list)},[e.$slots.header?(l(),d("div",{key:0,class:a(e.$style.header)},[h(e.$slots,"header")],2)):m("",!0),y("div",{class:a(e.$style.body)},[h(e.$slots,"default")],2)],2)],2)}const we={$style:me},be=v(de,[["render",ye],["__cssModules",we]]),$e=S({props:{value:{type:Boolean,default:!0},myResourcesLabel:{type:String,default:""},allResourcesLabel:{type:String,default:""}},computed:{menuItems(){return[{id:"all",icon:"globe-americas",label:this.allResourcesLabel,position:"top"},{id:"owner",icon:"user",label:this.myResourcesLabel,position:"top"}]}},methods:{onSelectOwner(e){this.$emit("update:modelValue",e==="owner")}}}),ge={class:"resource-ownership-select"};function ve(e,s,t,w,p,_){const $=r("n8n-menu");return l(),d("div",ge,[i($,{items:e.menuItems,mode:"tabs",modelValue:e.value?"owner":"all","onUpdate:modelValue":e.onSelectOwner},null,8,["items","modelValue","onUpdate:modelValue"])])}const Se=v($e,[["render",ve],["__scopeId","data-v-64775fda"]]),_e=S({props:{modelValue:{type:Object,default:()=>({})},keys:{type:Array,default:()=>[]},shareable:{type:Boolean,default:!0},reset:{type:Function}},data(){return{EnterpriseEditionFeature:z}},computed:{...K(A),ownedByUsers(){return this.usersStore.allUsers.map(e=>e.id===this.modelValue.sharedWith?{...e,disabled:!0}:e)},sharedWithUsers(){return this.usersStore.allUsers.map(e=>e.id===this.modelValue.ownedBy?{...e,disabled:!0}:e)},filtersLength(){let e=0;return this.keys.forEach(s=>{s!=="search"&&(e+=(Array.isArray(this.modelValue[s])?this.modelValue[s].length>0:this.modelValue[s]!=="")?1:0)}),e},hasFilters(){return this.filtersLength>0}},methods:{setKeyValue(e,s){const t={...this.modelValue,[e]:s};this.$emit("update:modelValue",t)},resetFilters(){if(this.reset)this.reset();else{const e={...this.modelValue};this.keys.forEach(s=>{e[s]=Array.isArray(this.modelValue[s])?[]:""}),this.$emit("update:modelValue",e)}}},watch:{filtersLength(e){this.$emit("update:filtersLength",e)}}}),Fe={"filter-button":"_filter-button_157qk_5","filters-dropdown":"_filters-dropdown_157qk_10","filters-dropdown-footer":"_filters-dropdown-footer_157qk_15"};function Ve(e,s,t,w,p,_){const $=r("n8n-badge"),k=r("n8n-button"),F=r("n8n-input-label"),V=r("n8n-user-select"),b=r("enterprise-edition"),T=r("n8n-link"),U=r("n8n-popover");return l(),f(U,{trigger:"click",width:"304",size:"large"},{reference:o(()=>[i(k,{icon:"filter",type:"tertiary",active:e.hasFilters,class:a([e.$style["filter-button"],"ml-2xs"]),"data-test-id":"resources-list-filters-trigger"},{default:o(()=>[O(i($,{theme:"primary",class:"mr-4xs"},{default:o(()=>[u(c(e.filtersLength),1)]),_:1},512),[[R,e.filtersLength>0]]),u(" "+c(e.$locale.baseText("forms.resourceFiltersDropdown.filters")),1)]),_:1},8,["active","class"])]),default:o(()=>[y("div",{class:a(e.$style["filters-dropdown"]),"data-test-id":"resources-list-filters-dropdown"},[h(e.$slots,"default",{filters:e.modelValue,setKeyValue:e.setKeyValue}),e.shareable?(l(),f(b,{key:0,class:"mb-s",features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[i(F,{label:e.$locale.baseText("forms.resourceFiltersDropdown.ownedBy"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),i(V,{users:e.ownedByUsers,currentUserId:e.usersStore.currentUser.id,modelValue:e.modelValue.ownedBy,size:"medium","onUpdate:modelValue":s[0]||(s[0]=g=>e.setKeyValue("ownedBy",g))},null,8,["users","currentUserId","modelValue"])]),_:1},8,["features"])):m("",!0),e.shareable?(l(),f(b,{key:1,features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[i(F,{label:e.$locale.baseText("forms.resourceFiltersDropdown.sharedWith"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),i(V,{users:e.sharedWithUsers,currentUserId:e.usersStore.currentUser.id,modelValue:e.modelValue.sharedWith,size:"medium","onUpdate:modelValue":s[1]||(s[1]=g=>e.setKeyValue("sharedWith",g))},null,8,["users","currentUserId","modelValue"])]),_:1},8,["features"])):m("",!0),e.hasFilters?(l(),d("div",{key:2,class:a([e.$style["filters-dropdown-footer"],"mt-s"])},[i(T,{onClick:e.resetFilters},{default:o(()=>[u(c(e.$locale.baseText("forms.resourceFiltersDropdown.reset")),1)]),_:1},8,["onClick"])],2)):m("",!0)],2)]),_:3})}const ke={$style:Fe},Te=v(_e,[["render",Ve],["__cssModules",ke]]),Ue=S({name:"resources-list-layout",mixins:[x],components:{PageViewLayout:ae,PageViewLayoutList:be,ResourceOwnershipSelect:Se,ResourceFiltersDropdown:Te},props:{resourceKey:{type:String,default:""},displayName:{type:Function,default:e=>e.name},resources:{type:Array,default:()=>[]},disabled:{type:Boolean,default:!1},initialize:{type:Function,default:()=>async()=>{}},filters:{type:Object,default:()=>({search:"",ownedBy:"",sharedWith:""})},additionalFiltersHandler:{type:Function},showAside:{type:Boolean,default:!0},shareable:{type:Boolean,default:!0},showFiltersDropdown:{type:Boolean,default:!0},sortFns:{type:Object,default:()=>({})},sortOptions:{type:Array,default:()=>["lastUpdated","lastCreated","nameAsc","nameDesc"]},type:{type:String,default:"list"},typeProps:{type:Object,default:()=>({itemSize:80})}},setup(){return{i18n:Q()}},data(){return{loading:!0,isOwnerSubview:!1,sortBy:this.sortOptions[0],hasFilters:!1,filtersModel:{...this.filters},currentPage:1,rowsPerPage:10,resettingFilters:!1,EnterpriseEditionFeature:z}},computed:{...K(G,A),subviewResources(){return this.shareable?this.resources.filter(e=>{var s;return this.isOwnerSubview&&this.settingsStore.isEnterpriseFeatureEnabled(z.Sharing)?!!(e.ownedBy&&e.ownedBy.id===((s=this.usersStore.currentUser)==null?void 0:s.id)):!0}):this.resources},filterKeys(){return Object.keys(this.filtersModel)},filteredAndSortedSubviewResources(){return this.subviewResources.filter(s=>{var w;let t=!0;if(this.filtersModel.ownedBy&&(t=t&&!!(s.ownedBy&&s.ownedBy.id===this.filtersModel.ownedBy)),this.filtersModel.sharedWith&&(t=t&&!!((w=s.sharedWith)!=null&&w.find(p=>p.id===this.filtersModel.sharedWith))),this.filtersModel.search){const p=this.filtersModel.search.toLowerCase();t=t&&this.displayName(s).toLowerCase().includes(p)}return this.additionalFiltersHandler&&(t=this.additionalFiltersHandler(s,this.filtersModel,t)),t}).sort((s,t)=>{switch(this.sortBy){case"lastUpdated":return this.sortFns.lastUpdated?this.sortFns.lastUpdated(s,t):new Date(t.updatedAt).valueOf()-new Date(s.updatedAt).valueOf();case"lastCreated":return this.sortFns.lastCreated?this.sortFns.lastCreated(s,t):new Date(t.createdAt).valueOf()-new Date(s.createdAt).valueOf();case"nameAsc":return this.sortFns.nameAsc?this.sortFns.nameAsc(s,t):this.displayName(s).trim().localeCompare(this.displayName(t).trim());case"nameDesc":return this.sortFns.nameDesc?this.sortFns.nameDesc(s,t):this.displayName(t).trim().localeCompare(this.displayName(s).trim());default:return this.sortFns[this.sortBy]?this.sortFns[this.sortBy](s,t):0}})},resourcesNotOwned(){return this.resources.filter(e=>{var s;return e.ownedBy&&e.ownedBy.id!==((s=this.usersStore.currentUser)==null?void 0:s.id)})},shouldSwitchToAllSubview(){return!this.hasFilters&&this.isOwnerSubview&&this.resourcesNotOwned.length>0}},methods:{async onMounted(){await this.initialize(),this.loading=!1,await this.$nextTick(),this.focusSearchInput(),this.hasAppliedFilters()&&(this.hasFilters=!0)},hasAppliedFilters(){return!!this.filterKeys.find(e=>e!=="search"&&(Array.isArray(this.filters[e])?this.filters[e].length>0:this.filters[e]!==""))},setCurrentPage(e){this.currentPage=e},setRowsPerPage(e){this.rowsPerPage=e},resetFilters(){Object.keys(this.filtersModel).forEach(e=>{this.filtersModel[e]=Array.isArray(this.filtersModel[e])?[]:""}),this.resettingFilters=!0,this.sendFiltersTelemetry("reset")},focusSearchInput(){this.$refs.search&&this.$refs.search.focus()},setOwnerSubview(e){this.isOwnerSubview=e},getTelemetrySubview(){return this.i18n.baseText(`${this.resourceKey}.menu.${this.isOwnerSubview?"my":"all"}`)},sendSubviewTelemetry(){this.$telemetry.track(`User changed ${this.resourceKey} sub view`,{sub_view:this.getTelemetrySubview()})},sendSortingTelemetry(){this.$telemetry.track(`User changed sorting in ${this.resourceKey} list`,{sub_view:this.getTelemetrySubview(),sorting:this.sortBy})},sendFiltersTelemetry(e){if(this.resettingFilters){if(e!=="reset")return;setTimeout(()=>this.resettingFilters=!1,1500)}const s=this.filtersModel,t=[],w=[];Object.keys(s).forEach(p=>{s[p]&&(t.push(p),w.push(p==="search"?null:s[p]))}),this.$telemetry.track(`User set filters in ${this.resourceKey} list`,{filters_set:t,filter_values:w,sub_view:this.getTelemetrySubview(),[`${this.resourceKey}_total_in_view`]:this.subviewResources.length,[`${this.resourceKey}_after_filtering`]:this.filteredAndSortedSubviewResources.length})},onUpdateFiltersLength(e){this.hasFilters=e>0},onSearch(e){this.filtersModel.search=e,this.$emit("update:filters",this.filtersModel)}},mounted(){this.onMounted()},watch:{isOwnerSubview(){this.sendSubviewTelemetry()},filters(e){this.filtersModel=e},"filtersModel.ownedBy"(e){e&&this.setOwnerSubview(!1),this.sendFiltersTelemetry("ownedBy")},"filtersModel.sharedWith"(){this.sendFiltersTelemetry("sharedWith")},"filtersModel.search"(){this.callDebounced("sendFiltersTelemetry",{debounceTime:1e3,trailing:!0},"search")},sortBy(e){this.$emit("sort",e),this.sendSortingTelemetry()}}}),Be="_search_1l5ez_16",Pe="_listWrapper_1l5ez_20",Me="_datatable_1l5ez_39",ze={"heading-wrapper":"_heading-wrapper_1l5ez_5","filters-row":"_filters-row_1l5ez_9",search:Be,listWrapper:Pe,"sort-and-filter":"_sort-and-filter_1l5ez_24","header-loading":"_header-loading_1l5ez_31","card-loading":"_card-loading_1l5ez_35",datatable:Me},Ke={class:"mt-xs mb-l"},Ae={key:0},Oe={key:0},Re={class:"mb-xs"},Ce={key:0,class:"mt-xs"},Le=y("div",{class:"pb-xs"},null,-1),De={key:0},We={key:1};function Ee(e,s,t,w,p,_){const $=r("n8n-heading"),k=r("n8n-button"),F=r("resource-ownership-select"),V=r("enterprise-edition"),b=r("n8n-loading"),T=r("n8n-action-box"),U=r("n8n-icon"),g=r("n8n-input"),C=r("n8n-option"),L=r("n8n-select"),D=r("resource-filters-dropdown"),B=r("n8n-link"),W=r("n8n-info-tip"),E=r("n8n-recycle-scroller"),N=r("n8n-datatable"),I=r("n8n-text"),j=r("page-view-layout-list"),H=r("page-view-layout");return l(),f(H,null,J({default:o(()=>[e.loading?(l(),d("div",Ae,[i(b,{class:a([e.$style["header-loading"],"mb-l"]),variant:"custom"},null,8,["class"]),i(b,{class:a([e.$style["card-loading"],"mb-2xs"]),variant:"custom"},null,8,["class"]),i(b,{class:a(e.$style["card-loading"]),variant:"custom"},null,8,["class"])])):(l(),d(M,{key:1},[e.resources.length===0?(l(),d("div",Oe,[h(e.$slots,"empty",{},()=>[i(T,{"data-test-id":"empty-resources-list",emoji:"👋",heading:e.i18n.baseText(e.usersStore.currentUser.firstName?`${e.resourceKey}.empty.heading`:`${e.resourceKey}.empty.heading.userNotSetup`,{interpolate:{name:e.usersStore.currentUser.firstName}}),description:e.i18n.baseText(`${e.resourceKey}.empty.description`),buttonText:e.i18n.baseText(`${e.resourceKey}.empty.button`),buttonType:"secondary","onClick:button":s[2]||(s[2]=n=>e.$emit("click:add",n))},null,8,["heading","description","buttonText"])])])):(l(),f(j,{key:1,overflow:e.type!=="list"},{header:o(()=>[y("div",Re,[y("div",{class:a(e.$style["filters-row"])},[i(g,{modelValue:e.filtersModel.search,class:a([e.$style.search,"mr-2xs"]),placeholder:e.i18n.baseText(`${e.resourceKey}.search.placeholder`),clearable:"",ref:"search","data-test-id":"resources-list-search","onUpdate:modelValue":e.onSearch},{prefix:o(()=>[i(U,{icon:"search"})]),_:1},8,["modelValue","class","placeholder","onUpdate:modelValue"]),y("div",{class:a(e.$style["sort-and-filter"])},[i(L,{modelValue:e.sortBy,"onUpdate:modelValue":s[3]||(s[3]=n=>e.sortBy=n),"data-test-id":"resources-list-sort"},{default:o(()=>[(l(!0),d(M,null,X(e.sortOptions,n=>(l(),f(C,{"data-test-id":"resources-list-sort-item",key:n,value:n,label:e.i18n.baseText(`${e.resourceKey}.sort.${n}`)},null,8,["value","label"]))),128))]),_:1},8,["modelValue"]),e.showFiltersDropdown?(l(),f(D,{key:0,keys:e.filterKeys,reset:e.resetFilters,modelValue:e.filtersModel,shareable:e.shareable,"onUpdate:modelValue":s[4]||(s[4]=n=>e.$emit("update:filters",n)),"onUpdate:filtersLength":e.onUpdateFiltersLength},{default:o(n=>[h(e.$slots,"filters",Y(Z(n)))]),_:3},8,["keys","reset","modelValue","shareable","onUpdate:filtersLength"])):m("",!0)],2)],2)]),h(e.$slots,"callout"),e.showFiltersDropdown?O((l(),d("div",Ce,[i(W,{bold:!1},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.filters.active`))+" ",1),i(B,{"data-test-id":"workflows-filter-reset",onClick:e.resetFilters,size:"small"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.filters.active.reset`)),1)]),_:1},8,["onClick"])]),_:1})],512)),[[R,e.hasFilters]]):m("",!0),Le]),default:o(()=>[h(e.$slots,"preamble"),e.filteredAndSortedSubviewResources.length>0?(l(),d("div",{key:0,class:a(e.$style.listWrapper),ref:"listWrapperRef"},[e.type==="list"?(l(),f(E,{key:0,"data-test-id":"resources-list",class:a([e.$style.list,"list-style-none"]),items:e.filteredAndSortedSubviewResources,"item-size":e.typeProps.itemSize,"item-key":"id"},{default:o(({item:n,updateItemSize:P})=>[h(e.$slots,"default",{data:n,updateItemSize:P})]),postListContent:o(()=>[h(e.$slots,"postListContent")]),_:3},8,["class","items","item-size"])):m("",!0),e.typeProps.columns?(l(),f(N,{key:1,"data-test-id":"resources-table",class:a(e.$style.datatable),columns:e.typeProps.columns,rows:e.filteredAndSortedSubviewResources,currentPage:e.currentPage,rowsPerPage:e.rowsPerPage,"onUpdate:currentPage":e.setCurrentPage,"onUpdate:rowsPerPage":e.setRowsPerPage},{row:o(({columns:n,row:P})=>[h(e.$slots,"default",{data:P,columns:n})]),_:3},8,["class","columns","rows","currentPage","rowsPerPage","onUpdate:currentPage","onUpdate:rowsPerPage"])):m("",!0)],2)):(l(),f(I,{key:1,color:"text-base",size:"medium","data-test-id":"resources-list-empty"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.noResults`))+" ",1),e.shouldSwitchToAllSubview?(l(),d(M,{key:0},[e.filtersModel.search?(l(),d("span",We,[u(" ("+c(e.i18n.baseText(`${e.resourceKey}.noResults.withSearch.switchToShared.preamble`))+" ",1),i(B,{onClick:s[6]||(s[6]=n=>e.setOwnerSubview(!1))},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.noResults.withSearch.switchToShared.link`)),1)]),_:1}),u(") ")])):(l(),d("span",De,[u(" ("+c(e.i18n.baseText(`${e.resourceKey}.noResults.switchToShared.preamble`))+" ",1),i(B,{onClick:s[5]||(s[5]=n=>e.setOwnerSubview(!1))},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.noResults.switchToShared.link`)),1)]),_:1}),u(") ")]))],64)):m("",!0)]),_:1})),h(e.$slots,"postamble")]),_:3},8,["overflow"]))],64))]),_:2},[e.showAside?{name:"aside",fn:o(()=>[y("div",{class:a([e.$style["heading-wrapper"],"mb-xs"])},[i($,{size:"2xlarge"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.heading`)),1)]),_:1})],2),y("div",Ke,[h(e.$slots,"add-button",{disabled:e.disabled},()=>[i(k,{size:"large",block:"",disabled:e.disabled,onClick:s[0]||(s[0]=n=>e.$emit("click:add",n)),"data-test-id":"resources-list-add"},{default:o(()=>[u(c(e.i18n.baseText(`${e.resourceKey}.add`)),1)]),_:1},8,["disabled"])])]),e.shareable?(l(),f(V,{key:0,features:[e.EnterpriseEditionFeature.Sharing]},{default:o(()=>[i(F,{modelValue:e.isOwnerSubview,"onUpdate:modelValue":s[1]||(s[1]=n=>e.isOwnerSubview=n),"my-resources-label":e.i18n.baseText(`${e.resourceKey}.menu.my`),"all-resources-label":e.i18n.baseText(`${e.resourceKey}.menu.all`)},null,8,["modelValue","my-resources-label","all-resources-label"])]),_:1},8,["features"])):m("",!0)]),key:"0"}:void 0]),1024)}const Ne={$style:ze},Ge=v(Ue,[["render",Ee],["__cssModules",Ne]]);export{Ge as R};
|
|
2
|
+
//# sourceMappingURL=ResourcesListLayout-y5FSwJeu.js.map
|
package/dist/assets/{ResourcesListLayout-N4zg03Vf.js.map → ResourcesListLayout-y5FSwJeu.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourcesListLayout-N4zg03Vf.js","sources":["../../src/components/layouts/PageViewLayout.vue","../../src/components/layouts/PageViewLayoutList.vue","../../src/components/forms/ResourceOwnershipSelect.ee.vue","../../src/components/forms/ResourceFiltersDropdown.vue","../../src/components/layouts/ResourcesListLayout.vue"],"sourcesContent":["<template>\n\t<div :class=\"[$style.wrapper, !this.uiStore.sidebarMenuCollapsed && $style.expandedSidebar]\">\n\t\t<div :class=\"$style.container\">\n\t\t\t<aside :class=\"$style.aside\" v-if=\"$slots.aside\">\n\t\t\t\t<slot name=\"aside\" />\n\t\t\t</aside>\n\t\t\t<main :class=\"$style.content\">\n\t\t\t\t<slot />\n\t\t\t</main>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport default defineComponent({\n\tname: 'PageViewLayout',\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore),\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: flex;\n\theight: 100%;\n\twidth: 100%;\n\tmax-width: 1280px;\n\tjustify-content: center;\n\tbox-sizing: border-box;\n\tpadding: var(--spacing-l) var(--spacing-l) 0;\n\t@media (min-width: 1200px) {\n\t\tpadding: var(--spacing-2xl) var(--spacing-2xl) 0;\n\t}\n}\n\n.container {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tflex-direction: row;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.aside {\n\tdisplay: flex;\n\tflex-shrink: 0;\n\tflex-direction: column;\n\theight: 100%;\n\twidth: 160px;\n\tmargin-right: var(--spacing-l);\n\n\t@media (min-width: 1200px) {\n\t\tmargin-right: var(--spacing-2xl);\n\t}\n}\n\n.content {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 100%;\n\theight: 100%;\n}\n\n@media (max-width: 500px) {\n\t.container {\n\t\tflex-direction: column;\n\t}\n\t.aside {\n\t\theight: auto;\n\t\tmargin: 0;\n\t}\n}\n</style>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tprops: {\n\t\toverflow: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n});\n</script>\n\n<template>\n\t<div :class=\"{ [$style.wrapper]: true, [$style.overflow]: overflow }\">\n\t\t<div :class=\"$style.list\">\n\t\t\t<div v-if=\"$slots.header\" :class=\"$style.header\">\n\t\t\t\t<slot name=\"header\" />\n\t\t\t</div>\n\t\t\t<div :class=\"$style.body\">\n\t\t\t\t<slot />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.overflow {\n\t.list {\n\t\t.body {\n\t\t\toverflow: auto;\n\t\t}\n\t}\n}\n\n.list {\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\theight: 100%;\n\n\t.header {\n\t\tflex: 0 0 auto;\n\t}\n\n\t.body {\n\t\toverflow: hidden;\n\t\tflex: 1 1;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"resource-ownership-select\">\n\t\t<n8n-menu\n\t\t\t:items=\"menuItems\"\n\t\t\tmode=\"tabs\"\n\t\t\t:modelValue=\"value ? 'owner' : 'all'\"\n\t\t\t@update:modelValue=\"onSelectOwner\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IMenuItem } from 'n8n-design-system';\n\nexport default defineComponent({\n\tprops: {\n\t\tvalue: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tmyResourcesLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tallResourcesLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tcomputed: {\n\t\tmenuItems(): IMenuItem[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'all',\n\t\t\t\t\ticon: 'globe-americas',\n\t\t\t\t\tlabel: this.allResourcesLabel,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'owner',\n\t\t\t\t\ticon: 'user',\n\t\t\t\t\tlabel: this.myResourcesLabel,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t},\n\tmethods: {\n\t\tonSelectOwner(type: string) {\n\t\t\tthis.$emit('update:modelValue', type === 'owner');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.menu-container {\n\t--menu-background: transparent;\n\t--menu-padding: 0;\n}\n</style>\n","<template>\n\t<n8n-popover trigger=\"click\" width=\"304\" size=\"large\">\n\t\t<template #reference>\n\t\t\t<n8n-button\n\t\t\t\ticon=\"filter\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\t:active=\"hasFilters\"\n\t\t\t\t:class=\"[$style['filter-button'], 'ml-2xs']\"\n\t\t\t\tdata-test-id=\"resources-list-filters-trigger\"\n\t\t\t>\n\t\t\t\t<n8n-badge v-show=\"filtersLength > 0\" theme=\"primary\" class=\"mr-4xs\">\n\t\t\t\t\t{{ filtersLength }}\n\t\t\t\t</n8n-badge>\n\t\t\t\t{{ $locale.baseText('forms.resourceFiltersDropdown.filters') }}\n\t\t\t</n8n-button>\n\t\t</template>\n\t\t<div :class=\"$style['filters-dropdown']\" data-test-id=\"resources-list-filters-dropdown\">\n\t\t\t<slot :filters=\"modelValue\" :setKeyValue=\"setKeyValue\" />\n\t\t\t<enterprise-edition\n\t\t\t\tclass=\"mb-s\"\n\t\t\t\t:features=\"[EnterpriseEditionFeature.Sharing]\"\n\t\t\t\tv-if=\"shareable\"\n\t\t\t>\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('forms.resourceFiltersDropdown.ownedBy')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<n8n-user-select\n\t\t\t\t\t:users=\"ownedByUsers\"\n\t\t\t\t\t:currentUserId=\"usersStore.currentUser.id\"\n\t\t\t\t\t:modelValue=\"modelValue.ownedBy\"\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('ownedBy', $event)\"\n\t\t\t\t/>\n\t\t\t</enterprise-edition>\n\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\" v-if=\"shareable\">\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('forms.resourceFiltersDropdown.sharedWith')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<n8n-user-select\n\t\t\t\t\t:users=\"sharedWithUsers\"\n\t\t\t\t\t:currentUserId=\"usersStore.currentUser.id\"\n\t\t\t\t\t:modelValue=\"modelValue.sharedWith\"\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('sharedWith', $event)\"\n\t\t\t\t/>\n\t\t\t</enterprise-edition>\n\t\t\t<div :class=\"[$style['filters-dropdown-footer'], 'mt-s']\" v-if=\"hasFilters\">\n\t\t\t\t<n8n-link @click=\"resetFilters\">\n\t\t\t\t\t{{ $locale.baseText('forms.resourceFiltersDropdown.reset') }}\n\t\t\t\t</n8n-link>\n\t\t\t</div>\n\t\t</div>\n\t</n8n-popover>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useUsersStore } from '@/stores/users.store';\nimport type { PropType } from 'vue';\nimport type { IUser } from '@/Interface';\n\nexport type IResourceFiltersType = Record<string, boolean | string | string[]>;\n\nexport default defineComponent({\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: Object as PropType<IResourceFiltersType>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tkeys: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshareable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\treset: {\n\t\t\ttype: Function as PropType<() => void>,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUsersStore),\n\t\townedByUsers(): IUser[] {\n\t\t\treturn this.usersStore.allUsers.map((user) =>\n\t\t\t\tuser.id === this.modelValue.sharedWith ? { ...user, disabled: true } : user,\n\t\t\t);\n\t\t},\n\t\tsharedWithUsers(): IUser[] {\n\t\t\treturn this.usersStore.allUsers.map((user) =>\n\t\t\t\tuser.id === this.modelValue.ownedBy ? { ...user, disabled: true } : user,\n\t\t\t);\n\t\t},\n\t\tfiltersLength(): number {\n\t\t\tlet length = 0;\n\n\t\t\tthis.keys.forEach((key) => {\n\t\t\t\tif (key === 'search') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlength += (\n\t\t\t\t\tArray.isArray(this.modelValue[key])\n\t\t\t\t\t\t? this.modelValue[key].length > 0\n\t\t\t\t\t\t: this.modelValue[key] !== ''\n\t\t\t\t)\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0;\n\t\t\t});\n\n\t\t\treturn length;\n\t\t},\n\t\thasFilters(): boolean {\n\t\t\treturn this.filtersLength > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetKeyValue(key: string, value: unknown) {\n\t\t\tconst filters = {\n\t\t\t\t...this.modelValue,\n\t\t\t\t[key]: value,\n\t\t\t};\n\n\t\t\tthis.$emit('update:modelValue', filters);\n\t\t},\n\t\tresetFilters() {\n\t\t\tif (this.reset) {\n\t\t\t\tthis.reset();\n\t\t\t} else {\n\t\t\t\tconst filters = { ...this.modelValue };\n\n\t\t\t\tthis.keys.forEach((key) => {\n\t\t\t\t\tfilters[key] = Array.isArray(this.modelValue[key]) ? [] : '';\n\t\t\t\t});\n\n\t\t\t\tthis.$emit('update:modelValue', filters);\n\t\t\t}\n\t\t},\n\t},\n\twatch: {\n\t\tfiltersLength(value: number) {\n\t\t\tthis.$emit('update:filtersLength', value);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.filter-button {\n\theight: 40px;\n\talign-items: center;\n}\n\n.filters-dropdown {\n\twidth: 280px;\n\tpadding-bottom: var(--spacing-s);\n}\n\n.filters-dropdown-footer {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n}\n</style>\n","<template>\n\t<page-view-layout>\n\t\t<template #aside v-if=\"showAside\">\n\t\t\t<div :class=\"[$style['heading-wrapper'], 'mb-xs']\">\n\t\t\t\t<n8n-heading size=\"2xlarge\">\n\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.heading`) }}\n\t\t\t\t</n8n-heading>\n\t\t\t</div>\n\n\t\t\t<div class=\"mt-xs mb-l\">\n\t\t\t\t<slot name=\"add-button\" :disabled=\"disabled\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t@click=\"$emit('click:add', $event)\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</slot>\n\t\t\t</div>\n\n\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\" v-if=\"shareable\">\n\t\t\t\t<resource-ownership-select\n\t\t\t\t\tv-model=\"isOwnerSubview\"\n\t\t\t\t\t:my-resources-label=\"i18n.baseText(`${resourceKey}.menu.my`)\"\n\t\t\t\t\t:all-resources-label=\"i18n.baseText(`${resourceKey}.menu.all`)\"\n\t\t\t\t/>\n\t\t\t</enterprise-edition>\n\t\t</template>\n\n\t\t<div v-if=\"loading\">\n\t\t\t<n8n-loading :class=\"[$style['header-loading'], 'mb-l']\" variant=\"custom\" />\n\t\t\t<n8n-loading :class=\"[$style['card-loading'], 'mb-2xs']\" variant=\"custom\" />\n\t\t\t<n8n-loading :class=\"$style['card-loading']\" variant=\"custom\" />\n\t\t</div>\n\t\t<template v-else>\n\t\t\t<div v-if=\"resources.length === 0\">\n\t\t\t\t<slot name=\"empty\">\n\t\t\t\t\t<n8n-action-box\n\t\t\t\t\t\tdata-test-id=\"empty-resources-list\"\n\t\t\t\t\t\temoji=\"👋\"\n\t\t\t\t\t\t:heading=\"\n\t\t\t\t\t\t\ti18n.baseText(\n\t\t\t\t\t\t\t\tusersStore.currentUser.firstName\n\t\t\t\t\t\t\t\t\t? `${resourceKey}.empty.heading`\n\t\t\t\t\t\t\t\t\t: `${resourceKey}.empty.heading.userNotSetup`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinterpolate: { name: usersStore.currentUser.firstName },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t:description=\"i18n.baseText(`${resourceKey}.empty.description`)\"\n\t\t\t\t\t\t:buttonText=\"i18n.baseText(`${resourceKey}.empty.button`)\"\n\t\t\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t\t\t@click:button=\"$emit('click:add', $event)\"\n\t\t\t\t\t/>\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t\t<page-view-layout-list :overflow=\"type !== 'list'\" v-else>\n\t\t\t\t<template #header>\n\t\t\t\t\t<div class=\"mb-xs\">\n\t\t\t\t\t\t<div :class=\"$style['filters-row']\">\n\t\t\t\t\t\t\t<n8n-input\n\t\t\t\t\t\t\t\t:modelValue=\"filtersModel.search\"\n\t\t\t\t\t\t\t\t:class=\"[$style['search'], 'mr-2xs']\"\n\t\t\t\t\t\t\t\t:placeholder=\"i18n.baseText(`${resourceKey}.search.placeholder`)\"\n\t\t\t\t\t\t\t\tclearable\n\t\t\t\t\t\t\t\tref=\"search\"\n\t\t\t\t\t\t\t\tdata-test-id=\"resources-list-search\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onSearch\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #prefix>\n\t\t\t\t\t\t\t\t\t<n8n-icon icon=\"search\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</n8n-input>\n\t\t\t\t\t\t\t<div :class=\"$style['sort-and-filter']\">\n\t\t\t\t\t\t\t\t<n8n-select v-model=\"sortBy\" data-test-id=\"resources-list-sort\">\n\t\t\t\t\t\t\t\t\t<n8n-option\n\t\t\t\t\t\t\t\t\t\tv-for=\"sortOption in sortOptions\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"resources-list-sort-item\"\n\t\t\t\t\t\t\t\t\t\t:key=\"sortOption\"\n\t\t\t\t\t\t\t\t\t\t:value=\"sortOption\"\n\t\t\t\t\t\t\t\t\t\t:label=\"i18n.baseText(`${resourceKey}.sort.${sortOption}`)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</n8n-select>\n\t\t\t\t\t\t\t\t<resource-filters-dropdown\n\t\t\t\t\t\t\t\t\tv-if=\"showFiltersDropdown\"\n\t\t\t\t\t\t\t\t\t:keys=\"filterKeys\"\n\t\t\t\t\t\t\t\t\t:reset=\"resetFilters\"\n\t\t\t\t\t\t\t\t\t:modelValue=\"filtersModel\"\n\t\t\t\t\t\t\t\t\t:shareable=\"shareable\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"$emit('update:filters', $event)\"\n\t\t\t\t\t\t\t\t\t@update:filtersLength=\"onUpdateFiltersLength\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<template #default=\"resourceFiltersSlotProps\">\n\t\t\t\t\t\t\t\t\t\t<slot name=\"filters\" v-bind=\"resourceFiltersSlotProps\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</resource-filters-dropdown>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<slot name=\"callout\"></slot>\n\n\t\t\t\t\t<div v-if=\"showFiltersDropdown\" v-show=\"hasFilters\" class=\"mt-xs\">\n\t\t\t\t\t\t<n8n-info-tip :bold=\"false\">\n\t\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.filters.active`) }}\n\t\t\t\t\t\t\t<n8n-link data-test-id=\"workflows-filter-reset\" @click=\"resetFilters\" size=\"small\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.filters.active.reset`) }}\n\t\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"pb-xs\" />\n\t\t\t\t</template>\n\n\t\t\t\t<slot name=\"preamble\" />\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"filteredAndSortedSubviewResources.length > 0\"\n\t\t\t\t\t:class=\"$style.listWrapper\"\n\t\t\t\t\tref=\"listWrapperRef\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-recycle-scroller\n\t\t\t\t\t\tv-if=\"type === 'list'\"\n\t\t\t\t\t\tdata-test-id=\"resources-list\"\n\t\t\t\t\t\t:class=\"[$style.list, 'list-style-none']\"\n\t\t\t\t\t\t:items=\"filteredAndSortedSubviewResources\"\n\t\t\t\t\t\t:item-size=\"typeProps.itemSize\"\n\t\t\t\t\t\titem-key=\"id\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #default=\"{ item, updateItemSize }\">\n\t\t\t\t\t\t\t<slot :data=\"item\" :updateItemSize=\"updateItemSize\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template #postListContent>\n\t\t\t\t\t\t\t<slot name=\"postListContent\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</n8n-recycle-scroller>\n\t\t\t\t\t<n8n-datatable\n\t\t\t\t\t\tv-if=\"typeProps.columns\"\n\t\t\t\t\t\tdata-test-id=\"resources-table\"\n\t\t\t\t\t\t:class=\"$style.datatable\"\n\t\t\t\t\t\t:columns=\"typeProps.columns\"\n\t\t\t\t\t\t:rows=\"filteredAndSortedSubviewResources\"\n\t\t\t\t\t\t:currentPage=\"currentPage\"\n\t\t\t\t\t\t:rowsPerPage=\"rowsPerPage\"\n\t\t\t\t\t\t@update:currentPage=\"setCurrentPage\"\n\t\t\t\t\t\t@update:rowsPerPage=\"setRowsPerPage\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #row=\"{ columns, row }\">\n\t\t\t\t\t\t\t<slot :data=\"row\" :columns=\"columns\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</n8n-datatable>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-text color=\"text-base\" size=\"medium\" data-test-id=\"resources-list-empty\" v-else>\n\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.noResults`) }}\n\t\t\t\t\t<template v-if=\"shouldSwitchToAllSubview\">\n\t\t\t\t\t\t<span v-if=\"!filtersModel.search\">\n\t\t\t\t\t\t\t({{ i18n.baseText(`${resourceKey}.noResults.switchToShared.preamble`) }}\n\t\t\t\t\t\t\t<n8n-link @click=\"setOwnerSubview(false)\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.noResults.switchToShared.link`) }} </n8n-link\n\t\t\t\t\t\t\t>)\n\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t<span v-else>\n\t\t\t\t\t\t\t({{ i18n.baseText(`${resourceKey}.noResults.withSearch.switchToShared.preamble`) }}\n\t\t\t\t\t\t\t<n8n-link @click=\"setOwnerSubview(false)\">\n\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\ti18n.baseText(`${resourceKey}.noResults.withSearch.switchToShared.link`)\n\t\t\t\t\t\t\t\t}} </n8n-link\n\t\t\t\t\t\t\t>)\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-text>\n\n\t\t\t\t<slot name=\"postamble\" />\n\t\t\t</page-view-layout-list>\n\t\t</template>\n\t</page-view-layout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type { IUser } from '@/Interface';\nimport PageViewLayout from '@/components/layouts/PageViewLayout.vue';\nimport PageViewLayoutList from '@/components/layouts/PageViewLayoutList.vue';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { debounceHelper } from '@/mixins/debounce';\nimport ResourceOwnershipSelect from '@/components/forms/ResourceOwnershipSelect.ee.vue';\nimport ResourceFiltersDropdown from '@/components/forms/ResourceFiltersDropdown.vue';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport type { N8nInput, DatatableColumn } from 'n8n-design-system';\nimport { useI18n } from '@/composables/useI18n';\n\nexport interface IResource {\n\tid: string;\n\tname: string;\n\tupdatedAt: string;\n\tcreatedAt: string;\n\townedBy?: Partial<IUser>;\n\tsharedWith?: Array<Partial<IUser>>;\n}\n\ninterface IFilters {\n\tsearch: string;\n\townedBy: string;\n\tsharedWith: string;\n\n\t[key: string]: boolean | string | string[];\n}\n\ntype IResourceKeyType = 'credentials' | 'workflows';\ntype SearchRef = InstanceType<typeof N8nInput>;\n\nexport default defineComponent({\n\tname: 'resources-list-layout',\n\tmixins: [debounceHelper],\n\tcomponents: {\n\t\tPageViewLayout,\n\t\tPageViewLayoutList,\n\t\tResourceOwnershipSelect,\n\t\tResourceFiltersDropdown,\n\t},\n\tprops: {\n\t\tresourceKey: {\n\t\t\ttype: String,\n\t\t\tdefault: '' as IResourceKeyType,\n\t\t},\n\t\tdisplayName: {\n\t\t\ttype: Function as PropType<(resource: IResource) => string>,\n\t\t\tdefault: (resource: IResource) => resource.name,\n\t\t},\n\t\tresources: {\n\t\t\ttype: Array,\n\t\t\tdefault: (): IResource[] => [],\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tinitialize: {\n\t\t\ttype: Function as PropType<() => Promise<void>>,\n\t\t\tdefault: () => async () => {},\n\t\t},\n\t\tfilters: {\n\t\t\ttype: Object,\n\t\t\tdefault: (): IFilters => ({ search: '', ownedBy: '', sharedWith: '' }),\n\t\t},\n\t\tadditionalFiltersHandler: {\n\t\t\ttype: Function,\n\t\t},\n\t\tshowAside: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tshareable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tshowFiltersDropdown: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tsortFns: {\n\t\t\ttype: Object as PropType<Record<string, (a: IResource, b: IResource) => number>>,\n\t\t\tdefault: (): Record<string, (a: IResource, b: IResource) => number> => ({}),\n\t\t},\n\t\tsortOptions: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => ['lastUpdated', 'lastCreated', 'nameAsc', 'nameDesc'],\n\t\t},\n\t\ttype: {\n\t\t\ttype: String as PropType<'datatable' | 'list'>,\n\t\t\tdefault: 'list',\n\t\t},\n\t\ttypeProps: {\n\t\t\ttype: Object as PropType<{ itemSize: number } | { columns: DatatableColumn[] }>,\n\t\t\tdefault: () => ({\n\t\t\t\titemSize: 80,\n\t\t\t}),\n\t\t},\n\t},\n\tsetup() {\n\t\tconst i18n = useI18n();\n\n\t\treturn {\n\t\t\ti18n,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\tisOwnerSubview: false,\n\t\t\tsortBy: this.sortOptions[0],\n\t\t\thasFilters: false,\n\t\t\tfiltersModel: { ...this.filters },\n\t\t\tcurrentPage: 1,\n\t\t\trowsPerPage: 10 as number | '*',\n\t\t\tresettingFilters: false,\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useSettingsStore, useUsersStore),\n\t\tsubviewResources(): IResource[] {\n\t\t\tif (!this.shareable) {\n\t\t\t\treturn this.resources as IResource[];\n\t\t\t}\n\n\t\t\treturn (this.resources as IResource[]).filter((resource) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.isOwnerSubview &&\n\t\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t\t) {\n\t\t\t\t\treturn !!(resource.ownedBy && resource.ownedBy.id === this.usersStore.currentUser?.id);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t});\n\t\t},\n\t\tfilterKeys(): string[] {\n\t\t\treturn Object.keys(this.filtersModel);\n\t\t},\n\t\tfilteredAndSortedSubviewResources(): IResource[] {\n\t\t\tconst filtered: IResource[] = this.subviewResources.filter((resource: IResource) => {\n\t\t\t\tlet matches = true;\n\n\t\t\t\tif (this.filtersModel.ownedBy) {\n\t\t\t\t\tmatches =\n\t\t\t\t\t\tmatches && !!(resource.ownedBy && resource.ownedBy.id === this.filtersModel.ownedBy);\n\t\t\t\t}\n\n\t\t\t\tif (this.filtersModel.sharedWith) {\n\t\t\t\t\tmatches =\n\t\t\t\t\t\tmatches &&\n\t\t\t\t\t\t!!resource.sharedWith?.find((sharee) => sharee.id === this.filtersModel.sharedWith);\n\t\t\t\t}\n\n\t\t\t\tif (this.filtersModel.search) {\n\t\t\t\t\tconst searchString = this.filtersModel.search.toLowerCase();\n\n\t\t\t\t\tmatches = matches && this.displayName(resource).toLowerCase().includes(searchString);\n\t\t\t\t}\n\n\t\t\t\tif (this.additionalFiltersHandler) {\n\t\t\t\t\tmatches = this.additionalFiltersHandler(resource, this.filtersModel, matches);\n\t\t\t\t}\n\n\t\t\t\treturn matches;\n\t\t\t});\n\n\t\t\treturn filtered.sort((a, b) => {\n\t\t\t\tswitch (this.sortBy) {\n\t\t\t\t\tcase 'lastUpdated':\n\t\t\t\t\t\treturn this.sortFns.lastUpdated\n\t\t\t\t\t\t\t? this.sortFns.lastUpdated(a, b)\n\t\t\t\t\t\t\t: new Date(b.updatedAt).valueOf() - new Date(a.updatedAt).valueOf();\n\t\t\t\t\tcase 'lastCreated':\n\t\t\t\t\t\treturn this.sortFns.lastCreated\n\t\t\t\t\t\t\t? this.sortFns.lastCreated(a, b)\n\t\t\t\t\t\t\t: new Date(b.createdAt).valueOf() - new Date(a.createdAt).valueOf();\n\t\t\t\t\tcase 'nameAsc':\n\t\t\t\t\t\treturn this.sortFns.nameAsc\n\t\t\t\t\t\t\t? this.sortFns.nameAsc(a, b)\n\t\t\t\t\t\t\t: this.displayName(a).trim().localeCompare(this.displayName(b).trim());\n\t\t\t\t\tcase 'nameDesc':\n\t\t\t\t\t\treturn this.sortFns.nameDesc\n\t\t\t\t\t\t\t? this.sortFns.nameDesc(a, b)\n\t\t\t\t\t\t\t: this.displayName(b).trim().localeCompare(this.displayName(a).trim());\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn this.sortFns[this.sortBy] ? this.sortFns[this.sortBy](a, b) : 0;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tresourcesNotOwned(): IResource[] {\n\t\t\treturn (this.resources as IResource[]).filter((resource) => {\n\t\t\t\treturn resource.ownedBy && resource.ownedBy.id !== this.usersStore.currentUser?.id;\n\t\t\t});\n\t\t},\n\t\tshouldSwitchToAllSubview(): boolean {\n\t\t\treturn !this.hasFilters && this.isOwnerSubview && this.resourcesNotOwned.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onMounted() {\n\t\t\tawait this.initialize();\n\n\t\t\tthis.loading = false;\n\t\t\tawait this.$nextTick();\n\t\t\tthis.focusSearchInput();\n\n\t\t\tif (this.hasAppliedFilters()) {\n\t\t\t\tthis.hasFilters = true;\n\t\t\t}\n\t\t},\n\t\thasAppliedFilters(): boolean {\n\t\t\treturn !!this.filterKeys.find(\n\t\t\t\t(key) =>\n\t\t\t\t\tkey !== 'search' &&\n\t\t\t\t\t(Array.isArray(this.filters[key])\n\t\t\t\t\t\t? this.filters[key].length > 0\n\t\t\t\t\t\t: this.filters[key] !== ''),\n\t\t\t);\n\t\t},\n\t\tsetCurrentPage(page: number) {\n\t\t\tthis.currentPage = page;\n\t\t},\n\t\tsetRowsPerPage(rowsPerPage: number | '*') {\n\t\t\tthis.rowsPerPage = rowsPerPage;\n\t\t},\n\t\tresetFilters() {\n\t\t\tObject.keys(this.filtersModel).forEach((key) => {\n\t\t\t\tthis.filtersModel[key] = Array.isArray(this.filtersModel[key]) ? [] : '';\n\t\t\t});\n\n\t\t\tthis.resettingFilters = true;\n\t\t\tthis.sendFiltersTelemetry('reset');\n\t\t},\n\t\tfocusSearchInput() {\n\t\t\tif (this.$refs.search) {\n\t\t\t\t(this.$refs.search as SearchRef).focus();\n\t\t\t}\n\t\t},\n\t\tsetOwnerSubview(active: boolean) {\n\t\t\tthis.isOwnerSubview = active;\n\t\t},\n\t\tgetTelemetrySubview(): string {\n\t\t\treturn this.i18n.baseText(\n\t\t\t\t`${this.resourceKey as IResourceKeyType}.menu.${this.isOwnerSubview ? 'my' : 'all'}`,\n\t\t\t);\n\t\t},\n\t\tsendSubviewTelemetry() {\n\t\t\tthis.$telemetry.track(`User changed ${this.resourceKey} sub view`, {\n\t\t\t\tsub_view: this.getTelemetrySubview(),\n\t\t\t});\n\t\t},\n\t\tsendSortingTelemetry() {\n\t\t\tthis.$telemetry.track(`User changed sorting in ${this.resourceKey} list`, {\n\t\t\t\tsub_view: this.getTelemetrySubview(),\n\t\t\t\tsorting: this.sortBy,\n\t\t\t});\n\t\t},\n\t\tsendFiltersTelemetry(source: string) {\n\t\t\t// Prevent sending multiple telemetry events when resetting filters\n\t\t\t// Timeout is required to wait for search debounce to be over\n\t\t\tif (this.resettingFilters) {\n\t\t\t\tif (source !== 'reset') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => (this.resettingFilters = false), 1500);\n\t\t\t}\n\n\t\t\tconst filters = this.filtersModel as Record<string, string[] | string | boolean>;\n\t\t\tconst filtersSet: string[] = [];\n\t\t\tconst filterValues: Array<string[] | string | boolean | null> = [];\n\n\t\t\tObject.keys(filters).forEach((key) => {\n\t\t\t\tif (filters[key]) {\n\t\t\t\t\tfiltersSet.push(key);\n\t\t\t\t\tfilterValues.push(key === 'search' ? null : filters[key]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.$telemetry.track(`User set filters in ${this.resourceKey} list`, {\n\t\t\t\tfilters_set: filtersSet,\n\t\t\t\tfilter_values: filterValues,\n\t\t\t\tsub_view: this.getTelemetrySubview(),\n\t\t\t\t[`${this.resourceKey}_total_in_view`]: this.subviewResources.length,\n\t\t\t\t[`${this.resourceKey}_after_filtering`]: this.filteredAndSortedSubviewResources.length,\n\t\t\t});\n\t\t},\n\t\tonUpdateFiltersLength(length: number) {\n\t\t\tthis.hasFilters = length > 0;\n\t\t},\n\t\tonSearch(search: string) {\n\t\t\tthis.filtersModel.search = search;\n\t\t\tthis.$emit('update:filters', this.filtersModel);\n\t\t},\n\t},\n\tmounted() {\n\t\tvoid this.onMounted();\n\t},\n\twatch: {\n\t\tisOwnerSubview() {\n\t\t\tthis.sendSubviewTelemetry();\n\t\t},\n\t\tfilters(value) {\n\t\t\tthis.filtersModel = value;\n\t\t},\n\t\t'filtersModel.ownedBy'(value) {\n\t\t\tif (value) {\n\t\t\t\tthis.setOwnerSubview(false);\n\t\t\t}\n\t\t\tthis.sendFiltersTelemetry('ownedBy');\n\t\t},\n\t\t'filtersModel.sharedWith'() {\n\t\t\tthis.sendFiltersTelemetry('sharedWith');\n\t\t},\n\t\t'filtersModel.search'() {\n\t\t\tvoid this.callDebounced(\n\t\t\t\t'sendFiltersTelemetry',\n\t\t\t\t{ debounceTime: 1000, trailing: true },\n\t\t\t\t'search',\n\t\t\t);\n\t\t},\n\t\tsortBy(newValue) {\n\t\t\tthis.$emit('sort', newValue);\n\t\t\tthis.sendSortingTelemetry();\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.heading-wrapper {\n\tpadding-bottom: 1px; // Match input height\n}\n\n.filters-row {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.search {\n\tmax-width: 240px;\n}\n\n.list {\n\t//display: flex;\n\t//flex-direction: column;\n}\n\n.listWrapper {\n\theight: 100%;\n}\n\n.sort-and-filter {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.header-loading {\n\theight: 36px;\n}\n\n.card-loading {\n\theight: 69px;\n}\n\n.datatable {\n\tpadding-bottom: var(--spacing-s);\n}\n</style>\n"],"names":["_sfc_main$4","defineComponent","mapStores","useUIStore","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_normalizeClass","_openBlock","_createElementBlock","_createCommentVNode","_createElementVNode","_sfc_main$3","_sfc_main$2","type","_component_n8n_menu","_resolveComponent","_hoisted_1","_createVNode","_sfc_main$1","EnterpriseEditionFeature","useUsersStore","user","length","key","value","filters","_createBlock","_component_n8n_popover","_withCtx","_component_n8n_button","_withDirectives","_component_n8n_badge","_vShow","_renderSlot","_component_enterprise_edition","_component_n8n_input_label","_component_n8n_user_select","_component_n8n_link","_sfc_main","debounceHelper","PageViewLayout","PageViewLayoutList","ResourceOwnershipSelect","ResourceFiltersDropdown","resource","useI18n","useSettingsStore","_a","matches","sharee","searchString","a","b","page","rowsPerPage","active","source","filtersSet","filterValues","search","newValue","_hoisted_2","_hoisted_5","_component_page_view_layout","_createSlots","_component_n8n_loading","_Fragment","_hoisted_3","_component_n8n_action_box","_component_page_view_layout_list","_hoisted_4","_component_n8n_input","$event","_renderList","sortOption","_component_n8n_option","_component_resource_filters_dropdown","_component_n8n_info_tip","_createTextVNode","_toDisplayString","_component_n8n_recycle_scroller","item","updateItemSize","_component_n8n_datatable","columns","row","_component_n8n_text","_hoisted_8","_hoisted_7","_component_n8n_heading","_component_resource_ownership_select"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResourcesListLayout-y5FSwJeu.js","sources":["../../src/components/layouts/PageViewLayout.vue","../../src/components/layouts/PageViewLayoutList.vue","../../src/components/forms/ResourceOwnershipSelect.ee.vue","../../src/components/forms/ResourceFiltersDropdown.vue","../../src/components/layouts/ResourcesListLayout.vue"],"sourcesContent":["<template>\n\t<div :class=\"[$style.wrapper, !this.uiStore.sidebarMenuCollapsed && $style.expandedSidebar]\">\n\t\t<div :class=\"$style.container\">\n\t\t\t<aside :class=\"$style.aside\" v-if=\"$slots.aside\">\n\t\t\t\t<slot name=\"aside\" />\n\t\t\t</aside>\n\t\t\t<main :class=\"$style.content\">\n\t\t\t\t<slot />\n\t\t\t</main>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport default defineComponent({\n\tname: 'PageViewLayout',\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore),\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: flex;\n\theight: 100%;\n\twidth: 100%;\n\tmax-width: 1280px;\n\tjustify-content: center;\n\tbox-sizing: border-box;\n\tpadding: var(--spacing-l) var(--spacing-l) 0;\n\t@media (min-width: 1200px) {\n\t\tpadding: var(--spacing-2xl) var(--spacing-2xl) 0;\n\t}\n}\n\n.container {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tflex-direction: row;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.aside {\n\tdisplay: flex;\n\tflex-shrink: 0;\n\tflex-direction: column;\n\theight: 100%;\n\twidth: 160px;\n\tmargin-right: var(--spacing-l);\n\n\t@media (min-width: 1200px) {\n\t\tmargin-right: var(--spacing-2xl);\n\t}\n}\n\n.content {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 100%;\n\theight: 100%;\n}\n\n@media (max-width: 500px) {\n\t.container {\n\t\tflex-direction: column;\n\t}\n\t.aside {\n\t\theight: auto;\n\t\tmargin: 0;\n\t}\n}\n</style>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tprops: {\n\t\toverflow: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n});\n</script>\n\n<template>\n\t<div :class=\"{ [$style.wrapper]: true, [$style.overflow]: overflow }\">\n\t\t<div :class=\"$style.list\">\n\t\t\t<div v-if=\"$slots.header\" :class=\"$style.header\">\n\t\t\t\t<slot name=\"header\" />\n\t\t\t</div>\n\t\t\t<div :class=\"$style.body\">\n\t\t\t\t<slot />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.overflow {\n\t.list {\n\t\t.body {\n\t\t\toverflow: auto;\n\t\t}\n\t}\n}\n\n.list {\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\theight: 100%;\n\n\t.header {\n\t\tflex: 0 0 auto;\n\t}\n\n\t.body {\n\t\toverflow: hidden;\n\t\tflex: 1 1;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"resource-ownership-select\">\n\t\t<n8n-menu\n\t\t\t:items=\"menuItems\"\n\t\t\tmode=\"tabs\"\n\t\t\t:modelValue=\"value ? 'owner' : 'all'\"\n\t\t\t@update:modelValue=\"onSelectOwner\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IMenuItem } from 'n8n-design-system';\n\nexport default defineComponent({\n\tprops: {\n\t\tvalue: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tmyResourcesLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tallResourcesLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tcomputed: {\n\t\tmenuItems(): IMenuItem[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'all',\n\t\t\t\t\ticon: 'globe-americas',\n\t\t\t\t\tlabel: this.allResourcesLabel,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'owner',\n\t\t\t\t\ticon: 'user',\n\t\t\t\t\tlabel: this.myResourcesLabel,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t},\n\tmethods: {\n\t\tonSelectOwner(type: string) {\n\t\t\tthis.$emit('update:modelValue', type === 'owner');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.menu-container {\n\t--menu-background: transparent;\n\t--menu-padding: 0;\n}\n</style>\n","<template>\n\t<n8n-popover trigger=\"click\" width=\"304\" size=\"large\">\n\t\t<template #reference>\n\t\t\t<n8n-button\n\t\t\t\ticon=\"filter\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\t:active=\"hasFilters\"\n\t\t\t\t:class=\"[$style['filter-button'], 'ml-2xs']\"\n\t\t\t\tdata-test-id=\"resources-list-filters-trigger\"\n\t\t\t>\n\t\t\t\t<n8n-badge v-show=\"filtersLength > 0\" theme=\"primary\" class=\"mr-4xs\">\n\t\t\t\t\t{{ filtersLength }}\n\t\t\t\t</n8n-badge>\n\t\t\t\t{{ $locale.baseText('forms.resourceFiltersDropdown.filters') }}\n\t\t\t</n8n-button>\n\t\t</template>\n\t\t<div :class=\"$style['filters-dropdown']\" data-test-id=\"resources-list-filters-dropdown\">\n\t\t\t<slot :filters=\"modelValue\" :setKeyValue=\"setKeyValue\" />\n\t\t\t<enterprise-edition\n\t\t\t\tclass=\"mb-s\"\n\t\t\t\t:features=\"[EnterpriseEditionFeature.Sharing]\"\n\t\t\t\tv-if=\"shareable\"\n\t\t\t>\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('forms.resourceFiltersDropdown.ownedBy')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<n8n-user-select\n\t\t\t\t\t:users=\"ownedByUsers\"\n\t\t\t\t\t:currentUserId=\"usersStore.currentUser.id\"\n\t\t\t\t\t:modelValue=\"modelValue.ownedBy\"\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('ownedBy', $event)\"\n\t\t\t\t/>\n\t\t\t</enterprise-edition>\n\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\" v-if=\"shareable\">\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('forms.resourceFiltersDropdown.sharedWith')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<n8n-user-select\n\t\t\t\t\t:users=\"sharedWithUsers\"\n\t\t\t\t\t:currentUserId=\"usersStore.currentUser.id\"\n\t\t\t\t\t:modelValue=\"modelValue.sharedWith\"\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('sharedWith', $event)\"\n\t\t\t\t/>\n\t\t\t</enterprise-edition>\n\t\t\t<div :class=\"[$style['filters-dropdown-footer'], 'mt-s']\" v-if=\"hasFilters\">\n\t\t\t\t<n8n-link @click=\"resetFilters\">\n\t\t\t\t\t{{ $locale.baseText('forms.resourceFiltersDropdown.reset') }}\n\t\t\t\t</n8n-link>\n\t\t\t</div>\n\t\t</div>\n\t</n8n-popover>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useUsersStore } from '@/stores/users.store';\nimport type { PropType } from 'vue';\nimport type { IUser } from '@/Interface';\n\nexport type IResourceFiltersType = Record<string, boolean | string | string[]>;\n\nexport default defineComponent({\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: Object as PropType<IResourceFiltersType>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tkeys: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshareable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\treset: {\n\t\t\ttype: Function as PropType<() => void>,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUsersStore),\n\t\townedByUsers(): IUser[] {\n\t\t\treturn this.usersStore.allUsers.map((user) =>\n\t\t\t\tuser.id === this.modelValue.sharedWith ? { ...user, disabled: true } : user,\n\t\t\t);\n\t\t},\n\t\tsharedWithUsers(): IUser[] {\n\t\t\treturn this.usersStore.allUsers.map((user) =>\n\t\t\t\tuser.id === this.modelValue.ownedBy ? { ...user, disabled: true } : user,\n\t\t\t);\n\t\t},\n\t\tfiltersLength(): number {\n\t\t\tlet length = 0;\n\n\t\t\tthis.keys.forEach((key) => {\n\t\t\t\tif (key === 'search') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlength += (\n\t\t\t\t\tArray.isArray(this.modelValue[key])\n\t\t\t\t\t\t? this.modelValue[key].length > 0\n\t\t\t\t\t\t: this.modelValue[key] !== ''\n\t\t\t\t)\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0;\n\t\t\t});\n\n\t\t\treturn length;\n\t\t},\n\t\thasFilters(): boolean {\n\t\t\treturn this.filtersLength > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetKeyValue(key: string, value: unknown) {\n\t\t\tconst filters = {\n\t\t\t\t...this.modelValue,\n\t\t\t\t[key]: value,\n\t\t\t};\n\n\t\t\tthis.$emit('update:modelValue', filters);\n\t\t},\n\t\tresetFilters() {\n\t\t\tif (this.reset) {\n\t\t\t\tthis.reset();\n\t\t\t} else {\n\t\t\t\tconst filters = { ...this.modelValue };\n\n\t\t\t\tthis.keys.forEach((key) => {\n\t\t\t\t\tfilters[key] = Array.isArray(this.modelValue[key]) ? [] : '';\n\t\t\t\t});\n\n\t\t\t\tthis.$emit('update:modelValue', filters);\n\t\t\t}\n\t\t},\n\t},\n\twatch: {\n\t\tfiltersLength(value: number) {\n\t\t\tthis.$emit('update:filtersLength', value);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.filter-button {\n\theight: 40px;\n\talign-items: center;\n}\n\n.filters-dropdown {\n\twidth: 280px;\n\tpadding-bottom: var(--spacing-s);\n}\n\n.filters-dropdown-footer {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n}\n</style>\n","<template>\n\t<page-view-layout>\n\t\t<template #aside v-if=\"showAside\">\n\t\t\t<div :class=\"[$style['heading-wrapper'], 'mb-xs']\">\n\t\t\t\t<n8n-heading size=\"2xlarge\">\n\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.heading`) }}\n\t\t\t\t</n8n-heading>\n\t\t\t</div>\n\n\t\t\t<div class=\"mt-xs mb-l\">\n\t\t\t\t<slot name=\"add-button\" :disabled=\"disabled\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t@click=\"$emit('click:add', $event)\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</slot>\n\t\t\t</div>\n\n\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\" v-if=\"shareable\">\n\t\t\t\t<resource-ownership-select\n\t\t\t\t\tv-model=\"isOwnerSubview\"\n\t\t\t\t\t:my-resources-label=\"i18n.baseText(`${resourceKey}.menu.my`)\"\n\t\t\t\t\t:all-resources-label=\"i18n.baseText(`${resourceKey}.menu.all`)\"\n\t\t\t\t/>\n\t\t\t</enterprise-edition>\n\t\t</template>\n\n\t\t<div v-if=\"loading\">\n\t\t\t<n8n-loading :class=\"[$style['header-loading'], 'mb-l']\" variant=\"custom\" />\n\t\t\t<n8n-loading :class=\"[$style['card-loading'], 'mb-2xs']\" variant=\"custom\" />\n\t\t\t<n8n-loading :class=\"$style['card-loading']\" variant=\"custom\" />\n\t\t</div>\n\t\t<template v-else>\n\t\t\t<div v-if=\"resources.length === 0\">\n\t\t\t\t<slot name=\"empty\">\n\t\t\t\t\t<n8n-action-box\n\t\t\t\t\t\tdata-test-id=\"empty-resources-list\"\n\t\t\t\t\t\temoji=\"👋\"\n\t\t\t\t\t\t:heading=\"\n\t\t\t\t\t\t\ti18n.baseText(\n\t\t\t\t\t\t\t\tusersStore.currentUser.firstName\n\t\t\t\t\t\t\t\t\t? `${resourceKey}.empty.heading`\n\t\t\t\t\t\t\t\t\t: `${resourceKey}.empty.heading.userNotSetup`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinterpolate: { name: usersStore.currentUser.firstName },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t:description=\"i18n.baseText(`${resourceKey}.empty.description`)\"\n\t\t\t\t\t\t:buttonText=\"i18n.baseText(`${resourceKey}.empty.button`)\"\n\t\t\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t\t\t@click:button=\"$emit('click:add', $event)\"\n\t\t\t\t\t/>\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t\t<page-view-layout-list :overflow=\"type !== 'list'\" v-else>\n\t\t\t\t<template #header>\n\t\t\t\t\t<div class=\"mb-xs\">\n\t\t\t\t\t\t<div :class=\"$style['filters-row']\">\n\t\t\t\t\t\t\t<n8n-input\n\t\t\t\t\t\t\t\t:modelValue=\"filtersModel.search\"\n\t\t\t\t\t\t\t\t:class=\"[$style['search'], 'mr-2xs']\"\n\t\t\t\t\t\t\t\t:placeholder=\"i18n.baseText(`${resourceKey}.search.placeholder`)\"\n\t\t\t\t\t\t\t\tclearable\n\t\t\t\t\t\t\t\tref=\"search\"\n\t\t\t\t\t\t\t\tdata-test-id=\"resources-list-search\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onSearch\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #prefix>\n\t\t\t\t\t\t\t\t\t<n8n-icon icon=\"search\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</n8n-input>\n\t\t\t\t\t\t\t<div :class=\"$style['sort-and-filter']\">\n\t\t\t\t\t\t\t\t<n8n-select v-model=\"sortBy\" data-test-id=\"resources-list-sort\">\n\t\t\t\t\t\t\t\t\t<n8n-option\n\t\t\t\t\t\t\t\t\t\tv-for=\"sortOption in sortOptions\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"resources-list-sort-item\"\n\t\t\t\t\t\t\t\t\t\t:key=\"sortOption\"\n\t\t\t\t\t\t\t\t\t\t:value=\"sortOption\"\n\t\t\t\t\t\t\t\t\t\t:label=\"i18n.baseText(`${resourceKey}.sort.${sortOption}`)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</n8n-select>\n\t\t\t\t\t\t\t\t<resource-filters-dropdown\n\t\t\t\t\t\t\t\t\tv-if=\"showFiltersDropdown\"\n\t\t\t\t\t\t\t\t\t:keys=\"filterKeys\"\n\t\t\t\t\t\t\t\t\t:reset=\"resetFilters\"\n\t\t\t\t\t\t\t\t\t:modelValue=\"filtersModel\"\n\t\t\t\t\t\t\t\t\t:shareable=\"shareable\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"$emit('update:filters', $event)\"\n\t\t\t\t\t\t\t\t\t@update:filtersLength=\"onUpdateFiltersLength\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<template #default=\"resourceFiltersSlotProps\">\n\t\t\t\t\t\t\t\t\t\t<slot name=\"filters\" v-bind=\"resourceFiltersSlotProps\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</resource-filters-dropdown>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<slot name=\"callout\"></slot>\n\n\t\t\t\t\t<div v-if=\"showFiltersDropdown\" v-show=\"hasFilters\" class=\"mt-xs\">\n\t\t\t\t\t\t<n8n-info-tip :bold=\"false\">\n\t\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.filters.active`) }}\n\t\t\t\t\t\t\t<n8n-link data-test-id=\"workflows-filter-reset\" @click=\"resetFilters\" size=\"small\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.filters.active.reset`) }}\n\t\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"pb-xs\" />\n\t\t\t\t</template>\n\n\t\t\t\t<slot name=\"preamble\" />\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"filteredAndSortedSubviewResources.length > 0\"\n\t\t\t\t\t:class=\"$style.listWrapper\"\n\t\t\t\t\tref=\"listWrapperRef\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-recycle-scroller\n\t\t\t\t\t\tv-if=\"type === 'list'\"\n\t\t\t\t\t\tdata-test-id=\"resources-list\"\n\t\t\t\t\t\t:class=\"[$style.list, 'list-style-none']\"\n\t\t\t\t\t\t:items=\"filteredAndSortedSubviewResources\"\n\t\t\t\t\t\t:item-size=\"typeProps.itemSize\"\n\t\t\t\t\t\titem-key=\"id\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #default=\"{ item, updateItemSize }\">\n\t\t\t\t\t\t\t<slot :data=\"item\" :updateItemSize=\"updateItemSize\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template #postListContent>\n\t\t\t\t\t\t\t<slot name=\"postListContent\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</n8n-recycle-scroller>\n\t\t\t\t\t<n8n-datatable\n\t\t\t\t\t\tv-if=\"typeProps.columns\"\n\t\t\t\t\t\tdata-test-id=\"resources-table\"\n\t\t\t\t\t\t:class=\"$style.datatable\"\n\t\t\t\t\t\t:columns=\"typeProps.columns\"\n\t\t\t\t\t\t:rows=\"filteredAndSortedSubviewResources\"\n\t\t\t\t\t\t:currentPage=\"currentPage\"\n\t\t\t\t\t\t:rowsPerPage=\"rowsPerPage\"\n\t\t\t\t\t\t@update:currentPage=\"setCurrentPage\"\n\t\t\t\t\t\t@update:rowsPerPage=\"setRowsPerPage\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #row=\"{ columns, row }\">\n\t\t\t\t\t\t\t<slot :data=\"row\" :columns=\"columns\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</n8n-datatable>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-text color=\"text-base\" size=\"medium\" data-test-id=\"resources-list-empty\" v-else>\n\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.noResults`) }}\n\t\t\t\t\t<template v-if=\"shouldSwitchToAllSubview\">\n\t\t\t\t\t\t<span v-if=\"!filtersModel.search\">\n\t\t\t\t\t\t\t({{ i18n.baseText(`${resourceKey}.noResults.switchToShared.preamble`) }}\n\t\t\t\t\t\t\t<n8n-link @click=\"setOwnerSubview(false)\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText(`${resourceKey}.noResults.switchToShared.link`) }} </n8n-link\n\t\t\t\t\t\t\t>)\n\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t<span v-else>\n\t\t\t\t\t\t\t({{ i18n.baseText(`${resourceKey}.noResults.withSearch.switchToShared.preamble`) }}\n\t\t\t\t\t\t\t<n8n-link @click=\"setOwnerSubview(false)\">\n\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\ti18n.baseText(`${resourceKey}.noResults.withSearch.switchToShared.link`)\n\t\t\t\t\t\t\t\t}} </n8n-link\n\t\t\t\t\t\t\t>)\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-text>\n\n\t\t\t\t<slot name=\"postamble\" />\n\t\t\t</page-view-layout-list>\n\t\t</template>\n\t</page-view-layout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type { IUser } from '@/Interface';\nimport PageViewLayout from '@/components/layouts/PageViewLayout.vue';\nimport PageViewLayoutList from '@/components/layouts/PageViewLayoutList.vue';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { debounceHelper } from '@/mixins/debounce';\nimport ResourceOwnershipSelect from '@/components/forms/ResourceOwnershipSelect.ee.vue';\nimport ResourceFiltersDropdown from '@/components/forms/ResourceFiltersDropdown.vue';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport type { N8nInput, DatatableColumn } from 'n8n-design-system';\nimport { useI18n } from '@/composables/useI18n';\n\nexport interface IResource {\n\tid: string;\n\tname: string;\n\tupdatedAt: string;\n\tcreatedAt: string;\n\townedBy?: Partial<IUser>;\n\tsharedWith?: Array<Partial<IUser>>;\n}\n\ninterface IFilters {\n\tsearch: string;\n\townedBy: string;\n\tsharedWith: string;\n\n\t[key: string]: boolean | string | string[];\n}\n\ntype IResourceKeyType = 'credentials' | 'workflows';\ntype SearchRef = InstanceType<typeof N8nInput>;\n\nexport default defineComponent({\n\tname: 'resources-list-layout',\n\tmixins: [debounceHelper],\n\tcomponents: {\n\t\tPageViewLayout,\n\t\tPageViewLayoutList,\n\t\tResourceOwnershipSelect,\n\t\tResourceFiltersDropdown,\n\t},\n\tprops: {\n\t\tresourceKey: {\n\t\t\ttype: String,\n\t\t\tdefault: '' as IResourceKeyType,\n\t\t},\n\t\tdisplayName: {\n\t\t\ttype: Function as PropType<(resource: IResource) => string>,\n\t\t\tdefault: (resource: IResource) => resource.name,\n\t\t},\n\t\tresources: {\n\t\t\ttype: Array,\n\t\t\tdefault: (): IResource[] => [],\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tinitialize: {\n\t\t\ttype: Function as PropType<() => Promise<void>>,\n\t\t\tdefault: () => async () => {},\n\t\t},\n\t\tfilters: {\n\t\t\ttype: Object,\n\t\t\tdefault: (): IFilters => ({ search: '', ownedBy: '', sharedWith: '' }),\n\t\t},\n\t\tadditionalFiltersHandler: {\n\t\t\ttype: Function,\n\t\t},\n\t\tshowAside: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tshareable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tshowFiltersDropdown: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tsortFns: {\n\t\t\ttype: Object as PropType<Record<string, (a: IResource, b: IResource) => number>>,\n\t\t\tdefault: (): Record<string, (a: IResource, b: IResource) => number> => ({}),\n\t\t},\n\t\tsortOptions: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => ['lastUpdated', 'lastCreated', 'nameAsc', 'nameDesc'],\n\t\t},\n\t\ttype: {\n\t\t\ttype: String as PropType<'datatable' | 'list'>,\n\t\t\tdefault: 'list',\n\t\t},\n\t\ttypeProps: {\n\t\t\ttype: Object as PropType<{ itemSize: number } | { columns: DatatableColumn[] }>,\n\t\t\tdefault: () => ({\n\t\t\t\titemSize: 80,\n\t\t\t}),\n\t\t},\n\t},\n\tsetup() {\n\t\tconst i18n = useI18n();\n\n\t\treturn {\n\t\t\ti18n,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\tisOwnerSubview: false,\n\t\t\tsortBy: this.sortOptions[0],\n\t\t\thasFilters: false,\n\t\t\tfiltersModel: { ...this.filters },\n\t\t\tcurrentPage: 1,\n\t\t\trowsPerPage: 10 as number | '*',\n\t\t\tresettingFilters: false,\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useSettingsStore, useUsersStore),\n\t\tsubviewResources(): IResource[] {\n\t\t\tif (!this.shareable) {\n\t\t\t\treturn this.resources as IResource[];\n\t\t\t}\n\n\t\t\treturn (this.resources as IResource[]).filter((resource) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.isOwnerSubview &&\n\t\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t\t) {\n\t\t\t\t\treturn !!(resource.ownedBy && resource.ownedBy.id === this.usersStore.currentUser?.id);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t});\n\t\t},\n\t\tfilterKeys(): string[] {\n\t\t\treturn Object.keys(this.filtersModel);\n\t\t},\n\t\tfilteredAndSortedSubviewResources(): IResource[] {\n\t\t\tconst filtered: IResource[] = this.subviewResources.filter((resource: IResource) => {\n\t\t\t\tlet matches = true;\n\n\t\t\t\tif (this.filtersModel.ownedBy) {\n\t\t\t\t\tmatches =\n\t\t\t\t\t\tmatches && !!(resource.ownedBy && resource.ownedBy.id === this.filtersModel.ownedBy);\n\t\t\t\t}\n\n\t\t\t\tif (this.filtersModel.sharedWith) {\n\t\t\t\t\tmatches =\n\t\t\t\t\t\tmatches &&\n\t\t\t\t\t\t!!resource.sharedWith?.find((sharee) => sharee.id === this.filtersModel.sharedWith);\n\t\t\t\t}\n\n\t\t\t\tif (this.filtersModel.search) {\n\t\t\t\t\tconst searchString = this.filtersModel.search.toLowerCase();\n\n\t\t\t\t\tmatches = matches && this.displayName(resource).toLowerCase().includes(searchString);\n\t\t\t\t}\n\n\t\t\t\tif (this.additionalFiltersHandler) {\n\t\t\t\t\tmatches = this.additionalFiltersHandler(resource, this.filtersModel, matches);\n\t\t\t\t}\n\n\t\t\t\treturn matches;\n\t\t\t});\n\n\t\t\treturn filtered.sort((a, b) => {\n\t\t\t\tswitch (this.sortBy) {\n\t\t\t\t\tcase 'lastUpdated':\n\t\t\t\t\t\treturn this.sortFns.lastUpdated\n\t\t\t\t\t\t\t? this.sortFns.lastUpdated(a, b)\n\t\t\t\t\t\t\t: new Date(b.updatedAt).valueOf() - new Date(a.updatedAt).valueOf();\n\t\t\t\t\tcase 'lastCreated':\n\t\t\t\t\t\treturn this.sortFns.lastCreated\n\t\t\t\t\t\t\t? this.sortFns.lastCreated(a, b)\n\t\t\t\t\t\t\t: new Date(b.createdAt).valueOf() - new Date(a.createdAt).valueOf();\n\t\t\t\t\tcase 'nameAsc':\n\t\t\t\t\t\treturn this.sortFns.nameAsc\n\t\t\t\t\t\t\t? this.sortFns.nameAsc(a, b)\n\t\t\t\t\t\t\t: this.displayName(a).trim().localeCompare(this.displayName(b).trim());\n\t\t\t\t\tcase 'nameDesc':\n\t\t\t\t\t\treturn this.sortFns.nameDesc\n\t\t\t\t\t\t\t? this.sortFns.nameDesc(a, b)\n\t\t\t\t\t\t\t: this.displayName(b).trim().localeCompare(this.displayName(a).trim());\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn this.sortFns[this.sortBy] ? this.sortFns[this.sortBy](a, b) : 0;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tresourcesNotOwned(): IResource[] {\n\t\t\treturn (this.resources as IResource[]).filter((resource) => {\n\t\t\t\treturn resource.ownedBy && resource.ownedBy.id !== this.usersStore.currentUser?.id;\n\t\t\t});\n\t\t},\n\t\tshouldSwitchToAllSubview(): boolean {\n\t\t\treturn !this.hasFilters && this.isOwnerSubview && this.resourcesNotOwned.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onMounted() {\n\t\t\tawait this.initialize();\n\n\t\t\tthis.loading = false;\n\t\t\tawait this.$nextTick();\n\t\t\tthis.focusSearchInput();\n\n\t\t\tif (this.hasAppliedFilters()) {\n\t\t\t\tthis.hasFilters = true;\n\t\t\t}\n\t\t},\n\t\thasAppliedFilters(): boolean {\n\t\t\treturn !!this.filterKeys.find(\n\t\t\t\t(key) =>\n\t\t\t\t\tkey !== 'search' &&\n\t\t\t\t\t(Array.isArray(this.filters[key])\n\t\t\t\t\t\t? this.filters[key].length > 0\n\t\t\t\t\t\t: this.filters[key] !== ''),\n\t\t\t);\n\t\t},\n\t\tsetCurrentPage(page: number) {\n\t\t\tthis.currentPage = page;\n\t\t},\n\t\tsetRowsPerPage(rowsPerPage: number | '*') {\n\t\t\tthis.rowsPerPage = rowsPerPage;\n\t\t},\n\t\tresetFilters() {\n\t\t\tObject.keys(this.filtersModel).forEach((key) => {\n\t\t\t\tthis.filtersModel[key] = Array.isArray(this.filtersModel[key]) ? [] : '';\n\t\t\t});\n\n\t\t\tthis.resettingFilters = true;\n\t\t\tthis.sendFiltersTelemetry('reset');\n\t\t},\n\t\tfocusSearchInput() {\n\t\t\tif (this.$refs.search) {\n\t\t\t\t(this.$refs.search as SearchRef).focus();\n\t\t\t}\n\t\t},\n\t\tsetOwnerSubview(active: boolean) {\n\t\t\tthis.isOwnerSubview = active;\n\t\t},\n\t\tgetTelemetrySubview(): string {\n\t\t\treturn this.i18n.baseText(\n\t\t\t\t`${this.resourceKey as IResourceKeyType}.menu.${this.isOwnerSubview ? 'my' : 'all'}`,\n\t\t\t);\n\t\t},\n\t\tsendSubviewTelemetry() {\n\t\t\tthis.$telemetry.track(`User changed ${this.resourceKey} sub view`, {\n\t\t\t\tsub_view: this.getTelemetrySubview(),\n\t\t\t});\n\t\t},\n\t\tsendSortingTelemetry() {\n\t\t\tthis.$telemetry.track(`User changed sorting in ${this.resourceKey} list`, {\n\t\t\t\tsub_view: this.getTelemetrySubview(),\n\t\t\t\tsorting: this.sortBy,\n\t\t\t});\n\t\t},\n\t\tsendFiltersTelemetry(source: string) {\n\t\t\t// Prevent sending multiple telemetry events when resetting filters\n\t\t\t// Timeout is required to wait for search debounce to be over\n\t\t\tif (this.resettingFilters) {\n\t\t\t\tif (source !== 'reset') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => (this.resettingFilters = false), 1500);\n\t\t\t}\n\n\t\t\tconst filters = this.filtersModel as Record<string, string[] | string | boolean>;\n\t\t\tconst filtersSet: string[] = [];\n\t\t\tconst filterValues: Array<string[] | string | boolean | null> = [];\n\n\t\t\tObject.keys(filters).forEach((key) => {\n\t\t\t\tif (filters[key]) {\n\t\t\t\t\tfiltersSet.push(key);\n\t\t\t\t\tfilterValues.push(key === 'search' ? null : filters[key]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.$telemetry.track(`User set filters in ${this.resourceKey} list`, {\n\t\t\t\tfilters_set: filtersSet,\n\t\t\t\tfilter_values: filterValues,\n\t\t\t\tsub_view: this.getTelemetrySubview(),\n\t\t\t\t[`${this.resourceKey}_total_in_view`]: this.subviewResources.length,\n\t\t\t\t[`${this.resourceKey}_after_filtering`]: this.filteredAndSortedSubviewResources.length,\n\t\t\t});\n\t\t},\n\t\tonUpdateFiltersLength(length: number) {\n\t\t\tthis.hasFilters = length > 0;\n\t\t},\n\t\tonSearch(search: string) {\n\t\t\tthis.filtersModel.search = search;\n\t\t\tthis.$emit('update:filters', this.filtersModel);\n\t\t},\n\t},\n\tmounted() {\n\t\tvoid this.onMounted();\n\t},\n\twatch: {\n\t\tisOwnerSubview() {\n\t\t\tthis.sendSubviewTelemetry();\n\t\t},\n\t\tfilters(value) {\n\t\t\tthis.filtersModel = value;\n\t\t},\n\t\t'filtersModel.ownedBy'(value) {\n\t\t\tif (value) {\n\t\t\t\tthis.setOwnerSubview(false);\n\t\t\t}\n\t\t\tthis.sendFiltersTelemetry('ownedBy');\n\t\t},\n\t\t'filtersModel.sharedWith'() {\n\t\t\tthis.sendFiltersTelemetry('sharedWith');\n\t\t},\n\t\t'filtersModel.search'() {\n\t\t\tvoid this.callDebounced(\n\t\t\t\t'sendFiltersTelemetry',\n\t\t\t\t{ debounceTime: 1000, trailing: true },\n\t\t\t\t'search',\n\t\t\t);\n\t\t},\n\t\tsortBy(newValue) {\n\t\t\tthis.$emit('sort', newValue);\n\t\t\tthis.sendSortingTelemetry();\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.heading-wrapper {\n\tpadding-bottom: 1px; // Match input height\n}\n\n.filters-row {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.search {\n\tmax-width: 240px;\n}\n\n.list {\n\t//display: flex;\n\t//flex-direction: column;\n}\n\n.listWrapper {\n\theight: 100%;\n}\n\n.sort-and-filter {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.header-loading {\n\theight: 36px;\n}\n\n.card-loading {\n\theight: 69px;\n}\n\n.datatable {\n\tpadding-bottom: var(--spacing-s);\n}\n</style>\n"],"names":["_sfc_main$4","defineComponent","mapStores","useUIStore","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_normalizeClass","_openBlock","_createElementBlock","_createCommentVNode","_createElementVNode","_sfc_main$3","_sfc_main$2","type","_component_n8n_menu","_resolveComponent","_hoisted_1","_createVNode","_sfc_main$1","EnterpriseEditionFeature","useUsersStore","user","length","key","value","filters","_createBlock","_component_n8n_popover","_withCtx","_component_n8n_button","_withDirectives","_component_n8n_badge","_vShow","_renderSlot","_component_enterprise_edition","_component_n8n_input_label","_component_n8n_user_select","_component_n8n_link","_sfc_main","debounceHelper","PageViewLayout","PageViewLayoutList","ResourceOwnershipSelect","ResourceFiltersDropdown","resource","useI18n","useSettingsStore","_a","matches","sharee","searchString","a","b","page","rowsPerPage","active","source","filtersSet","filterValues","search","newValue","_hoisted_2","_hoisted_5","_component_page_view_layout","_createSlots","_component_n8n_loading","_Fragment","_hoisted_3","_component_n8n_action_box","_component_page_view_layout_list","_hoisted_4","_component_n8n_input","$event","_renderList","sortOption","_component_n8n_option","_component_resource_filters_dropdown","_component_n8n_info_tip","_createTextVNode","_toDisplayString","_component_n8n_recycle_scroller","item","updateItemSize","_component_n8n_datatable","columns","row","_component_n8n_text","_hoisted_8","_hoisted_7","_component_n8n_heading","_component_resource_ownership_select"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{N as _,fS as Y,o as Z,M as ee,_ as H,z as K,B as G,fT as te}from"./n8n-ZKR6bms9.js";import{N as Q}from"./index
|
|
1
|
+
import{N as _,fS as Y,o as Z,M as ee,_ as H,z as K,B as G,fT as te}from"./n8n-ZKR6bms9.js";import{N as Q}from"./index-RXjMHIPR.js";import{G as L,r as O,b as ne,ag as B,l as y,m as k,p as w,I as d,T as v,R as $,u as E,M as z,a2 as oe,Q as M,F as P,a7 as J,e as V,O as R,S as x,d as se,J as ae}from"./vendor-2CfOYFi2.js";import{V as W}from"./vue-markdown-render-arvjXOrF.js";import{u as re}from"./useCopyToClipboard--_VQNyU0.js";import{A as le}from"./lodash-es-s_m9YyW7.js";import"./axios-QLjAsgXu.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./pinia-jX93eZRS.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"./copy-to-clipboard-w-_qJz-n.js";const q=n=>({type:"json",data:n,parsed:!1}),X={[_.AiLanguageModel](n){const o=n.response??n;if(!o)throw new Error("No response from Language Model");return Array.isArray(o==null?void 0:o.messages)&&(o==null?void 0:o.messages.length)===1&&typeof(o==null?void 0:o.messages[0])=="string"?{type:"text",data:o.messages[0],parsed:!0}:o.messages&&Array.isArray(o.messages)?X[_.AiMemory](n):o.generations?{type:"json",data:o.generations.map(s=>s!=null&&s.text?s.text:Array.isArray(s)?s.map(b=>b.text??b).join(`
|
|
2
2
|
|
|
3
3
|
`).trim():s),parsed:!0}:{type:"json",data:o,parsed:!0}},[_.AiTool]:q,[_.AiAgent]:q,[_.AiMemory](n){var T;const o=n.chatHistory??n.messages??((T=n==null?void 0:n.response)==null?void 0:T.chat_history);return Array.isArray(o)?{type:"markdown",data:o.map(s=>{var b,p;if(s.type==="constructor"&&((b=s.id)!=null&&b.includes("messages"))&&s.kwargs){let u=s.kwargs.content;if(Array.isArray(u)){const l=u[0];(l==null?void 0:l.type)==="image_url"&&(u=`==null?void 0:p.url})`),u=u}return Object.keys(s.kwargs.additional_kwargs).length&&(u+=` (${JSON.stringify(s.kwargs.additional_kwargs)})`),s.id.includes("HumanMessage")?u=`**Human:** ${u.trim()}`:s.id.includes("AIMessage")?u=`**AI:** ${u}`:s.id.includes("SystemMessage")&&(u=`**System Message:** ${u}`),n.action&&n.action!=="getMessages"&&(u=`## Action: ${n.action}
|
|
4
4
|
|
|
@@ -9,4 +9,4 @@ ${u}`),u}return""}).join(`
|
|
|
9
9
|
`),parsed:!0}}},ie=()=>({parseAiRunData:(o,T)=>{if([_.AiChain,_.Main].includes(T))return o.map(p=>({raw:p.json,parsedContent:null}));const I=o.map(p=>!Y(p.binary)?p.binary:p.json),s=X[T];return s?I.filter(p=>p!==void 0).map(p=>({raw:p,parsedContent:s(p)})):[{raw:I.filter(p=>p!==void 0),parsedContent:null}]}}),ue=["data-content-type"],ce=["textContent"],de=L({__name:"AiRunContentBlock",props:{runData:{}},setup(n){const o=n,T=ee(),I=ie(),s=O(l()),b=O(!1),p=O(!1),u=O(void 0);function l(){return!{input:[_.AiDocument,_.AiTextSplitter],output:[_.AiDocument,_.AiEmbedding,_.AiTextSplitter,_.AiVectorStore]}[o.runData.inOut].includes(o.runData.type)}function S(e){return e.data?I.parseAiRunData(e.data,e.type):void 0}function D(e){return typeof e!="string"?!1:[/^# .+/gm,/\*{1,2}.+\*{1,2}/g,/\[.+\]\(.+\)/g,/```[\s\S]+```/g].some(i=>i.test(e))}function g(e){return"```json\n"+e+"\n```"}function j(e){return D(e)?e:Array.isArray(e)&&e.length&&typeof e[0]!="number"?e.map(i=>j(i)).join(`
|
|
10
10
|
|
|
11
11
|
`).trim():g(typeof e=="string"?e:JSON.stringify(e,null,2))}function A(e){p.value=!!e.find(r=>{var i;return((i=r.parsedContent)==null?void 0:i.parsed)===!0})}function h(){s.value=!s.value}function t(e){const r=re(),{showMessage:i}=Z();try{r(JSON.stringify(e,void 0,2)),i({title:T.baseText("generic.copiedToClipboard"),type:"success"})}catch{}}return ne(()=>{u.value=S(o.runData),u.value&&A(u.value)}),(e,r)=>{const i=B("font-awesome-icon"),a=B("el-switch"),m=B("n8n-icon-button");return y(),k("div",{class:d(e.$style.block)},[w("header",{class:d(e.$style.blockHeader),onClick:h},[w("button",{class:d(e.$style.blockToggle)},[v(i,{icon:s.value?"angle-down":"angle-up",size:"lg"},null,8,["icon"])],2),w("p",{class:d(e.$style.blockTitle)},$(E(le)(e.runData.inOut)),3),p.value?(y(),z(a,{key:0,onClick:r[0]||(r[0]=oe(()=>{},["stop"])),class:d(e.$style.rawSwitch),"active-text":"RAW JSON",modelValue:b.value,"onUpdate:modelValue":r[1]||(r[1]=c=>b.value=c)},null,8,["class","modelValue"])):M("",!0)],2),w("main",{class:d({[e.$style.blockContent]:!0,[e.$style.blockContentExpanded]:s.value})},[(y(!0),k(P,null,J(u.value,({parsedContent:c,raw:C},f)=>(y(),k("div",{key:f,class:d(e.$style.contentText),"data-content-type":c==null?void 0:c.type},[c&&!b.value?(y(),k(P,{key:0},[c.type==="json"?(y(),z(E(W),{key:0,source:j(c.data),class:d(e.$style.markdown)},null,8,["source","class"])):M("",!0),c.type==="markdown"?(y(),z(E(W),{key:1,source:c.data,class:d(e.$style.markdown)},null,8,["source","class"])):M("",!0),c.type==="text"?(y(),k("p",{key:2,class:d(e.$style.runText),textContent:$(c.data)},null,10,ce)):M("",!0)],64)):(y(),k("div",{key:1,class:d(e.$style.rawContent)},[v(m,{size:"small",class:d(e.$style.copyToClipboard),type:"secondary",onClick:N=>t(C),title:e.$locale.baseText("nodeErrorView.copyToClipboard"),icon:"copy"},null,8,["class","onClick","title"]),v(E(W),{source:j(C),class:d(e.$style.markdown)},null,8,["source","class"])],2))],10,ue))),128))],2)],2)}}}),pe="_copyToClipboard_8qn1s_5",me="_rawContent_8qn1s_11",ye="_markdown_8qn1s_15",_e="_contentText_8qn1s_39",fe="_block_8qn1s_44",ke="_blockContent_8qn1s_52",Te="_blockContentExpanded_8qn1s_56",ge="_runText_8qn1s_60",be="_rawSwitch_8qn1s_65",he="_blockHeader_8qn1s_72",$e="_blockTitle_8qn1s_84",ve="_blockToggle_8qn1s_89",we={copyToClipboard:pe,rawContent:me,markdown:ye,contentText:_e,block:fe,blockContent:ke,blockContentExpanded:Te,runText:ge,rawSwitch:be,blockHeader:he,blockTitle:$e,blockToggle:ve},Ae={$style:we},Ce=H(de,[["__cssModules",Ae]]),Me={key:0},Se={key:1},Ie={key:2},De=w("br",null,null,-1),je=L({__name:"RunDataAiContent",props:{inputData:{},contentIndex:{}},setup(n){const o=n,T=K(),I=G(),s=V(()=>{var S,D;return(D=(S=p.value)==null?void 0:S.data)==null?void 0:D.reduce((g,j)=>{var t,e;const A=(t=j.json)==null?void 0:t.response,h=(e=A==null?void 0:A.llmOutput)==null?void 0:e.tokenUsage;return h?{completionTokens:g.completionTokens+h.completionTokens,promptTokens:g.promptTokens+h.promptTokens,totalTokens:g.totalTokens+h.totalTokens}:g},{completionTokens:0,promptTokens:0,totalTokens:0})});function b(l){const S=I.getNodeByName(o.inputData.node),D=T.getNodeType((S==null?void 0:S.type)??"");return{startTimeMs:l.metadata.startTime,executionTimeMs:l.metadata.executionTime,node:D,type:l.inOut,connectionType:l.type}}const p=V(()=>o.inputData.data.find(l=>l.inOut==="output")),u=V(()=>{if(p.value!==void 0)return b(p.value)});return(l,S)=>{var A,h,t,e,r,i;const D=B("n8n-tooltip"),g=B("n8n-text"),j=B("n8n-info-tip");return y(),k("div",{class:d(l.$style.container)},[w("header",{class:d(l.$style.header)},[(A=u.value)!=null&&A.node?(y(),z(Q,{key:0,class:d(l.$style.nodeIcon),"node-type":u.value.node,size:20},null,8,["class","node-type"])):M("",!0),w("div",{class:d(l.$style.headerWrap)},[w("p",{class:d(l.$style.title)},$(l.inputData.node),3),w("ul",{class:d(l.$style.meta)},[(h=u.value)!=null&&h.startTimeMs?(y(),k("li",Me,$((t=u.value)==null?void 0:t.executionTimeMs)+"ms",1)):M("",!0),(e=u.value)!=null&&e.startTimeMs?(y(),k("li",Se,[v(D,null,{content:R(()=>{var a;return[x($(new Date((a=u.value)==null?void 0:a.startTimeMs).toLocaleString()),1)]}),default:R(()=>{var a;return[x(" "+$(l.$locale.baseText("runData.aiContentBlock.startedAt",{interpolate:{startTime:new Date((a=u.value)==null?void 0:a.startTimeMs).toLocaleTimeString()}})),1)]}),_:1})])):M("",!0),(((r=s.value)==null?void 0:r.totalTokens)??0)>0?(y(),k("li",Ie,[x($(l.$locale.baseText("runData.aiContentBlock.tokens",{interpolate:{count:(i=s.value)==null?void 0:i.totalTokens.toString()}}))+" ",1),v(j,{type:"tooltip",theme:"info-light",tooltipPlacement:"right"},{default:R(()=>[w("div",null,[v(g,{bold:!0,size:"small"},{default:R(()=>{var a;return[x($(l.$locale.baseText("runData.aiContentBlock.tokens.prompt"))+" "+$(l.$locale.baseText("runData.aiContentBlock.tokens",{interpolate:{count:(a=s.value)==null?void 0:a.promptTokens.toString()}})),1)]}),_:1}),De,v(g,{bold:!0,size:"small"},{default:R(()=>{var a;return[x($(l.$locale.baseText("runData.aiContentBlock.tokens.completion"))+" "+$(l.$locale.baseText("runData.aiContentBlock.tokens",{interpolate:{count:(a=s.value)==null?void 0:a.completionTokens.toString()}})),1)]}),_:1})])]),_:1})])):M("",!0)],2)],2)],2),(y(!0),k(P,null,J(o.inputData.data,(a,m)=>(y(),k("main",{class:d(l.$style.content),key:m},[v(Ce,{runData:a},null,8,["runData"])],2))),128))],2)}}}),Ne="_container_160yh_2",Re="_nodeIcon_160yh_5",Be="_header_160yh_8",qe="_headerWrap_160yh_14",xe="_title_160yh_18",Oe="_meta_160yh_25",Ee={container:Ne,nodeIcon:Re,header:Be,headerWrap:qe,title:xe,meta:Oe},Ve={$style:Ee},ze=H(je,[["__cssModules",Ve]]),Pe=["data-tree-depth"],We=["onClick"],He=["textContent"],Le=L({__name:"RunDataAi",props:{node:{},runIndex:{default:0},hideTitle:{type:Boolean},slim:{type:Boolean}},setup(n){const o=n,T=G(),I=K(),s=O([]);function b(t){return s.value.some(e=>e.node===t.node&&e.runIndex===t.runIndex)}function p(t,e,r){const i=T.getWorkflowResultDataByNodeName(t.node);if(!(i!=null&&i[t.runIndex]))return[];const a=i[t.runIndex];if(!a)return[];const m=[];function c(C,f){C&&Object.keys(C).map(N=>{m.push({data:C[N][0],inOut:f,type:N,metadata:{executionTime:a.executionTime,startTime:a.startTime}})})}return e&&c(a.inputOverride,"input"),r&&c(a.data,"output"),m}function u(t){t.expanded=!t.expanded}function l(t){var r;if(!((r=A.value)==null?void 0:r.find(i=>i.node===t.node&&i.runIndex===t.runIndex))){s.value=[];return}s.value=[{node:t.node,runIndex:t.runIndex,data:p({node:t.node,runIndex:t.runIndex},!0,!0)}]}function S(t){const e=T.getNodeByName(t);return e?I.getNodeType(e==null?void 0:e.type):null}function D(){h.value.length&&h.value[0].children.length&&l(h.value[0].children[0])}const g=(t,e,r,i=[])=>{var a,m;return{node:t,id:t,depth:e,startTime:((m=(a=r==null?void 0:r.data)==null?void 0:a.metadata)==null?void 0:m.startTime)??0,runIndex:(r==null?void 0:r.runIndex)??0,children:i}};function j(t,e){var C;const{connectionsByDestinationNode:r}=T.getCurrentWorkflow(),i=r[t],a=((C=A.value)==null?void 0:C.filter(f=>f.node===t))??[];if(!i)return a.map(f=>g(t,e,f));const c=Object.keys(i).filter(f=>f!==_.Main).flatMap(f=>i[f][0].flatMap(N=>j(N.node,e+1)));return a.length?a.map(f=>g(t,e,f,c)):(c.sort((f,N)=>f.startTime-N.startTime),[g(t,e,void 0,c)])}const A=V(()=>{var i;const t=T.getWorkflowResultDataByNodeName(o.node.name);if(!t||!Array.isArray(t))return;const e=(i=t[o.runIndex].metadata)==null?void 0:i.subRun;if(!Array.isArray(e))return;const r=e.flatMap(a=>p(a,!1,!0).map(m=>({...a,data:m})));return r.sort((a,m)=>{var f,N,F,U;const c=((N=(f=a.data)==null?void 0:f.metadata)==null?void 0:N.startTime)||0,C=((U=(F=m.data)==null?void 0:F.metadata)==null?void 0:U.startTime)||0;return c-C}),r}),h=V(()=>{const t=o.node;return j(t.name,0)||[]});return se(()=>o.runIndex,D,{immediate:!0}),(t,e)=>{const r=B("font-awesome-icon"),i=B("n8n-tooltip"),a=B("n8n-text");return A.value?(y(),k("div",{key:0,class:d(t.$style.container)},[w("div",{class:d({[t.$style.tree]:!0,[t.$style.slim]:t.slim})},[v(E(te),{data:h.value,props:{label:"node"},"default-expand-all":"",indent:12,onNodeClick:l,"expand-on-click-node":!1,"data-test-id":"lm-chat-logs-tree"},{default:R(({node:m,data:c})=>[w("div",{class:d({[t.$style.treeNode]:!0,[t.$style.isSelected]:b(c)}),"data-tree-depth":c.depth,style:ae({"--item-depth":c.depth})},[c.children.length?(y(),k("button",{key:0,class:d(t.$style.treeToggle),onClick:C=>u(m)},[v(r,{icon:m.expanded?"angle-down":"angle-up"},null,8,["icon"])],10,We)):M("",!0),v(i,{disabled:!t.slim,placement:"right"},{content:R(()=>[x($(m.label),1)]),default:R(()=>[w("span",{class:d(t.$style.leafLabel)},[v(Q,{"node-type":S(c.node),size:17},null,8,["node-type"]),t.slim?M("",!0):(y(),k("span",{key:0,textContent:$(m.label)},null,8,He))],2)]),_:2},1032,["disabled"])],14,Pe)]),_:1},8,["data"])],2),w("div",{class:d(t.$style.runData)},[s.value.length===0?(y(),k("div",{key:0,class:d(t.$style.empty)},[v(a,{size:"large"},{default:R(()=>[x($(t.$locale.baseText("ndv.output.ai.empty",{interpolate:{node:o.node.name}})),1)]),_:1})],2)):M("",!0),(y(!0),k(P,null,J(s.value,(m,c)=>(y(),k("div",{key:`${m.node}__${m.runIndex}__index`,"data-test-id":"lm-chat-logs-entry"},[v(ze,{inputData:m,contentIndex:c},null,8,["inputData","contentIndex"])]))),128))],2)],2)):M("",!0)}}}),Je="_treeToggle_gjbqy_5",Fe="_leafLabel_gjbqy_13",Ue="_empty_gjbqy_19",Ke="_title_gjbqy_23",Ge="_tree_gjbqy_5",Qe="_slim_gjbqy_36",Xe="_runData_gjbqy_40",Ye="_container_gjbqy_46",Ze="_isSelected_gjbqy_73",et="_treeNode_gjbqy_77",tt={treeToggle:Je,leafLabel:Fe,empty:Ue,title:Ke,tree:Ge,slim:Qe,runData:Xe,container:Ye,isSelected:Ze,treeNode:et},nt={$style:tt},Bt=H(Le,[["__cssModules",nt]]);export{Bt as default};
|
|
12
|
-
//# sourceMappingURL=RunDataAi-
|
|
12
|
+
//# sourceMappingURL=RunDataAi-dgEyN_Yl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunDataAi-EdxjRrVc.js","sources":["../../src/components/RunDataAi/useAiContentParsers.ts","../../src/components/RunDataAi/AiRunContentBlock.vue","../../src/components/RunDataAi/RunDataAiContent.vue","../../src/components/RunDataAi/RunDataAi.vue"],"sourcesContent":["import type { IDataObject, INodeExecutionData } from 'n8n-workflow';\nimport { isObjectEmpty, NodeConnectionType } from 'n8n-workflow';\n\ninterface MemoryMessage {\n\tlc: number;\n\ttype: string;\n\tid: string[];\n\tkwargs: {\n\t\tcontent: unknown;\n\t\tadditional_kwargs: Record<string, unknown>;\n\t};\n}\ninterface LmGeneration {\n\ttext: string;\n\tmessage: MemoryMessage;\n}\n\ntype ExcludedKeys = NodeConnectionType.Main | NodeConnectionType.AiChain;\ntype AllowedEndpointType = Exclude<NodeConnectionType, ExcludedKeys>;\n\nconst fallbackParser = (execData: IDataObject) => ({\n\ttype: 'json' as 'json' | 'text' | 'markdown',\n\tdata: execData,\n\tparsed: false,\n});\n\nconst outputTypeParsers: {\n\t[key in AllowedEndpointType]: (execData: IDataObject) => {\n\t\ttype: 'json' | 'text' | 'markdown';\n\t\tdata: unknown;\n\t\tparsed: boolean;\n\t};\n} = {\n\t[NodeConnectionType.AiLanguageModel](execData: IDataObject) {\n\t\tconst response = (execData.response as IDataObject) ?? execData;\n\t\tif (!response) throw new Error('No response from Language Model');\n\n\t\t// Simple LLM output — single string message item\n\t\tif (\n\t\t\tArray.isArray(response?.messages) &&\n\t\t\tresponse?.messages.length === 1 &&\n\t\t\ttypeof response?.messages[0] === 'string'\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: 'text',\n\t\t\t\tdata: response.messages[0],\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\t\t// Use the memory parser if the response is a memory-like(chat) object\n\t\tif (response.messages && Array.isArray(response.messages)) {\n\t\t\treturn outputTypeParsers[NodeConnectionType.AiMemory](execData);\n\t\t}\n\t\tif (response.generations) {\n\t\t\tconst generations = response.generations as LmGeneration[];\n\n\t\t\tconst content = generations.map((generation) => {\n\t\t\t\tif (generation?.text) return generation.text;\n\n\t\t\t\tif (Array.isArray(generation)) {\n\t\t\t\t\treturn generation\n\t\t\t\t\t\t.map((item: LmGeneration) => item.text ?? item)\n\t\t\t\t\t\t.join('\\n\\n')\n\t\t\t\t\t\t.trim();\n\t\t\t\t}\n\n\t\t\t\treturn generation;\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: content,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'json',\n\t\t\tdata: response,\n\t\t\tparsed: true,\n\t\t};\n\t},\n\t[NodeConnectionType.AiTool]: fallbackParser,\n\t[NodeConnectionType.AiAgent]: fallbackParser,\n\t[NodeConnectionType.AiMemory](execData: IDataObject) {\n\t\tconst chatHistory =\n\t\t\texecData.chatHistory ?? execData.messages ?? execData?.response?.chat_history;\n\t\tif (Array.isArray(chatHistory)) {\n\t\t\tconst responseText = chatHistory\n\t\t\t\t.map((content: MemoryMessage) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcontent.type === 'constructor' &&\n\t\t\t\t\t\tcontent.id?.includes('messages') &&\n\t\t\t\t\t\tcontent.kwargs\n\t\t\t\t\t) {\n\t\t\t\t\t\tinterface MessageContent {\n\t\t\t\t\t\t\ttype: string;\n\t\t\t\t\t\t\timage_url?: {\n\t\t\t\t\t\t\t\turl: string;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet message = content.kwargs.content;\n\t\t\t\t\t\tif (Array.isArray(message)) {\n\t\t\t\t\t\t\tconst messageContent = message[0] as {\n\t\t\t\t\t\t\t\ttype?: string;\n\t\t\t\t\t\t\t\timage_url?: { url: string };\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (messageContent?.type === 'image_url') {\n\t\t\t\t\t\t\t\tmessage = ``;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmessage = message as MessageContent[];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Object.keys(content.kwargs.additional_kwargs).length) {\n\t\t\t\t\t\t\tmessage += ` (${JSON.stringify(content.kwargs.additional_kwargs)})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (content.id.includes('HumanMessage')) {\n\t\t\t\t\t\t\tmessage = `**Human:** ${message.trim()}`;\n\t\t\t\t\t\t} else if (content.id.includes('AIMessage')) {\n\t\t\t\t\t\t\tmessage = `**AI:** ${message}`;\n\t\t\t\t\t\t} else if (content.id.includes('SystemMessage')) {\n\t\t\t\t\t\t\tmessage = `**System Message:** ${message}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (execData.action && execData.action !== 'getMessages') {\n\t\t\t\t\t\t\tmessage = `## Action: ${execData.action}\\n\\n${message}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn message;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t})\n\t\t\t\t.join('\\n\\n');\n\n\t\t\treturn {\n\t\t\t\ttype: 'markdown',\n\t\t\t\tdata: responseText,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiOutputParser]: fallbackParser,\n\t[NodeConnectionType.AiRetriever]: fallbackParser,\n\t[NodeConnectionType.AiVectorStore](execData: IDataObject) {\n\t\tif (execData.documents) {\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: execData.documents,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiEmbedding](execData: IDataObject) {\n\t\tif (execData.documents) {\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: execData.documents,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiDocument](execData: IDataObject) {\n\t\tif (execData.documents) {\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: execData.documents,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiTextSplitter](execData: IDataObject) {\n\t\tconst arrayData = Array.isArray(execData.response)\n\t\t\t? execData.response\n\t\t\t: [execData.textSplitter];\n\t\treturn {\n\t\t\ttype: 'text',\n\t\t\tdata: arrayData.join('\\n\\n'),\n\t\t\tparsed: true,\n\t\t};\n\t},\n};\nexport type ParsedAiContent = Array<{\n\traw: IDataObject | IDataObject[];\n\tparsedContent: {\n\t\ttype: 'json' | 'text' | 'markdown';\n\t\tdata: unknown;\n\t\tparsed: boolean;\n\t} | null;\n}>;\n\nexport const useAiContentParsers = () => {\n\tconst parseAiRunData = (\n\t\texecutionData: INodeExecutionData[],\n\t\tendpointType: NodeConnectionType,\n\t): ParsedAiContent => {\n\t\tif ([NodeConnectionType.AiChain, NodeConnectionType.Main].includes(endpointType)) {\n\t\t\treturn executionData.map((data) => ({ raw: data.json, parsedContent: null }));\n\t\t}\n\n\t\tconst contentJson = executionData.map((node) => {\n\t\t\tconst hasBinarData = !isObjectEmpty(node.binary);\n\t\t\treturn hasBinarData ? node.binary : node.json;\n\t\t});\n\n\t\tconst parser = outputTypeParsers[endpointType as AllowedEndpointType];\n\t\tif (!parser)\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\traw: contentJson.filter((item): item is IDataObject => item !== undefined),\n\t\t\t\t\tparsedContent: null,\n\t\t\t\t},\n\t\t\t];\n\n\t\tconst parsedOutput = contentJson\n\t\t\t.filter((c): c is IDataObject => c !== undefined)\n\t\t\t.map((c) => ({ raw: c, parsedContent: parser(c) }));\n\t\treturn parsedOutput;\n\t};\n\n\treturn {\n\t\tparseAiRunData,\n\t};\n};\n","<template>\n\t<div :class=\"$style.block\">\n\t\t<header :class=\"$style.blockHeader\" @click=\"onBlockHeaderClick\">\n\t\t\t<button :class=\"$style.blockToggle\">\n\t\t\t\t<font-awesome-icon :icon=\"isExpanded ? 'angle-down' : 'angle-up'\" size=\"lg\" />\n\t\t\t</button>\n\t\t\t<p :class=\"$style.blockTitle\">{{ capitalize(runData.inOut) }}</p>\n\t\t\t<!-- @click.stop to prevent event from bubbling to blockHeader and toggling expanded state when clicking on rawSwitch -->\n\t\t\t<el-switch\n\t\t\t\tv-if=\"contentParsed\"\n\t\t\t\t@click.stop\n\t\t\t\t:class=\"$style.rawSwitch\"\n\t\t\t\tactive-text=\"RAW JSON\"\n\t\t\t\tv-model=\"isShowRaw\"\n\t\t\t/>\n\t\t</header>\n\t\t<main\n\t\t\t:class=\"{\n\t\t\t\t[$style.blockContent]: true,\n\t\t\t\t[$style.blockContentExpanded]: isExpanded,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t:key=\"index\"\n\t\t\t\tv-for=\"({ parsedContent, raw }, index) in parsedRun\"\n\t\t\t\t:class=\"$style.contentText\"\n\t\t\t\t:data-content-type=\"parsedContent?.type\"\n\t\t\t>\n\t\t\t\t<template v-if=\"parsedContent && !isShowRaw\">\n\t\t\t\t\t<template v-if=\"parsedContent.type === 'json'\">\n\t\t\t\t\t\t<vue-markdown\n\t\t\t\t\t\t\t:source=\"jsonToMarkdown(parsedContent.data as JsonMarkdown)\"\n\t\t\t\t\t\t\t:class=\"$style.markdown\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-if=\"parsedContent.type === 'markdown'\">\n\t\t\t\t\t\t<vue-markdown :source=\"parsedContent.data\" :class=\"$style.markdown\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t<p\n\t\t\t\t\t\t:class=\"$style.runText\"\n\t\t\t\t\t\tv-if=\"parsedContent.type === 'text'\"\n\t\t\t\t\t\tv-text=\"parsedContent.data\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<!-- We weren't able to parse text or raw switch -->\n\t\t\t\t<template v-else>\n\t\t\t\t\t<div :class=\"$style.rawContent\">\n\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t:class=\"$style.copyToClipboard\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t@click=\"copyToClipboard(raw)\"\n\t\t\t\t\t\t\t:title=\"$locale.baseText('nodeErrorView.copyToClipboard')\"\n\t\t\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<vue-markdown :source=\"jsonToMarkdown(raw as JsonMarkdown)\" :class=\"$style.markdown\" />\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</main>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { IAiDataContent } from '@/Interface';\nimport { capitalize } from 'lodash-es';\nimport { ref, onMounted } from 'vue';\nimport type { ParsedAiContent } from './useAiContentParsers';\nimport { useAiContentParsers } from './useAiContentParsers';\nimport VueMarkdown from 'vue-markdown-render';\nimport { useCopyToClipboard } from '@/composables/useCopyToClipboard';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport { NodeConnectionType, type IDataObject } from 'n8n-workflow';\n\nconst props = defineProps<{\n\trunData: IAiDataContent;\n}>();\n\nconst i18n = useI18n();\nconst contentParsers = useAiContentParsers();\n// eslint-disable-next-line @typescript-eslint/no-use-before-define\nconst isExpanded = ref(getInitialExpandedState());\nconst isShowRaw = ref(false);\nconst contentParsed = ref(false);\nconst parsedRun = ref(undefined as ParsedAiContent | undefined);\n\nfunction getInitialExpandedState() {\n\tconst collapsedTypes = {\n\t\tinput: [NodeConnectionType.AiDocument, NodeConnectionType.AiTextSplitter],\n\t\toutput: [\n\t\t\tNodeConnectionType.AiDocument,\n\t\t\tNodeConnectionType.AiEmbedding,\n\t\t\tNodeConnectionType.AiTextSplitter,\n\t\t\tNodeConnectionType.AiVectorStore,\n\t\t],\n\t};\n\n\treturn !collapsedTypes[props.runData.inOut].includes(props.runData.type);\n}\n\nfunction parseAiRunData(run: IAiDataContent) {\n\tif (!run.data) {\n\t\treturn;\n\t}\n\tconst parsedData = contentParsers.parseAiRunData(run.data, run.type);\n\n\treturn parsedData;\n}\n\nfunction isMarkdown(content: JsonMarkdown): boolean {\n\tif (typeof content !== 'string') return false;\n\tconst markdownPatterns = [\n\t\t/^# .+/gm, // headers\n\t\t/\\*{1,2}.+\\*{1,2}/g, // emphasis and strong\n\t\t/\\[.+\\]\\(.+\\)/g, // links\n\t\t/```[\\s\\S]+```/g, // code blocks\n\t];\n\n\treturn markdownPatterns.some((pattern) => pattern.test(content));\n}\n\nfunction formatToJsonMarkdown(data: string): string {\n\treturn '```json\\n' + data + '\\n```';\n}\n\ntype JsonMarkdown = string | object | Array<string | object>;\n\nfunction jsonToMarkdown(data: JsonMarkdown): string {\n\tif (isMarkdown(data)) return data as string;\n\n\tif (Array.isArray(data) && data.length && typeof data[0] !== 'number') {\n\t\tconst markdownArray = data.map((item: JsonMarkdown) => jsonToMarkdown(item));\n\n\t\treturn markdownArray.join('\\n\\n').trim();\n\t}\n\n\tif (typeof data === 'string') {\n\t\treturn formatToJsonMarkdown(data);\n\t}\n\n\treturn formatToJsonMarkdown(JSON.stringify(data, null, 2));\n}\n\nfunction setContentParsed(content: ParsedAiContent): void {\n\tcontentParsed.value = !!content.find((item) => {\n\t\tif (item.parsedContent?.parsed === true) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t});\n}\n\nfunction onBlockHeaderClick() {\n\tisExpanded.value = !isExpanded.value;\n}\n\nfunction copyToClipboard(content: IDataObject | IDataObject[]) {\n\tconst copyToClipboardFn = useCopyToClipboard();\n\tconst { showMessage } = useToast();\n\n\ttry {\n\t\tcopyToClipboardFn(JSON.stringify(content, undefined, 2));\n\t\tshowMessage({\n\t\t\ttitle: i18n.baseText('generic.copiedToClipboard'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (err) {}\n}\n\nonMounted(() => {\n\tparsedRun.value = parseAiRunData(props.runData);\n\tif (parsedRun.value) {\n\t\tsetContentParsed(parsedRun.value);\n\t}\n});\n</script>\n\n<style lang=\"scss\" module>\n.copyToClipboard {\n\tposition: absolute;\n\tright: var(--spacing-s);\n\ttop: var(--spacing-s);\n}\n.rawContent {\n\tposition: relative;\n}\n.markdown {\n\t& {\n\t\twhite-space: pre-wrap;\n\n\t\th1 {\n\t\t\tfont-size: var(--font-size-xl);\n\t\t\tline-height: var(--font-line-height-xloose);\n\t\t}\n\n\t\th2 {\n\t\t\tfont-size: var(--font-size-l);\n\t\t\tline-height: var(--font-line-height-loose);\n\t\t}\n\n\t\th3 {\n\t\t\tfont-size: var(--font-size-m);\n\t\t\tline-height: var(--font-line-height-regular);\n\t\t}\n\n\t\tpre {\n\t\t\tbackground-color: var(--color-foreground-light);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t\tline-height: var(--font-line-height-xloose);\n\t\t\tpadding: var(--spacing-s);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\t}\n}\n.contentText {\n\tpadding-top: var(--spacing-s);\n\tfont-size: var(--font-size-xs);\n\t// max-height: 100%;\n}\n.block {\n\tborder: 1px solid var(--color-foreground-base);\n\tbackground: var(--color-background-xlight);\n\tpadding: var(--spacing-xs);\n\tborder-radius: 4px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n.blockContent {\n\theight: 0;\n\toverflow: hidden;\n\n\t&.blockContentExpanded {\n\t\theight: auto;\n\t}\n}\n.runText {\n\tline-height: var(--font-line-height-regular);\n\twhite-space: pre-line;\n}\n.rawSwitch {\n\tmargin-left: auto;\n\n\t& * {\n\t\tfont-size: var(--font-size-2xs);\n\t}\n}\n.blockHeader {\n\tdisplay: flex;\n\tgap: var(--spacing-xs);\n\tcursor: pointer;\n\t/* This hack is needed to make the whole surface of header clickable */\n\tmargin: calc(-1 * var(--spacing-xs));\n\tpadding: var(--spacing-xs);\n\n\t& * {\n\t\tuser-select: none;\n\t}\n}\n.blockTitle {\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-text-dark);\n}\n.blockToggle {\n\tborder: none;\n\tbackground: none;\n\tpadding: 0;\n\tcolor: var(--color-text-base);\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<header :class=\"$style.header\">\n\t\t\t<node-icon\n\t\t\t\tv-if=\"runMeta?.node\"\n\t\t\t\t:class=\"$style.nodeIcon\"\n\t\t\t\t:node-type=\"runMeta.node\"\n\t\t\t\t:size=\"20\"\n\t\t\t/>\n\t\t\t<div :class=\"$style.headerWrap\">\n\t\t\t\t<p :class=\"$style.title\">\n\t\t\t\t\t{{ inputData.node }}\n\t\t\t\t</p>\n\t\t\t\t<ul :class=\"$style.meta\">\n\t\t\t\t\t<li v-if=\"runMeta?.startTimeMs\">{{ runMeta?.executionTimeMs }}ms</li>\n\t\t\t\t\t<li v-if=\"runMeta?.startTimeMs\">\n\t\t\t\t\t\t<n8n-tooltip>\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t{{ new Date(runMeta?.startTimeMs).toLocaleString() }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.startedAt', {\n\t\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\t\tstartTime: new Date(runMeta?.startTimeMs).toLocaleTimeString(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li v-if=\"(consumedTokensSum?.totalTokens ?? 0) > 0\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.tokens', {\n\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\tcount: consumedTokensSum?.totalTokens.toString()!,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t<n8n-info-tip type=\"tooltip\" theme=\"info-light\" tooltipPlacement=\"right\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<n8n-text :bold=\"true\" size=\"small\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('runData.aiContentBlock.tokens.prompt') }}\n\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.tokens', {\n\t\t\t\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\t\t\t\tcount: consumedTokensSum?.promptTokens.toString()!,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t<n8n-text :bold=\"true\" size=\"small\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('runData.aiContentBlock.tokens.completion') }}\n\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.tokens', {\n\t\t\t\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\t\t\t\tcount: consumedTokensSum?.completionTokens.toString()!,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<main :class=\"$style.content\" v-for=\"(run, index) in props.inputData.data\" :key=\"index\">\n\t\t\t<AiRunContentBlock :runData=\"run\" />\n\t\t</main>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { IAiData, IAiDataContent } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type {\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeTypeDescription,\n\tNodeConnectionType,\n} from 'n8n-workflow';\nimport { computed } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport AiRunContentBlock from './AiRunContentBlock.vue';\n\ninterface RunMeta {\n\tstartTimeMs: number;\n\texecutionTimeMs: number;\n\tnode: INodeTypeDescription | null;\n\ttype: 'input' | 'output';\n\tconnectionType: NodeConnectionType;\n}\nconst props = defineProps<{\n\tinputData: IAiData;\n\tcontentIndex: number;\n}>();\n\nconst nodeTypesStore = useNodeTypesStore();\nconst workflowsStore = useWorkflowsStore();\n\ntype TokenUsageData = {\n\tcompletionTokens: number;\n\tpromptTokens: number;\n\ttotalTokens: number;\n};\nconst consumedTokensSum = computed(() => {\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tconst consumedTokensSum1 = outputRun.value?.data?.reduce(\n\t\t(acc: TokenUsageData, curr: INodeExecutionData) => {\n\t\t\tconst response = curr.json?.response as IDataObject;\n\t\t\tconst tokenUsageData = (response?.llmOutput as IDataObject)?.tokenUsage as TokenUsageData;\n\n\t\t\tif (!tokenUsageData) return acc;\n\n\t\t\treturn {\n\t\t\t\tcompletionTokens: acc.completionTokens + tokenUsageData.completionTokens,\n\t\t\t\tpromptTokens: acc.promptTokens + tokenUsageData.promptTokens,\n\t\t\t\ttotalTokens: acc.totalTokens + tokenUsageData.totalTokens,\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\tcompletionTokens: 0,\n\t\t\tpromptTokens: 0,\n\t\t\ttotalTokens: 0,\n\t\t},\n\t);\n\n\treturn consumedTokensSum1;\n});\n\nfunction extractRunMeta(run: IAiDataContent) {\n\tconst uiNode = workflowsStore.getNodeByName(props.inputData.node);\n\tconst nodeType = nodeTypesStore.getNodeType(uiNode?.type ?? '');\n\n\tconst runMeta: RunMeta = {\n\t\tstartTimeMs: run.metadata.startTime,\n\t\texecutionTimeMs: run.metadata.executionTime,\n\t\tnode: nodeType,\n\t\ttype: run.inOut,\n\t\tconnectionType: run.type,\n\t};\n\n\treturn runMeta;\n}\n\nconst outputRun = computed(() => {\n\treturn props.inputData.data.find((r) => r.inOut === 'output');\n});\n\nconst runMeta = computed(() => {\n\tif (outputRun.value === undefined) {\n\t\treturn;\n\t}\n\treturn extractRunMeta(outputRun.value);\n});\n</script>\n\n<style type=\"scss\" module>\n.container {\n\tpadding: 0 var(--spacing-s) var(--spacing-s);\n}\n.nodeIcon {\n\tmargin-top: calc(var(--spacing-3xs) * -1);\n}\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-3xs);\n\tmargin-bottom: var(--spacing-s);\n}\n.headerWrap {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.title {\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: var(--font-size-s);\n\tgap: var(--spacing-3xs);\n\tcolor: var(--color-text-dark);\n}\n.meta {\n\tlist-style: none;\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tfont-size: var(--font-size-xs);\n\n\t& > li:not(:last-child) {\n\t\tborder-right: 1px solid var(--color-text-base);\n\t\tpadding-right: var(--spacing-3xs);\n\t}\n\n\t& > li:not(:first-child) {\n\t\tpadding-left: var(--spacing-3xs);\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"aiData\" :class=\"$style.container\">\n\t\t<div :class=\"{ [$style.tree]: true, [$style.slim]: slim }\">\n\t\t\t<el-tree\n\t\t\t\t:data=\"executionTree\"\n\t\t\t\t:props=\"{ label: 'node' }\"\n\t\t\t\tdefault-expand-all\n\t\t\t\t:indent=\"12\"\n\t\t\t\t@node-click=\"onItemClick\"\n\t\t\t\t:expand-on-click-node=\"false\"\n\t\t\t\tdata-test-id=\"lm-chat-logs-tree\"\n\t\t\t>\n\t\t\t\t<template #default=\"{ node, data }\">\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.treeNode]: true,\n\t\t\t\t\t\t\t[$style.isSelected]: isTreeNodeSelected(data),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:data-tree-depth=\"data.depth\"\n\t\t\t\t\t\t:style=\"{ '--item-depth': data.depth }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t:class=\"$style.treeToggle\"\n\t\t\t\t\t\t\tv-if=\"data.children.length\"\n\t\t\t\t\t\t\t@click=\"toggleTreeItem(node)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<font-awesome-icon :icon=\"node.expanded ? 'angle-down' : 'angle-up'\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<n8n-tooltip :disabled=\"!slim\" placement=\"right\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t{{ node.label }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<span :class=\"$style.leafLabel\">\n\t\t\t\t\t\t\t\t<node-icon :node-type=\"getNodeType(data.node)!\" :size=\"17\" />\n\t\t\t\t\t\t\t\t<span v-text=\"node.label\" v-if=\"!slim\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</el-tree>\n\t\t</div>\n\t\t<div :class=\"$style.runData\">\n\t\t\t<div v-if=\"selectedRun.length === 0\" :class=\"$style.empty\">\n\t\t\t\t<n8n-text size=\"large\">\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('ndv.output.ai.empty', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tnode: props.node.name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-for=\"(data, index) in selectedRun\"\n\t\t\t\t:key=\"`${data.node}__${data.runIndex}__index`\"\n\t\t\t\tdata-test-id=\"lm-chat-logs-entry\"\n\t\t\t>\n\t\t\t\t<RunDataAiContent :inputData=\"data\" :contentIndex=\"index\" />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { Ref } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport type { ITaskSubRunMetadata, ITaskDataConnections } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport type { IAiData, IAiDataContent, INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport RunDataAiContent from './RunDataAiContent.vue';\nimport { ElTree } from 'element-plus';\n\ninterface AIResult {\n\tnode: string;\n\trunIndex: number;\n\tdata: IAiDataContent | undefined;\n}\ninterface TreeNode {\n\tnode: string;\n\tid: string;\n\tchildren: TreeNode[];\n\tdepth: number;\n\tstartTime: number;\n\trunIndex: number;\n}\nexport interface Props {\n\tnode: INodeUi;\n\trunIndex: number;\n\thideTitle?: boolean;\n\tslim?: boolean;\n}\nconst props = withDefaults(defineProps<Props>(), { runIndex: 0 });\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst selectedRun: Ref<IAiData[]> = ref([]);\n\nfunction isTreeNodeSelected(node: TreeNode) {\n\treturn selectedRun.value.some((run) => run.node === node.node && run.runIndex === node.runIndex);\n}\n\nfunction getReferencedData(\n\treference: ITaskSubRunMetadata,\n\twithInput: boolean,\n\twithOutput: boolean,\n): IAiDataContent[] {\n\tconst resultData = workflowsStore.getWorkflowResultDataByNodeName(reference.node);\n\n\tif (!resultData?.[reference.runIndex]) {\n\t\treturn [];\n\t}\n\n\tconst taskData = resultData[reference.runIndex];\n\n\tif (!taskData) {\n\t\treturn [];\n\t}\n\n\tconst returnData: IAiDataContent[] = [];\n\n\tfunction addFunction(data: ITaskDataConnections | undefined, inOut: 'input' | 'output') {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\n\t\tObject.keys(data).map((type) => {\n\t\t\treturnData.push({\n\t\t\t\tdata: data[type][0],\n\t\t\t\tinOut,\n\t\t\t\ttype: type as NodeConnectionType,\n\t\t\t\tmetadata: {\n\t\t\t\t\texecutionTime: taskData.executionTime,\n\t\t\t\t\tstartTime: taskData.startTime,\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t}\n\n\tif (withInput) {\n\t\taddFunction(taskData.inputOverride, 'input');\n\t}\n\tif (withOutput) {\n\t\taddFunction(taskData.data, 'output');\n\t}\n\n\treturn returnData;\n}\n\nfunction toggleTreeItem(node: { expanded: boolean }) {\n\tnode.expanded = !node.expanded;\n}\n\nfunction onItemClick(data: TreeNode) {\n\tconst matchingRun = aiData.value?.find(\n\t\t(run) => run.node === data.node && run.runIndex === data.runIndex,\n\t);\n\tif (!matchingRun) {\n\t\tselectedRun.value = [];\n\n\t\treturn;\n\t}\n\tselectedRun.value = [\n\t\t{\n\t\t\tnode: data.node,\n\t\t\trunIndex: data.runIndex,\n\t\t\tdata: getReferencedData(\n\t\t\t\t{\n\t\t\t\t\tnode: data.node,\n\t\t\t\t\trunIndex: data.runIndex,\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t\ttrue,\n\t\t\t),\n\t\t},\n\t];\n}\n\nfunction getNodeType(nodeName: string) {\n\tconst node = workflowsStore.getNodeByName(nodeName);\n\tif (!node) {\n\t\treturn null;\n\t}\n\tconst nodeType = nodeTypesStore.getNodeType(node?.type);\n\n\treturn nodeType;\n}\n\nfunction selectFirst() {\n\tif (executionTree.value.length && executionTree.value[0].children.length) {\n\t\tonItemClick(executionTree.value[0].children[0]);\n\t}\n}\n\nconst createNode = (\n\tnodeName: string,\n\tcurrentDepth: number,\n\tr?: AIResult,\n\tchildren: TreeNode[] = [],\n): TreeNode => ({\n\tnode: nodeName,\n\tid: nodeName,\n\tdepth: currentDepth,\n\tstartTime: r?.data?.metadata?.startTime ?? 0,\n\trunIndex: r?.runIndex ?? 0,\n\tchildren,\n});\n\nfunction getTreeNodeData(nodeName: string, currentDepth: number): TreeNode[] {\n\tconst { connectionsByDestinationNode } = workflowsStore.getCurrentWorkflow();\n\tconst connections = connectionsByDestinationNode[nodeName];\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tconst resultData = aiData.value?.filter((data) => data.node === nodeName) ?? [];\n\n\tif (!connections) {\n\t\treturn resultData.map((d) => createNode(nodeName, currentDepth, d));\n\t}\n\n\tconst nonMainConnectionsKeys = Object.keys(connections).filter(\n\t\t(key) => key !== NodeConnectionType.Main,\n\t);\n\tconst children = nonMainConnectionsKeys.flatMap((key) =>\n\t\tconnections[key][0].flatMap((node) => getTreeNodeData(node.node, currentDepth + 1)),\n\t);\n\n\tif (resultData.length) {\n\t\treturn resultData.map((r) => createNode(nodeName, currentDepth, r, children));\n\t}\n\n\tchildren.sort((a, b) => a.startTime - b.startTime);\n\n\treturn [createNode(nodeName, currentDepth, undefined, children)];\n}\n\nconst aiData = computed<AIResult[] | undefined>(() => {\n\tconst resultData = workflowsStore.getWorkflowResultDataByNodeName(props.node.name);\n\n\tif (!resultData || !Array.isArray(resultData)) {\n\t\treturn;\n\t}\n\n\tconst subRun = resultData[props.runIndex].metadata?.subRun;\n\tif (!Array.isArray(subRun)) {\n\t\treturn;\n\t}\n\t// Extend the subRun with the data and sort by adding execution time + startTime and comparing them\n\tconst subRunWithData = subRun.flatMap((run) =>\n\t\tgetReferencedData(run, false, true).map((data) => ({ ...run, data })),\n\t);\n\n\tsubRunWithData.sort((a, b) => {\n\t\tconst aTime = a.data?.metadata?.startTime || 0;\n\t\tconst bTime = b.data?.metadata?.startTime || 0;\n\t\treturn aTime - bTime;\n\t});\n\n\treturn subRunWithData;\n});\n\nconst executionTree = computed<TreeNode[]>(() => {\n\tconst rootNode = props.node;\n\n\tconst tree = getTreeNodeData(rootNode.name, 0);\n\treturn tree || [];\n});\n\nwatch(() => props.runIndex, selectFirst, { immediate: true });\n</script>\n\n<style lang=\"scss\" module>\n.treeToggle {\n\tborder: none;\n\tbackground-color: transparent;\n\tpadding: 0 var(--spacing-3xs);\n\tmargin: 0 calc(-1 * var(--spacing-3xs));\n\tcursor: pointer;\n}\n.leafLabel {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-3xs);\n}\n.empty {\n\tpadding: var(--spacing-l);\n}\n.title {\n\tfont-size: var(--font-size-s);\n\tmargin-bottom: var(--spacing-xs);\n}\n.tree {\n\tflex-shrink: 0;\n\tmin-width: 12.8rem;\n\theight: 100%;\n\tborder-right: 1px solid var(--color-foreground-base);\n\tpadding-right: var(--spacing-xs);\n\tpadding-left: var(--spacing-2xs);\n\t&.slim {\n\t\tmin-width: auto;\n\t}\n}\n.runData {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n.container {\n\theight: 100%;\n\tpadding: 0 var(--spacing-xs);\n\tdisplay: flex;\n\n\t:global(.el-tree > .el-tree-node) {\n\t\tposition: relative;\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\ttop: 2rem;\n\t\t\tbottom: 1.2rem;\n\t\t\tleft: 0.75rem;\n\t\t\twidth: 0.125rem;\n\t\t\tbackground-color: var(--color-foreground-base);\n\t\t}\n\t}\n\t:global(.el-tree-node__expand-icon) {\n\t\tdisplay: none;\n\t}\n\t:global(.el-tree) {\n\t\tmargin-left: calc(-1 * var(--spacing-xs));\n\t}\n\t:global(.el-tree-node__content) {\n\t\tmargin-left: var(--spacing-xs);\n\t}\n}\n.isSelected {\n\tbackground-color: var(--color-foreground-base);\n}\n.treeNode {\n\tdisplay: inline-flex;\n\tborder-radius: var(--border-radius-base);\n\talign-items: center;\n\tgap: var(--spacing-3xs);\n\tpadding: var(--spacing-4xs) var(--spacing-3xs);\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-text-dark);\n\tmargin-bottom: var(--spacing-3xs);\n\tcursor: pointer;\n\n\t&:hover {\n\t\tbackground-color: var(--color-foreground-base);\n\t}\n\t&[data-tree-depth='0'] {\n\t\tmargin-left: calc(-1 * var(--spacing-2xs));\n\t}\n\n\t&:after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tmargin: auto;\n\t\tbackground-color: var(--color-foreground-base);\n\t\theight: 0.125rem;\n\t\tleft: 0.75rem;\n\t\twidth: calc(var(--item-depth) * 0.625rem);\n\t}\n}\n</style>\n"],"names":["fallbackParser","execData","outputTypeParsers","NodeConnectionType","response","generation","item","chatHistory","_a","content","message","messageContent","_b","useAiContentParsers","executionData","endpointType","data","contentJson","node","isObjectEmpty","parser","c","i18n","useI18n","contentParsers","isExpanded","ref","getInitialExpandedState","isShowRaw","contentParsed","parsedRun","props","parseAiRunData","run","isMarkdown","pattern","formatToJsonMarkdown","jsonToMarkdown","setContentParsed","onBlockHeaderClick","copyToClipboard","copyToClipboardFn","useCopyToClipboard","showMessage","useToast","onMounted","nodeTypesStore","useNodeTypesStore","workflowsStore","useWorkflowsStore","consumedTokensSum","computed","outputRun","acc","curr","tokenUsageData","extractRunMeta","uiNode","nodeType","runMeta","r","selectedRun","isTreeNodeSelected","getReferencedData","reference","withInput","withOutput","resultData","taskData","returnData","addFunction","inOut","type","toggleTreeItem","onItemClick","aiData","getNodeType","nodeName","selectFirst","executionTree","createNode","currentDepth","children","getTreeNodeData","connectionsByDestinationNode","connections","d","key","a","b","subRun","subRunWithData","aTime","bTime","_d","_c","rootNode","watch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RunDataAi-dgEyN_Yl.js","sources":["../../src/components/RunDataAi/useAiContentParsers.ts","../../src/components/RunDataAi/AiRunContentBlock.vue","../../src/components/RunDataAi/RunDataAiContent.vue","../../src/components/RunDataAi/RunDataAi.vue"],"sourcesContent":["import type { IDataObject, INodeExecutionData } from 'n8n-workflow';\nimport { isObjectEmpty, NodeConnectionType } from 'n8n-workflow';\n\ninterface MemoryMessage {\n\tlc: number;\n\ttype: string;\n\tid: string[];\n\tkwargs: {\n\t\tcontent: unknown;\n\t\tadditional_kwargs: Record<string, unknown>;\n\t};\n}\ninterface LmGeneration {\n\ttext: string;\n\tmessage: MemoryMessage;\n}\n\ntype ExcludedKeys = NodeConnectionType.Main | NodeConnectionType.AiChain;\ntype AllowedEndpointType = Exclude<NodeConnectionType, ExcludedKeys>;\n\nconst fallbackParser = (execData: IDataObject) => ({\n\ttype: 'json' as 'json' | 'text' | 'markdown',\n\tdata: execData,\n\tparsed: false,\n});\n\nconst outputTypeParsers: {\n\t[key in AllowedEndpointType]: (execData: IDataObject) => {\n\t\ttype: 'json' | 'text' | 'markdown';\n\t\tdata: unknown;\n\t\tparsed: boolean;\n\t};\n} = {\n\t[NodeConnectionType.AiLanguageModel](execData: IDataObject) {\n\t\tconst response = (execData.response as IDataObject) ?? execData;\n\t\tif (!response) throw new Error('No response from Language Model');\n\n\t\t// Simple LLM output — single string message item\n\t\tif (\n\t\t\tArray.isArray(response?.messages) &&\n\t\t\tresponse?.messages.length === 1 &&\n\t\t\ttypeof response?.messages[0] === 'string'\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: 'text',\n\t\t\t\tdata: response.messages[0],\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\t\t// Use the memory parser if the response is a memory-like(chat) object\n\t\tif (response.messages && Array.isArray(response.messages)) {\n\t\t\treturn outputTypeParsers[NodeConnectionType.AiMemory](execData);\n\t\t}\n\t\tif (response.generations) {\n\t\t\tconst generations = response.generations as LmGeneration[];\n\n\t\t\tconst content = generations.map((generation) => {\n\t\t\t\tif (generation?.text) return generation.text;\n\n\t\t\t\tif (Array.isArray(generation)) {\n\t\t\t\t\treturn generation\n\t\t\t\t\t\t.map((item: LmGeneration) => item.text ?? item)\n\t\t\t\t\t\t.join('\\n\\n')\n\t\t\t\t\t\t.trim();\n\t\t\t\t}\n\n\t\t\t\treturn generation;\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: content,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'json',\n\t\t\tdata: response,\n\t\t\tparsed: true,\n\t\t};\n\t},\n\t[NodeConnectionType.AiTool]: fallbackParser,\n\t[NodeConnectionType.AiAgent]: fallbackParser,\n\t[NodeConnectionType.AiMemory](execData: IDataObject) {\n\t\tconst chatHistory =\n\t\t\texecData.chatHistory ?? execData.messages ?? execData?.response?.chat_history;\n\t\tif (Array.isArray(chatHistory)) {\n\t\t\tconst responseText = chatHistory\n\t\t\t\t.map((content: MemoryMessage) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcontent.type === 'constructor' &&\n\t\t\t\t\t\tcontent.id?.includes('messages') &&\n\t\t\t\t\t\tcontent.kwargs\n\t\t\t\t\t) {\n\t\t\t\t\t\tinterface MessageContent {\n\t\t\t\t\t\t\ttype: string;\n\t\t\t\t\t\t\timage_url?: {\n\t\t\t\t\t\t\t\turl: string;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet message = content.kwargs.content;\n\t\t\t\t\t\tif (Array.isArray(message)) {\n\t\t\t\t\t\t\tconst messageContent = message[0] as {\n\t\t\t\t\t\t\t\ttype?: string;\n\t\t\t\t\t\t\t\timage_url?: { url: string };\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (messageContent?.type === 'image_url') {\n\t\t\t\t\t\t\t\tmessage = ``;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmessage = message as MessageContent[];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Object.keys(content.kwargs.additional_kwargs).length) {\n\t\t\t\t\t\t\tmessage += ` (${JSON.stringify(content.kwargs.additional_kwargs)})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (content.id.includes('HumanMessage')) {\n\t\t\t\t\t\t\tmessage = `**Human:** ${message.trim()}`;\n\t\t\t\t\t\t} else if (content.id.includes('AIMessage')) {\n\t\t\t\t\t\t\tmessage = `**AI:** ${message}`;\n\t\t\t\t\t\t} else if (content.id.includes('SystemMessage')) {\n\t\t\t\t\t\t\tmessage = `**System Message:** ${message}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (execData.action && execData.action !== 'getMessages') {\n\t\t\t\t\t\t\tmessage = `## Action: ${execData.action}\\n\\n${message}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn message;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t})\n\t\t\t\t.join('\\n\\n');\n\n\t\t\treturn {\n\t\t\t\ttype: 'markdown',\n\t\t\t\tdata: responseText,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiOutputParser]: fallbackParser,\n\t[NodeConnectionType.AiRetriever]: fallbackParser,\n\t[NodeConnectionType.AiVectorStore](execData: IDataObject) {\n\t\tif (execData.documents) {\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: execData.documents,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiEmbedding](execData: IDataObject) {\n\t\tif (execData.documents) {\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: execData.documents,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiDocument](execData: IDataObject) {\n\t\tif (execData.documents) {\n\t\t\treturn {\n\t\t\t\ttype: 'json',\n\t\t\t\tdata: execData.documents,\n\t\t\t\tparsed: true,\n\t\t\t};\n\t\t}\n\n\t\treturn fallbackParser(execData);\n\t},\n\t[NodeConnectionType.AiTextSplitter](execData: IDataObject) {\n\t\tconst arrayData = Array.isArray(execData.response)\n\t\t\t? execData.response\n\t\t\t: [execData.textSplitter];\n\t\treturn {\n\t\t\ttype: 'text',\n\t\t\tdata: arrayData.join('\\n\\n'),\n\t\t\tparsed: true,\n\t\t};\n\t},\n};\nexport type ParsedAiContent = Array<{\n\traw: IDataObject | IDataObject[];\n\tparsedContent: {\n\t\ttype: 'json' | 'text' | 'markdown';\n\t\tdata: unknown;\n\t\tparsed: boolean;\n\t} | null;\n}>;\n\nexport const useAiContentParsers = () => {\n\tconst parseAiRunData = (\n\t\texecutionData: INodeExecutionData[],\n\t\tendpointType: NodeConnectionType,\n\t): ParsedAiContent => {\n\t\tif ([NodeConnectionType.AiChain, NodeConnectionType.Main].includes(endpointType)) {\n\t\t\treturn executionData.map((data) => ({ raw: data.json, parsedContent: null }));\n\t\t}\n\n\t\tconst contentJson = executionData.map((node) => {\n\t\t\tconst hasBinarData = !isObjectEmpty(node.binary);\n\t\t\treturn hasBinarData ? node.binary : node.json;\n\t\t});\n\n\t\tconst parser = outputTypeParsers[endpointType as AllowedEndpointType];\n\t\tif (!parser)\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\traw: contentJson.filter((item): item is IDataObject => item !== undefined),\n\t\t\t\t\tparsedContent: null,\n\t\t\t\t},\n\t\t\t];\n\n\t\tconst parsedOutput = contentJson\n\t\t\t.filter((c): c is IDataObject => c !== undefined)\n\t\t\t.map((c) => ({ raw: c, parsedContent: parser(c) }));\n\t\treturn parsedOutput;\n\t};\n\n\treturn {\n\t\tparseAiRunData,\n\t};\n};\n","<template>\n\t<div :class=\"$style.block\">\n\t\t<header :class=\"$style.blockHeader\" @click=\"onBlockHeaderClick\">\n\t\t\t<button :class=\"$style.blockToggle\">\n\t\t\t\t<font-awesome-icon :icon=\"isExpanded ? 'angle-down' : 'angle-up'\" size=\"lg\" />\n\t\t\t</button>\n\t\t\t<p :class=\"$style.blockTitle\">{{ capitalize(runData.inOut) }}</p>\n\t\t\t<!-- @click.stop to prevent event from bubbling to blockHeader and toggling expanded state when clicking on rawSwitch -->\n\t\t\t<el-switch\n\t\t\t\tv-if=\"contentParsed\"\n\t\t\t\t@click.stop\n\t\t\t\t:class=\"$style.rawSwitch\"\n\t\t\t\tactive-text=\"RAW JSON\"\n\t\t\t\tv-model=\"isShowRaw\"\n\t\t\t/>\n\t\t</header>\n\t\t<main\n\t\t\t:class=\"{\n\t\t\t\t[$style.blockContent]: true,\n\t\t\t\t[$style.blockContentExpanded]: isExpanded,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t:key=\"index\"\n\t\t\t\tv-for=\"({ parsedContent, raw }, index) in parsedRun\"\n\t\t\t\t:class=\"$style.contentText\"\n\t\t\t\t:data-content-type=\"parsedContent?.type\"\n\t\t\t>\n\t\t\t\t<template v-if=\"parsedContent && !isShowRaw\">\n\t\t\t\t\t<template v-if=\"parsedContent.type === 'json'\">\n\t\t\t\t\t\t<vue-markdown\n\t\t\t\t\t\t\t:source=\"jsonToMarkdown(parsedContent.data as JsonMarkdown)\"\n\t\t\t\t\t\t\t:class=\"$style.markdown\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-if=\"parsedContent.type === 'markdown'\">\n\t\t\t\t\t\t<vue-markdown :source=\"parsedContent.data\" :class=\"$style.markdown\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t<p\n\t\t\t\t\t\t:class=\"$style.runText\"\n\t\t\t\t\t\tv-if=\"parsedContent.type === 'text'\"\n\t\t\t\t\t\tv-text=\"parsedContent.data\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<!-- We weren't able to parse text or raw switch -->\n\t\t\t\t<template v-else>\n\t\t\t\t\t<div :class=\"$style.rawContent\">\n\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t:class=\"$style.copyToClipboard\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t@click=\"copyToClipboard(raw)\"\n\t\t\t\t\t\t\t:title=\"$locale.baseText('nodeErrorView.copyToClipboard')\"\n\t\t\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<vue-markdown :source=\"jsonToMarkdown(raw as JsonMarkdown)\" :class=\"$style.markdown\" />\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</main>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { IAiDataContent } from '@/Interface';\nimport { capitalize } from 'lodash-es';\nimport { ref, onMounted } from 'vue';\nimport type { ParsedAiContent } from './useAiContentParsers';\nimport { useAiContentParsers } from './useAiContentParsers';\nimport VueMarkdown from 'vue-markdown-render';\nimport { useCopyToClipboard } from '@/composables/useCopyToClipboard';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport { NodeConnectionType, type IDataObject } from 'n8n-workflow';\n\nconst props = defineProps<{\n\trunData: IAiDataContent;\n}>();\n\nconst i18n = useI18n();\nconst contentParsers = useAiContentParsers();\n// eslint-disable-next-line @typescript-eslint/no-use-before-define\nconst isExpanded = ref(getInitialExpandedState());\nconst isShowRaw = ref(false);\nconst contentParsed = ref(false);\nconst parsedRun = ref(undefined as ParsedAiContent | undefined);\n\nfunction getInitialExpandedState() {\n\tconst collapsedTypes = {\n\t\tinput: [NodeConnectionType.AiDocument, NodeConnectionType.AiTextSplitter],\n\t\toutput: [\n\t\t\tNodeConnectionType.AiDocument,\n\t\t\tNodeConnectionType.AiEmbedding,\n\t\t\tNodeConnectionType.AiTextSplitter,\n\t\t\tNodeConnectionType.AiVectorStore,\n\t\t],\n\t};\n\n\treturn !collapsedTypes[props.runData.inOut].includes(props.runData.type);\n}\n\nfunction parseAiRunData(run: IAiDataContent) {\n\tif (!run.data) {\n\t\treturn;\n\t}\n\tconst parsedData = contentParsers.parseAiRunData(run.data, run.type);\n\n\treturn parsedData;\n}\n\nfunction isMarkdown(content: JsonMarkdown): boolean {\n\tif (typeof content !== 'string') return false;\n\tconst markdownPatterns = [\n\t\t/^# .+/gm, // headers\n\t\t/\\*{1,2}.+\\*{1,2}/g, // emphasis and strong\n\t\t/\\[.+\\]\\(.+\\)/g, // links\n\t\t/```[\\s\\S]+```/g, // code blocks\n\t];\n\n\treturn markdownPatterns.some((pattern) => pattern.test(content));\n}\n\nfunction formatToJsonMarkdown(data: string): string {\n\treturn '```json\\n' + data + '\\n```';\n}\n\ntype JsonMarkdown = string | object | Array<string | object>;\n\nfunction jsonToMarkdown(data: JsonMarkdown): string {\n\tif (isMarkdown(data)) return data as string;\n\n\tif (Array.isArray(data) && data.length && typeof data[0] !== 'number') {\n\t\tconst markdownArray = data.map((item: JsonMarkdown) => jsonToMarkdown(item));\n\n\t\treturn markdownArray.join('\\n\\n').trim();\n\t}\n\n\tif (typeof data === 'string') {\n\t\treturn formatToJsonMarkdown(data);\n\t}\n\n\treturn formatToJsonMarkdown(JSON.stringify(data, null, 2));\n}\n\nfunction setContentParsed(content: ParsedAiContent): void {\n\tcontentParsed.value = !!content.find((item) => {\n\t\tif (item.parsedContent?.parsed === true) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t});\n}\n\nfunction onBlockHeaderClick() {\n\tisExpanded.value = !isExpanded.value;\n}\n\nfunction copyToClipboard(content: IDataObject | IDataObject[]) {\n\tconst copyToClipboardFn = useCopyToClipboard();\n\tconst { showMessage } = useToast();\n\n\ttry {\n\t\tcopyToClipboardFn(JSON.stringify(content, undefined, 2));\n\t\tshowMessage({\n\t\t\ttitle: i18n.baseText('generic.copiedToClipboard'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (err) {}\n}\n\nonMounted(() => {\n\tparsedRun.value = parseAiRunData(props.runData);\n\tif (parsedRun.value) {\n\t\tsetContentParsed(parsedRun.value);\n\t}\n});\n</script>\n\n<style lang=\"scss\" module>\n.copyToClipboard {\n\tposition: absolute;\n\tright: var(--spacing-s);\n\ttop: var(--spacing-s);\n}\n.rawContent {\n\tposition: relative;\n}\n.markdown {\n\t& {\n\t\twhite-space: pre-wrap;\n\n\t\th1 {\n\t\t\tfont-size: var(--font-size-xl);\n\t\t\tline-height: var(--font-line-height-xloose);\n\t\t}\n\n\t\th2 {\n\t\t\tfont-size: var(--font-size-l);\n\t\t\tline-height: var(--font-line-height-loose);\n\t\t}\n\n\t\th3 {\n\t\t\tfont-size: var(--font-size-m);\n\t\t\tline-height: var(--font-line-height-regular);\n\t\t}\n\n\t\tpre {\n\t\t\tbackground-color: var(--color-foreground-light);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t\tline-height: var(--font-line-height-xloose);\n\t\t\tpadding: var(--spacing-s);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\t}\n}\n.contentText {\n\tpadding-top: var(--spacing-s);\n\tfont-size: var(--font-size-xs);\n\t// max-height: 100%;\n}\n.block {\n\tborder: 1px solid var(--color-foreground-base);\n\tbackground: var(--color-background-xlight);\n\tpadding: var(--spacing-xs);\n\tborder-radius: 4px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n.blockContent {\n\theight: 0;\n\toverflow: hidden;\n\n\t&.blockContentExpanded {\n\t\theight: auto;\n\t}\n}\n.runText {\n\tline-height: var(--font-line-height-regular);\n\twhite-space: pre-line;\n}\n.rawSwitch {\n\tmargin-left: auto;\n\n\t& * {\n\t\tfont-size: var(--font-size-2xs);\n\t}\n}\n.blockHeader {\n\tdisplay: flex;\n\tgap: var(--spacing-xs);\n\tcursor: pointer;\n\t/* This hack is needed to make the whole surface of header clickable */\n\tmargin: calc(-1 * var(--spacing-xs));\n\tpadding: var(--spacing-xs);\n\n\t& * {\n\t\tuser-select: none;\n\t}\n}\n.blockTitle {\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-text-dark);\n}\n.blockToggle {\n\tborder: none;\n\tbackground: none;\n\tpadding: 0;\n\tcolor: var(--color-text-base);\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<header :class=\"$style.header\">\n\t\t\t<node-icon\n\t\t\t\tv-if=\"runMeta?.node\"\n\t\t\t\t:class=\"$style.nodeIcon\"\n\t\t\t\t:node-type=\"runMeta.node\"\n\t\t\t\t:size=\"20\"\n\t\t\t/>\n\t\t\t<div :class=\"$style.headerWrap\">\n\t\t\t\t<p :class=\"$style.title\">\n\t\t\t\t\t{{ inputData.node }}\n\t\t\t\t</p>\n\t\t\t\t<ul :class=\"$style.meta\">\n\t\t\t\t\t<li v-if=\"runMeta?.startTimeMs\">{{ runMeta?.executionTimeMs }}ms</li>\n\t\t\t\t\t<li v-if=\"runMeta?.startTimeMs\">\n\t\t\t\t\t\t<n8n-tooltip>\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t{{ new Date(runMeta?.startTimeMs).toLocaleString() }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.startedAt', {\n\t\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\t\tstartTime: new Date(runMeta?.startTimeMs).toLocaleTimeString(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li v-if=\"(consumedTokensSum?.totalTokens ?? 0) > 0\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.tokens', {\n\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\tcount: consumedTokensSum?.totalTokens.toString()!,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t<n8n-info-tip type=\"tooltip\" theme=\"info-light\" tooltipPlacement=\"right\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<n8n-text :bold=\"true\" size=\"small\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('runData.aiContentBlock.tokens.prompt') }}\n\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.tokens', {\n\t\t\t\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\t\t\t\tcount: consumedTokensSum?.promptTokens.toString()!,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t<n8n-text :bold=\"true\" size=\"small\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('runData.aiContentBlock.tokens.completion') }}\n\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t$locale.baseText('runData.aiContentBlock.tokens', {\n\t\t\t\t\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\t\t\t\t\tcount: consumedTokensSum?.completionTokens.toString()!,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<main :class=\"$style.content\" v-for=\"(run, index) in props.inputData.data\" :key=\"index\">\n\t\t\t<AiRunContentBlock :runData=\"run\" />\n\t\t</main>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { IAiData, IAiDataContent } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type {\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeTypeDescription,\n\tNodeConnectionType,\n} from 'n8n-workflow';\nimport { computed } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport AiRunContentBlock from './AiRunContentBlock.vue';\n\ninterface RunMeta {\n\tstartTimeMs: number;\n\texecutionTimeMs: number;\n\tnode: INodeTypeDescription | null;\n\ttype: 'input' | 'output';\n\tconnectionType: NodeConnectionType;\n}\nconst props = defineProps<{\n\tinputData: IAiData;\n\tcontentIndex: number;\n}>();\n\nconst nodeTypesStore = useNodeTypesStore();\nconst workflowsStore = useWorkflowsStore();\n\ntype TokenUsageData = {\n\tcompletionTokens: number;\n\tpromptTokens: number;\n\ttotalTokens: number;\n};\nconst consumedTokensSum = computed(() => {\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tconst consumedTokensSum1 = outputRun.value?.data?.reduce(\n\t\t(acc: TokenUsageData, curr: INodeExecutionData) => {\n\t\t\tconst response = curr.json?.response as IDataObject;\n\t\t\tconst tokenUsageData = (response?.llmOutput as IDataObject)?.tokenUsage as TokenUsageData;\n\n\t\t\tif (!tokenUsageData) return acc;\n\n\t\t\treturn {\n\t\t\t\tcompletionTokens: acc.completionTokens + tokenUsageData.completionTokens,\n\t\t\t\tpromptTokens: acc.promptTokens + tokenUsageData.promptTokens,\n\t\t\t\ttotalTokens: acc.totalTokens + tokenUsageData.totalTokens,\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\tcompletionTokens: 0,\n\t\t\tpromptTokens: 0,\n\t\t\ttotalTokens: 0,\n\t\t},\n\t);\n\n\treturn consumedTokensSum1;\n});\n\nfunction extractRunMeta(run: IAiDataContent) {\n\tconst uiNode = workflowsStore.getNodeByName(props.inputData.node);\n\tconst nodeType = nodeTypesStore.getNodeType(uiNode?.type ?? '');\n\n\tconst runMeta: RunMeta = {\n\t\tstartTimeMs: run.metadata.startTime,\n\t\texecutionTimeMs: run.metadata.executionTime,\n\t\tnode: nodeType,\n\t\ttype: run.inOut,\n\t\tconnectionType: run.type,\n\t};\n\n\treturn runMeta;\n}\n\nconst outputRun = computed(() => {\n\treturn props.inputData.data.find((r) => r.inOut === 'output');\n});\n\nconst runMeta = computed(() => {\n\tif (outputRun.value === undefined) {\n\t\treturn;\n\t}\n\treturn extractRunMeta(outputRun.value);\n});\n</script>\n\n<style type=\"scss\" module>\n.container {\n\tpadding: 0 var(--spacing-s) var(--spacing-s);\n}\n.nodeIcon {\n\tmargin-top: calc(var(--spacing-3xs) * -1);\n}\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-3xs);\n\tmargin-bottom: var(--spacing-s);\n}\n.headerWrap {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.title {\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: var(--font-size-s);\n\tgap: var(--spacing-3xs);\n\tcolor: var(--color-text-dark);\n}\n.meta {\n\tlist-style: none;\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tfont-size: var(--font-size-xs);\n\n\t& > li:not(:last-child) {\n\t\tborder-right: 1px solid var(--color-text-base);\n\t\tpadding-right: var(--spacing-3xs);\n\t}\n\n\t& > li:not(:first-child) {\n\t\tpadding-left: var(--spacing-3xs);\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"aiData\" :class=\"$style.container\">\n\t\t<div :class=\"{ [$style.tree]: true, [$style.slim]: slim }\">\n\t\t\t<el-tree\n\t\t\t\t:data=\"executionTree\"\n\t\t\t\t:props=\"{ label: 'node' }\"\n\t\t\t\tdefault-expand-all\n\t\t\t\t:indent=\"12\"\n\t\t\t\t@node-click=\"onItemClick\"\n\t\t\t\t:expand-on-click-node=\"false\"\n\t\t\t\tdata-test-id=\"lm-chat-logs-tree\"\n\t\t\t>\n\t\t\t\t<template #default=\"{ node, data }\">\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.treeNode]: true,\n\t\t\t\t\t\t\t[$style.isSelected]: isTreeNodeSelected(data),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:data-tree-depth=\"data.depth\"\n\t\t\t\t\t\t:style=\"{ '--item-depth': data.depth }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t:class=\"$style.treeToggle\"\n\t\t\t\t\t\t\tv-if=\"data.children.length\"\n\t\t\t\t\t\t\t@click=\"toggleTreeItem(node)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<font-awesome-icon :icon=\"node.expanded ? 'angle-down' : 'angle-up'\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<n8n-tooltip :disabled=\"!slim\" placement=\"right\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t{{ node.label }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<span :class=\"$style.leafLabel\">\n\t\t\t\t\t\t\t\t<node-icon :node-type=\"getNodeType(data.node)!\" :size=\"17\" />\n\t\t\t\t\t\t\t\t<span v-text=\"node.label\" v-if=\"!slim\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</el-tree>\n\t\t</div>\n\t\t<div :class=\"$style.runData\">\n\t\t\t<div v-if=\"selectedRun.length === 0\" :class=\"$style.empty\">\n\t\t\t\t<n8n-text size=\"large\">\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('ndv.output.ai.empty', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tnode: props.node.name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-for=\"(data, index) in selectedRun\"\n\t\t\t\t:key=\"`${data.node}__${data.runIndex}__index`\"\n\t\t\t\tdata-test-id=\"lm-chat-logs-entry\"\n\t\t\t>\n\t\t\t\t<RunDataAiContent :inputData=\"data\" :contentIndex=\"index\" />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { Ref } from 'vue';\nimport { computed, ref, watch } from 'vue';\nimport type { ITaskSubRunMetadata, ITaskDataConnections } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport type { IAiData, IAiDataContent, INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport RunDataAiContent from './RunDataAiContent.vue';\nimport { ElTree } from 'element-plus';\n\ninterface AIResult {\n\tnode: string;\n\trunIndex: number;\n\tdata: IAiDataContent | undefined;\n}\ninterface TreeNode {\n\tnode: string;\n\tid: string;\n\tchildren: TreeNode[];\n\tdepth: number;\n\tstartTime: number;\n\trunIndex: number;\n}\nexport interface Props {\n\tnode: INodeUi;\n\trunIndex: number;\n\thideTitle?: boolean;\n\tslim?: boolean;\n}\nconst props = withDefaults(defineProps<Props>(), { runIndex: 0 });\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst selectedRun: Ref<IAiData[]> = ref([]);\n\nfunction isTreeNodeSelected(node: TreeNode) {\n\treturn selectedRun.value.some((run) => run.node === node.node && run.runIndex === node.runIndex);\n}\n\nfunction getReferencedData(\n\treference: ITaskSubRunMetadata,\n\twithInput: boolean,\n\twithOutput: boolean,\n): IAiDataContent[] {\n\tconst resultData = workflowsStore.getWorkflowResultDataByNodeName(reference.node);\n\n\tif (!resultData?.[reference.runIndex]) {\n\t\treturn [];\n\t}\n\n\tconst taskData = resultData[reference.runIndex];\n\n\tif (!taskData) {\n\t\treturn [];\n\t}\n\n\tconst returnData: IAiDataContent[] = [];\n\n\tfunction addFunction(data: ITaskDataConnections | undefined, inOut: 'input' | 'output') {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\n\t\tObject.keys(data).map((type) => {\n\t\t\treturnData.push({\n\t\t\t\tdata: data[type][0],\n\t\t\t\tinOut,\n\t\t\t\ttype: type as NodeConnectionType,\n\t\t\t\tmetadata: {\n\t\t\t\t\texecutionTime: taskData.executionTime,\n\t\t\t\t\tstartTime: taskData.startTime,\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t}\n\n\tif (withInput) {\n\t\taddFunction(taskData.inputOverride, 'input');\n\t}\n\tif (withOutput) {\n\t\taddFunction(taskData.data, 'output');\n\t}\n\n\treturn returnData;\n}\n\nfunction toggleTreeItem(node: { expanded: boolean }) {\n\tnode.expanded = !node.expanded;\n}\n\nfunction onItemClick(data: TreeNode) {\n\tconst matchingRun = aiData.value?.find(\n\t\t(run) => run.node === data.node && run.runIndex === data.runIndex,\n\t);\n\tif (!matchingRun) {\n\t\tselectedRun.value = [];\n\n\t\treturn;\n\t}\n\tselectedRun.value = [\n\t\t{\n\t\t\tnode: data.node,\n\t\t\trunIndex: data.runIndex,\n\t\t\tdata: getReferencedData(\n\t\t\t\t{\n\t\t\t\t\tnode: data.node,\n\t\t\t\t\trunIndex: data.runIndex,\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t\ttrue,\n\t\t\t),\n\t\t},\n\t];\n}\n\nfunction getNodeType(nodeName: string) {\n\tconst node = workflowsStore.getNodeByName(nodeName);\n\tif (!node) {\n\t\treturn null;\n\t}\n\tconst nodeType = nodeTypesStore.getNodeType(node?.type);\n\n\treturn nodeType;\n}\n\nfunction selectFirst() {\n\tif (executionTree.value.length && executionTree.value[0].children.length) {\n\t\tonItemClick(executionTree.value[0].children[0]);\n\t}\n}\n\nconst createNode = (\n\tnodeName: string,\n\tcurrentDepth: number,\n\tr?: AIResult,\n\tchildren: TreeNode[] = [],\n): TreeNode => ({\n\tnode: nodeName,\n\tid: nodeName,\n\tdepth: currentDepth,\n\tstartTime: r?.data?.metadata?.startTime ?? 0,\n\trunIndex: r?.runIndex ?? 0,\n\tchildren,\n});\n\nfunction getTreeNodeData(nodeName: string, currentDepth: number): TreeNode[] {\n\tconst { connectionsByDestinationNode } = workflowsStore.getCurrentWorkflow();\n\tconst connections = connectionsByDestinationNode[nodeName];\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tconst resultData = aiData.value?.filter((data) => data.node === nodeName) ?? [];\n\n\tif (!connections) {\n\t\treturn resultData.map((d) => createNode(nodeName, currentDepth, d));\n\t}\n\n\tconst nonMainConnectionsKeys = Object.keys(connections).filter(\n\t\t(key) => key !== NodeConnectionType.Main,\n\t);\n\tconst children = nonMainConnectionsKeys.flatMap((key) =>\n\t\tconnections[key][0].flatMap((node) => getTreeNodeData(node.node, currentDepth + 1)),\n\t);\n\n\tif (resultData.length) {\n\t\treturn resultData.map((r) => createNode(nodeName, currentDepth, r, children));\n\t}\n\n\tchildren.sort((a, b) => a.startTime - b.startTime);\n\n\treturn [createNode(nodeName, currentDepth, undefined, children)];\n}\n\nconst aiData = computed<AIResult[] | undefined>(() => {\n\tconst resultData = workflowsStore.getWorkflowResultDataByNodeName(props.node.name);\n\n\tif (!resultData || !Array.isArray(resultData)) {\n\t\treturn;\n\t}\n\n\tconst subRun = resultData[props.runIndex].metadata?.subRun;\n\tif (!Array.isArray(subRun)) {\n\t\treturn;\n\t}\n\t// Extend the subRun with the data and sort by adding execution time + startTime and comparing them\n\tconst subRunWithData = subRun.flatMap((run) =>\n\t\tgetReferencedData(run, false, true).map((data) => ({ ...run, data })),\n\t);\n\n\tsubRunWithData.sort((a, b) => {\n\t\tconst aTime = a.data?.metadata?.startTime || 0;\n\t\tconst bTime = b.data?.metadata?.startTime || 0;\n\t\treturn aTime - bTime;\n\t});\n\n\treturn subRunWithData;\n});\n\nconst executionTree = computed<TreeNode[]>(() => {\n\tconst rootNode = props.node;\n\n\tconst tree = getTreeNodeData(rootNode.name, 0);\n\treturn tree || [];\n});\n\nwatch(() => props.runIndex, selectFirst, { immediate: true });\n</script>\n\n<style lang=\"scss\" module>\n.treeToggle {\n\tborder: none;\n\tbackground-color: transparent;\n\tpadding: 0 var(--spacing-3xs);\n\tmargin: 0 calc(-1 * var(--spacing-3xs));\n\tcursor: pointer;\n}\n.leafLabel {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-3xs);\n}\n.empty {\n\tpadding: var(--spacing-l);\n}\n.title {\n\tfont-size: var(--font-size-s);\n\tmargin-bottom: var(--spacing-xs);\n}\n.tree {\n\tflex-shrink: 0;\n\tmin-width: 12.8rem;\n\theight: 100%;\n\tborder-right: 1px solid var(--color-foreground-base);\n\tpadding-right: var(--spacing-xs);\n\tpadding-left: var(--spacing-2xs);\n\t&.slim {\n\t\tmin-width: auto;\n\t}\n}\n.runData {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n.container {\n\theight: 100%;\n\tpadding: 0 var(--spacing-xs);\n\tdisplay: flex;\n\n\t:global(.el-tree > .el-tree-node) {\n\t\tposition: relative;\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\ttop: 2rem;\n\t\t\tbottom: 1.2rem;\n\t\t\tleft: 0.75rem;\n\t\t\twidth: 0.125rem;\n\t\t\tbackground-color: var(--color-foreground-base);\n\t\t}\n\t}\n\t:global(.el-tree-node__expand-icon) {\n\t\tdisplay: none;\n\t}\n\t:global(.el-tree) {\n\t\tmargin-left: calc(-1 * var(--spacing-xs));\n\t}\n\t:global(.el-tree-node__content) {\n\t\tmargin-left: var(--spacing-xs);\n\t}\n}\n.isSelected {\n\tbackground-color: var(--color-foreground-base);\n}\n.treeNode {\n\tdisplay: inline-flex;\n\tborder-radius: var(--border-radius-base);\n\talign-items: center;\n\tgap: var(--spacing-3xs);\n\tpadding: var(--spacing-4xs) var(--spacing-3xs);\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-text-dark);\n\tmargin-bottom: var(--spacing-3xs);\n\tcursor: pointer;\n\n\t&:hover {\n\t\tbackground-color: var(--color-foreground-base);\n\t}\n\t&[data-tree-depth='0'] {\n\t\tmargin-left: calc(-1 * var(--spacing-2xs));\n\t}\n\n\t&:after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tmargin: auto;\n\t\tbackground-color: var(--color-foreground-base);\n\t\theight: 0.125rem;\n\t\tleft: 0.75rem;\n\t\twidth: calc(var(--item-depth) * 0.625rem);\n\t}\n}\n</style>\n"],"names":["fallbackParser","execData","outputTypeParsers","NodeConnectionType","response","generation","item","chatHistory","_a","content","message","messageContent","_b","useAiContentParsers","executionData","endpointType","data","contentJson","node","isObjectEmpty","parser","c","i18n","useI18n","contentParsers","isExpanded","ref","getInitialExpandedState","isShowRaw","contentParsed","parsedRun","props","parseAiRunData","run","isMarkdown","pattern","formatToJsonMarkdown","jsonToMarkdown","setContentParsed","onBlockHeaderClick","copyToClipboard","copyToClipboardFn","useCopyToClipboard","showMessage","useToast","onMounted","nodeTypesStore","useNodeTypesStore","workflowsStore","useWorkflowsStore","consumedTokensSum","computed","outputRun","acc","curr","tokenUsageData","extractRunMeta","uiNode","nodeType","runMeta","r","selectedRun","isTreeNodeSelected","getReferencedData","reference","withInput","withOutput","resultData","taskData","returnData","addFunction","inOut","type","toggleTreeItem","onItemClick","aiData","getNodeType","nodeName","selectFirst","executionTree","createNode","currentDepth","children","getTreeNodeData","connectionsByDestinationNode","connections","d","key","a","b","subRun","subRunWithData","aTime","bTime","_d","_c","rootNode","watch"],"mappings":"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"}
|