n8n-editor-ui 1.47.1 → 1.47.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +76 -76
- package/dist/assets/{AuthView-CMxdNKZJ.js → AuthView-B_jZMnGj.js} +2 -2
- package/dist/assets/{AuthView-CMxdNKZJ.js.map → AuthView-B_jZMnGj.js.map} +1 -1
- package/dist/assets/{CanvasControls-3FMjwMqA.js → CanvasControls-ns1B0A0j.js} +2 -2
- package/dist/assets/{CanvasControls-3FMjwMqA.js.map → CanvasControls-ns1B0A0j.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-_NkkcUVb.js → ChangePasswordView-BDsuHv0B.js} +2 -2
- package/dist/assets/{ChangePasswordView-_NkkcUVb.js.map → ChangePasswordView-BDsuHv0B.js.map} +1 -1
- package/dist/assets/{CollectionParameter-BXMOfisf.js → CollectionParameter-Br-xtutZ.js} +2 -2
- package/dist/assets/CollectionParameter-Br-xtutZ.js.map +1 -0
- package/dist/assets/{CredentialsView-B2UF3tK_.js → CredentialsView-DnJ_jhDo.js} +2 -2
- package/dist/assets/{CredentialsView-B2UF3tK_.js.map → CredentialsView-DnJ_jhDo.js.map} +1 -1
- package/dist/assets/{ErrorView-B_lpOlen.js → ErrorView-BfV5e5ko.js} +2 -2
- package/dist/assets/{ErrorView-B_lpOlen.js.map → ErrorView-BfV5e5ko.js.map} +1 -1
- package/dist/assets/{ExecutionsFilter-dNFZor7l.js → ExecutionsFilter-0XcXH83H.js} +2 -2
- package/dist/assets/{ExecutionsFilter-dNFZor7l.js.map → ExecutionsFilter-0XcXH83H.js.map} +1 -1
- package/dist/assets/{ExecutionsView-BYe-KERG.js → ExecutionsView-aFiZuLVt.js} +2 -2
- package/dist/assets/{ExecutionsView-BYe-KERG.js.map → ExecutionsView-aFiZuLVt.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-D97J06wc.js → ForgotMyPasswordView-64X9tXq4.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-D97J06wc.js.map → ForgotMyPasswordView-64X9tXq4.js.map} +1 -1
- package/dist/assets/{MainHeader-CT4nF2mY.js → MainHeader-Ch0Iz_7s.js} +2 -2
- package/dist/assets/{MainHeader-CT4nF2mY.js.map → MainHeader-Ch0Iz_7s.js.map} +1 -1
- package/dist/assets/{MainSidebar-CTg5wPzP.js → MainSidebar-3ee-tTgz.js} +2 -2
- package/dist/assets/{MainSidebar-CTg5wPzP.js.map → MainSidebar-3ee-tTgz.js.map} +1 -1
- package/dist/assets/{NodeCreation-BF_L2-99.js → NodeCreation-PrQGENrl.js} +3 -3
- package/dist/assets/{NodeCreation-BF_L2-99.js.map → NodeCreation-PrQGENrl.js.map} +1 -1
- package/dist/assets/{NodeCreator-B_yCtSu6.js → NodeCreator-DlK1669m.js} +2 -2
- package/dist/assets/{NodeCreator-B_yCtSu6.js.map → NodeCreator-DlK1669m.js.map} +1 -1
- package/dist/assets/{NodeDetailsView-ggolOsHM.js → NodeDetailsView-DcV7LI-g.js} +4 -4
- package/dist/assets/{NodeDetailsView-ggolOsHM.js.map → NodeDetailsView-DcV7LI-g.js.map} +1 -1
- package/dist/assets/{NodeView-B2MlTl6g.js → NodeView-D_kbUfVN.js} +3 -3
- package/dist/assets/{NodeView-B2MlTl6g.js.map → NodeView-D_kbUfVN.js.map} +1 -1
- package/dist/assets/{NodeView.v2-D_CKj9CS.js → NodeView.v2-D_Wbnl01.js} +3 -3
- package/dist/assets/{NodeView.v2-D_CKj9CS.js.map → NodeView.v2-D_Wbnl01.js.map} +1 -1
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js} +2 -2
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js.map} +1 -1
- package/dist/assets/{ProjectSettings-DpJesEZX.js → ProjectSettings-CfcplqBX.js} +2 -2
- package/dist/assets/{ProjectSettings-DpJesEZX.js.map → ProjectSettings-CfcplqBX.js.map} +1 -1
- package/dist/assets/{ProjectTabs-D7nNxtFO.js → ProjectTabs-5ZO9YR8J.js} +2 -2
- package/dist/assets/{ProjectTabs-D7nNxtFO.js.map → ProjectTabs-5ZO9YR8J.js.map} +1 -1
- package/dist/assets/{PushConnectionTracker-YJuy57g2.js → PushConnectionTracker-Bp-RjnYr.js} +2 -2
- package/dist/assets/{PushConnectionTracker-YJuy57g2.js.map → PushConnectionTracker-Bp-RjnYr.js.map} +1 -1
- package/dist/assets/{ResourcesListLayout-mZ4ijKRB.js → ResourcesListLayout-B4W1PSHT.js} +2 -2
- package/dist/assets/{ResourcesListLayout-mZ4ijKRB.js.map → ResourcesListLayout-B4W1PSHT.js.map} +1 -1
- package/dist/assets/{RunDataAi-D0m0Vg_p.js → RunDataAi-C3XiqNZa.js} +2 -2
- package/dist/assets/{RunDataAi-D0m0Vg_p.js.map → RunDataAi-C3XiqNZa.js.map} +1 -1
- package/dist/assets/{RunDataJson-DkHNIqVj.js → RunDataJson-CMcOD-78.js} +3 -3
- package/dist/assets/{RunDataJson-DkHNIqVj.js.map → RunDataJson-CMcOD-78.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-Cgxcpw8t.js → RunDataJsonActions-BQBpmtOi.js} +2 -2
- package/dist/assets/{RunDataJsonActions-Cgxcpw8t.js.map → RunDataJsonActions-BQBpmtOi.js.map} +1 -1
- package/dist/assets/{RunDataSchema-C6aZoC0a.js → RunDataSchema-CF4YH-8y.js} +2 -2
- package/dist/assets/{RunDataSchema-C6aZoC0a.js.map → RunDataSchema-CF4YH-8y.js.map} +1 -1
- package/dist/assets/{RunDataSearch-D2CDg21N.js → RunDataSearch-DwB8g_cE.js} +2 -2
- package/dist/assets/{RunDataSearch-D2CDg21N.js.map → RunDataSearch-DwB8g_cE.js.map} +1 -1
- package/dist/assets/{RunDataTable-D597NRFD.js → RunDataTable-BVAuNDP9.js} +2 -2
- package/dist/assets/{RunDataTable-D597NRFD.js.map → RunDataTable-BVAuNDP9.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-Me669myi.js → SamlOnboarding-Csd8l-7T.js} +2 -2
- package/dist/assets/{SamlOnboarding-Me669myi.js.map → SamlOnboarding-Csd8l-7T.js.map} +1 -1
- package/dist/assets/{SettingsApiView-DV8pIHDw.js → SettingsApiView-DnvdV7dx.js} +2 -2
- package/dist/assets/{SettingsApiView-DV8pIHDw.js.map → SettingsApiView-DnvdV7dx.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-D_gtSdk3.js → SettingsCommunityNodesView-C11a_Ybs.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-D_gtSdk3.js.map → SettingsCommunityNodesView-C11a_Ybs.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-xprYKjAW.js → SettingsExternalSecrets-IIReUcRG.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-xprYKjAW.js.map → SettingsExternalSecrets-IIReUcRG.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-CKaSOYh5.js → SettingsFakeDoorView-BOUfBJS8.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-CKaSOYh5.js.map → SettingsFakeDoorView-BOUfBJS8.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-BBCv2tmk.js → SettingsLdapView-BaSjQ4cy.js} +2 -2
- package/dist/assets/{SettingsLdapView-BBCv2tmk.js.map → SettingsLdapView-BaSjQ4cy.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-HRIp8kyL.js → SettingsLogStreamingView-COGhA1hN.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-HRIp8kyL.js.map → SettingsLogStreamingView-COGhA1hN.js.map} +1 -1
- package/dist/assets/{SettingsPersonalView-CsUb3SvK.js → SettingsPersonalView-BJGgPTwa.js} +2 -2
- package/dist/assets/{SettingsPersonalView-CsUb3SvK.js.map → SettingsPersonalView-BJGgPTwa.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-BkPpVGsk.js → SettingsSourceControl-DkdSLuvp.js} +2 -2
- package/dist/assets/{SettingsSourceControl-BkPpVGsk.js.map → SettingsSourceControl-DkdSLuvp.js.map} +1 -1
- package/dist/assets/{SettingsSso-BueUV3RH.js → SettingsSso-DA9AOKH5.js} +2 -2
- package/dist/assets/{SettingsSso-BueUV3RH.js.map → SettingsSso-DA9AOKH5.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-DzDC9m54.js → SettingsUsageAndPlan-BVPtlthH.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-DzDC9m54.js.map → SettingsUsageAndPlan-BVPtlthH.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-CTd5MQLw.js → SettingsUsersView-BuKt4ZDO.js} +2 -2
- package/dist/assets/{SettingsUsersView-CTd5MQLw.js.map → SettingsUsersView-BuKt4ZDO.js.map} +1 -1
- package/dist/assets/{SettingsView-DMxqsNh0.js → SettingsView-DJ78VuiY.js} +2 -2
- package/dist/assets/{SettingsView-DMxqsNh0.js.map → SettingsView-DJ78VuiY.js.map} +1 -1
- package/dist/assets/{SetupView-tkyttChl.js → SetupView-C70Dkfed.js} +2 -2
- package/dist/assets/{SetupView-tkyttChl.js.map → SetupView-C70Dkfed.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-B3HZvKQp.js → SetupWorkflowCredentialsButton-CEQ1LrFl.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-B3HZvKQp.js.map → SetupWorkflowCredentialsButton-CEQ1LrFl.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-DL3b-TZS.js → SetupWorkflowFromTemplateView-BUzzXtBr.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-DL3b-TZS.js.map → SetupWorkflowFromTemplateView-BUzzXtBr.js.map} +1 -1
- package/dist/assets/{SigninView-BPLGsvzz.js → SigninView-B3CNL-yp.js} +2 -2
- package/dist/assets/{SigninView-BPLGsvzz.js.map → SigninView-B3CNL-yp.js.map} +1 -1
- package/dist/assets/{SignoutView-BySf9D7k.js → SignoutView-svcLavkC.js} +2 -2
- package/dist/assets/{SignoutView-BySf9D7k.js.map → SignoutView-svcLavkC.js.map} +1 -1
- package/dist/assets/{SignupView-EU3JWt4T.js → SignupView-DJWRTPKF.js} +2 -2
- package/dist/assets/{SignupView-EU3JWt4T.js.map → SignupView-DJWRTPKF.js.map} +1 -1
- package/dist/assets/{TemplateDetails-Cemx-ozB.js → TemplateDetails-BnbiWxo-.js} +2 -2
- package/dist/assets/{TemplateDetails-Cemx-ozB.js.map → TemplateDetails-BnbiWxo-.js.map} +1 -1
- package/dist/assets/{TemplateList-h3b91b7e.js → TemplateList-By-t2s0M.js} +2 -2
- package/dist/assets/{TemplateList-h3b91b7e.js.map → TemplateList-By-t2s0M.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-aBX3f7Pp.js → TemplatesCollectionView-D2L1fmSc.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-aBX3f7Pp.js.map → TemplatesCollectionView-D2L1fmSc.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-DyoC9WUR.js → TemplatesSearchView-Bmr6Nd6g.js} +2 -2
- package/dist/assets/{TemplatesSearchView-DyoC9WUR.js.map → TemplatesSearchView-Bmr6Nd6g.js.map} +1 -1
- package/dist/assets/{TemplatesView-GQmC_sY8.js → TemplatesView-BbunSn-s.js} +2 -2
- package/dist/assets/{TemplatesView-GQmC_sY8.js.map → TemplatesView-BbunSn-s.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-C-0pXdDh.js → TemplatesWorkflowView-XxBIlMWY.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-C-0pXdDh.js.map → TemplatesWorkflowView-XxBIlMWY.js.map} +1 -1
- package/dist/assets/{VariablesView-BO5fdkwt.js → VariablesView-ZY5xLmKI.js} +2 -2
- package/dist/assets/{VariablesView-BO5fdkwt.js.map → VariablesView-ZY5xLmKI.js.map} +1 -1
- package/dist/assets/{WorkerView-C3Rdbsfq.js → WorkerView-DV19-i1-.js} +2 -2
- package/dist/assets/{WorkerView-C3Rdbsfq.js.map → WorkerView-DV19-i1-.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-DQXSsw0V.js → WorkflowActivator-BXWURYao.js} +2 -2
- package/dist/assets/{WorkflowActivator-DQXSsw0V.js.map → WorkflowActivator-BXWURYao.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsInfoAccordion-DJPF47om.js → WorkflowExecutionsInfoAccordion-aldNazgt.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-DJPF47om.js.map → WorkflowExecutionsInfoAccordion-aldNazgt.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-DoSsHWxH.js → WorkflowExecutionsLandingPage-CaAameTk.js} +2 -2
- package/dist/assets/{WorkflowExecutionsLandingPage-DoSsHWxH.js.map → WorkflowExecutionsLandingPage-CaAameTk.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsPreview-Dt23N5A4.js → WorkflowExecutionsPreview-Bb-wJtr-.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-Dt23N5A4.js.map → WorkflowExecutionsPreview-Bb-wJtr-.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsView-CpAIVxYQ.js → WorkflowExecutionsView-D7nlOP1-.js} +2 -2
- package/dist/assets/{WorkflowExecutionsView-CpAIVxYQ.js.map → WorkflowExecutionsView-D7nlOP1-.js.map} +1 -1
- package/dist/assets/{WorkflowHistory-D1-E_J_s.js → WorkflowHistory-C6zCGFoY.js} +2 -2
- package/dist/assets/{WorkflowHistory-D1-E_J_s.js.map → WorkflowHistory-C6zCGFoY.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-fzAZuVh5.js → WorkflowOnboardingView-Bu_Oqtr7.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-fzAZuVh5.js.map → WorkflowOnboardingView-Bu_Oqtr7.js.map} +1 -1
- package/dist/assets/{WorkflowPreview-BkL2jDRm.js → WorkflowPreview-CVwpKdpj.js} +2 -2
- package/dist/assets/{WorkflowPreview-BkL2jDRm.js.map → WorkflowPreview-CVwpKdpj.js.map} +1 -1
- package/dist/assets/{WorkflowsView-rbygROmM.js → WorkflowsView-DVeAZ2zW.js} +2 -2
- package/dist/assets/{WorkflowsView-rbygROmM.js.map → WorkflowsView-DVeAZ2zW.js.map} +1 -1
- package/dist/assets/{cloud-B90x0-JC.js → cloud-BRhZDk2r.js} +2 -2
- package/dist/assets/{cloud-B90x0-JC.js.map → cloud-BRhZDk2r.js.map} +1 -1
- package/dist/assets/{collaboration.store-ElxCV91F.js → collaboration.store-Ol7bcCFc.js} +2 -2
- package/dist/assets/{collaboration.store-ElxCV91F.js.map → collaboration.store-Ol7bcCFc.js.map} +1 -1
- package/dist/assets/{index-BE0Xl-jy.js → index-1OxaEeO3.js} +4 -4
- package/dist/assets/{index-BE0Xl-jy.js.map → index-1OxaEeO3.js.map} +1 -1
- package/dist/assets/{nodeCreator.store-Q1T99YCl.js → nodeCreator.store-FIsc3SCx.js} +2 -2
- package/dist/assets/{nodeCreator.store-Q1T99YCl.js.map → nodeCreator.store-FIsc3SCx.js.map} +1 -1
- package/dist/assets/{templateActions-B7R6qRak.js → templateActions-w_1vSarr.js} +2 -2
- package/dist/assets/{templateActions-B7R6qRak.js.map → templateActions-w_1vSarr.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-BJ0CgMh8.js → useExecutionDebugging-EHinBq_u.js} +2 -2
- package/dist/assets/{useExecutionDebugging-BJ0CgMh8.js.map → useExecutionDebugging-EHinBq_u.js.map} +1 -1
- package/dist/assets/{useExecutionHelpers-D3294Pbg.js → useExecutionHelpers-LeKoU_T-.js} +2 -2
- package/dist/assets/{useExecutionHelpers-D3294Pbg.js.map → useExecutionHelpers-LeKoU_T-.js.map} +1 -1
- package/dist/assets/{usePushConnection-CsYeEXN4.js → usePushConnection-PQgFeT_8.js} +2 -2
- package/dist/assets/{usePushConnection-CsYeEXN4.js.map → usePushConnection-PQgFeT_8.js.map} +1 -1
- package/dist/assets/{useUserHelpers-CzNhI0vP.js → useUserHelpers-DZtbUAMm.js} +2 -2
- package/dist/assets/{useUserHelpers-CzNhI0vP.js.map → useUserHelpers-DZtbUAMm.js.map} +1 -1
- package/dist/assets/{useWorkflowActivate-D8iK20ua.js → useWorkflowActivate-npf1npdP.js} +2 -2
- package/dist/assets/{useWorkflowActivate-D8iK20ua.js.map → useWorkflowActivate-npf1npdP.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-BXMOfisf.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as X,e as Y,u as j,Y as J,c$ as ee,x as te,A as U,H as se}from"./index-BE0Xl-jy.js";import{G as oe,r as ne,e as V,b as re,Z as ae,ag as g,l as m,m as x,U as c,O as a,S as h,T as r,u as s,p as n,I as l,M as _,R as b}from"./vendor-Dv5OeN6t.js";import{_ as ce}from"./n8n-4UEsHtUL.js";import"./pinia-sugP77Im.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const le={key:0,"data-test-id":"source-control-content-licensed"},ie=["href"],ue={for:"repoUrl"},pe=["href"],de={key:2,"data-test-id":"source-control-connected-content"},ge=n("hr",null,null,-1),me=["href"],he=oe({__name:"SettingsSourceControl",setup(we){const e=te(),o=X(),w=Y(),p=j(),S=se(),y=J(),d=ne(!1),E=V(()=>o.preferences.branches.map(t=>({value:t,label:t}))),K=async()=>{y.startLoading(),y.setLoadingText(e.baseText("settings.sourceControl.loading.connecting"));try{await o.savePreferences({repositoryUrl:o.preferences.repositoryUrl}),await o.getBranches(),d.value=!0,p.showMessage({title:e.baseText("settings.sourceControl.toast.connected.title"),message:e.baseText("settings.sourceControl.toast.connected.message"),type:"success"})}catch(t){p.showError(t,e.baseText("settings.sourceControl.toast.connected.error"))}y.stopLoading()},$=async()=>{try{await S.confirm(e.baseText("settings.sourceControl.modals.disconnect.message"),e.baseText("settings.sourceControl.modals.disconnect.title"),{confirmButtonText:e.baseText("settings.sourceControl.modals.disconnect.confirm"),cancelButtonText:e.baseText("settings.sourceControl.modals.disconnect.cancel")})===U&&(y.startLoading(),await o.disconnect(!0),d.value=!1,p.showMessage({title:e.baseText("settings.sourceControl.toast.disconnected.title"),message:e.baseText("settings.sourceControl.toast.disconnected.message"),type:"success"}))}catch(t){p.showError(t,e.baseText("settings.sourceControl.toast.disconnected.error"))}y.stopLoading()},I=async()=>{y.startLoading();try{await o.updatePreferences({branchName:o.preferences.branchName,branchReadOnly:o.preferences.branchReadOnly,branchColor:o.preferences.branchColor}),p.showMessage({title:e.baseText("settings.sourceControl.saved.title"),type:"success"})}catch(t){p.showError(t,"Error setting branch")}y.stopLoading()},z=async t=>{t!==o.preferences.branchName&&(o.preferences.branchName=t)},N=()=>{w.goToUpgrade("source-control","upgrade-source-control")},R=async()=>{await o.getPreferences(),o.preferences.connected&&(d.value=!0,o.getBranches())};re(async()=>{o.isEnterpriseSourceControlEnabled&&await R()});const B=ae({repoUrl:!1,keyGeneratorType:!1});function C(t,i){B[t]=i}const M=[{name:"REQUIRED"},{name:"MATCH_REGEX",config:{regex:/^(ssh:\/\/)?git@(?:\[[0-9a-fA-F:]+\]|(?:[a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+)(?::[0-9]+)*:(?:v[0-9]+\/)?[a-zA-Z0-9_.\-\/]+(\.git)?(?:\/[a-zA-Z0-9_.\-\/]+)*$/,message:e.baseText("settings.sourceControl.repoUrlInvalid")}}],O=[{name:"REQUIRED"}],G=V(()=>B.repoUrl),L=[{name:"REQUIRED"}];async function A(){try{await S.confirm(e.baseText("settings.sourceControl.modals.refreshSshKey.message"),e.baseText("settings.sourceControl.modals.refreshSshKey.title"),{confirmButtonText:e.baseText("settings.sourceControl.modals.refreshSshKey.confirm"),cancelButtonText:e.baseText("settings.sourceControl.modals.refreshSshKey.cancel")})===U&&(await o.generateKeyPair(o.preferences.keyGeneratorType),p.showMessage({title:e.baseText("settings.sourceControl.refreshSshKey.successful.title"),type:"success"}))}catch(t){p.showError(t,e.baseText("settings.sourceControl.refreshSshKey.error.title"))}}const D=async()=>{try{await o.getBranches(),p.showMessage({title:e.baseText("settings.sourceControl.refreshBranches.success"),type:"success"})}catch(t){p.showError(t,e.baseText("settings.sourceControl.refreshBranches.error"))}},F=async t=>{t!==o.preferences.keyGeneratorType&&(o.preferences.keyGeneratorType=t)};return(t,i)=>{const T=g("n8n-heading"),v=g("i18n-t"),P=g("n8n-callout"),k=g("n8n-form-input"),f=g("n8n-button"),Z=g("n8n-notice"),Q=g("n8n-tooltip"),H=g("n8n-checkbox"),q=g("n8n-color-picker"),W=g("n8n-action-box");return m(),x("div",null,[c(T,{size:"2xlarge",tag:"h1"},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.title")),1)]),_:1}),s(o).isEnterpriseSourceControlEnabled?(m(),x("div",le,[c(P,{theme:"secondary",icon:"info-circle",class:"mt-2xl mb-l"},{default:a(()=>[c(v,{keypath:"settings.sourceControl.description",tag:"span"},{link:a(()=>[n("a",{href:s(e).baseText("settings.sourceControl.docs.url"),target:"_blank"},r(s(e).baseText("settings.sourceControl.description.link")),9,ie)]),_:1})]),_:1}),c(T,{size:"xlarge",tag:"h2",class:"mb-s"},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.gitConfig")),1)]),_:1}),n("div",{class:l(t.$style.group)},[n("label",ue,r(s(e).baseText("settings.sourceControl.repoUrl")),1),n("div",{class:l(t.$style.groupFlex)},[c(k,{id:"repoUrl",modelValue:s(o).preferences.repositoryUrl,"onUpdate:modelValue":i[0]||(i[0]=u=>s(o).preferences.repositoryUrl=u),label:"",class:"ml-0",name:"repoUrl","validate-on-blur":"","validation-rules":M,disabled:d.value,placeholder:s(e).baseText("settings.sourceControl.repoUrlPlaceholder"),onValidate:i[1]||(i[1]=u=>C("repoUrl",u))},null,8,["modelValue","disabled","placeholder"]),d.value?(m(),_(f,{key:0,class:l(t.$style.disconnectButton),type:"tertiary",size:"large",icon:"trash","data-test-id":"source-control-disconnect-button",onClick:$},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.button.disconnect")),1)]),_:1},8,["class"])):b("",!0)],2)],2),s(o).preferences.publicKey?(m(),x("div",{key:0,class:l(t.$style.group)},[n("label",null,r(s(e).baseText("settings.sourceControl.sshKey")),1),n("div",{class:l({[t.$style.sshInput]:!d.value})},[d.value?b("",!0):(m(),_(k,{key:0,id:"keyGeneratorType",class:l(t.$style.sshKeyTypeSelect),label:"",type:"select",name:"keyGeneratorType","data-test-id":"source-control-ssh-key-type-select","validate-on-blur":"","validation-rules":O,options:s(o).sshKeyTypesWithLabel,"model-value":s(o).preferences.keyGeneratorType,onValidate:i[2]||(i[2]=u=>C("keyGeneratorType",u)),"onUpdate:modelValue":F},null,8,["class","options","model-value"])),c(ee,{class:l(t.$style.copyInput),collapse:"",size:"medium",value:s(o).preferences.publicKey,"copy-button-text":s(e).baseText("generic.clickToCopy")},null,8,["class","value","copy-button-text"]),d.value?b("",!0):(m(),_(f,{key:1,size:"large",type:"tertiary",icon:"sync","data-test-id":"source-control-refresh-ssh-key-button",onClick:A},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.refreshSshKey")),1)]),_:1}))],2),c(Z,{type:"info",class:"mt-s"},{default:a(()=>[c(v,{keypath:"settings.sourceControl.sshKeyDescription",tag:"span"},{link:a(()=>[n("a",{href:s(e).baseText("settings.sourceControl.docs.setup.ssh.url"),target:"_blank"},r(s(e).baseText("settings.sourceControl.sshKeyDescriptionLink")),9,pe)]),_:1})]),_:1})],2)):b("",!0),d.value?b("",!0):(m(),_(f,{key:1,size:"large",disabled:!G.value,class:l(t.$style.connect),"data-test-id":"source-control-connect-button",onClick:K},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.button.connect")),1)]),_:1},8,["disabled","class"])),d.value?(m(),x("div",de,[n("div",{class:l(t.$style.group)},[ge,c(T,{size:"xlarge",tag:"h2",class:"mb-s"},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.instanceSettings")),1)]),_:1}),n("label",null,r(s(e).baseText("settings.sourceControl.branches")),1),n("div",{class:l(t.$style.branchSelection)},[c(k,{id:"branchName",label:"",type:"select",name:"branchName",class:"mb-s","data-test-id":"source-control-branch-select","validate-on-blur":"","validation-rules":L,options:E.value,"model-value":s(o).preferences.branchName,onValidate:i[3]||(i[3]=u=>C("branchName",u)),"onUpdate:modelValue":z},null,8,["options","model-value"]),c(Q,{placement:"top"},{content:a(()=>[n("span",null,r(s(e).baseText("settings.sourceControl.refreshBranches.tooltip")),1)]),default:a(()=>[c(f,{size:"small",type:"tertiary",icon:"sync",square:"",class:l(t.$style.refreshBranches),"data-test-id":"source-control-refresh-branches-button",onClick:D},null,8,["class"])]),_:1})],2),c(H,{modelValue:s(o).preferences.branchReadOnly,"onUpdate:modelValue":i[4]||(i[4]=u=>s(o).preferences.branchReadOnly=u),class:l(t.$style.readOnly)},{default:a(()=>[c(v,{keypath:"settings.sourceControl.protected",tag:"span"},{bold:a(()=>[n("strong",null,r(s(e).baseText("settings.sourceControl.protected.bold")),1)]),_:1})]),_:1},8,["modelValue","class"])],2),n("div",{class:l(t.$style.group)},[n("label",null,r(s(e).baseText("settings.sourceControl.color")),1),n("div",null,[c(q,{modelValue:s(o).preferences.branchColor,"onUpdate:modelValue":i[5]||(i[5]=u=>s(o).preferences.branchColor=u),size:"small"},null,8,["modelValue"])])],2),n("div",{class:l([t.$style.group,"pt-s"])},[c(f,{size:"large",disabled:!s(o).preferences.branchName,"data-test-id":"source-control-save-settings-button",onClick:I},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.button.save")),1)]),_:1},8,["disabled"])],2)])):b("",!0)])):(m(),_(W,{key:1,"data-test-id":"source-control-content-unlicensed",class:l(t.$style.actionBox),description:s(e).baseText("settings.sourceControl.actionBox.description"),"button-text":s(e).baseText("settings.sourceControl.actionBox.buttonText"),"onClick:button":N},{heading:a(()=>[n("span",null,r(s(e).baseText("settings.sourceControl.actionBox.title")),1)]),description:a(()=>[h(r(s(e).baseText("settings.sourceControl.actionBox.description"))+" ",1),n("a",{href:s(e).baseText("settings.sourceControl.docs.url"),target:"_blank"},r(s(e).baseText("settings.sourceControl.actionBox.description.link")),9,me)]),_:1},8,["class","description","button-text"]))])}}}),ye="_group_1exsh_1",be="_readOnly_1exsh_22",fe="_groupFlex_1exsh_26",_e="_connect_1exsh_40",xe="_disconnectButton_1exsh_44",Ce="_actionBox_1exsh_49",Te="_sshInput_1exsh_53",ve="_copyInput_1exsh_64",ke="_sshKeyTypeSelect_1exsh_68",Se="_branchSelection_1exsh_76",Be="_refreshBranches_1exsh_85",Ue={group:ye,readOnly:be,groupFlex:fe,connect:_e,disconnectButton:xe,actionBox:Ce,sshInput:Te,copyInput:ve,sshKeyTypeSelect:ke,branchSelection:Se,refreshBranches:Be},Ve={$style:Ue},rt=ce(he,[["__cssModules",Ve]]);export{rt as default};
|
|
2
|
-
//# sourceMappingURL=SettingsSourceControl-
|
|
1
|
+
import{n as X,e as Y,u as j,Y as J,c$ as ee,x as te,A as U,H as se}from"./index-1OxaEeO3.js";import{G as oe,r as ne,e as V,b as re,Z as ae,ag as g,l as m,m as x,U as c,O as a,S as h,T as r,u as s,p as n,I as l,M as _,R as b}from"./vendor-Dv5OeN6t.js";import{_ as ce}from"./n8n-4UEsHtUL.js";import"./pinia-sugP77Im.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const le={key:0,"data-test-id":"source-control-content-licensed"},ie=["href"],ue={for:"repoUrl"},pe=["href"],de={key:2,"data-test-id":"source-control-connected-content"},ge=n("hr",null,null,-1),me=["href"],he=oe({__name:"SettingsSourceControl",setup(we){const e=te(),o=X(),w=Y(),p=j(),S=se(),y=J(),d=ne(!1),E=V(()=>o.preferences.branches.map(t=>({value:t,label:t}))),K=async()=>{y.startLoading(),y.setLoadingText(e.baseText("settings.sourceControl.loading.connecting"));try{await o.savePreferences({repositoryUrl:o.preferences.repositoryUrl}),await o.getBranches(),d.value=!0,p.showMessage({title:e.baseText("settings.sourceControl.toast.connected.title"),message:e.baseText("settings.sourceControl.toast.connected.message"),type:"success"})}catch(t){p.showError(t,e.baseText("settings.sourceControl.toast.connected.error"))}y.stopLoading()},$=async()=>{try{await S.confirm(e.baseText("settings.sourceControl.modals.disconnect.message"),e.baseText("settings.sourceControl.modals.disconnect.title"),{confirmButtonText:e.baseText("settings.sourceControl.modals.disconnect.confirm"),cancelButtonText:e.baseText("settings.sourceControl.modals.disconnect.cancel")})===U&&(y.startLoading(),await o.disconnect(!0),d.value=!1,p.showMessage({title:e.baseText("settings.sourceControl.toast.disconnected.title"),message:e.baseText("settings.sourceControl.toast.disconnected.message"),type:"success"}))}catch(t){p.showError(t,e.baseText("settings.sourceControl.toast.disconnected.error"))}y.stopLoading()},I=async()=>{y.startLoading();try{await o.updatePreferences({branchName:o.preferences.branchName,branchReadOnly:o.preferences.branchReadOnly,branchColor:o.preferences.branchColor}),p.showMessage({title:e.baseText("settings.sourceControl.saved.title"),type:"success"})}catch(t){p.showError(t,"Error setting branch")}y.stopLoading()},z=async t=>{t!==o.preferences.branchName&&(o.preferences.branchName=t)},N=()=>{w.goToUpgrade("source-control","upgrade-source-control")},R=async()=>{await o.getPreferences(),o.preferences.connected&&(d.value=!0,o.getBranches())};re(async()=>{o.isEnterpriseSourceControlEnabled&&await R()});const B=ae({repoUrl:!1,keyGeneratorType:!1});function C(t,i){B[t]=i}const M=[{name:"REQUIRED"},{name:"MATCH_REGEX",config:{regex:/^(ssh:\/\/)?git@(?:\[[0-9a-fA-F:]+\]|(?:[a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+)(?::[0-9]+)*:(?:v[0-9]+\/)?[a-zA-Z0-9_.\-\/]+(\.git)?(?:\/[a-zA-Z0-9_.\-\/]+)*$/,message:e.baseText("settings.sourceControl.repoUrlInvalid")}}],O=[{name:"REQUIRED"}],G=V(()=>B.repoUrl),L=[{name:"REQUIRED"}];async function A(){try{await S.confirm(e.baseText("settings.sourceControl.modals.refreshSshKey.message"),e.baseText("settings.sourceControl.modals.refreshSshKey.title"),{confirmButtonText:e.baseText("settings.sourceControl.modals.refreshSshKey.confirm"),cancelButtonText:e.baseText("settings.sourceControl.modals.refreshSshKey.cancel")})===U&&(await o.generateKeyPair(o.preferences.keyGeneratorType),p.showMessage({title:e.baseText("settings.sourceControl.refreshSshKey.successful.title"),type:"success"}))}catch(t){p.showError(t,e.baseText("settings.sourceControl.refreshSshKey.error.title"))}}const D=async()=>{try{await o.getBranches(),p.showMessage({title:e.baseText("settings.sourceControl.refreshBranches.success"),type:"success"})}catch(t){p.showError(t,e.baseText("settings.sourceControl.refreshBranches.error"))}},F=async t=>{t!==o.preferences.keyGeneratorType&&(o.preferences.keyGeneratorType=t)};return(t,i)=>{const T=g("n8n-heading"),v=g("i18n-t"),P=g("n8n-callout"),k=g("n8n-form-input"),f=g("n8n-button"),Z=g("n8n-notice"),Q=g("n8n-tooltip"),H=g("n8n-checkbox"),q=g("n8n-color-picker"),W=g("n8n-action-box");return m(),x("div",null,[c(T,{size:"2xlarge",tag:"h1"},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.title")),1)]),_:1}),s(o).isEnterpriseSourceControlEnabled?(m(),x("div",le,[c(P,{theme:"secondary",icon:"info-circle",class:"mt-2xl mb-l"},{default:a(()=>[c(v,{keypath:"settings.sourceControl.description",tag:"span"},{link:a(()=>[n("a",{href:s(e).baseText("settings.sourceControl.docs.url"),target:"_blank"},r(s(e).baseText("settings.sourceControl.description.link")),9,ie)]),_:1})]),_:1}),c(T,{size:"xlarge",tag:"h2",class:"mb-s"},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.gitConfig")),1)]),_:1}),n("div",{class:l(t.$style.group)},[n("label",ue,r(s(e).baseText("settings.sourceControl.repoUrl")),1),n("div",{class:l(t.$style.groupFlex)},[c(k,{id:"repoUrl",modelValue:s(o).preferences.repositoryUrl,"onUpdate:modelValue":i[0]||(i[0]=u=>s(o).preferences.repositoryUrl=u),label:"",class:"ml-0",name:"repoUrl","validate-on-blur":"","validation-rules":M,disabled:d.value,placeholder:s(e).baseText("settings.sourceControl.repoUrlPlaceholder"),onValidate:i[1]||(i[1]=u=>C("repoUrl",u))},null,8,["modelValue","disabled","placeholder"]),d.value?(m(),_(f,{key:0,class:l(t.$style.disconnectButton),type:"tertiary",size:"large",icon:"trash","data-test-id":"source-control-disconnect-button",onClick:$},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.button.disconnect")),1)]),_:1},8,["class"])):b("",!0)],2)],2),s(o).preferences.publicKey?(m(),x("div",{key:0,class:l(t.$style.group)},[n("label",null,r(s(e).baseText("settings.sourceControl.sshKey")),1),n("div",{class:l({[t.$style.sshInput]:!d.value})},[d.value?b("",!0):(m(),_(k,{key:0,id:"keyGeneratorType",class:l(t.$style.sshKeyTypeSelect),label:"",type:"select",name:"keyGeneratorType","data-test-id":"source-control-ssh-key-type-select","validate-on-blur":"","validation-rules":O,options:s(o).sshKeyTypesWithLabel,"model-value":s(o).preferences.keyGeneratorType,onValidate:i[2]||(i[2]=u=>C("keyGeneratorType",u)),"onUpdate:modelValue":F},null,8,["class","options","model-value"])),c(ee,{class:l(t.$style.copyInput),collapse:"",size:"medium",value:s(o).preferences.publicKey,"copy-button-text":s(e).baseText("generic.clickToCopy")},null,8,["class","value","copy-button-text"]),d.value?b("",!0):(m(),_(f,{key:1,size:"large",type:"tertiary",icon:"sync","data-test-id":"source-control-refresh-ssh-key-button",onClick:A},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.refreshSshKey")),1)]),_:1}))],2),c(Z,{type:"info",class:"mt-s"},{default:a(()=>[c(v,{keypath:"settings.sourceControl.sshKeyDescription",tag:"span"},{link:a(()=>[n("a",{href:s(e).baseText("settings.sourceControl.docs.setup.ssh.url"),target:"_blank"},r(s(e).baseText("settings.sourceControl.sshKeyDescriptionLink")),9,pe)]),_:1})]),_:1})],2)):b("",!0),d.value?b("",!0):(m(),_(f,{key:1,size:"large",disabled:!G.value,class:l(t.$style.connect),"data-test-id":"source-control-connect-button",onClick:K},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.button.connect")),1)]),_:1},8,["disabled","class"])),d.value?(m(),x("div",de,[n("div",{class:l(t.$style.group)},[ge,c(T,{size:"xlarge",tag:"h2",class:"mb-s"},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.instanceSettings")),1)]),_:1}),n("label",null,r(s(e).baseText("settings.sourceControl.branches")),1),n("div",{class:l(t.$style.branchSelection)},[c(k,{id:"branchName",label:"",type:"select",name:"branchName",class:"mb-s","data-test-id":"source-control-branch-select","validate-on-blur":"","validation-rules":L,options:E.value,"model-value":s(o).preferences.branchName,onValidate:i[3]||(i[3]=u=>C("branchName",u)),"onUpdate:modelValue":z},null,8,["options","model-value"]),c(Q,{placement:"top"},{content:a(()=>[n("span",null,r(s(e).baseText("settings.sourceControl.refreshBranches.tooltip")),1)]),default:a(()=>[c(f,{size:"small",type:"tertiary",icon:"sync",square:"",class:l(t.$style.refreshBranches),"data-test-id":"source-control-refresh-branches-button",onClick:D},null,8,["class"])]),_:1})],2),c(H,{modelValue:s(o).preferences.branchReadOnly,"onUpdate:modelValue":i[4]||(i[4]=u=>s(o).preferences.branchReadOnly=u),class:l(t.$style.readOnly)},{default:a(()=>[c(v,{keypath:"settings.sourceControl.protected",tag:"span"},{bold:a(()=>[n("strong",null,r(s(e).baseText("settings.sourceControl.protected.bold")),1)]),_:1})]),_:1},8,["modelValue","class"])],2),n("div",{class:l(t.$style.group)},[n("label",null,r(s(e).baseText("settings.sourceControl.color")),1),n("div",null,[c(q,{modelValue:s(o).preferences.branchColor,"onUpdate:modelValue":i[5]||(i[5]=u=>s(o).preferences.branchColor=u),size:"small"},null,8,["modelValue"])])],2),n("div",{class:l([t.$style.group,"pt-s"])},[c(f,{size:"large",disabled:!s(o).preferences.branchName,"data-test-id":"source-control-save-settings-button",onClick:I},{default:a(()=>[h(r(s(e).baseText("settings.sourceControl.button.save")),1)]),_:1},8,["disabled"])],2)])):b("",!0)])):(m(),_(W,{key:1,"data-test-id":"source-control-content-unlicensed",class:l(t.$style.actionBox),description:s(e).baseText("settings.sourceControl.actionBox.description"),"button-text":s(e).baseText("settings.sourceControl.actionBox.buttonText"),"onClick:button":N},{heading:a(()=>[n("span",null,r(s(e).baseText("settings.sourceControl.actionBox.title")),1)]),description:a(()=>[h(r(s(e).baseText("settings.sourceControl.actionBox.description"))+" ",1),n("a",{href:s(e).baseText("settings.sourceControl.docs.url"),target:"_blank"},r(s(e).baseText("settings.sourceControl.actionBox.description.link")),9,me)]),_:1},8,["class","description","button-text"]))])}}}),ye="_group_1exsh_1",be="_readOnly_1exsh_22",fe="_groupFlex_1exsh_26",_e="_connect_1exsh_40",xe="_disconnectButton_1exsh_44",Ce="_actionBox_1exsh_49",Te="_sshInput_1exsh_53",ve="_copyInput_1exsh_64",ke="_sshKeyTypeSelect_1exsh_68",Se="_branchSelection_1exsh_76",Be="_refreshBranches_1exsh_85",Ue={group:ye,readOnly:be,groupFlex:fe,connect:_e,disconnectButton:xe,actionBox:Ce,sshInput:Te,copyInput:ve,sshKeyTypeSelect:ke,branchSelection:Se,refreshBranches:Be},Ve={$style:Ue},rt=ce(he,[["__cssModules",Ve]]);export{rt as default};
|
|
2
|
+
//# sourceMappingURL=SettingsSourceControl-DkdSLuvp.js.map
|
package/dist/assets/{SettingsSourceControl-BkPpVGsk.js.map → SettingsSourceControl-DkdSLuvp.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSourceControl-BkPpVGsk.js","sources":["../../src/views/SettingsSourceControl.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, reactive, ref, onMounted } from 'vue';\nimport type { Rule, RuleGroup } from 'n8n-design-system/types';\nimport { MODAL_CONFIRM } from '@/constants';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport CopyInput from '@/components/CopyInput.vue';\nimport type { TupleToUnion } from '@/utils/typeHelpers';\nimport type { SshKeyTypes } from '@/Interface';\n\nconst locale = useI18n();\nconst sourceControlStore = useSourceControlStore();\nconst uiStore = useUIStore();\nconst toast = useToast();\nconst message = useMessage();\nconst loadingService = useLoadingService();\n\nconst isConnected = ref(false);\nconst branchNameOptions = computed(() =>\n\tsourceControlStore.preferences.branches.map((branch) => ({\n\t\tvalue: branch,\n\t\tlabel: branch,\n\t})),\n);\n\nconst onConnect = async () => {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(locale.baseText('settings.sourceControl.loading.connecting'));\n\ttry {\n\t\tawait sourceControlStore.savePreferences({\n\t\t\trepositoryUrl: sourceControlStore.preferences.repositoryUrl,\n\t\t});\n\t\tawait sourceControlStore.getBranches();\n\t\tisConnected.value = true;\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('settings.sourceControl.toast.connected.title'),\n\t\t\tmessage: locale.baseText('settings.sourceControl.toast.connected.message'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.toast.connected.error'));\n\t}\n\tloadingService.stopLoading();\n};\n\nconst onDisconnect = async () => {\n\ttry {\n\t\tconst confirmation = await message.confirm(\n\t\t\tlocale.baseText('settings.sourceControl.modals.disconnect.message'),\n\t\t\tlocale.baseText('settings.sourceControl.modals.disconnect.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: locale.baseText('settings.sourceControl.modals.disconnect.confirm'),\n\t\t\t\tcancelButtonText: locale.baseText('settings.sourceControl.modals.disconnect.cancel'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmation === MODAL_CONFIRM) {\n\t\t\tloadingService.startLoading();\n\t\t\tawait sourceControlStore.disconnect(true);\n\t\t\tisConnected.value = false;\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: locale.baseText('settings.sourceControl.toast.disconnected.title'),\n\t\t\t\tmessage: locale.baseText('settings.sourceControl.toast.disconnected.message'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.toast.disconnected.error'));\n\t}\n\tloadingService.stopLoading();\n};\n\nconst onSave = async () => {\n\tloadingService.startLoading();\n\ttry {\n\t\tawait sourceControlStore.updatePreferences({\n\t\t\tbranchName: sourceControlStore.preferences.branchName,\n\t\t\tbranchReadOnly: sourceControlStore.preferences.branchReadOnly,\n\t\t\tbranchColor: sourceControlStore.preferences.branchColor,\n\t\t});\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('settings.sourceControl.saved.title'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, 'Error setting branch');\n\t}\n\tloadingService.stopLoading();\n};\n\nconst onSelect = async (b: string) => {\n\tif (b === sourceControlStore.preferences.branchName) {\n\t\treturn;\n\t}\n\tsourceControlStore.preferences.branchName = b;\n};\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('source-control', 'upgrade-source-control');\n};\n\nconst initialize = async () => {\n\tawait sourceControlStore.getPreferences();\n\tif (sourceControlStore.preferences.connected) {\n\t\tisConnected.value = true;\n\t\tvoid sourceControlStore.getBranches();\n\t}\n};\n\nonMounted(async () => {\n\tif (!sourceControlStore.isEnterpriseSourceControlEnabled) return;\n\tawait initialize();\n});\n\nconst formValidationStatus = reactive<Record<string, boolean>>({\n\trepoUrl: false,\n\tkeyGeneratorType: false,\n});\n\nfunction onValidate(key: string, value: boolean) {\n\tformValidationStatus[key] = value;\n}\n\nconst repoUrlValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'REQUIRED' },\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex:\n\t\t\t\t/^(ssh:\\/\\/)?git@(?:\\[[0-9a-fA-F:]+\\]|(?:[a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+)(?::[0-9]+)*:(?:v[0-9]+\\/)?[a-zA-Z0-9_.\\-\\/]+(\\.git)?(?:\\/[a-zA-Z0-9_.\\-\\/]+)*$/,\n\t\t\tmessage: locale.baseText('settings.sourceControl.repoUrlInvalid'),\n\t\t},\n\t},\n];\n\nconst keyGeneratorTypeValidationRules: Array<Rule | RuleGroup> = [{ name: 'REQUIRED' }];\n\nconst validForConnection = computed(() => formValidationStatus.repoUrl);\nconst branchNameValidationRules: Array<Rule | RuleGroup> = [{ name: 'REQUIRED' }];\n\nasync function refreshSshKey() {\n\ttry {\n\t\tconst confirmation = await message.confirm(\n\t\t\tlocale.baseText('settings.sourceControl.modals.refreshSshKey.message'),\n\t\t\tlocale.baseText('settings.sourceControl.modals.refreshSshKey.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: locale.baseText('settings.sourceControl.modals.refreshSshKey.confirm'),\n\t\t\t\tcancelButtonText: locale.baseText('settings.sourceControl.modals.refreshSshKey.cancel'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmation === MODAL_CONFIRM) {\n\t\t\tawait sourceControlStore.generateKeyPair(sourceControlStore.preferences.keyGeneratorType);\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: locale.baseText('settings.sourceControl.refreshSshKey.successful.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.refreshSshKey.error.title'));\n\t}\n}\n\nconst refreshBranches = async () => {\n\ttry {\n\t\tawait sourceControlStore.getBranches();\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('settings.sourceControl.refreshBranches.success'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.refreshBranches.error'));\n\t}\n};\n\nconst onSelectSshKeyType = async (sshKeyType: TupleToUnion<SshKeyTypes>) => {\n\tif (sshKeyType === sourceControlStore.preferences.keyGeneratorType) {\n\t\treturn;\n\t}\n\tsourceControlStore.preferences.keyGeneratorType = sshKeyType;\n};\n</script>\n\n<template>\n\t<div>\n\t\t<n8n-heading size=\"2xlarge\" tag=\"h1\">{{\n\t\t\tlocale.baseText('settings.sourceControl.title')\n\t\t}}</n8n-heading>\n\t\t<div\n\t\t\tv-if=\"sourceControlStore.isEnterpriseSourceControlEnabled\"\n\t\t\tdata-test-id=\"source-control-content-licensed\"\n\t\t>\n\t\t\t<n8n-callout theme=\"secondary\" icon=\"info-circle\" class=\"mt-2xl mb-l\">\n\t\t\t\t<i18n-t keypath=\"settings.sourceControl.description\" tag=\"span\">\n\t\t\t\t\t<template #link>\n\t\t\t\t\t\t<a :href=\"locale.baseText('settings.sourceControl.docs.url')\" target=\"_blank\">\n\t\t\t\t\t\t\t{{ locale.baseText('settings.sourceControl.description.link') }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t</n8n-callout>\n\t\t\t<n8n-heading size=\"xlarge\" tag=\"h2\" class=\"mb-s\">{{\n\t\t\t\tlocale.baseText('settings.sourceControl.gitConfig')\n\t\t\t}}</n8n-heading>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label for=\"repoUrl\">{{ locale.baseText('settings.sourceControl.repoUrl') }}</label>\n\t\t\t\t<div :class=\"$style.groupFlex\">\n\t\t\t\t\t<n8n-form-input\n\t\t\t\t\t\tid=\"repoUrl\"\n\t\t\t\t\t\tv-model=\"sourceControlStore.preferences.repositoryUrl\"\n\t\t\t\t\t\tlabel\n\t\t\t\t\t\tclass=\"ml-0\"\n\t\t\t\t\t\tname=\"repoUrl\"\n\t\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t\t:validation-rules=\"repoUrlValidationRules\"\n\t\t\t\t\t\t:disabled=\"isConnected\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('settings.sourceControl.repoUrlPlaceholder')\"\n\t\t\t\t\t\t@validate=\"(value: boolean) => onValidate('repoUrl', value)\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tv-if=\"isConnected\"\n\t\t\t\t\t\t:class=\"$style.disconnectButton\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\t\tdata-test-id=\"source-control-disconnect-button\"\n\t\t\t\t\t\t@click=\"onDisconnect\"\n\t\t\t\t\t\t>{{ locale.baseText('settings.sourceControl.button.disconnect') }}</n8n-button\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if=\"sourceControlStore.preferences.publicKey\" :class=\"$style.group\">\n\t\t\t\t<label>{{ locale.baseText('settings.sourceControl.sshKey') }}</label>\n\t\t\t\t<div :class=\"{ [$style.sshInput]: !isConnected }\">\n\t\t\t\t\t<n8n-form-input\n\t\t\t\t\t\tv-if=\"!isConnected\"\n\t\t\t\t\t\tid=\"keyGeneratorType\"\n\t\t\t\t\t\t:class=\"$style.sshKeyTypeSelect\"\n\t\t\t\t\t\tlabel\n\t\t\t\t\t\ttype=\"select\"\n\t\t\t\t\t\tname=\"keyGeneratorType\"\n\t\t\t\t\t\tdata-test-id=\"source-control-ssh-key-type-select\"\n\t\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t\t:validation-rules=\"keyGeneratorTypeValidationRules\"\n\t\t\t\t\t\t:options=\"sourceControlStore.sshKeyTypesWithLabel\"\n\t\t\t\t\t\t:model-value=\"sourceControlStore.preferences.keyGeneratorType\"\n\t\t\t\t\t\t@validate=\"(value: boolean) => onValidate('keyGeneratorType', value)\"\n\t\t\t\t\t\t@update:model-value=\"onSelectSshKeyType\"\n\t\t\t\t\t/>\n\t\t\t\t\t<CopyInput\n\t\t\t\t\t\t:class=\"$style.copyInput\"\n\t\t\t\t\t\tcollapse\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t:value=\"sourceControlStore.preferences.publicKey\"\n\t\t\t\t\t\t:copy-button-text=\"locale.baseText('generic.clickToCopy')\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tv-if=\"!isConnected\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\ticon=\"sync\"\n\t\t\t\t\t\tdata-test-id=\"source-control-refresh-ssh-key-button\"\n\t\t\t\t\t\t@click=\"refreshSshKey\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ locale.baseText('settings.sourceControl.refreshSshKey') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<n8n-notice type=\"info\" class=\"mt-s\">\n\t\t\t\t\t<i18n-t keypath=\"settings.sourceControl.sshKeyDescription\" tag=\"span\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"locale.baseText('settings.sourceControl.docs.setup.ssh.url')\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>{{ locale.baseText('settings.sourceControl.sshKeyDescriptionLink') }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</n8n-notice>\n\t\t\t</div>\n\t\t\t<n8n-button\n\t\t\t\tv-if=\"!isConnected\"\n\t\t\t\tsize=\"large\"\n\t\t\t\t:disabled=\"!validForConnection\"\n\t\t\t\t:class=\"$style.connect\"\n\t\t\t\tdata-test-id=\"source-control-connect-button\"\n\t\t\t\t@click=\"onConnect\"\n\t\t\t\t>{{ locale.baseText('settings.sourceControl.button.connect') }}</n8n-button\n\t\t\t>\n\t\t\t<div v-if=\"isConnected\" data-test-id=\"source-control-connected-content\">\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<hr />\n\t\t\t\t\t<n8n-heading size=\"xlarge\" tag=\"h2\" class=\"mb-s\">{{\n\t\t\t\t\t\tlocale.baseText('settings.sourceControl.instanceSettings')\n\t\t\t\t\t}}</n8n-heading>\n\t\t\t\t\t<label>{{ locale.baseText('settings.sourceControl.branches') }}</label>\n\t\t\t\t\t<div :class=\"$style.branchSelection\">\n\t\t\t\t\t\t<n8n-form-input\n\t\t\t\t\t\t\tid=\"branchName\"\n\t\t\t\t\t\t\tlabel\n\t\t\t\t\t\t\ttype=\"select\"\n\t\t\t\t\t\t\tname=\"branchName\"\n\t\t\t\t\t\t\tclass=\"mb-s\"\n\t\t\t\t\t\t\tdata-test-id=\"source-control-branch-select\"\n\t\t\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t\t\t:validation-rules=\"branchNameValidationRules\"\n\t\t\t\t\t\t\t:options=\"branchNameOptions\"\n\t\t\t\t\t\t\t:model-value=\"sourceControlStore.preferences.branchName\"\n\t\t\t\t\t\t\t@validate=\"(value: boolean) => onValidate('branchName', value)\"\n\t\t\t\t\t\t\t@update:model-value=\"onSelect\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{{ locale.baseText('settings.sourceControl.refreshBranches.tooltip') }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t\ticon=\"sync\"\n\t\t\t\t\t\t\t\tsquare\n\t\t\t\t\t\t\t\t:class=\"$style.refreshBranches\"\n\t\t\t\t\t\t\t\tdata-test-id=\"source-control-refresh-branches-button\"\n\t\t\t\t\t\t\t\t@click=\"refreshBranches\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<n8n-checkbox\n\t\t\t\t\t\tv-model=\"sourceControlStore.preferences.branchReadOnly\"\n\t\t\t\t\t\t:class=\"$style.readOnly\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i18n-t keypath=\"settings.sourceControl.protected\" tag=\"span\">\n\t\t\t\t\t\t\t<template #bold>\n\t\t\t\t\t\t\t\t<strong>{{ locale.baseText('settings.sourceControl.protected.bold') }}</strong>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</n8n-checkbox>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<label>{{ locale.baseText('settings.sourceControl.color') }}</label>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-color-picker v-model=\"sourceControlStore.preferences.branchColor\" size=\"small\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"[$style.group, 'pt-s']\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t:disabled=\"!sourceControlStore.preferences.branchName\"\n\t\t\t\t\t\tdata-test-id=\"source-control-save-settings-button\"\n\t\t\t\t\t\t@click=\"onSave\"\n\t\t\t\t\t\t>{{ locale.baseText('settings.sourceControl.button.save') }}</n8n-button\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-action-box\n\t\t\tv-else\n\t\t\tdata-test-id=\"source-control-content-unlicensed\"\n\t\t\t:class=\"$style.actionBox\"\n\t\t\t:description=\"locale.baseText('settings.sourceControl.actionBox.description')\"\n\t\t\t:button-text=\"locale.baseText('settings.sourceControl.actionBox.buttonText')\"\n\t\t\t@click:button=\"goToUpgrade\"\n\t\t>\n\t\t\t<template #heading>\n\t\t\t\t<span>{{ locale.baseText('settings.sourceControl.actionBox.title') }}</span>\n\t\t\t</template>\n\t\t\t<template #description>\n\t\t\t\t{{ locale.baseText('settings.sourceControl.actionBox.description') }}\n\t\t\t\t<a :href=\"locale.baseText('settings.sourceControl.docs.url')\" target=\"_blank\">\n\t\t\t\t\t{{ locale.baseText('settings.sourceControl.actionBox.description.link') }}\n\t\t\t\t</a>\n\t\t\t</template>\n\t\t</n8n-action-box>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.group {\n\tpadding: 0 0 var(--spacing-s);\n\twidth: 100%;\n\tdisplay: block;\n\n\thr {\n\t\tmargin: 0 0 var(--spacing-xl);\n\t\tborder: 1px solid var(--color-foreground-light);\n\t}\n\n\tlabel {\n\t\tdisplay: inline-block;\n\t\tpadding: 0 0 var(--spacing-2xs);\n\t\tfont-size: var(--font-size-s);\n\t}\n\n\tsmall {\n\t\tdisplay: inline-block;\n\t\tpadding: var(--spacing-2xs) 0 0;\n\t\tfont-size: var(--font-size-2xs);\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n.readOnly {\n\tspan {\n\t\tfont-size: var(--font-size-s) !important;\n\t}\n}\n\n.groupFlex {\n\tdisplay: flex;\n\talign-items: flex-start;\n\n\t> div {\n\t\tflex: 1;\n\n\t\t&:last-child {\n\t\t\tmargin-left: var(--spacing-2xs);\n\t\t}\n\t}\n\n\tinput {\n\t\twidth: 100%;\n\t}\n}\n\n.connect {\n\tmargin: calc(var(--spacing-2xs) * -1) 0 var(--spacing-2xs);\n}\n\n.disconnectButton {\n\tmargin: 0 0 0 var(--spacing-2xs);\n\theight: 40px;\n}\n\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n\n.sshInput {\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n\n\t> div {\n\t\tflex: 1 1 auto;\n\t}\n\n\t> button {\n\t\theight: 42px;\n\t}\n\n\t.copyInput {\n\t\tmargin: 0 var(--spacing-2xs);\n\t}\n}\n\n.sshKeyTypeSelect {\n\tmin-width: 120px;\n}\n\n.copyInput {\n\toverflow: auto;\n}\n\n.branchSelection {\n\tdisplay: flex;\n\n\t> div:first-child {\n\t\tflex: 1;\n\n\t\tinput {\n\t\t\theight: 36px;\n\t\t}\n\t}\n\n\tbutton.refreshBranches {\n\t\theight: 36px;\n\t\twidth: 36px;\n\t\tmargin-left: var(--spacing-xs);\n\t}\n}\n</style>\n"],"names":["locale","useI18n","sourceControlStore","useSourceControlStore","uiStore","useUIStore","toast","useToast","message","useMessage","loadingService","useLoadingService","isConnected","ref","branchNameOptions","computed","branch","onConnect","error","onDisconnect","MODAL_CONFIRM","onSave","onSelect","b","goToUpgrade","initialize","onMounted","formValidationStatus","reactive","onValidate","key","value","repoUrlValidationRules","keyGeneratorTypeValidationRules","validForConnection","branchNameValidationRules","refreshSshKey","refreshBranches","onSelectSshKeyType","sshKeyType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsSourceControl-DkdSLuvp.js","sources":["../../src/views/SettingsSourceControl.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, reactive, ref, onMounted } from 'vue';\nimport type { Rule, RuleGroup } from 'n8n-design-system/types';\nimport { MODAL_CONFIRM } from '@/constants';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useToast } from '@/composables/useToast';\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport CopyInput from '@/components/CopyInput.vue';\nimport type { TupleToUnion } from '@/utils/typeHelpers';\nimport type { SshKeyTypes } from '@/Interface';\n\nconst locale = useI18n();\nconst sourceControlStore = useSourceControlStore();\nconst uiStore = useUIStore();\nconst toast = useToast();\nconst message = useMessage();\nconst loadingService = useLoadingService();\n\nconst isConnected = ref(false);\nconst branchNameOptions = computed(() =>\n\tsourceControlStore.preferences.branches.map((branch) => ({\n\t\tvalue: branch,\n\t\tlabel: branch,\n\t})),\n);\n\nconst onConnect = async () => {\n\tloadingService.startLoading();\n\tloadingService.setLoadingText(locale.baseText('settings.sourceControl.loading.connecting'));\n\ttry {\n\t\tawait sourceControlStore.savePreferences({\n\t\t\trepositoryUrl: sourceControlStore.preferences.repositoryUrl,\n\t\t});\n\t\tawait sourceControlStore.getBranches();\n\t\tisConnected.value = true;\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('settings.sourceControl.toast.connected.title'),\n\t\t\tmessage: locale.baseText('settings.sourceControl.toast.connected.message'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.toast.connected.error'));\n\t}\n\tloadingService.stopLoading();\n};\n\nconst onDisconnect = async () => {\n\ttry {\n\t\tconst confirmation = await message.confirm(\n\t\t\tlocale.baseText('settings.sourceControl.modals.disconnect.message'),\n\t\t\tlocale.baseText('settings.sourceControl.modals.disconnect.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: locale.baseText('settings.sourceControl.modals.disconnect.confirm'),\n\t\t\t\tcancelButtonText: locale.baseText('settings.sourceControl.modals.disconnect.cancel'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmation === MODAL_CONFIRM) {\n\t\t\tloadingService.startLoading();\n\t\t\tawait sourceControlStore.disconnect(true);\n\t\t\tisConnected.value = false;\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: locale.baseText('settings.sourceControl.toast.disconnected.title'),\n\t\t\t\tmessage: locale.baseText('settings.sourceControl.toast.disconnected.message'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.toast.disconnected.error'));\n\t}\n\tloadingService.stopLoading();\n};\n\nconst onSave = async () => {\n\tloadingService.startLoading();\n\ttry {\n\t\tawait sourceControlStore.updatePreferences({\n\t\t\tbranchName: sourceControlStore.preferences.branchName,\n\t\t\tbranchReadOnly: sourceControlStore.preferences.branchReadOnly,\n\t\t\tbranchColor: sourceControlStore.preferences.branchColor,\n\t\t});\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('settings.sourceControl.saved.title'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, 'Error setting branch');\n\t}\n\tloadingService.stopLoading();\n};\n\nconst onSelect = async (b: string) => {\n\tif (b === sourceControlStore.preferences.branchName) {\n\t\treturn;\n\t}\n\tsourceControlStore.preferences.branchName = b;\n};\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('source-control', 'upgrade-source-control');\n};\n\nconst initialize = async () => {\n\tawait sourceControlStore.getPreferences();\n\tif (sourceControlStore.preferences.connected) {\n\t\tisConnected.value = true;\n\t\tvoid sourceControlStore.getBranches();\n\t}\n};\n\nonMounted(async () => {\n\tif (!sourceControlStore.isEnterpriseSourceControlEnabled) return;\n\tawait initialize();\n});\n\nconst formValidationStatus = reactive<Record<string, boolean>>({\n\trepoUrl: false,\n\tkeyGeneratorType: false,\n});\n\nfunction onValidate(key: string, value: boolean) {\n\tformValidationStatus[key] = value;\n}\n\nconst repoUrlValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'REQUIRED' },\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex:\n\t\t\t\t/^(ssh:\\/\\/)?git@(?:\\[[0-9a-fA-F:]+\\]|(?:[a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+)(?::[0-9]+)*:(?:v[0-9]+\\/)?[a-zA-Z0-9_.\\-\\/]+(\\.git)?(?:\\/[a-zA-Z0-9_.\\-\\/]+)*$/,\n\t\t\tmessage: locale.baseText('settings.sourceControl.repoUrlInvalid'),\n\t\t},\n\t},\n];\n\nconst keyGeneratorTypeValidationRules: Array<Rule | RuleGroup> = [{ name: 'REQUIRED' }];\n\nconst validForConnection = computed(() => formValidationStatus.repoUrl);\nconst branchNameValidationRules: Array<Rule | RuleGroup> = [{ name: 'REQUIRED' }];\n\nasync function refreshSshKey() {\n\ttry {\n\t\tconst confirmation = await message.confirm(\n\t\t\tlocale.baseText('settings.sourceControl.modals.refreshSshKey.message'),\n\t\t\tlocale.baseText('settings.sourceControl.modals.refreshSshKey.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: locale.baseText('settings.sourceControl.modals.refreshSshKey.confirm'),\n\t\t\t\tcancelButtonText: locale.baseText('settings.sourceControl.modals.refreshSshKey.cancel'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmation === MODAL_CONFIRM) {\n\t\t\tawait sourceControlStore.generateKeyPair(sourceControlStore.preferences.keyGeneratorType);\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: locale.baseText('settings.sourceControl.refreshSshKey.successful.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.refreshSshKey.error.title'));\n\t}\n}\n\nconst refreshBranches = async () => {\n\ttry {\n\t\tawait sourceControlStore.getBranches();\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('settings.sourceControl.refreshBranches.success'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, locale.baseText('settings.sourceControl.refreshBranches.error'));\n\t}\n};\n\nconst onSelectSshKeyType = async (sshKeyType: TupleToUnion<SshKeyTypes>) => {\n\tif (sshKeyType === sourceControlStore.preferences.keyGeneratorType) {\n\t\treturn;\n\t}\n\tsourceControlStore.preferences.keyGeneratorType = sshKeyType;\n};\n</script>\n\n<template>\n\t<div>\n\t\t<n8n-heading size=\"2xlarge\" tag=\"h1\">{{\n\t\t\tlocale.baseText('settings.sourceControl.title')\n\t\t}}</n8n-heading>\n\t\t<div\n\t\t\tv-if=\"sourceControlStore.isEnterpriseSourceControlEnabled\"\n\t\t\tdata-test-id=\"source-control-content-licensed\"\n\t\t>\n\t\t\t<n8n-callout theme=\"secondary\" icon=\"info-circle\" class=\"mt-2xl mb-l\">\n\t\t\t\t<i18n-t keypath=\"settings.sourceControl.description\" tag=\"span\">\n\t\t\t\t\t<template #link>\n\t\t\t\t\t\t<a :href=\"locale.baseText('settings.sourceControl.docs.url')\" target=\"_blank\">\n\t\t\t\t\t\t\t{{ locale.baseText('settings.sourceControl.description.link') }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t</n8n-callout>\n\t\t\t<n8n-heading size=\"xlarge\" tag=\"h2\" class=\"mb-s\">{{\n\t\t\t\tlocale.baseText('settings.sourceControl.gitConfig')\n\t\t\t}}</n8n-heading>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label for=\"repoUrl\">{{ locale.baseText('settings.sourceControl.repoUrl') }}</label>\n\t\t\t\t<div :class=\"$style.groupFlex\">\n\t\t\t\t\t<n8n-form-input\n\t\t\t\t\t\tid=\"repoUrl\"\n\t\t\t\t\t\tv-model=\"sourceControlStore.preferences.repositoryUrl\"\n\t\t\t\t\t\tlabel\n\t\t\t\t\t\tclass=\"ml-0\"\n\t\t\t\t\t\tname=\"repoUrl\"\n\t\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t\t:validation-rules=\"repoUrlValidationRules\"\n\t\t\t\t\t\t:disabled=\"isConnected\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('settings.sourceControl.repoUrlPlaceholder')\"\n\t\t\t\t\t\t@validate=\"(value: boolean) => onValidate('repoUrl', value)\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tv-if=\"isConnected\"\n\t\t\t\t\t\t:class=\"$style.disconnectButton\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\t\tdata-test-id=\"source-control-disconnect-button\"\n\t\t\t\t\t\t@click=\"onDisconnect\"\n\t\t\t\t\t\t>{{ locale.baseText('settings.sourceControl.button.disconnect') }}</n8n-button\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if=\"sourceControlStore.preferences.publicKey\" :class=\"$style.group\">\n\t\t\t\t<label>{{ locale.baseText('settings.sourceControl.sshKey') }}</label>\n\t\t\t\t<div :class=\"{ [$style.sshInput]: !isConnected }\">\n\t\t\t\t\t<n8n-form-input\n\t\t\t\t\t\tv-if=\"!isConnected\"\n\t\t\t\t\t\tid=\"keyGeneratorType\"\n\t\t\t\t\t\t:class=\"$style.sshKeyTypeSelect\"\n\t\t\t\t\t\tlabel\n\t\t\t\t\t\ttype=\"select\"\n\t\t\t\t\t\tname=\"keyGeneratorType\"\n\t\t\t\t\t\tdata-test-id=\"source-control-ssh-key-type-select\"\n\t\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t\t:validation-rules=\"keyGeneratorTypeValidationRules\"\n\t\t\t\t\t\t:options=\"sourceControlStore.sshKeyTypesWithLabel\"\n\t\t\t\t\t\t:model-value=\"sourceControlStore.preferences.keyGeneratorType\"\n\t\t\t\t\t\t@validate=\"(value: boolean) => onValidate('keyGeneratorType', value)\"\n\t\t\t\t\t\t@update:model-value=\"onSelectSshKeyType\"\n\t\t\t\t\t/>\n\t\t\t\t\t<CopyInput\n\t\t\t\t\t\t:class=\"$style.copyInput\"\n\t\t\t\t\t\tcollapse\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t:value=\"sourceControlStore.preferences.publicKey\"\n\t\t\t\t\t\t:copy-button-text=\"locale.baseText('generic.clickToCopy')\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tv-if=\"!isConnected\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\ticon=\"sync\"\n\t\t\t\t\t\tdata-test-id=\"source-control-refresh-ssh-key-button\"\n\t\t\t\t\t\t@click=\"refreshSshKey\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ locale.baseText('settings.sourceControl.refreshSshKey') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<n8n-notice type=\"info\" class=\"mt-s\">\n\t\t\t\t\t<i18n-t keypath=\"settings.sourceControl.sshKeyDescription\" tag=\"span\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"locale.baseText('settings.sourceControl.docs.setup.ssh.url')\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>{{ locale.baseText('settings.sourceControl.sshKeyDescriptionLink') }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</n8n-notice>\n\t\t\t</div>\n\t\t\t<n8n-button\n\t\t\t\tv-if=\"!isConnected\"\n\t\t\t\tsize=\"large\"\n\t\t\t\t:disabled=\"!validForConnection\"\n\t\t\t\t:class=\"$style.connect\"\n\t\t\t\tdata-test-id=\"source-control-connect-button\"\n\t\t\t\t@click=\"onConnect\"\n\t\t\t\t>{{ locale.baseText('settings.sourceControl.button.connect') }}</n8n-button\n\t\t\t>\n\t\t\t<div v-if=\"isConnected\" data-test-id=\"source-control-connected-content\">\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<hr />\n\t\t\t\t\t<n8n-heading size=\"xlarge\" tag=\"h2\" class=\"mb-s\">{{\n\t\t\t\t\t\tlocale.baseText('settings.sourceControl.instanceSettings')\n\t\t\t\t\t}}</n8n-heading>\n\t\t\t\t\t<label>{{ locale.baseText('settings.sourceControl.branches') }}</label>\n\t\t\t\t\t<div :class=\"$style.branchSelection\">\n\t\t\t\t\t\t<n8n-form-input\n\t\t\t\t\t\t\tid=\"branchName\"\n\t\t\t\t\t\t\tlabel\n\t\t\t\t\t\t\ttype=\"select\"\n\t\t\t\t\t\t\tname=\"branchName\"\n\t\t\t\t\t\t\tclass=\"mb-s\"\n\t\t\t\t\t\t\tdata-test-id=\"source-control-branch-select\"\n\t\t\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t\t\t:validation-rules=\"branchNameValidationRules\"\n\t\t\t\t\t\t\t:options=\"branchNameOptions\"\n\t\t\t\t\t\t\t:model-value=\"sourceControlStore.preferences.branchName\"\n\t\t\t\t\t\t\t@validate=\"(value: boolean) => onValidate('branchName', value)\"\n\t\t\t\t\t\t\t@update:model-value=\"onSelect\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{{ locale.baseText('settings.sourceControl.refreshBranches.tooltip') }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t\ticon=\"sync\"\n\t\t\t\t\t\t\t\tsquare\n\t\t\t\t\t\t\t\t:class=\"$style.refreshBranches\"\n\t\t\t\t\t\t\t\tdata-test-id=\"source-control-refresh-branches-button\"\n\t\t\t\t\t\t\t\t@click=\"refreshBranches\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<n8n-checkbox\n\t\t\t\t\t\tv-model=\"sourceControlStore.preferences.branchReadOnly\"\n\t\t\t\t\t\t:class=\"$style.readOnly\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i18n-t keypath=\"settings.sourceControl.protected\" tag=\"span\">\n\t\t\t\t\t\t\t<template #bold>\n\t\t\t\t\t\t\t\t<strong>{{ locale.baseText('settings.sourceControl.protected.bold') }}</strong>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</n8n-checkbox>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<label>{{ locale.baseText('settings.sourceControl.color') }}</label>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-color-picker v-model=\"sourceControlStore.preferences.branchColor\" size=\"small\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"[$style.group, 'pt-s']\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t:disabled=\"!sourceControlStore.preferences.branchName\"\n\t\t\t\t\t\tdata-test-id=\"source-control-save-settings-button\"\n\t\t\t\t\t\t@click=\"onSave\"\n\t\t\t\t\t\t>{{ locale.baseText('settings.sourceControl.button.save') }}</n8n-button\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-action-box\n\t\t\tv-else\n\t\t\tdata-test-id=\"source-control-content-unlicensed\"\n\t\t\t:class=\"$style.actionBox\"\n\t\t\t:description=\"locale.baseText('settings.sourceControl.actionBox.description')\"\n\t\t\t:button-text=\"locale.baseText('settings.sourceControl.actionBox.buttonText')\"\n\t\t\t@click:button=\"goToUpgrade\"\n\t\t>\n\t\t\t<template #heading>\n\t\t\t\t<span>{{ locale.baseText('settings.sourceControl.actionBox.title') }}</span>\n\t\t\t</template>\n\t\t\t<template #description>\n\t\t\t\t{{ locale.baseText('settings.sourceControl.actionBox.description') }}\n\t\t\t\t<a :href=\"locale.baseText('settings.sourceControl.docs.url')\" target=\"_blank\">\n\t\t\t\t\t{{ locale.baseText('settings.sourceControl.actionBox.description.link') }}\n\t\t\t\t</a>\n\t\t\t</template>\n\t\t</n8n-action-box>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.group {\n\tpadding: 0 0 var(--spacing-s);\n\twidth: 100%;\n\tdisplay: block;\n\n\thr {\n\t\tmargin: 0 0 var(--spacing-xl);\n\t\tborder: 1px solid var(--color-foreground-light);\n\t}\n\n\tlabel {\n\t\tdisplay: inline-block;\n\t\tpadding: 0 0 var(--spacing-2xs);\n\t\tfont-size: var(--font-size-s);\n\t}\n\n\tsmall {\n\t\tdisplay: inline-block;\n\t\tpadding: var(--spacing-2xs) 0 0;\n\t\tfont-size: var(--font-size-2xs);\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n.readOnly {\n\tspan {\n\t\tfont-size: var(--font-size-s) !important;\n\t}\n}\n\n.groupFlex {\n\tdisplay: flex;\n\talign-items: flex-start;\n\n\t> div {\n\t\tflex: 1;\n\n\t\t&:last-child {\n\t\t\tmargin-left: var(--spacing-2xs);\n\t\t}\n\t}\n\n\tinput {\n\t\twidth: 100%;\n\t}\n}\n\n.connect {\n\tmargin: calc(var(--spacing-2xs) * -1) 0 var(--spacing-2xs);\n}\n\n.disconnectButton {\n\tmargin: 0 0 0 var(--spacing-2xs);\n\theight: 40px;\n}\n\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n\n.sshInput {\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n\n\t> div {\n\t\tflex: 1 1 auto;\n\t}\n\n\t> button {\n\t\theight: 42px;\n\t}\n\n\t.copyInput {\n\t\tmargin: 0 var(--spacing-2xs);\n\t}\n}\n\n.sshKeyTypeSelect {\n\tmin-width: 120px;\n}\n\n.copyInput {\n\toverflow: auto;\n}\n\n.branchSelection {\n\tdisplay: flex;\n\n\t> div:first-child {\n\t\tflex: 1;\n\n\t\tinput {\n\t\t\theight: 36px;\n\t\t}\n\t}\n\n\tbutton.refreshBranches {\n\t\theight: 36px;\n\t\twidth: 36px;\n\t\tmargin-left: var(--spacing-xs);\n\t}\n}\n</style>\n"],"names":["locale","useI18n","sourceControlStore","useSourceControlStore","uiStore","useUIStore","toast","useToast","message","useMessage","loadingService","useLoadingService","isConnected","ref","branchNameOptions","computed","branch","onConnect","error","onDisconnect","MODAL_CONFIRM","onSave","onSelect","b","goToUpgrade","initialize","onMounted","formValidationStatus","reactive","onValidate","key","value","repoUrlValidationRules","keyGeneratorTypeValidationRules","validForConnection","branchNameValidationRules","refreshSshKey","refreshBranches","onSelectSshKeyType","sshKeyType"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{G as J,e as f,r as v,b as K,ag as d,l as T,m as C,U as u,O as c,S as x,T as o,u as s,p as a,M as V,I as p,R as W,P as B,V as I}from"./vendor-Dv5OeN6t.js";import{l as Y,cQ as Z,e as tt,u as et,c$ as M,x as st,G as at,H as ot}from"./index-
|
|
2
|
-
//# sourceMappingURL=SettingsSso-
|
|
1
|
+
import{G as J,e as f,r as v,b as K,ag as d,l as T,m as C,U as u,O as c,S as x,T as o,u as s,p as a,M as V,I as p,R as W,P as B,V as I}from"./vendor-Dv5OeN6t.js";import{l as Y,cQ as Z,e as tt,u as et,c$ as M,x as st,G as at,H as ot}from"./index-1OxaEeO3.js";import{_ as nt}from"./n8n-4UEsHtUL.js";import"./pinia-sugP77Im.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const lt={class:"pb-3xl"},it={href:"https://docs.n8n.io/user-management/saml/",target:"_blank"},rt={key:0,"data-test-id":"sso-content-licensed"},ut={class:"mt-2xs mb-s"},dt=J({__name:"SettingsSso",setup(xt){const l={URL:"url",XML:"xml"},e=st(),R=at(),$=Y(),n=Z(),j=tt(),z=ot(),y=et(),X=f(()=>n.isSamlLoginEnabled?e.baseText("settings.sso.activated"):e.baseText("settings.sso.deactivated")),_=v(!1),S=v(),U=v(),N=v([{label:e.baseText("settings.sso.settings.ips.options.url"),value:l.URL},{label:e.baseText("settings.sso.settings.ips.options.xml"),value:l.XML}]),i=v(l.URL),m=v(),g=v(),D=f(()=>{var t,r;return i.value===l.URL?!!m.value&&m.value!==((t=n.samlConfig)==null?void 0:t.metadataUrl):i.value===l.XML?!!g.value&&g.value!==((r=n.samlConfig)==null?void 0:r.metadata):!1}),O=f(()=>i.value===l.URL?!!m.value&&_.value:i.value===l.XML?!!g.value&&_.value:!1),w=async()=>{const t=await n.getSamlConfig();U.value=t==null?void 0:t.entityID,S.value=t==null?void 0:t.returnUrl,t!=null&&t.metadataUrl?i.value=l.URL:t!=null&&t.metadata&&(i.value=l.XML),g.value=t==null?void 0:t.metadata,m.value=t==null?void 0:t.metadataUrl,_.value=!!(t!=null&&t.metadata)},G=async()=>{try{const t=i.value===l.URL?{metadataUrl:m.value}:{metadata:g.value};await n.saveSamlConfig(t),n.isSamlLoginEnabled||await z.confirm(e.baseText("settings.sso.settings.save.activate.message"),e.baseText("settings.sso.settings.save.activate.title"),{confirmButtonText:e.baseText("settings.sso.settings.save.activate.test"),cancelButtonText:e.baseText("settings.sso.settings.save.activate.cancel")})==="confirm"&&await h(),R.track("User updated single sign on settings",{instance_id:$.instanceId,identity_provider:i.value==="url"?"metadata":"xml",is_active:n.isSamlLoginEnabled})}catch(t){y.showError(t,e.baseText("settings.sso.settings.save.error"));return}finally{await w()}},h=async()=>{try{const t=await n.testSamlConfig();typeof window<"u"&&window.open(t,"_blank")}catch(t){y.showError(t,"error")}},P=()=>{j.goToUpgrade("sso","upgrade-sso")};return K(async()=>{if(n.isEnterpriseSamlEnabled)try{await w()}catch(t){y.showError(t,"error")}}),(t,r)=>{const k=d("n8n-heading"),A=d("el-switch"),H=d("n8n-tooltip"),Q=d("n8n-info-tip"),q=d("n8n-radio-buttons"),L=d("n8n-input"),E=d("n8n-button"),F=d("n8n-action-box");return T(),C("div",lt,[u(k,{size:"2xlarge"},{default:c(()=>[x(o(s(e).baseText("settings.sso.title")),1)]),_:1}),a("div",{class:p(t.$style.top)},[u(k,{size:"xlarge"},{default:c(()=>[x(o(s(e).baseText("settings.sso.subtitle")),1)]),_:1}),s(n).isEnterpriseSamlEnabled?(T(),V(H,{key:0,disabled:s(n).isSamlLoginEnabled||_.value},{content:c(()=>[a("span",null,o(s(e).baseText("settings.sso.activation.tooltip")),1)]),default:c(()=>[u(A,{modelValue:s(n).isSamlLoginEnabled,"onUpdate:modelValue":r[0]||(r[0]=b=>s(n).isSamlLoginEnabled=b),disabled:!_.value,class:p(t.$style.switch),"inactive-text":X.value},null,8,["modelValue","disabled","class","inactive-text"])]),_:1},8,["disabled"])):W("",!0)],2),u(Q,null,{default:c(()=>[x(o(s(e).baseText("settings.sso.info"))+" ",1),a("a",it,o(s(e).baseText("settings.sso.info.link")),1)]),_:1}),s(n).isEnterpriseSamlEnabled?(T(),C("div",rt,[a("div",{class:p(t.$style.group)},[a("label",null,o(s(e).baseText("settings.sso.settings.redirectUrl.label")),1),u(M,{value:S.value,"copy-button-text":s(e).baseText("generic.clickToCopy"),"toast-title":s(e).baseText("settings.sso.settings.redirectUrl.copied")},null,8,["value","copy-button-text","toast-title"]),a("small",null,o(s(e).baseText("settings.sso.settings.redirectUrl.help")),1)],2),a("div",{class:p(t.$style.group)},[a("label",null,o(s(e).baseText("settings.sso.settings.entityId.label")),1),u(M,{value:U.value,"copy-button-text":s(e).baseText("generic.clickToCopy"),"toast-title":s(e).baseText("settings.sso.settings.entityId.copied")},null,8,["value","copy-button-text","toast-title"]),a("small",null,o(s(e).baseText("settings.sso.settings.entityId.help")),1)],2),a("div",{class:p(t.$style.group)},[a("label",null,o(s(e).baseText("settings.sso.settings.ips.label")),1),a("div",ut,[u(q,{modelValue:i.value,"onUpdate:modelValue":r[1]||(r[1]=b=>i.value=b),options:N.value},null,8,["modelValue","options"])]),B(a("div",null,[u(L,{modelValue:m.value,"onUpdate:modelValue":r[2]||(r[2]=b=>m.value=b),type:"text",name:"metadataUrl",size:"large",placeholder:s(e).baseText("settings.sso.settings.ips.url.placeholder")},null,8,["modelValue","placeholder"]),a("small",null,o(s(e).baseText("settings.sso.settings.ips.url.help")),1)],512),[[I,i.value===l.URL]]),B(a("div",null,[u(L,{modelValue:g.value,"onUpdate:modelValue":r[3]||(r[3]=b=>g.value=b),type:"textarea",name:"metadata",rows:4},null,8,["modelValue"]),a("small",null,o(s(e).baseText("settings.sso.settings.ips.xml.help")),1)],512),[[I,i.value===l.XML]])],2),a("div",{class:p(t.$style.buttons)},[u(E,{disabled:!D.value,size:"large","data-test-id":"sso-save",onClick:G},{default:c(()=>[x(o(s(e).baseText("settings.sso.settings.save")),1)]),_:1},8,["disabled"]),u(E,{disabled:!O.value,size:"large",type:"tertiary","data-test-id":"sso-test",onClick:h},{default:c(()=>[x(o(s(e).baseText("settings.sso.settings.test")),1)]),_:1},8,["disabled"])],2),a("footer",{class:p(t.$style.footer)},o(s(e).baseText("settings.sso.settings.footer.hint")),3)])):(T(),V(F,{key:1,"data-test-id":"sso-content-unlicensed",class:p(t.$style.actionBox),description:s(e).baseText("settings.sso.actionBox.description"),"button-text":s(e).baseText("settings.sso.actionBox.buttonText"),"onClick:button":P},{heading:c(()=>[a("span",null,o(s(e).baseText("settings.sso.actionBox.title")),1)]),_:1},8,["class","description","button-text"]))])}}}),ct="_top_1i3kj_1",pt="_buttons_1i3kj_14",mt="_group_1i3kj_23",gt="_actionBox_1i3kj_39",bt="_footer_1i3kj_43",vt={top:ct,switch:"_switch_1i3kj_8",buttons:pt,group:mt,actionBox:gt,footer:bt},_t={$style:vt},Ft=nt(dt,[["__cssModules",_t]]);export{Ft as default};
|
|
2
|
+
//# sourceMappingURL=SettingsSso-DA9AOKH5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSso-BueUV3RH.js","sources":["../../src/views/SettingsSso.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, onMounted } from 'vue';\nimport { useSSOStore } from '@/stores/sso.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport CopyInput from '@/components/CopyInput.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useRootStore } from '@/stores/root.store';\n\nconst IdentityProviderSettingsType = {\n\tURL: 'url',\n\tXML: 'xml',\n};\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst rootStore = useRootStore();\nconst ssoStore = useSSOStore();\nconst uiStore = useUIStore();\nconst message = useMessage();\nconst toast = useToast();\n\nconst ssoActivatedLabel = computed(() =>\n\tssoStore.isSamlLoginEnabled\n\t\t? i18n.baseText('settings.sso.activated')\n\t\t: i18n.baseText('settings.sso.deactivated'),\n);\nconst ssoSettingsSaved = ref(false);\n\nconst redirectUrl = ref();\nconst entityId = ref();\n\nconst ipsOptions = ref([\n\t{\n\t\tlabel: i18n.baseText('settings.sso.settings.ips.options.url'),\n\t\tvalue: IdentityProviderSettingsType.URL,\n\t},\n\t{\n\t\tlabel: i18n.baseText('settings.sso.settings.ips.options.xml'),\n\t\tvalue: IdentityProviderSettingsType.XML,\n\t},\n]);\nconst ipsType = ref(IdentityProviderSettingsType.URL);\n\nconst metadataUrl = ref();\nconst metadata = ref();\n\nconst isSaveEnabled = computed(() => {\n\tif (ipsType.value === IdentityProviderSettingsType.URL) {\n\t\treturn !!metadataUrl.value && metadataUrl.value !== ssoStore.samlConfig?.metadataUrl;\n\t} else if (ipsType.value === IdentityProviderSettingsType.XML) {\n\t\treturn !!metadata.value && metadata.value !== ssoStore.samlConfig?.metadata;\n\t}\n\treturn false;\n});\n\nconst isTestEnabled = computed(() => {\n\tif (ipsType.value === IdentityProviderSettingsType.URL) {\n\t\treturn !!metadataUrl.value && ssoSettingsSaved.value;\n\t} else if (ipsType.value === IdentityProviderSettingsType.XML) {\n\t\treturn !!metadata.value && ssoSettingsSaved.value;\n\t}\n\treturn false;\n});\n\nconst getSamlConfig = async () => {\n\tconst config = await ssoStore.getSamlConfig();\n\n\tentityId.value = config?.entityID;\n\tredirectUrl.value = config?.returnUrl;\n\n\tif (config?.metadataUrl) {\n\t\tipsType.value = IdentityProviderSettingsType.URL;\n\t} else if (config?.metadata) {\n\t\tipsType.value = IdentityProviderSettingsType.XML;\n\t}\n\n\tmetadata.value = config?.metadata;\n\tmetadataUrl.value = config?.metadataUrl;\n\tssoSettingsSaved.value = !!config?.metadata;\n};\n\nconst onSave = async () => {\n\ttry {\n\t\tconst config =\n\t\t\tipsType.value === IdentityProviderSettingsType.URL\n\t\t\t\t? { metadataUrl: metadataUrl.value }\n\t\t\t\t: { metadata: metadata.value };\n\t\tawait ssoStore.saveSamlConfig(config);\n\n\t\tif (!ssoStore.isSamlLoginEnabled) {\n\t\t\tconst answer = await message.confirm(\n\t\t\t\ti18n.baseText('settings.sso.settings.save.activate.message'),\n\t\t\t\ti18n.baseText('settings.sso.settings.save.activate.title'),\n\t\t\t\t{\n\t\t\t\t\tconfirmButtonText: i18n.baseText('settings.sso.settings.save.activate.test'),\n\t\t\t\t\tcancelButtonText: i18n.baseText('settings.sso.settings.save.activate.cancel'),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (answer === 'confirm') {\n\t\t\t\tawait onTest();\n\t\t\t}\n\t\t}\n\n\t\ttelemetry.track('User updated single sign on settings', {\n\t\t\tinstance_id: rootStore.instanceId,\n\t\t\tidentity_provider: ipsType.value === 'url' ? 'metadata' : 'xml',\n\t\t\tis_active: ssoStore.isSamlLoginEnabled,\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('settings.sso.settings.save.error'));\n\t\treturn;\n\t} finally {\n\t\tawait getSamlConfig();\n\t}\n};\n\nconst onTest = async () => {\n\ttry {\n\t\tconst url = await ssoStore.testSamlConfig();\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, 'error');\n\t}\n};\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('sso', 'upgrade-sso');\n};\n\nonMounted(async () => {\n\tif (!ssoStore.isEnterpriseSamlEnabled) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait getSamlConfig();\n\t} catch (error) {\n\t\ttoast.showError(error, 'error');\n\t}\n});\n</script>\n\n<template>\n\t<div class=\"pb-3xl\">\n\t\t<n8n-heading size=\"2xlarge\">{{ i18n.baseText('settings.sso.title') }}</n8n-heading>\n\t\t<div :class=\"$style.top\">\n\t\t\t<n8n-heading size=\"xlarge\">{{ i18n.baseText('settings.sso.subtitle') }}</n8n-heading>\n\t\t\t<n8n-tooltip\n\t\t\t\tv-if=\"ssoStore.isEnterpriseSamlEnabled\"\n\t\t\t\t:disabled=\"ssoStore.isSamlLoginEnabled || ssoSettingsSaved\"\n\t\t\t>\n\t\t\t\t<template #content>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{{ i18n.baseText('settings.sso.activation.tooltip') }}\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<el-switch\n\t\t\t\t\tv-model=\"ssoStore.isSamlLoginEnabled\"\n\t\t\t\t\t:disabled=\"!ssoSettingsSaved\"\n\t\t\t\t\t:class=\"$style.switch\"\n\t\t\t\t\t:inactive-text=\"ssoActivatedLabel\"\n\t\t\t\t/>\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t\t<n8n-info-tip>\n\t\t\t{{ i18n.baseText('settings.sso.info') }}\n\t\t\t<a href=\"https://docs.n8n.io/user-management/saml/\" target=\"_blank\">\n\t\t\t\t{{ i18n.baseText('settings.sso.info.link') }}\n\t\t\t</a>\n\t\t</n8n-info-tip>\n\t\t<div v-if=\"ssoStore.isEnterpriseSamlEnabled\" data-test-id=\"sso-content-licensed\">\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label>{{ i18n.baseText('settings.sso.settings.redirectUrl.label') }}</label>\n\t\t\t\t<CopyInput\n\t\t\t\t\t:value=\"redirectUrl\"\n\t\t\t\t\t:copy-button-text=\"i18n.baseText('generic.clickToCopy')\"\n\t\t\t\t\t:toast-title=\"i18n.baseText('settings.sso.settings.redirectUrl.copied')\"\n\t\t\t\t/>\n\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.redirectUrl.help') }}</small>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label>{{ i18n.baseText('settings.sso.settings.entityId.label') }}</label>\n\t\t\t\t<CopyInput\n\t\t\t\t\t:value=\"entityId\"\n\t\t\t\t\t:copy-button-text=\"i18n.baseText('generic.clickToCopy')\"\n\t\t\t\t\t:toast-title=\"i18n.baseText('settings.sso.settings.entityId.copied')\"\n\t\t\t\t/>\n\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.entityId.help') }}</small>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label>{{ i18n.baseText('settings.sso.settings.ips.label') }}</label>\n\t\t\t\t<div class=\"mt-2xs mb-s\">\n\t\t\t\t\t<n8n-radio-buttons v-model=\"ipsType\" :options=\"ipsOptions\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-show=\"ipsType === IdentityProviderSettingsType.URL\">\n\t\t\t\t\t<n8n-input\n\t\t\t\t\t\tv-model=\"metadataUrl\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"metadataUrl\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t:placeholder=\"i18n.baseText('settings.sso.settings.ips.url.placeholder')\"\n\t\t\t\t\t/>\n\t\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.ips.url.help') }}</small>\n\t\t\t\t</div>\n\t\t\t\t<div v-show=\"ipsType === IdentityProviderSettingsType.XML\">\n\t\t\t\t\t<n8n-input v-model=\"metadata\" type=\"textarea\" name=\"metadata\" :rows=\"4\" />\n\t\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.ips.xml.help') }}</small>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.buttons\">\n\t\t\t\t<n8n-button :disabled=\"!isSaveEnabled\" size=\"large\" data-test-id=\"sso-save\" @click=\"onSave\">\n\t\t\t\t\t{{ i18n.baseText('settings.sso.settings.save') }}\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button\n\t\t\t\t\t:disabled=\"!isTestEnabled\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tdata-test-id=\"sso-test\"\n\t\t\t\t\t@click=\"onTest\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('settings.sso.settings.test') }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t\t<footer :class=\"$style.footer\">\n\t\t\t\t{{ i18n.baseText('settings.sso.settings.footer.hint') }}\n\t\t\t</footer>\n\t\t</div>\n\t\t<n8n-action-box\n\t\t\tv-else\n\t\t\tdata-test-id=\"sso-content-unlicensed\"\n\t\t\t:class=\"$style.actionBox\"\n\t\t\t:description=\"i18n.baseText('settings.sso.actionBox.description')\"\n\t\t\t:button-text=\"i18n.baseText('settings.sso.actionBox.buttonText')\"\n\t\t\t@click:button=\"goToUpgrade\"\n\t\t>\n\t\t\t<template #heading>\n\t\t\t\t<span>{{ i18n.baseText('settings.sso.actionBox.title') }}</span>\n\t\t\t</template>\n\t\t</n8n-action-box>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.top {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: var(--spacing-2xl) 0 var(--spacing-xl);\n}\n\n.switch {\n\tspan {\n\t\tfont-size: var(--font-size-2xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tjustify-content: flex-start;\n\tpadding: var(--spacing-2xl) 0 var(--spacing-2xs);\n\n\tbutton {\n\t\tmargin: 0 var(--spacing-s) 0 0;\n\t}\n}\n\n.group {\n\tpadding: var(--spacing-xl) 0 0;\n\n\t> label {\n\t\tdisplay: inline-block;\n\t\tfont-size: var(--font-size-s);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tpadding: 0 0 var(--spacing-2xs);\n\t}\n\n\tsmall {\n\t\tdisplay: block;\n\t\tpadding: var(--spacing-2xs) 0 0;\n\t\tfont-size: var(--font-size-2xs);\n\t\tcolor: var(--color-text-base);\n\t}\n}\n\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n\n.footer {\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-2xs);\n}\n</style>\n"],"names":["IdentityProviderSettingsType","i18n","useI18n","telemetry","useTelemetry","rootStore","useRootStore","ssoStore","useSSOStore","uiStore","useUIStore","message","useMessage","toast","useToast","ssoActivatedLabel","computed","ssoSettingsSaved","ref","redirectUrl","entityId","ipsOptions","ipsType","metadataUrl","metadata","isSaveEnabled","_a","_b","isTestEnabled","getSamlConfig","config","onSave","onTest","error","url","goToUpgrade","onMounted"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsSso-DA9AOKH5.js","sources":["../../src/views/SettingsSso.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, onMounted } from 'vue';\nimport { useSSOStore } from '@/stores/sso.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport CopyInput from '@/components/CopyInput.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useRootStore } from '@/stores/root.store';\n\nconst IdentityProviderSettingsType = {\n\tURL: 'url',\n\tXML: 'xml',\n};\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst rootStore = useRootStore();\nconst ssoStore = useSSOStore();\nconst uiStore = useUIStore();\nconst message = useMessage();\nconst toast = useToast();\n\nconst ssoActivatedLabel = computed(() =>\n\tssoStore.isSamlLoginEnabled\n\t\t? i18n.baseText('settings.sso.activated')\n\t\t: i18n.baseText('settings.sso.deactivated'),\n);\nconst ssoSettingsSaved = ref(false);\n\nconst redirectUrl = ref();\nconst entityId = ref();\n\nconst ipsOptions = ref([\n\t{\n\t\tlabel: i18n.baseText('settings.sso.settings.ips.options.url'),\n\t\tvalue: IdentityProviderSettingsType.URL,\n\t},\n\t{\n\t\tlabel: i18n.baseText('settings.sso.settings.ips.options.xml'),\n\t\tvalue: IdentityProviderSettingsType.XML,\n\t},\n]);\nconst ipsType = ref(IdentityProviderSettingsType.URL);\n\nconst metadataUrl = ref();\nconst metadata = ref();\n\nconst isSaveEnabled = computed(() => {\n\tif (ipsType.value === IdentityProviderSettingsType.URL) {\n\t\treturn !!metadataUrl.value && metadataUrl.value !== ssoStore.samlConfig?.metadataUrl;\n\t} else if (ipsType.value === IdentityProviderSettingsType.XML) {\n\t\treturn !!metadata.value && metadata.value !== ssoStore.samlConfig?.metadata;\n\t}\n\treturn false;\n});\n\nconst isTestEnabled = computed(() => {\n\tif (ipsType.value === IdentityProviderSettingsType.URL) {\n\t\treturn !!metadataUrl.value && ssoSettingsSaved.value;\n\t} else if (ipsType.value === IdentityProviderSettingsType.XML) {\n\t\treturn !!metadata.value && ssoSettingsSaved.value;\n\t}\n\treturn false;\n});\n\nconst getSamlConfig = async () => {\n\tconst config = await ssoStore.getSamlConfig();\n\n\tentityId.value = config?.entityID;\n\tredirectUrl.value = config?.returnUrl;\n\n\tif (config?.metadataUrl) {\n\t\tipsType.value = IdentityProviderSettingsType.URL;\n\t} else if (config?.metadata) {\n\t\tipsType.value = IdentityProviderSettingsType.XML;\n\t}\n\n\tmetadata.value = config?.metadata;\n\tmetadataUrl.value = config?.metadataUrl;\n\tssoSettingsSaved.value = !!config?.metadata;\n};\n\nconst onSave = async () => {\n\ttry {\n\t\tconst config =\n\t\t\tipsType.value === IdentityProviderSettingsType.URL\n\t\t\t\t? { metadataUrl: metadataUrl.value }\n\t\t\t\t: { metadata: metadata.value };\n\t\tawait ssoStore.saveSamlConfig(config);\n\n\t\tif (!ssoStore.isSamlLoginEnabled) {\n\t\t\tconst answer = await message.confirm(\n\t\t\t\ti18n.baseText('settings.sso.settings.save.activate.message'),\n\t\t\t\ti18n.baseText('settings.sso.settings.save.activate.title'),\n\t\t\t\t{\n\t\t\t\t\tconfirmButtonText: i18n.baseText('settings.sso.settings.save.activate.test'),\n\t\t\t\t\tcancelButtonText: i18n.baseText('settings.sso.settings.save.activate.cancel'),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (answer === 'confirm') {\n\t\t\t\tawait onTest();\n\t\t\t}\n\t\t}\n\n\t\ttelemetry.track('User updated single sign on settings', {\n\t\t\tinstance_id: rootStore.instanceId,\n\t\t\tidentity_provider: ipsType.value === 'url' ? 'metadata' : 'xml',\n\t\t\tis_active: ssoStore.isSamlLoginEnabled,\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('settings.sso.settings.save.error'));\n\t\treturn;\n\t} finally {\n\t\tawait getSamlConfig();\n\t}\n};\n\nconst onTest = async () => {\n\ttry {\n\t\tconst url = await ssoStore.testSamlConfig();\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, 'error');\n\t}\n};\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('sso', 'upgrade-sso');\n};\n\nonMounted(async () => {\n\tif (!ssoStore.isEnterpriseSamlEnabled) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait getSamlConfig();\n\t} catch (error) {\n\t\ttoast.showError(error, 'error');\n\t}\n});\n</script>\n\n<template>\n\t<div class=\"pb-3xl\">\n\t\t<n8n-heading size=\"2xlarge\">{{ i18n.baseText('settings.sso.title') }}</n8n-heading>\n\t\t<div :class=\"$style.top\">\n\t\t\t<n8n-heading size=\"xlarge\">{{ i18n.baseText('settings.sso.subtitle') }}</n8n-heading>\n\t\t\t<n8n-tooltip\n\t\t\t\tv-if=\"ssoStore.isEnterpriseSamlEnabled\"\n\t\t\t\t:disabled=\"ssoStore.isSamlLoginEnabled || ssoSettingsSaved\"\n\t\t\t>\n\t\t\t\t<template #content>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{{ i18n.baseText('settings.sso.activation.tooltip') }}\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<el-switch\n\t\t\t\t\tv-model=\"ssoStore.isSamlLoginEnabled\"\n\t\t\t\t\t:disabled=\"!ssoSettingsSaved\"\n\t\t\t\t\t:class=\"$style.switch\"\n\t\t\t\t\t:inactive-text=\"ssoActivatedLabel\"\n\t\t\t\t/>\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t\t<n8n-info-tip>\n\t\t\t{{ i18n.baseText('settings.sso.info') }}\n\t\t\t<a href=\"https://docs.n8n.io/user-management/saml/\" target=\"_blank\">\n\t\t\t\t{{ i18n.baseText('settings.sso.info.link') }}\n\t\t\t</a>\n\t\t</n8n-info-tip>\n\t\t<div v-if=\"ssoStore.isEnterpriseSamlEnabled\" data-test-id=\"sso-content-licensed\">\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label>{{ i18n.baseText('settings.sso.settings.redirectUrl.label') }}</label>\n\t\t\t\t<CopyInput\n\t\t\t\t\t:value=\"redirectUrl\"\n\t\t\t\t\t:copy-button-text=\"i18n.baseText('generic.clickToCopy')\"\n\t\t\t\t\t:toast-title=\"i18n.baseText('settings.sso.settings.redirectUrl.copied')\"\n\t\t\t\t/>\n\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.redirectUrl.help') }}</small>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label>{{ i18n.baseText('settings.sso.settings.entityId.label') }}</label>\n\t\t\t\t<CopyInput\n\t\t\t\t\t:value=\"entityId\"\n\t\t\t\t\t:copy-button-text=\"i18n.baseText('generic.clickToCopy')\"\n\t\t\t\t\t:toast-title=\"i18n.baseText('settings.sso.settings.entityId.copied')\"\n\t\t\t\t/>\n\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.entityId.help') }}</small>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label>{{ i18n.baseText('settings.sso.settings.ips.label') }}</label>\n\t\t\t\t<div class=\"mt-2xs mb-s\">\n\t\t\t\t\t<n8n-radio-buttons v-model=\"ipsType\" :options=\"ipsOptions\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-show=\"ipsType === IdentityProviderSettingsType.URL\">\n\t\t\t\t\t<n8n-input\n\t\t\t\t\t\tv-model=\"metadataUrl\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"metadataUrl\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t:placeholder=\"i18n.baseText('settings.sso.settings.ips.url.placeholder')\"\n\t\t\t\t\t/>\n\t\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.ips.url.help') }}</small>\n\t\t\t\t</div>\n\t\t\t\t<div v-show=\"ipsType === IdentityProviderSettingsType.XML\">\n\t\t\t\t\t<n8n-input v-model=\"metadata\" type=\"textarea\" name=\"metadata\" :rows=\"4\" />\n\t\t\t\t\t<small>{{ i18n.baseText('settings.sso.settings.ips.xml.help') }}</small>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.buttons\">\n\t\t\t\t<n8n-button :disabled=\"!isSaveEnabled\" size=\"large\" data-test-id=\"sso-save\" @click=\"onSave\">\n\t\t\t\t\t{{ i18n.baseText('settings.sso.settings.save') }}\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button\n\t\t\t\t\t:disabled=\"!isTestEnabled\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tdata-test-id=\"sso-test\"\n\t\t\t\t\t@click=\"onTest\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('settings.sso.settings.test') }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t\t<footer :class=\"$style.footer\">\n\t\t\t\t{{ i18n.baseText('settings.sso.settings.footer.hint') }}\n\t\t\t</footer>\n\t\t</div>\n\t\t<n8n-action-box\n\t\t\tv-else\n\t\t\tdata-test-id=\"sso-content-unlicensed\"\n\t\t\t:class=\"$style.actionBox\"\n\t\t\t:description=\"i18n.baseText('settings.sso.actionBox.description')\"\n\t\t\t:button-text=\"i18n.baseText('settings.sso.actionBox.buttonText')\"\n\t\t\t@click:button=\"goToUpgrade\"\n\t\t>\n\t\t\t<template #heading>\n\t\t\t\t<span>{{ i18n.baseText('settings.sso.actionBox.title') }}</span>\n\t\t\t</template>\n\t\t</n8n-action-box>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.top {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: var(--spacing-2xl) 0 var(--spacing-xl);\n}\n\n.switch {\n\tspan {\n\t\tfont-size: var(--font-size-2xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tjustify-content: flex-start;\n\tpadding: var(--spacing-2xl) 0 var(--spacing-2xs);\n\n\tbutton {\n\t\tmargin: 0 var(--spacing-s) 0 0;\n\t}\n}\n\n.group {\n\tpadding: var(--spacing-xl) 0 0;\n\n\t> label {\n\t\tdisplay: inline-block;\n\t\tfont-size: var(--font-size-s);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tpadding: 0 0 var(--spacing-2xs);\n\t}\n\n\tsmall {\n\t\tdisplay: block;\n\t\tpadding: var(--spacing-2xs) 0 0;\n\t\tfont-size: var(--font-size-2xs);\n\t\tcolor: var(--color-text-base);\n\t}\n}\n\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n\n.footer {\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-2xs);\n}\n</style>\n"],"names":["IdentityProviderSettingsType","i18n","useI18n","telemetry","useTelemetry","rootStore","useRootStore","ssoStore","useSSOStore","uiStore","useUIStore","message","useMessage","toast","useToast","ssoActivatedLabel","computed","ssoSettingsSaved","ref","redirectUrl","entityId","ipsOptions","ipsType","metadataUrl","metadata","isSaveEnabled","_a","_b","isTestEnabled","getSamlConfig","config","onSave","onTest","error","url","goToUpgrade","onMounted"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{G as H,az as J,aH as Q,r as f,e as A,b as X,ag as u,l as i,m as d,U as l,O as s,S as p,T as o,u as t,M as k,I as r,R as h,p as g,J as Y,a2 as Z}from"./vendor-Dv5OeN6t.js";import{cR as ee,e as te,u as ne,t as ae,O as a,dn as se,dp as oe}from"./index-
|
|
2
|
-
//# sourceMappingURL=SettingsUsageAndPlan-
|
|
1
|
+
import{G as H,az as J,aH as Q,r as f,e as A,b as X,ag as u,l as i,m as d,U as l,O as s,S as p,T as o,u as t,M as k,I as r,R as h,p as g,J as Y,a2 as Z}from"./vendor-Dv5OeN6t.js";import{cR as ee,e as te,u as ne,t as ae,O as a,dn as se,dp as oe}from"./index-1OxaEeO3.js";import{_ as ie}from"./n8n-4UEsHtUL.js";import"./pinia-sugP77Im.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const le={class:"settings-usage-and-plan"},ce={key:1},re={key:0},ue={key:1},de={key:0},pe={key:1},ge=["href"],_e=["href"],me=H({__name:"SettingsUsageAndPlan",setup(ze){const n=ee(),P=J(),B=Q(),I=te(),x=ne(),T=f(`callback=${encodeURIComponent(`${window.location.origin}${window.location.pathname}`)}`),V=A(()=>`${n.viewPlansUrl}&${T.value}&source=usage_page`),j=A(()=>`${n.managePlanUrl}&${T.value}`),_=f(!1),v=f(""),w=f(null),$=A(()=>ae(["rbac"],{rbac:{scope:"license:manage"}})),z=()=>{x.showMessage({type:"success",title:a.baseText("settings.usageAndPlan.license.activation.success.title"),message:a.baseText("settings.usageAndPlan.license.activation.success.message",{interpolate:{name:n.planName,type:n.planId?a.baseText("settings.usageAndPlan.plan"):a.baseText("settings.usageAndPlan.edition")}})})},L=e=>{x.showError(e,a.baseText("settings.usageAndPlan.license.activation.error.title"),e.message)},S=async()=>{try{await n.activateLicense(v.value),_.value=!1,z()}catch(e){L(e)}};X(async()=>{if(!n.isDesktop){if(n.setLoading(!0),P.query.key)try{await n.activateLicense(P.query.key),await B.replace({query:{}}),z(),n.setLoading(!1);return}catch(e){L(e)}try{!P.query.key&&$.value?await n.refreshLicenseManagementToken():await n.getLicenseInfo(),n.setLoading(!1)}catch(e){e.name||(e.name=a.baseText("settings.usageAndPlan.error")),x.showError(e,e.name,e.message)}}});const y=e=>{const c=n.telemetryPayload;c.action=e,oe.track("User clicked button on usage page",c)},q=()=>{_.value=!0,y("add_activation_key")},M=()=>{I.goToUpgrade("usage_page","open"),y("view_plans")},N=()=>{y("manage_plan")},R=()=>{v.value=""},D=()=>{var e;(e=w.value)==null||e.focus()},E=()=>{y("desktop_view_plans"),window.open(se,"_blank")};return(e,c)=>{const C=u("n8n-heading"),K=u("n8n-action-box"),U=u("i18n-t"),O=u("n8n-text"),W=u("n8n-info-tip"),m=u("n8n-button"),F=u("n8n-input"),G=u("el-dialog");return i(),d("div",le,[l(C,{size:"2xlarge"},{default:s(()=>[p(o(t(a).baseText("settings.usageAndPlan.title")),1)]),_:1}),t(n).isDesktop?(i(),k(K,{key:0,class:r(e.$style.actionBox),heading:t(a).baseText("settings.usageAndPlan.desktop.title"),description:t(a).baseText("settings.usageAndPlan.desktop.description"),"button-text":t(a).baseText("settings.usageAndPlan.button.plans"),"onClick:button":E},null,8,["class","heading","description","button-text"])):h("",!0),!t(n).isDesktop&&!t(n).isLoading?(i(),d("div",ce,[l(C,{class:r(e.$style.title),size:"large"},{default:s(()=>[l(U,{keypath:"settings.usageAndPlan.description",tag:"span"},{name:s(()=>[p(o(t(n).planName),1)]),type:s(()=>[t(n).planId?(i(),d("span",re,o(t(a).baseText("settings.usageAndPlan.plan")),1)):(i(),d("span",ue,o(t(a).baseText("settings.usageAndPlan.edition")),1))]),_:1})]),_:1},8,["class"]),g("div",{class:r(e.$style.quota)},[l(O,{size:"medium",color:"text-light"},{default:s(()=>[p(o(t(a).baseText("settings.usageAndPlan.activeWorkflows")),1)]),_:1}),g("div",{class:r(e.$style.chart)},[t(n).executionLimit>0?(i(),d("span",{key:0,class:r(e.$style.chartLine)},[g("span",{class:r(e.$style.chartBar),style:Y({width:`${t(n).executionPercentage}%`})},null,6)],2)):h("",!0),l(U,{tag:"span",class:r(e.$style.count),keypath:"settings.usageAndPlan.activeWorkflows.count"},{count:s(()=>[p(o(t(n).executionCount),1)]),limit:s(()=>[t(n).executionLimit<0?(i(),d("span",de,o(t(a).baseText("settings.usageAndPlan.activeWorkflows.unlimited")),1)):(i(),d("span",pe,o(t(n).executionLimit),1))]),_:1},8,["class"])],2)],2),l(W,null,{default:s(()=>[p(o(t(a).baseText("settings.usageAndPlan.activeWorkflows.hint")),1)]),_:1}),g("div",{class:r(e.$style.buttons)},[$.value?(i(),k(m,{key:0,class:r(e.$style.buttonTertiary),type:"tertiary",size:"large",onClick:q},{default:s(()=>[g("span",null,o(t(a).baseText("settings.usageAndPlan.button.activation")),1)]),_:1},8,["class"])):h("",!0),t(n).managementToken?(i(),k(m,{key:1,size:"large",onClick:N},{default:s(()=>[g("a",{href:j.value,target:"_blank"},o(t(a).baseText("settings.usageAndPlan.button.manage")),9,ge)]),_:1})):(i(),k(m,{key:2,size:"large",onClick:Z(M,["prevent"])},{default:s(()=>[g("a",{href:V.value,target:"_blank"},o(t(a).baseText("settings.usageAndPlan.button.plans")),9,_e)]),_:1}))],2),l(G,{modelValue:_.value,"onUpdate:modelValue":c[2]||(c[2]=b=>_.value=b),width:"480px",top:"0",title:t(a).baseText("settings.usageAndPlan.dialog.activation.title"),"modal-class":e.$style.center,onClosed:R,onOpened:D},{default:s(()=>[l(F,{ref_key:"activationKeyInput",ref:w,modelValue:v.value,"onUpdate:modelValue":c[0]||(c[0]=b=>v.value=b),placeholder:t(a).baseText("settings.usageAndPlan.dialog.activation.label")},null,8,["modelValue","placeholder"])]),footer:s(()=>[l(m,{type:"secondary",onClick:c[1]||(c[1]=b=>_.value=!1)},{default:s(()=>[p(o(t(a).baseText("settings.usageAndPlan.dialog.activation.cancel")),1)]),_:1}),l(m,{onClick:S},{default:s(()=>[p(o(t(a).baseText("settings.usageAndPlan.dialog.activation.activate")),1)]),_:1})]),_:1},8,["modelValue","title","modal-class"])])):h("",!0)])}}}),ve="_center_jzvne_1",ye="_actionBox_jzvne_5",be="_spacedFlex_jzvne_9",fe="_title_jzvne_15",ke="_quota_jzvne_20",he="_count_jzvne_32",Pe="_buttons_jzvne_37",xe="_chart_jzvne_53",Ae="_chartLine_jzvne_60",Te="_chartBar_jzvne_70",we={center:ve,actionBox:ye,spacedFlex:be,title:fe,quota:ke,count:he,buttons:Pe,chart:xe,chartLine:Ae,chartBar:Te},$e={$style:we},st=ie(me,[["__cssModules",$e],["__scopeId","data-v-698d6909"]]);export{st as default};
|
|
2
|
+
//# sourceMappingURL=SettingsUsageAndPlan-BVPtlthH.js.map
|
package/dist/assets/{SettingsUsageAndPlan-DzDC9m54.js.map → SettingsUsageAndPlan-BVPtlthH.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsUsageAndPlan-DzDC9m54.js","sources":["../../src/views/SettingsUsageAndPlan.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onMounted, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { UsageTelemetry } from '@/stores/usage.store';\nimport { useUsageStore } from '@/stores/usage.store';\nimport { telemetry } from '@/plugins/telemetry';\nimport { i18n as locale } from '@/plugins/i18n';\nimport { useUIStore } from '@/stores/ui.store';\nimport { N8N_PRICING_PAGE_URL } from '@/constants';\nimport { useToast } from '@/composables/useToast';\nimport { hasPermission } from '@/utils/rbac/permissions';\n\nconst usageStore = useUsageStore();\nconst route = useRoute();\nconst router = useRouter();\nconst uiStore = useUIStore();\nconst toast = useToast();\n\nconst queryParamCallback = ref<string>(\n\t`callback=${encodeURIComponent(`${window.location.origin}${window.location.pathname}`)}`,\n);\nconst viewPlansUrl = computed(\n\t() => `${usageStore.viewPlansUrl}&${queryParamCallback.value}&source=usage_page`,\n);\nconst managePlanUrl = computed(() => `${usageStore.managePlanUrl}&${queryParamCallback.value}`);\nconst activationKeyModal = ref(false);\nconst activationKey = ref('');\nconst activationKeyInput = ref<HTMLInputElement | null>(null);\n\nconst canUserActivateLicense = computed(() =>\n\thasPermission(['rbac'], { rbac: { scope: 'license:manage' } }),\n);\n\nconst showActivationSuccess = () => {\n\ttoast.showMessage({\n\t\ttype: 'success',\n\t\ttitle: locale.baseText('settings.usageAndPlan.license.activation.success.title'),\n\t\tmessage: locale.baseText('settings.usageAndPlan.license.activation.success.message', {\n\t\t\tinterpolate: {\n\t\t\t\tname: usageStore.planName,\n\t\t\t\ttype: usageStore.planId\n\t\t\t\t\t? locale.baseText('settings.usageAndPlan.plan')\n\t\t\t\t\t: locale.baseText('settings.usageAndPlan.edition'),\n\t\t\t},\n\t\t}),\n\t});\n};\n\nconst showActivationError = (error: Error) => {\n\ttoast.showError(\n\t\terror,\n\t\tlocale.baseText('settings.usageAndPlan.license.activation.error.title'),\n\t\terror.message,\n\t);\n};\n\nconst onLicenseActivation = async () => {\n\ttry {\n\t\tawait usageStore.activateLicense(activationKey.value);\n\t\tactivationKeyModal.value = false;\n\t\tshowActivationSuccess();\n\t} catch (error) {\n\t\tshowActivationError(error);\n\t}\n};\n\nonMounted(async () => {\n\tif (usageStore.isDesktop) {\n\t\treturn;\n\t}\n\n\tusageStore.setLoading(true);\n\tif (route.query.key) {\n\t\ttry {\n\t\t\tawait usageStore.activateLicense(route.query.key as string);\n\t\t\tawait router.replace({ query: {} });\n\t\t\tshowActivationSuccess();\n\t\t\tusageStore.setLoading(false);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tshowActivationError(error);\n\t\t}\n\t}\n\ttry {\n\t\tif (!route.query.key && canUserActivateLicense.value) {\n\t\t\tawait usageStore.refreshLicenseManagementToken();\n\t\t} else {\n\t\t\tawait usageStore.getLicenseInfo();\n\t\t}\n\t\tusageStore.setLoading(false);\n\t} catch (error) {\n\t\tif (!error.name) {\n\t\t\terror.name = locale.baseText('settings.usageAndPlan.error');\n\t\t}\n\t\ttoast.showError(error, error.name, error.message);\n\t}\n});\n\nconst sendUsageTelemetry = (action: UsageTelemetry['action']) => {\n\tconst telemetryPayload = usageStore.telemetryPayload;\n\ttelemetryPayload.action = action;\n\ttelemetry.track('User clicked button on usage page', telemetryPayload);\n};\n\nconst onAddActivationKey = () => {\n\tactivationKeyModal.value = true;\n\tsendUsageTelemetry('add_activation_key');\n};\n\nconst onViewPlans = () => {\n\tvoid uiStore.goToUpgrade('usage_page', 'open');\n\tsendUsageTelemetry('view_plans');\n};\n\nconst onManagePlan = () => {\n\tsendUsageTelemetry('manage_plan');\n};\n\nconst onDialogClosed = () => {\n\tactivationKey.value = '';\n};\n\nconst onDialogOpened = () => {\n\tactivationKeyInput.value?.focus();\n};\n\nconst openPricingPage = () => {\n\tsendUsageTelemetry('desktop_view_plans');\n\twindow.open(N8N_PRICING_PAGE_URL, '_blank');\n};\n</script>\n\n<template>\n\t<div class=\"settings-usage-and-plan\">\n\t\t<n8n-heading size=\"2xlarge\">{{ locale.baseText('settings.usageAndPlan.title') }}</n8n-heading>\n\t\t<n8n-action-box\n\t\t\tv-if=\"usageStore.isDesktop\"\n\t\t\t:class=\"$style.actionBox\"\n\t\t\t:heading=\"locale.baseText('settings.usageAndPlan.desktop.title')\"\n\t\t\t:description=\"locale.baseText('settings.usageAndPlan.desktop.description')\"\n\t\t\t:button-text=\"locale.baseText('settings.usageAndPlan.button.plans')\"\n\t\t\t@click:button=\"openPricingPage\"\n\t\t/>\n\t\t<div v-if=\"!usageStore.isDesktop && !usageStore.isLoading\">\n\t\t\t<n8n-heading :class=\"$style.title\" size=\"large\">\n\t\t\t\t<i18n-t keypath=\"settings.usageAndPlan.description\" tag=\"span\">\n\t\t\t\t\t<template #name>{{ usageStore.planName }}</template>\n\t\t\t\t\t<template #type>\n\t\t\t\t\t\t<span v-if=\"usageStore.planId\">{{\n\t\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.plan')\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t<span v-else>{{ locale.baseText('settings.usageAndPlan.edition') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t</n8n-heading>\n\n\t\t\t<div :class=\"$style.quota\">\n\t\t\t\t<n8n-text size=\"medium\" color=\"text-light\">\n\t\t\t\t\t{{ locale.baseText('settings.usageAndPlan.activeWorkflows') }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<div :class=\"$style.chart\">\n\t\t\t\t\t<span v-if=\"usageStore.executionLimit > 0\" :class=\"$style.chartLine\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t:class=\"$style.chartBar\"\n\t\t\t\t\t\t\t:style=\"{ width: `${usageStore.executionPercentage}%` }\"\n\t\t\t\t\t\t></span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<i18n-t\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t:class=\"$style.count\"\n\t\t\t\t\t\tkeypath=\"settings.usageAndPlan.activeWorkflows.count\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #count>{{ usageStore.executionCount }}</template>\n\t\t\t\t\t\t<template #limit>\n\t\t\t\t\t\t\t<span v-if=\"usageStore.executionLimit < 0\">{{\n\t\t\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.activeWorkflows.unlimited')\n\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t<span v-else>{{ usageStore.executionLimit }}</span>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<n8n-info-tip>{{\n\t\t\t\tlocale.baseText('settings.usageAndPlan.activeWorkflows.hint')\n\t\t\t}}</n8n-info-tip>\n\n\t\t\t<div :class=\"$style.buttons\">\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-if=\"canUserActivateLicense\"\n\t\t\t\t\t:class=\"$style.buttonTertiary\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t@click=\"onAddActivationKey\"\n\t\t\t\t>\n\t\t\t\t\t<span>{{ locale.baseText('settings.usageAndPlan.button.activation') }}</span>\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button v-if=\"usageStore.managementToken\" size=\"large\" @click=\"onManagePlan\">\n\t\t\t\t\t<a :href=\"managePlanUrl\" target=\"_blank\">{{\n\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.button.manage')\n\t\t\t\t\t}}</a>\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button v-else size=\"large\" @click.prevent=\"onViewPlans\">\n\t\t\t\t\t<a :href=\"viewPlansUrl\" target=\"_blank\">{{\n\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.button.plans')\n\t\t\t\t\t}}</a>\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\n\t\t\t<el-dialog\n\t\t\t\tv-model=\"activationKeyModal\"\n\t\t\t\twidth=\"480px\"\n\t\t\t\ttop=\"0\"\n\t\t\t\t:title=\"locale.baseText('settings.usageAndPlan.dialog.activation.title')\"\n\t\t\t\t:modal-class=\"$style.center\"\n\t\t\t\t@closed=\"onDialogClosed\"\n\t\t\t\t@opened=\"onDialogOpened\"\n\t\t\t>\n\t\t\t\t<template #default>\n\t\t\t\t\t<n8n-input\n\t\t\t\t\t\tref=\"activationKeyInput\"\n\t\t\t\t\t\tv-model=\"activationKey\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('settings.usageAndPlan.dialog.activation.label')\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #footer>\n\t\t\t\t\t<n8n-button type=\"secondary\" @click=\"activationKeyModal = false\">\n\t\t\t\t\t\t{{ locale.baseText('settings.usageAndPlan.dialog.activation.cancel') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t\t<n8n-button @click=\"onLicenseActivation\">\n\t\t\t\t\t\t{{ locale.baseText('settings.usageAndPlan.dialog.activation.activate') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</template>\n\t\t\t</el-dialog>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n@import '@/styles/variables';\n\n.center > div {\n\tjustify-content: center;\n}\n\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n\n.spacedFlex {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n}\n\n.title {\n\tdisplay: block;\n\tpadding: var(--spacing-2xl) 0 var(--spacing-m);\n}\n\n.quota {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\theight: 54px;\n\tpadding: 0 var(--spacing-s);\n\tmargin: 0 0 var(--spacing-xs);\n\tbackground: var(--color-background-xlight);\n\tborder-radius: var(--border-radius-large);\n\tborder: 1px solid var(--color-foreground-base);\n\twhite-space: nowrap;\n\n\t.count {\n\t\ttext-transform: lowercase;\n\t\tfont-size: var(--font-size-s);\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tpadding: var(--spacing-xl) 0 0;\n\n\tbutton {\n\t\tmargin-left: var(--spacing-xs);\n\n\t\ta {\n\t\t\tdisplay: inline-block;\n\t\t\tcolor: inherit;\n\t\t\ttext-decoration: none;\n\t\t\tpadding: var(--spacing-xs) var(--spacing-m);\n\t\t\tmargin: calc(var(--spacing-xs) * -1) calc(var(--spacing-m) * -1);\n\t\t}\n\t}\n}\n\n.chart {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\tflex-grow: 1;\n}\n\n.chartLine {\n\tdisplay: block;\n\theight: 10px;\n\twidth: 100%;\n\tmax-width: 260px;\n\tmargin: 0 var(--spacing-m);\n\tborder-radius: 10px;\n\tbackground: var(--color-background-base);\n}\n\n.chartBar {\n\tfloat: left;\n\theight: 100%;\n\tmax-width: 100%;\n\tbackground: var(--color-secondary);\n\tborder-radius: 10px;\n\ttransition: width 0.2s $ease-out-expo;\n}\n\ndiv[class*='info'] > span > span:last-child {\n\tline-height: 1.4;\n\tpadding: 0 0 0 var(--spacing-4xs);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.settings-usage-and-plan {\n\t:deep(.el-dialog__wrapper) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\t.el-dialog {\n\t\t\tmargin: 0;\n\n\t\t\t.el-dialog__footer {\n\t\t\t\tbutton {\n\t\t\t\t\tmargin-left: var(--spacing-xs);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n"],"names":["usageStore","useUsageStore","route","useRoute","router","useRouter","uiStore","useUIStore","toast","useToast","queryParamCallback","ref","viewPlansUrl","computed","managePlanUrl","activationKeyModal","activationKey","activationKeyInput","canUserActivateLicense","hasPermission","showActivationSuccess","locale","showActivationError","error","onLicenseActivation","onMounted","sendUsageTelemetry","action","telemetryPayload","telemetry","onAddActivationKey","onViewPlans","onManagePlan","onDialogClosed","onDialogOpened","_a","openPricingPage","N8N_PRICING_PAGE_URL"],"mappings":"o4CAYA,MAAMA,EAAaC,KACbC,EAAQC,IACRC,EAASC,IACTC,EAAUC,KACVC,EAAQC,KAERC,EAAqBC,EAC1B,YAAY,mBAAmB,GAAG,OAAO,SAAS,MAAM,GAAG,OAAO,SAAS,QAAQ,EAAE,CAAC,EAAA,EAEjFC,EAAeC,EACpB,IAAM,GAAGb,EAAW,YAAY,IAAIU,EAAmB,KAAK,oBAAA,EAEvDI,EAAgBD,EAAS,IAAM,GAAGb,EAAW,aAAa,IAAIU,EAAmB,KAAK,EAAE,EACxFK,EAAqBJ,EAAI,EAAK,EAC9BK,EAAgBL,EAAI,EAAE,EACtBM,EAAqBN,EAA6B,IAAI,EAEtDO,EAAyBL,EAAS,IACvCM,GAAc,CAAC,MAAM,EAAG,CAAE,KAAM,CAAE,MAAO,gBAAiB,EAAG,CAAA,EAGxDC,EAAwB,IAAM,CACnCZ,EAAM,YAAY,CACjB,KAAM,UACN,MAAOa,EAAO,SAAS,wDAAwD,EAC/E,QAASA,EAAO,SAAS,2DAA4D,CACpF,YAAa,CACZ,KAAMrB,EAAW,SACjB,KAAMA,EAAW,OACdqB,EAAO,SAAS,4BAA4B,EAC5CA,EAAO,SAAS,+BAA+B,CACnD,CAAA,CACA,CAAA,CACD,CAAA,EAGIC,EAAuBC,GAAiB,CACvCf,EAAA,UACLe,EACAF,EAAO,SAAS,sDAAsD,EACtEE,EAAM,OAAA,CACP,EAGKC,EAAsB,SAAY,CACnC,GAAA,CACG,MAAAxB,EAAW,gBAAgBgB,EAAc,KAAK,EACpDD,EAAmB,MAAQ,GACLK,UACdG,EAAO,CACfD,EAAoBC,CAAK,CAC1B,CAAA,EAGDE,EAAU,SAAY,CACrB,GAAI,CAAAzB,EAAW,UAKX,IADJA,EAAW,WAAW,EAAI,EACtBE,EAAM,MAAM,IACX,GAAA,CACH,MAAMF,EAAW,gBAAgBE,EAAM,MAAM,GAAa,EAC1D,MAAME,EAAO,QAAQ,CAAE,MAAO,CAAA,CAAI,CAAA,EACZgB,IACtBpB,EAAW,WAAW,EAAK,EAC3B,aACQuB,EAAO,CACfD,EAAoBC,CAAK,CAC1B,CAEG,GAAA,CACC,CAACrB,EAAM,MAAM,KAAOgB,EAAuB,MAC9C,MAAMlB,EAAW,gCAEjB,MAAMA,EAAW,iBAElBA,EAAW,WAAW,EAAK,QACnBuB,EAAO,CACVA,EAAM,OACJA,EAAA,KAAOF,EAAO,SAAS,6BAA6B,GAE3Db,EAAM,UAAUe,EAAOA,EAAM,KAAMA,EAAM,OAAO,CACjD,EAAA,CACA,EAEK,MAAAG,EAAsBC,GAAqC,CAChE,MAAMC,EAAmB5B,EAAW,iBACpC4B,EAAiB,OAASD,EAChBE,GAAA,MAAM,oCAAqCD,CAAgB,CAAA,EAGhEE,EAAqB,IAAM,CAChCf,EAAmB,MAAQ,GAC3BW,EAAmB,oBAAoB,CAAA,EAGlCK,EAAc,IAAM,CACpBzB,EAAQ,YAAY,aAAc,MAAM,EAC7CoB,EAAmB,YAAY,CAAA,EAG1BM,EAAe,IAAM,CAC1BN,EAAmB,aAAa,CAAA,EAG3BO,EAAiB,IAAM,CAC5BjB,EAAc,MAAQ,EAAA,EAGjBkB,EAAiB,IAAM,QAC5BC,EAAAlB,EAAmB,QAAnB,MAAAkB,EAA0B,OAAM,EAG3BC,EAAkB,IAAM,CAC7BV,EAAmB,oBAAoB,EAChC,OAAA,KAAKW,GAAsB,QAAQ,CAAA"}
|
|
1
|
+
{"version":3,"file":"SettingsUsageAndPlan-BVPtlthH.js","sources":["../../src/views/SettingsUsageAndPlan.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onMounted, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { UsageTelemetry } from '@/stores/usage.store';\nimport { useUsageStore } from '@/stores/usage.store';\nimport { telemetry } from '@/plugins/telemetry';\nimport { i18n as locale } from '@/plugins/i18n';\nimport { useUIStore } from '@/stores/ui.store';\nimport { N8N_PRICING_PAGE_URL } from '@/constants';\nimport { useToast } from '@/composables/useToast';\nimport { hasPermission } from '@/utils/rbac/permissions';\n\nconst usageStore = useUsageStore();\nconst route = useRoute();\nconst router = useRouter();\nconst uiStore = useUIStore();\nconst toast = useToast();\n\nconst queryParamCallback = ref<string>(\n\t`callback=${encodeURIComponent(`${window.location.origin}${window.location.pathname}`)}`,\n);\nconst viewPlansUrl = computed(\n\t() => `${usageStore.viewPlansUrl}&${queryParamCallback.value}&source=usage_page`,\n);\nconst managePlanUrl = computed(() => `${usageStore.managePlanUrl}&${queryParamCallback.value}`);\nconst activationKeyModal = ref(false);\nconst activationKey = ref('');\nconst activationKeyInput = ref<HTMLInputElement | null>(null);\n\nconst canUserActivateLicense = computed(() =>\n\thasPermission(['rbac'], { rbac: { scope: 'license:manage' } }),\n);\n\nconst showActivationSuccess = () => {\n\ttoast.showMessage({\n\t\ttype: 'success',\n\t\ttitle: locale.baseText('settings.usageAndPlan.license.activation.success.title'),\n\t\tmessage: locale.baseText('settings.usageAndPlan.license.activation.success.message', {\n\t\t\tinterpolate: {\n\t\t\t\tname: usageStore.planName,\n\t\t\t\ttype: usageStore.planId\n\t\t\t\t\t? locale.baseText('settings.usageAndPlan.plan')\n\t\t\t\t\t: locale.baseText('settings.usageAndPlan.edition'),\n\t\t\t},\n\t\t}),\n\t});\n};\n\nconst showActivationError = (error: Error) => {\n\ttoast.showError(\n\t\terror,\n\t\tlocale.baseText('settings.usageAndPlan.license.activation.error.title'),\n\t\terror.message,\n\t);\n};\n\nconst onLicenseActivation = async () => {\n\ttry {\n\t\tawait usageStore.activateLicense(activationKey.value);\n\t\tactivationKeyModal.value = false;\n\t\tshowActivationSuccess();\n\t} catch (error) {\n\t\tshowActivationError(error);\n\t}\n};\n\nonMounted(async () => {\n\tif (usageStore.isDesktop) {\n\t\treturn;\n\t}\n\n\tusageStore.setLoading(true);\n\tif (route.query.key) {\n\t\ttry {\n\t\t\tawait usageStore.activateLicense(route.query.key as string);\n\t\t\tawait router.replace({ query: {} });\n\t\t\tshowActivationSuccess();\n\t\t\tusageStore.setLoading(false);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tshowActivationError(error);\n\t\t}\n\t}\n\ttry {\n\t\tif (!route.query.key && canUserActivateLicense.value) {\n\t\t\tawait usageStore.refreshLicenseManagementToken();\n\t\t} else {\n\t\t\tawait usageStore.getLicenseInfo();\n\t\t}\n\t\tusageStore.setLoading(false);\n\t} catch (error) {\n\t\tif (!error.name) {\n\t\t\terror.name = locale.baseText('settings.usageAndPlan.error');\n\t\t}\n\t\ttoast.showError(error, error.name, error.message);\n\t}\n});\n\nconst sendUsageTelemetry = (action: UsageTelemetry['action']) => {\n\tconst telemetryPayload = usageStore.telemetryPayload;\n\ttelemetryPayload.action = action;\n\ttelemetry.track('User clicked button on usage page', telemetryPayload);\n};\n\nconst onAddActivationKey = () => {\n\tactivationKeyModal.value = true;\n\tsendUsageTelemetry('add_activation_key');\n};\n\nconst onViewPlans = () => {\n\tvoid uiStore.goToUpgrade('usage_page', 'open');\n\tsendUsageTelemetry('view_plans');\n};\n\nconst onManagePlan = () => {\n\tsendUsageTelemetry('manage_plan');\n};\n\nconst onDialogClosed = () => {\n\tactivationKey.value = '';\n};\n\nconst onDialogOpened = () => {\n\tactivationKeyInput.value?.focus();\n};\n\nconst openPricingPage = () => {\n\tsendUsageTelemetry('desktop_view_plans');\n\twindow.open(N8N_PRICING_PAGE_URL, '_blank');\n};\n</script>\n\n<template>\n\t<div class=\"settings-usage-and-plan\">\n\t\t<n8n-heading size=\"2xlarge\">{{ locale.baseText('settings.usageAndPlan.title') }}</n8n-heading>\n\t\t<n8n-action-box\n\t\t\tv-if=\"usageStore.isDesktop\"\n\t\t\t:class=\"$style.actionBox\"\n\t\t\t:heading=\"locale.baseText('settings.usageAndPlan.desktop.title')\"\n\t\t\t:description=\"locale.baseText('settings.usageAndPlan.desktop.description')\"\n\t\t\t:button-text=\"locale.baseText('settings.usageAndPlan.button.plans')\"\n\t\t\t@click:button=\"openPricingPage\"\n\t\t/>\n\t\t<div v-if=\"!usageStore.isDesktop && !usageStore.isLoading\">\n\t\t\t<n8n-heading :class=\"$style.title\" size=\"large\">\n\t\t\t\t<i18n-t keypath=\"settings.usageAndPlan.description\" tag=\"span\">\n\t\t\t\t\t<template #name>{{ usageStore.planName }}</template>\n\t\t\t\t\t<template #type>\n\t\t\t\t\t\t<span v-if=\"usageStore.planId\">{{\n\t\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.plan')\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t<span v-else>{{ locale.baseText('settings.usageAndPlan.edition') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t</n8n-heading>\n\n\t\t\t<div :class=\"$style.quota\">\n\t\t\t\t<n8n-text size=\"medium\" color=\"text-light\">\n\t\t\t\t\t{{ locale.baseText('settings.usageAndPlan.activeWorkflows') }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<div :class=\"$style.chart\">\n\t\t\t\t\t<span v-if=\"usageStore.executionLimit > 0\" :class=\"$style.chartLine\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t:class=\"$style.chartBar\"\n\t\t\t\t\t\t\t:style=\"{ width: `${usageStore.executionPercentage}%` }\"\n\t\t\t\t\t\t></span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<i18n-t\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t:class=\"$style.count\"\n\t\t\t\t\t\tkeypath=\"settings.usageAndPlan.activeWorkflows.count\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #count>{{ usageStore.executionCount }}</template>\n\t\t\t\t\t\t<template #limit>\n\t\t\t\t\t\t\t<span v-if=\"usageStore.executionLimit < 0\">{{\n\t\t\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.activeWorkflows.unlimited')\n\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t<span v-else>{{ usageStore.executionLimit }}</span>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<n8n-info-tip>{{\n\t\t\t\tlocale.baseText('settings.usageAndPlan.activeWorkflows.hint')\n\t\t\t}}</n8n-info-tip>\n\n\t\t\t<div :class=\"$style.buttons\">\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-if=\"canUserActivateLicense\"\n\t\t\t\t\t:class=\"$style.buttonTertiary\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t@click=\"onAddActivationKey\"\n\t\t\t\t>\n\t\t\t\t\t<span>{{ locale.baseText('settings.usageAndPlan.button.activation') }}</span>\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button v-if=\"usageStore.managementToken\" size=\"large\" @click=\"onManagePlan\">\n\t\t\t\t\t<a :href=\"managePlanUrl\" target=\"_blank\">{{\n\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.button.manage')\n\t\t\t\t\t}}</a>\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button v-else size=\"large\" @click.prevent=\"onViewPlans\">\n\t\t\t\t\t<a :href=\"viewPlansUrl\" target=\"_blank\">{{\n\t\t\t\t\t\tlocale.baseText('settings.usageAndPlan.button.plans')\n\t\t\t\t\t}}</a>\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\n\t\t\t<el-dialog\n\t\t\t\tv-model=\"activationKeyModal\"\n\t\t\t\twidth=\"480px\"\n\t\t\t\ttop=\"0\"\n\t\t\t\t:title=\"locale.baseText('settings.usageAndPlan.dialog.activation.title')\"\n\t\t\t\t:modal-class=\"$style.center\"\n\t\t\t\t@closed=\"onDialogClosed\"\n\t\t\t\t@opened=\"onDialogOpened\"\n\t\t\t>\n\t\t\t\t<template #default>\n\t\t\t\t\t<n8n-input\n\t\t\t\t\t\tref=\"activationKeyInput\"\n\t\t\t\t\t\tv-model=\"activationKey\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('settings.usageAndPlan.dialog.activation.label')\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #footer>\n\t\t\t\t\t<n8n-button type=\"secondary\" @click=\"activationKeyModal = false\">\n\t\t\t\t\t\t{{ locale.baseText('settings.usageAndPlan.dialog.activation.cancel') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t\t<n8n-button @click=\"onLicenseActivation\">\n\t\t\t\t\t\t{{ locale.baseText('settings.usageAndPlan.dialog.activation.activate') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</template>\n\t\t\t</el-dialog>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n@import '@/styles/variables';\n\n.center > div {\n\tjustify-content: center;\n}\n\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n\n.spacedFlex {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n}\n\n.title {\n\tdisplay: block;\n\tpadding: var(--spacing-2xl) 0 var(--spacing-m);\n}\n\n.quota {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\theight: 54px;\n\tpadding: 0 var(--spacing-s);\n\tmargin: 0 0 var(--spacing-xs);\n\tbackground: var(--color-background-xlight);\n\tborder-radius: var(--border-radius-large);\n\tborder: 1px solid var(--color-foreground-base);\n\twhite-space: nowrap;\n\n\t.count {\n\t\ttext-transform: lowercase;\n\t\tfont-size: var(--font-size-s);\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tpadding: var(--spacing-xl) 0 0;\n\n\tbutton {\n\t\tmargin-left: var(--spacing-xs);\n\n\t\ta {\n\t\t\tdisplay: inline-block;\n\t\t\tcolor: inherit;\n\t\t\ttext-decoration: none;\n\t\t\tpadding: var(--spacing-xs) var(--spacing-m);\n\t\t\tmargin: calc(var(--spacing-xs) * -1) calc(var(--spacing-m) * -1);\n\t\t}\n\t}\n}\n\n.chart {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\tflex-grow: 1;\n}\n\n.chartLine {\n\tdisplay: block;\n\theight: 10px;\n\twidth: 100%;\n\tmax-width: 260px;\n\tmargin: 0 var(--spacing-m);\n\tborder-radius: 10px;\n\tbackground: var(--color-background-base);\n}\n\n.chartBar {\n\tfloat: left;\n\theight: 100%;\n\tmax-width: 100%;\n\tbackground: var(--color-secondary);\n\tborder-radius: 10px;\n\ttransition: width 0.2s $ease-out-expo;\n}\n\ndiv[class*='info'] > span > span:last-child {\n\tline-height: 1.4;\n\tpadding: 0 0 0 var(--spacing-4xs);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.settings-usage-and-plan {\n\t:deep(.el-dialog__wrapper) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\t.el-dialog {\n\t\t\tmargin: 0;\n\n\t\t\t.el-dialog__footer {\n\t\t\t\tbutton {\n\t\t\t\t\tmargin-left: var(--spacing-xs);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n"],"names":["usageStore","useUsageStore","route","useRoute","router","useRouter","uiStore","useUIStore","toast","useToast","queryParamCallback","ref","viewPlansUrl","computed","managePlanUrl","activationKeyModal","activationKey","activationKeyInput","canUserActivateLicense","hasPermission","showActivationSuccess","locale","showActivationError","error","onLicenseActivation","onMounted","sendUsageTelemetry","action","telemetryPayload","telemetry","onAddActivationKey","onViewPlans","onManagePlan","onDialogClosed","onDialogOpened","_a","openPricingPage","N8N_PRICING_PAGE_URL"],"mappings":"o4CAYA,MAAMA,EAAaC,KACbC,EAAQC,IACRC,EAASC,IACTC,EAAUC,KACVC,EAAQC,KAERC,EAAqBC,EAC1B,YAAY,mBAAmB,GAAG,OAAO,SAAS,MAAM,GAAG,OAAO,SAAS,QAAQ,EAAE,CAAC,EAAA,EAEjFC,EAAeC,EACpB,IAAM,GAAGb,EAAW,YAAY,IAAIU,EAAmB,KAAK,oBAAA,EAEvDI,EAAgBD,EAAS,IAAM,GAAGb,EAAW,aAAa,IAAIU,EAAmB,KAAK,EAAE,EACxFK,EAAqBJ,EAAI,EAAK,EAC9BK,EAAgBL,EAAI,EAAE,EACtBM,EAAqBN,EAA6B,IAAI,EAEtDO,EAAyBL,EAAS,IACvCM,GAAc,CAAC,MAAM,EAAG,CAAE,KAAM,CAAE,MAAO,gBAAiB,EAAG,CAAA,EAGxDC,EAAwB,IAAM,CACnCZ,EAAM,YAAY,CACjB,KAAM,UACN,MAAOa,EAAO,SAAS,wDAAwD,EAC/E,QAASA,EAAO,SAAS,2DAA4D,CACpF,YAAa,CACZ,KAAMrB,EAAW,SACjB,KAAMA,EAAW,OACdqB,EAAO,SAAS,4BAA4B,EAC5CA,EAAO,SAAS,+BAA+B,CACnD,CAAA,CACA,CAAA,CACD,CAAA,EAGIC,EAAuBC,GAAiB,CACvCf,EAAA,UACLe,EACAF,EAAO,SAAS,sDAAsD,EACtEE,EAAM,OAAA,CACP,EAGKC,EAAsB,SAAY,CACnC,GAAA,CACG,MAAAxB,EAAW,gBAAgBgB,EAAc,KAAK,EACpDD,EAAmB,MAAQ,GACLK,UACdG,EAAO,CACfD,EAAoBC,CAAK,CAC1B,CAAA,EAGDE,EAAU,SAAY,CACrB,GAAI,CAAAzB,EAAW,UAKX,IADJA,EAAW,WAAW,EAAI,EACtBE,EAAM,MAAM,IACX,GAAA,CACH,MAAMF,EAAW,gBAAgBE,EAAM,MAAM,GAAa,EAC1D,MAAME,EAAO,QAAQ,CAAE,MAAO,CAAA,CAAI,CAAA,EACZgB,IACtBpB,EAAW,WAAW,EAAK,EAC3B,aACQuB,EAAO,CACfD,EAAoBC,CAAK,CAC1B,CAEG,GAAA,CACC,CAACrB,EAAM,MAAM,KAAOgB,EAAuB,MAC9C,MAAMlB,EAAW,gCAEjB,MAAMA,EAAW,iBAElBA,EAAW,WAAW,EAAK,QACnBuB,EAAO,CACVA,EAAM,OACJA,EAAA,KAAOF,EAAO,SAAS,6BAA6B,GAE3Db,EAAM,UAAUe,EAAOA,EAAM,KAAMA,EAAM,OAAO,CACjD,EAAA,CACA,EAEK,MAAAG,EAAsBC,GAAqC,CAChE,MAAMC,EAAmB5B,EAAW,iBACpC4B,EAAiB,OAASD,EAChBE,GAAA,MAAM,oCAAqCD,CAAgB,CAAA,EAGhEE,EAAqB,IAAM,CAChCf,EAAmB,MAAQ,GAC3BW,EAAmB,oBAAoB,CAAA,EAGlCK,EAAc,IAAM,CACpBzB,EAAQ,YAAY,aAAc,MAAM,EAC7CoB,EAAmB,YAAY,CAAA,EAG1BM,EAAe,IAAM,CAC1BN,EAAmB,aAAa,CAAA,EAG3BO,EAAiB,IAAM,CAC5BjB,EAAc,MAAQ,EAAA,EAGjBkB,EAAiB,IAAM,QAC5BC,EAAAlB,EAAmB,QAAnB,MAAAkB,EAA0B,OAAM,EAG3BC,EAAkB,IAAM,CAC7BV,EAAmB,oBAAoB,EAChC,OAAA,KAAKW,GAAsB,QAAQ,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{m as M}from"./pinia-sugP77Im.js";import{aK as E,u as O,cQ as R,cR as A,a as B,e as I,b as P,E as S,t as d,cS as h,V,cT as z}from"./index-
|
|
2
|
-
//# sourceMappingURL=SettingsUsersView-
|
|
1
|
+
import{m as M}from"./pinia-sugP77Im.js";import{aK as E,u as O,cQ as R,cR as A,a as B,e as I,b as P,E as S,t as d,cS as h,V,cT as z}from"./index-1OxaEeO3.js";import{G as D,ag as t,l as n,m as l,p,U as a,O as i,S as v,T as b,I as g,R as u,M as m,F as N,a7 as Q}from"./vendor-Dv5OeN6t.js";import{_ as q}from"./n8n-4UEsHtUL.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const x=D({name:"SettingsUsersView",setup(){return{clipboard:E(),...O()}},computed:{...M(P,I,B,A,R),isSharingEnabled(){return this.settingsStore.isEnterpriseFeatureEnabled(S.Sharing)},showUMSetupWarning(){return d(["defaultUser"])},usersListActions(){return[{label:this.$locale.baseText("settings.users.actions.copyInviteLink"),value:"copyInviteLink",guard:e=>this.settingsStore.isBelowUserQuota&&!e.firstName&&!!e.inviteAcceptUrl},{label:this.$locale.baseText("settings.users.actions.reinvite"),value:"reinvite",guard:e=>this.settingsStore.isBelowUserQuota&&!e.firstName&&this.settingsStore.isSmtpSetup},{label:this.$locale.baseText("settings.users.actions.delete"),value:"delete",guard:e=>d(["rbac"],{rbac:{scope:"user:delete"}})&&e.id!==this.usersStore.currentUserId},{label:this.$locale.baseText("settings.users.actions.copyPasswordResetLink"),value:"copyPasswordResetLink",guard:e=>d(["rbac"],{rbac:{scope:"user:resetPassword"}})&&this.settingsStore.isBelowUserQuota&&!e.isPendingUser&&e.id!==this.usersStore.currentUserId},{label:this.$locale.baseText("settings.users.actions.allowSSOManualLogin"),value:"allowSSOManualLogin",guard:e=>{var s;return this.settingsStore.isSamlLoginEnabled&&!((s=e.settings)!=null&&s.allowSSOManualLogin)}},{label:this.$locale.baseText("settings.users.actions.disallowSSOManualLogin"),value:"disallowSSOManualLogin",guard:e=>{var s;return this.settingsStore.isSamlLoginEnabled&&((s=e.settings)==null?void 0:s.allowSSOManualLogin)===!0}}]},isAdvancedPermissionsEnabled(){return this.settingsStore.isEnterpriseFeatureEnabled(S.AdvancedPermissions)},userRoles(){return[{value:h.Member,label:this.$locale.baseText("auth.roles.member")},{value:h.Admin,label:this.$locale.baseText("auth.roles.admin"),disabled:!this.isAdvancedPermissionsEnabled}]},canUpdateRole(){return d(["rbac"],{rbac:{scope:["user:update","user:changeRole"]}})}},async mounted(){this.showUMSetupWarning||await this.usersStore.fetchUsers()},methods:{async onUsersListAction({action:e,userId:s}){switch(e){case"delete":await this.onDelete(s);break;case"reinvite":await this.onReinvite(s);break;case"copyInviteLink":await this.onCopyInviteLink(s);break;case"copyPasswordResetLink":await this.onCopyPasswordResetLink(s);break;case"allowSSOManualLogin":await this.onAllowSSOManualLogin(s);break;case"disallowSSOManualLogin":await this.onDisallowSSOManualLogin(s);break}},redirectToSetup(){this.$router.push({name:V.SETUP})},onInvite(){this.uiStore.openModal(z)},async onDelete(e){this.usersStore.getUserById(e)&&this.uiStore.openDeleteUserModal(e)},async onReinvite(e){const s=this.usersStore.getUserById(e);if(s!=null&&s.email&&(s!=null&&s.role)){if(!["global:admin","global:member"].includes(s.role))throw new Error("Invalid role name on reinvite");try{await this.usersStore.reinviteUser({email:s.email,role:s.role}),this.showToast({type:"success",title:this.$locale.baseText("settings.users.inviteResent"),message:this.$locale.baseText("settings.users.emailSentTo",{interpolate:{email:s.email??""}})})}catch(c){this.showError(c,this.$locale.baseText("settings.users.userReinviteError"))}}},async onCopyInviteLink(e){const s=this.usersStore.getUserById(e);s!=null&&s.inviteAcceptUrl&&(this.clipboard.copy(s.inviteAcceptUrl),this.showToast({type:"success",title:this.$locale.baseText("settings.users.inviteUrlCreated"),message:this.$locale.baseText("settings.users.inviteUrlCreated.message")}))},async onCopyPasswordResetLink(e){const s=this.usersStore.getUserById(e);if(s){const c=await this.usersStore.getUserPasswordResetLink(s);this.clipboard.copy(c.link),this.showToast({type:"success",title:this.$locale.baseText("settings.users.passwordResetUrlCreated"),message:this.$locale.baseText("settings.users.passwordResetUrlCreated.message")})}},async onAllowSSOManualLogin(e){const s=this.usersStore.getUserById(e);s&&(s.settings||(s.settings={}),s.settings.allowSSOManualLogin=!0,await this.usersStore.updateOtherUserSettings(e,s.settings),this.showToast({type:"success",title:this.$locale.baseText("settings.users.allowSSOManualLogin"),message:this.$locale.baseText("settings.users.allowSSOManualLogin.message")}))},async onDisallowSSOManualLogin(e){const s=this.usersStore.getUserById(e);s!=null&&s.settings&&(s.settings.allowSSOManualLogin=!1,await this.usersStore.updateOtherUserSettings(e,s.settings),this.showToast({type:"success",title:this.$locale.baseText("settings.users.disallowSSOManualLogin"),message:this.$locale.baseText("settings.users.disallowSSOManualLogin.message")}))},goToUpgrade(){this.uiStore.goToUpgrade("settings-users","upgrade-users")},goToUpgradeAdvancedPermissions(){this.uiStore.goToUpgrade("settings-users","upgrade-advanced-permissions")},async onRoleChange(e,s){await this.usersStore.updateGlobalRole({id:e.id,newRoleName:s})}}}),F="_container_1qzsb_1",K="_usersContainer_1qzsb_9",W="_buttonContainer_1qzsb_13",G="_setupInfoContainer_1qzsb_19",Y="_alert_1qzsb_23",j={container:F,usersContainer:K,buttonContainer:W,setupInfoContainer:G,alert:Y};function H(e,s,c,X,Z,ee){const w=t("n8n-heading"),U=t("n8n-button"),y=t("n8n-tooltip"),T=t("n8n-action-box"),L=t("n8n-link"),k=t("i18n-t"),$=t("n8n-notice"),C=t("n8n-option"),_=t("n8n-select"),f=t("n8n-users-list");return n(),l("div",{class:g(e.$style.container)},[p("div",null,[a(w,{size:"2xlarge"},{default:i(()=>[v(b(e.$locale.baseText("settings.users")),1)]),_:1}),e.showUMSetupWarning?u("",!0):(n(),l("div",{key:0,class:g(e.$style.buttonContainer)},[a(y,{disabled:!e.ssoStore.isSamlLoginEnabled},{content:i(()=>[p("span",null,b(e.$locale.baseText("settings.users.invite.tooltip")),1)]),default:i(()=>[p("div",null,[a(U,{disabled:e.ssoStore.isSamlLoginEnabled||!e.settingsStore.isBelowUserQuota,label:e.$locale.baseText("settings.users.invite"),size:"large","data-test-id":"settings-users-invite-button",onClick:e.onInvite},null,8,["disabled","label","onClick"])])]),_:1},8,["disabled"])],2))]),e.settingsStore.isBelowUserQuota?u("",!0):(n(),l("div",{key:0,class:g(e.$style.setupInfoContainer)},[a(T,{heading:e.$locale.baseText(e.uiStore.contextBasedTranslationKeys.users.settings.unavailable.title),description:e.$locale.baseText(e.uiStore.contextBasedTranslationKeys.users.settings.unavailable.description),"button-text":e.$locale.baseText(e.uiStore.contextBasedTranslationKeys.users.settings.unavailable.button),"onClick:button":e.goToUpgrade},null,8,["heading","description","button-text","onClick:button"])],2)),e.isAdvancedPermissionsEnabled?u("",!0):(n(),m($,{key:1},{default:i(()=>[a(k,{keypath:"settings.users.advancedPermissions.warning"},{link:i(()=>[a(L,{size:"small",onClick:e.goToUpgradeAdvancedPermissions},{default:i(()=>[v(b(e.$locale.baseText("settings.users.advancedPermissions.warning.link")),1)]),_:1},8,["onClick"])]),_:1})]),_:1})),e.settingsStore.isBelowUserQuota||e.usersStore.allUsers.length>1?(n(),l("div",{key:2,class:g(e.$style.usersContainer)},[a(f,{actions:e.usersListActions,users:e.usersStore.allUsers,"current-user-id":e.usersStore.currentUserId,"is-saml-login-enabled":e.ssoStore.isSamlLoginEnabled,onAction:e.onUsersListAction},{actions:i(({user:r})=>[r.id!==e.usersStore.currentUserId?(n(),m(_,{key:0,"model-value":(r==null?void 0:r.role)||"global:member",disabled:!e.canUpdateRole,"data-test-id":"user-role-select","onUpdate:modelValue":o=>e.onRoleChange(r,o)},{default:i(()=>[(n(!0),l(N,null,Q(e.userRoles,o=>(n(),m(C,{key:o.value,value:o.value,label:o.label,disabled:o.disabled},null,8,["value","label","disabled"]))),128))]),_:2},1032,["model-value","disabled","onUpdate:modelValue"])):u("",!0)]),_:1},8,["actions","users","current-user-id","is-saml-login-enabled","onAction"])],2)):u("",!0)],2)}const J={$style:j},Ee=q(x,[["render",H],["__cssModules",J]]);export{Ee as default};
|
|
2
|
+
//# sourceMappingURL=SettingsUsersView-BuKt4ZDO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsUsersView-CTd5MQLw.js","sources":["../../src/views/SettingsUsersView.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.container\">\n\t\t<div>\n\t\t\t<n8n-heading size=\"2xlarge\">{{ $locale.baseText('settings.users') }}</n8n-heading>\n\t\t\t<div v-if=\"!showUMSetupWarning\" :class=\"$style.buttonContainer\">\n\t\t\t\t<n8n-tooltip :disabled=\"!ssoStore.isSamlLoginEnabled\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<span> {{ $locale.baseText('settings.users.invite.tooltip') }} </span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t:disabled=\"ssoStore.isSamlLoginEnabled || !settingsStore.isBelowUserQuota\"\n\t\t\t\t\t\t\t:label=\"$locale.baseText('settings.users.invite')\"\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\tdata-test-id=\"settings-users-invite-button\"\n\t\t\t\t\t\t\t@click=\"onInvite\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"!settingsStore.isBelowUserQuota\" :class=\"$style.setupInfoContainer\">\n\t\t\t<n8n-action-box\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText(uiStore.contextBasedTranslationKeys.users.settings.unavailable.title)\n\t\t\t\t\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\tuiStore.contextBasedTranslationKeys.users.settings.unavailable.description,\n\t\t\t\t\t)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"\n\t\t\t\t\t$locale.baseText(uiStore.contextBasedTranslationKeys.users.settings.unavailable.button)\n\t\t\t\t\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t</div>\n\t\t<n8n-notice v-if=\"!isAdvancedPermissionsEnabled\">\n\t\t\t<i18n-t keypath=\"settings.users.advancedPermissions.warning\">\n\t\t\t\t<template #link>\n\t\t\t\t\t<n8n-link size=\"small\" @click=\"goToUpgradeAdvancedPermissions\">\n\t\t\t\t\t\t{{ $locale.baseText('settings.users.advancedPermissions.warning.link') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</n8n-notice>\n\t\t<!-- If there's more than 1 user it means the account quota was more than 1 in the past. So we need to allow instance owner to be able to delete users and transfer workflows.\n\t\t-->\n\t\t<div\n\t\t\tv-if=\"settingsStore.isBelowUserQuota || usersStore.allUsers.length > 1\"\n\t\t\t:class=\"$style.usersContainer\"\n\t\t>\n\t\t\t<n8n-users-list\n\t\t\t\t:actions=\"usersListActions\"\n\t\t\t\t:users=\"usersStore.allUsers\"\n\t\t\t\t:current-user-id=\"usersStore.currentUserId\"\n\t\t\t\t:is-saml-login-enabled=\"ssoStore.isSamlLoginEnabled\"\n\t\t\t\t@action=\"onUsersListAction\"\n\t\t\t>\n\t\t\t\t<template #actions=\"{ user }\">\n\t\t\t\t\t<n8n-select\n\t\t\t\t\t\tv-if=\"user.id !== usersStore.currentUserId\"\n\t\t\t\t\t\t:model-value=\"user?.role || 'global:member'\"\n\t\t\t\t\t\t:disabled=\"!canUpdateRole\"\n\t\t\t\t\t\tdata-test-id=\"user-role-select\"\n\t\t\t\t\t\t@update:model-value=\"onRoleChange(user, $event)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-option\n\t\t\t\t\t\t\tv-for=\"role in userRoles\"\n\t\t\t\t\t\t\t:key=\"role.value\"\n\t\t\t\t\t\t\t:value=\"role.value\"\n\t\t\t\t\t\t\t:label=\"role.label\"\n\t\t\t\t\t\t\t:disabled=\"role.disabled\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-select>\n\t\t\t\t</template>\n\t\t\t</n8n-users-list>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { EnterpriseEditionFeature, INVITE_USER_MODAL_KEY, VIEWS, ROLE } from '@/constants';\n\nimport type { IRole, IUser, IUserListAction, InvitableRoleName } from '@/Interface';\nimport { useToast } from '@/composables/useToast';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useUsageStore } from '@/stores/usage.store';\nimport { useSSOStore } from '@/stores/sso.store';\nimport { hasPermission } from '@/utils/rbac/permissions';\nimport { useClipboard } from '@/composables/useClipboard';\nimport type { UpdateGlobalRolePayload } from '@/api/users';\n\nexport default defineComponent({\n\tname: 'SettingsUsersView',\n\tsetup() {\n\t\tconst clipboard = useClipboard();\n\n\t\treturn {\n\t\t\tclipboard,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useSettingsStore, useUIStore, useUsersStore, useUsageStore, useSSOStore),\n\t\tisSharingEnabled() {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing);\n\t\t},\n\t\tshowUMSetupWarning() {\n\t\t\treturn hasPermission(['defaultUser']);\n\t\t},\n\t\tusersListActions(): IUserListAction[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.copyInviteLink'),\n\t\t\t\t\tvalue: 'copyInviteLink',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isBelowUserQuota && !user.firstName && !!user.inviteAcceptUrl,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.reinvite'),\n\t\t\t\t\tvalue: 'reinvite',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isBelowUserQuota &&\n\t\t\t\t\t\t!user.firstName &&\n\t\t\t\t\t\tthis.settingsStore.isSmtpSetup,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.delete'),\n\t\t\t\t\tvalue: 'delete',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\thasPermission(['rbac'], { rbac: { scope: 'user:delete' } }) &&\n\t\t\t\t\t\tuser.id !== this.usersStore.currentUserId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.copyPasswordResetLink'),\n\t\t\t\t\tvalue: 'copyPasswordResetLink',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\thasPermission(['rbac'], { rbac: { scope: 'user:resetPassword' } }) &&\n\t\t\t\t\t\tthis.settingsStore.isBelowUserQuota &&\n\t\t\t\t\t\t!user.isPendingUser &&\n\t\t\t\t\t\tuser.id !== this.usersStore.currentUserId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.allowSSOManualLogin'),\n\t\t\t\t\tvalue: 'allowSSOManualLogin',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isSamlLoginEnabled && !user.settings?.allowSSOManualLogin,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.disallowSSOManualLogin'),\n\t\t\t\t\tvalue: 'disallowSSOManualLogin',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isSamlLoginEnabled && user.settings?.allowSSOManualLogin === true,\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tisAdvancedPermissionsEnabled(): boolean {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(\n\t\t\t\tEnterpriseEditionFeature.AdvancedPermissions,\n\t\t\t);\n\t\t},\n\t\tuserRoles(): Array<{ value: IRole; label: string; disabled?: boolean }> {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tvalue: ROLE.Member,\n\t\t\t\t\tlabel: this.$locale.baseText('auth.roles.member'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvalue: ROLE.Admin,\n\t\t\t\t\tlabel: this.$locale.baseText('auth.roles.admin'),\n\t\t\t\t\tdisabled: !this.isAdvancedPermissionsEnabled,\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tcanUpdateRole(): boolean {\n\t\t\treturn hasPermission(['rbac'], { rbac: { scope: ['user:update', 'user:changeRole'] } });\n\t\t},\n\t},\n\tasync mounted() {\n\t\tif (!this.showUMSetupWarning) {\n\t\t\tawait this.usersStore.fetchUsers();\n\t\t}\n\t},\n\tmethods: {\n\t\tasync onUsersListAction({ action, userId }: { action: string; userId: string }) {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'delete':\n\t\t\t\t\tawait this.onDelete(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'reinvite':\n\t\t\t\t\tawait this.onReinvite(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'copyInviteLink':\n\t\t\t\t\tawait this.onCopyInviteLink(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'copyPasswordResetLink':\n\t\t\t\t\tawait this.onCopyPasswordResetLink(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'allowSSOManualLogin':\n\t\t\t\t\tawait this.onAllowSSOManualLogin(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'disallowSSOManualLogin':\n\t\t\t\t\tawait this.onDisallowSSOManualLogin(userId);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tredirectToSetup() {\n\t\t\tvoid this.$router.push({ name: VIEWS.SETUP });\n\t\t},\n\t\tonInvite() {\n\t\t\tthis.uiStore.openModal(INVITE_USER_MODAL_KEY);\n\t\t},\n\t\tasync onDelete(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user) {\n\t\t\t\tthis.uiStore.openDeleteUserModal(userId);\n\t\t\t}\n\t\t},\n\t\tasync onReinvite(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user?.email && user?.role) {\n\t\t\t\tif (!['global:admin', 'global:member'].includes(user.role)) {\n\t\t\t\t\tthrow new Error('Invalid role name on reinvite');\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait this.usersStore.reinviteUser({\n\t\t\t\t\t\temail: user.email,\n\t\t\t\t\t\trole: user.role as InvitableRoleName,\n\t\t\t\t\t});\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\ttitle: this.$locale.baseText('settings.users.inviteResent'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('settings.users.emailSentTo', {\n\t\t\t\t\t\t\tinterpolate: { email: user.email ?? '' },\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthis.showError(e, this.$locale.baseText('settings.users.userReinviteError'));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync onCopyInviteLink(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user?.inviteAcceptUrl) {\n\t\t\t\tvoid this.clipboard.copy(user.inviteAcceptUrl);\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.inviteUrlCreated'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.inviteUrlCreated.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync onCopyPasswordResetLink(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user) {\n\t\t\t\tconst url = await this.usersStore.getUserPasswordResetLink(user);\n\t\t\t\tvoid this.clipboard.copy(url.link);\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.passwordResetUrlCreated'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.passwordResetUrlCreated.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync onAllowSSOManualLogin(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user) {\n\t\t\t\tif (!user.settings) {\n\t\t\t\t\tuser.settings = {};\n\t\t\t\t}\n\t\t\t\tuser.settings.allowSSOManualLogin = true;\n\t\t\t\tawait this.usersStore.updateOtherUserSettings(userId, user.settings);\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.allowSSOManualLogin'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.allowSSOManualLogin.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync onDisallowSSOManualLogin(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user?.settings) {\n\t\t\t\tuser.settings.allowSSOManualLogin = false;\n\t\t\t\tawait this.usersStore.updateOtherUserSettings(userId, user.settings);\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.disallowSSOManualLogin'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.disallowSSOManualLogin.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tgoToUpgrade() {\n\t\t\tvoid this.uiStore.goToUpgrade('settings-users', 'upgrade-users');\n\t\t},\n\t\tgoToUpgradeAdvancedPermissions() {\n\t\t\tvoid this.uiStore.goToUpgrade('settings-users', 'upgrade-advanced-permissions');\n\t\t},\n\t\tasync onRoleChange(user: IUser, newRoleName: UpdateGlobalRolePayload['newRoleName']) {\n\t\t\tawait this.usersStore.updateGlobalRole({ id: user.id, newRoleName });\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\theight: 100%;\n\tpadding-right: var(--spacing-2xs);\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xl);\n\t}\n}\n\n.usersContainer {\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.buttonContainer {\n\tdisplay: inline-block;\n\tfloat: right;\n\tmargin-bottom: var(--spacing-l);\n}\n\n.setupInfoContainer {\n\tmax-width: 728px;\n}\n\n.alert {\n\tleft: calc(50% + 100px);\n}\n</style>\n"],"names":["_sfc_main","defineComponent","useClipboard","useToast","mapStores","useSettingsStore","useUIStore","useUsersStore","useUsageStore","useSSOStore","EnterpriseEditionFeature","hasPermission","user","_a","ROLE","action","userId","VIEWS","INVITE_USER_MODAL_KEY","e","url","newRoleName","_resolveComponent","_normalizeClass","_ctx","_createVNode","_component_n8n_heading","$locale","_withCtx","_createTextVNode","_toDisplayString","showUMSetupWarning","settingsStore","_openBlock","_createElementBlock","$style","_createElementVNode","ssoStore","_component_n8n_action_box","uiStore","goToUpgrade","_createCommentVNode","_component_n8n_notice","_component_i18n_t","goToUpgradeAdvancedPermissions","usersStore","onUsersListAction","_createBlock","_component_n8n_select","$event","_Fragment","_renderList","role","_component_n8n_option"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsUsersView-BuKt4ZDO.js","sources":["../../src/views/SettingsUsersView.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.container\">\n\t\t<div>\n\t\t\t<n8n-heading size=\"2xlarge\">{{ $locale.baseText('settings.users') }}</n8n-heading>\n\t\t\t<div v-if=\"!showUMSetupWarning\" :class=\"$style.buttonContainer\">\n\t\t\t\t<n8n-tooltip :disabled=\"!ssoStore.isSamlLoginEnabled\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<span> {{ $locale.baseText('settings.users.invite.tooltip') }} </span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t:disabled=\"ssoStore.isSamlLoginEnabled || !settingsStore.isBelowUserQuota\"\n\t\t\t\t\t\t\t:label=\"$locale.baseText('settings.users.invite')\"\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\tdata-test-id=\"settings-users-invite-button\"\n\t\t\t\t\t\t\t@click=\"onInvite\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"!settingsStore.isBelowUserQuota\" :class=\"$style.setupInfoContainer\">\n\t\t\t<n8n-action-box\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText(uiStore.contextBasedTranslationKeys.users.settings.unavailable.title)\n\t\t\t\t\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\tuiStore.contextBasedTranslationKeys.users.settings.unavailable.description,\n\t\t\t\t\t)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"\n\t\t\t\t\t$locale.baseText(uiStore.contextBasedTranslationKeys.users.settings.unavailable.button)\n\t\t\t\t\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t</div>\n\t\t<n8n-notice v-if=\"!isAdvancedPermissionsEnabled\">\n\t\t\t<i18n-t keypath=\"settings.users.advancedPermissions.warning\">\n\t\t\t\t<template #link>\n\t\t\t\t\t<n8n-link size=\"small\" @click=\"goToUpgradeAdvancedPermissions\">\n\t\t\t\t\t\t{{ $locale.baseText('settings.users.advancedPermissions.warning.link') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</n8n-notice>\n\t\t<!-- If there's more than 1 user it means the account quota was more than 1 in the past. So we need to allow instance owner to be able to delete users and transfer workflows.\n\t\t-->\n\t\t<div\n\t\t\tv-if=\"settingsStore.isBelowUserQuota || usersStore.allUsers.length > 1\"\n\t\t\t:class=\"$style.usersContainer\"\n\t\t>\n\t\t\t<n8n-users-list\n\t\t\t\t:actions=\"usersListActions\"\n\t\t\t\t:users=\"usersStore.allUsers\"\n\t\t\t\t:current-user-id=\"usersStore.currentUserId\"\n\t\t\t\t:is-saml-login-enabled=\"ssoStore.isSamlLoginEnabled\"\n\t\t\t\t@action=\"onUsersListAction\"\n\t\t\t>\n\t\t\t\t<template #actions=\"{ user }\">\n\t\t\t\t\t<n8n-select\n\t\t\t\t\t\tv-if=\"user.id !== usersStore.currentUserId\"\n\t\t\t\t\t\t:model-value=\"user?.role || 'global:member'\"\n\t\t\t\t\t\t:disabled=\"!canUpdateRole\"\n\t\t\t\t\t\tdata-test-id=\"user-role-select\"\n\t\t\t\t\t\t@update:model-value=\"onRoleChange(user, $event)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-option\n\t\t\t\t\t\t\tv-for=\"role in userRoles\"\n\t\t\t\t\t\t\t:key=\"role.value\"\n\t\t\t\t\t\t\t:value=\"role.value\"\n\t\t\t\t\t\t\t:label=\"role.label\"\n\t\t\t\t\t\t\t:disabled=\"role.disabled\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-select>\n\t\t\t\t</template>\n\t\t\t</n8n-users-list>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { EnterpriseEditionFeature, INVITE_USER_MODAL_KEY, VIEWS, ROLE } from '@/constants';\n\nimport type { IRole, IUser, IUserListAction, InvitableRoleName } from '@/Interface';\nimport { useToast } from '@/composables/useToast';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useUsageStore } from '@/stores/usage.store';\nimport { useSSOStore } from '@/stores/sso.store';\nimport { hasPermission } from '@/utils/rbac/permissions';\nimport { useClipboard } from '@/composables/useClipboard';\nimport type { UpdateGlobalRolePayload } from '@/api/users';\n\nexport default defineComponent({\n\tname: 'SettingsUsersView',\n\tsetup() {\n\t\tconst clipboard = useClipboard();\n\n\t\treturn {\n\t\t\tclipboard,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useSettingsStore, useUIStore, useUsersStore, useUsageStore, useSSOStore),\n\t\tisSharingEnabled() {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing);\n\t\t},\n\t\tshowUMSetupWarning() {\n\t\t\treturn hasPermission(['defaultUser']);\n\t\t},\n\t\tusersListActions(): IUserListAction[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.copyInviteLink'),\n\t\t\t\t\tvalue: 'copyInviteLink',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isBelowUserQuota && !user.firstName && !!user.inviteAcceptUrl,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.reinvite'),\n\t\t\t\t\tvalue: 'reinvite',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isBelowUserQuota &&\n\t\t\t\t\t\t!user.firstName &&\n\t\t\t\t\t\tthis.settingsStore.isSmtpSetup,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.delete'),\n\t\t\t\t\tvalue: 'delete',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\thasPermission(['rbac'], { rbac: { scope: 'user:delete' } }) &&\n\t\t\t\t\t\tuser.id !== this.usersStore.currentUserId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.copyPasswordResetLink'),\n\t\t\t\t\tvalue: 'copyPasswordResetLink',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\thasPermission(['rbac'], { rbac: { scope: 'user:resetPassword' } }) &&\n\t\t\t\t\t\tthis.settingsStore.isBelowUserQuota &&\n\t\t\t\t\t\t!user.isPendingUser &&\n\t\t\t\t\t\tuser.id !== this.usersStore.currentUserId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.allowSSOManualLogin'),\n\t\t\t\t\tvalue: 'allowSSOManualLogin',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isSamlLoginEnabled && !user.settings?.allowSSOManualLogin,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users.actions.disallowSSOManualLogin'),\n\t\t\t\t\tvalue: 'disallowSSOManualLogin',\n\t\t\t\t\tguard: (user) =>\n\t\t\t\t\t\tthis.settingsStore.isSamlLoginEnabled && user.settings?.allowSSOManualLogin === true,\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tisAdvancedPermissionsEnabled(): boolean {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(\n\t\t\t\tEnterpriseEditionFeature.AdvancedPermissions,\n\t\t\t);\n\t\t},\n\t\tuserRoles(): Array<{ value: IRole; label: string; disabled?: boolean }> {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tvalue: ROLE.Member,\n\t\t\t\t\tlabel: this.$locale.baseText('auth.roles.member'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvalue: ROLE.Admin,\n\t\t\t\t\tlabel: this.$locale.baseText('auth.roles.admin'),\n\t\t\t\t\tdisabled: !this.isAdvancedPermissionsEnabled,\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tcanUpdateRole(): boolean {\n\t\t\treturn hasPermission(['rbac'], { rbac: { scope: ['user:update', 'user:changeRole'] } });\n\t\t},\n\t},\n\tasync mounted() {\n\t\tif (!this.showUMSetupWarning) {\n\t\t\tawait this.usersStore.fetchUsers();\n\t\t}\n\t},\n\tmethods: {\n\t\tasync onUsersListAction({ action, userId }: { action: string; userId: string }) {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'delete':\n\t\t\t\t\tawait this.onDelete(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'reinvite':\n\t\t\t\t\tawait this.onReinvite(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'copyInviteLink':\n\t\t\t\t\tawait this.onCopyInviteLink(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'copyPasswordResetLink':\n\t\t\t\t\tawait this.onCopyPasswordResetLink(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'allowSSOManualLogin':\n\t\t\t\t\tawait this.onAllowSSOManualLogin(userId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'disallowSSOManualLogin':\n\t\t\t\t\tawait this.onDisallowSSOManualLogin(userId);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tredirectToSetup() {\n\t\t\tvoid this.$router.push({ name: VIEWS.SETUP });\n\t\t},\n\t\tonInvite() {\n\t\t\tthis.uiStore.openModal(INVITE_USER_MODAL_KEY);\n\t\t},\n\t\tasync onDelete(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user) {\n\t\t\t\tthis.uiStore.openDeleteUserModal(userId);\n\t\t\t}\n\t\t},\n\t\tasync onReinvite(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user?.email && user?.role) {\n\t\t\t\tif (!['global:admin', 'global:member'].includes(user.role)) {\n\t\t\t\t\tthrow new Error('Invalid role name on reinvite');\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait this.usersStore.reinviteUser({\n\t\t\t\t\t\temail: user.email,\n\t\t\t\t\t\trole: user.role as InvitableRoleName,\n\t\t\t\t\t});\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\ttitle: this.$locale.baseText('settings.users.inviteResent'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('settings.users.emailSentTo', {\n\t\t\t\t\t\t\tinterpolate: { email: user.email ?? '' },\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthis.showError(e, this.$locale.baseText('settings.users.userReinviteError'));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync onCopyInviteLink(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user?.inviteAcceptUrl) {\n\t\t\t\tvoid this.clipboard.copy(user.inviteAcceptUrl);\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.inviteUrlCreated'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.inviteUrlCreated.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync onCopyPasswordResetLink(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user) {\n\t\t\t\tconst url = await this.usersStore.getUserPasswordResetLink(user);\n\t\t\t\tvoid this.clipboard.copy(url.link);\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.passwordResetUrlCreated'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.passwordResetUrlCreated.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync onAllowSSOManualLogin(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user) {\n\t\t\t\tif (!user.settings) {\n\t\t\t\t\tuser.settings = {};\n\t\t\t\t}\n\t\t\t\tuser.settings.allowSSOManualLogin = true;\n\t\t\t\tawait this.usersStore.updateOtherUserSettings(userId, user.settings);\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.allowSSOManualLogin'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.allowSSOManualLogin.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync onDisallowSSOManualLogin(userId: string) {\n\t\t\tconst user = this.usersStore.getUserById(userId);\n\t\t\tif (user?.settings) {\n\t\t\t\tuser.settings.allowSSOManualLogin = false;\n\t\t\t\tawait this.usersStore.updateOtherUserSettings(userId, user.settings);\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: this.$locale.baseText('settings.users.disallowSSOManualLogin'),\n\t\t\t\t\tmessage: this.$locale.baseText('settings.users.disallowSSOManualLogin.message'),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tgoToUpgrade() {\n\t\t\tvoid this.uiStore.goToUpgrade('settings-users', 'upgrade-users');\n\t\t},\n\t\tgoToUpgradeAdvancedPermissions() {\n\t\t\tvoid this.uiStore.goToUpgrade('settings-users', 'upgrade-advanced-permissions');\n\t\t},\n\t\tasync onRoleChange(user: IUser, newRoleName: UpdateGlobalRolePayload['newRoleName']) {\n\t\t\tawait this.usersStore.updateGlobalRole({ id: user.id, newRoleName });\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\theight: 100%;\n\tpadding-right: var(--spacing-2xs);\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xl);\n\t}\n}\n\n.usersContainer {\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.buttonContainer {\n\tdisplay: inline-block;\n\tfloat: right;\n\tmargin-bottom: var(--spacing-l);\n}\n\n.setupInfoContainer {\n\tmax-width: 728px;\n}\n\n.alert {\n\tleft: calc(50% + 100px);\n}\n</style>\n"],"names":["_sfc_main","defineComponent","useClipboard","useToast","mapStores","useSettingsStore","useUIStore","useUsersStore","useUsageStore","useSSOStore","EnterpriseEditionFeature","hasPermission","user","_a","ROLE","action","userId","VIEWS","INVITE_USER_MODAL_KEY","e","url","newRoleName","_resolveComponent","_normalizeClass","_ctx","_createVNode","_component_n8n_heading","$locale","_withCtx","_createTextVNode","_toDisplayString","showUMSetupWarning","settingsStore","_openBlock","_createElementBlock","$style","_createElementVNode","ssoStore","_component_n8n_action_box","uiStore","goToUpgrade","_createCommentVNode","_component_n8n_notice","_component_i18n_t","goToUpgradeAdvancedPermissions","usersStore","onUsersListAction","_createBlock","_component_n8n_select","$event","_Fragment","_renderList","role","_component_n8n_option"],"mappings":"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"}
|