n8n-editor-ui 1.41.0 → 1.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +61 -61
- package/dist/assets/{AuthView-E0Dwqa78.js → AuthView-CMX_-yPy.js} +2 -2
- package/dist/assets/{AuthView-E0Dwqa78.js.map → AuthView-CMX_-yPy.js.map} +1 -1
- package/dist/assets/{CanvasControls-yrXCY2V6.js → CanvasControls-9oKgZX9B.js} +2 -2
- package/dist/assets/{CanvasControls-yrXCY2V6.js.map → CanvasControls-9oKgZX9B.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-kHBWSwn5.js → ChangePasswordView-GG3ESv5E.js} +2 -2
- package/dist/assets/{ChangePasswordView-kHBWSwn5.js.map → ChangePasswordView-GG3ESv5E.js.map} +1 -1
- package/dist/assets/{CollectionParameter-ZuNQUd29.js → CollectionParameter-1UnufhEZ.js} +2 -2
- package/dist/assets/CollectionParameter-1UnufhEZ.js.map +1 -0
- package/dist/assets/{CredentialsView-24rpr6nX.js → CredentialsView-TrGa_IpW.js} +2 -2
- package/dist/assets/{CredentialsView-24rpr6nX.js.map → CredentialsView-TrGa_IpW.js.map} +1 -1
- package/dist/assets/{ExecutionsFilter-RyBW2SgR.js → ExecutionsFilter-W0_jymTM.js} +2 -2
- package/dist/assets/{ExecutionsFilter-RyBW2SgR.js.map → ExecutionsFilter-W0_jymTM.js.map} +1 -1
- package/dist/assets/{ExecutionsView-NIusemYP.js → ExecutionsView-P-nSEBpq.js} +2 -2
- package/dist/assets/{ExecutionsView-NIusemYP.js.map → ExecutionsView-P-nSEBpq.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-ebrry8c_.js → ForgotMyPasswordView-_Ft-h_Xq.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-ebrry8c_.js.map → ForgotMyPasswordView-_Ft-h_Xq.js.map} +1 -1
- package/dist/assets/{MainHeader-JJIRXuyj.js → MainHeader-UFj-n8nH.js} +2 -2
- package/dist/assets/{MainHeader-JJIRXuyj.js.map → MainHeader-UFj-n8nH.js.map} +1 -1
- package/dist/assets/{MainSidebar-KnXGjnqU.js → MainSidebar-H7A2NfnT.js} +2 -2
- package/dist/assets/{MainSidebar-KnXGjnqU.js.map → MainSidebar-H7A2NfnT.js.map} +1 -1
- package/dist/assets/{NodeCreation-01VRbmJn.js → NodeCreation-MVULkw2n.js} +3 -3
- package/dist/assets/{NodeCreation-01VRbmJn.js.map → NodeCreation-MVULkw2n.js.map} +1 -1
- package/dist/assets/{NodeCreator-D_gQXSbT.js → NodeCreator-NjQetiNP.js} +2 -2
- package/dist/assets/{NodeCreator-D_gQXSbT.js.map → NodeCreator-NjQetiNP.js.map} +1 -1
- package/dist/assets/{NodeList-Ysq3Cjbn.js → NodeList-f4t5_e24.js} +2 -2
- package/dist/assets/{NodeList-Ysq3Cjbn.js.map → NodeList-f4t5_e24.js.map} +1 -1
- package/dist/assets/{NodeView-QjQV3eFX.js → NodeView-kA0j8oya.js} +4 -4
- package/dist/assets/{NodeView-QjQV3eFX.js.map → NodeView-kA0j8oya.js.map} +1 -1
- package/dist/assets/{RunDataAi-wbEK-oHX.js → RunDataAi-9Rk5nlrG.js} +2 -2
- package/dist/assets/{RunDataAi-wbEK-oHX.js.map → RunDataAi-9Rk5nlrG.js.map} +1 -1
- package/dist/assets/{RunDataJson-YtVT_k9o.js → RunDataJson-3HvvCXQv.js} +3 -3
- package/dist/assets/{RunDataJson-YtVT_k9o.js.map → RunDataJson-3HvvCXQv.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-dl7uUHxF.js → RunDataJsonActions-QVURaY0g.js} +2 -2
- package/dist/assets/{RunDataJsonActions-dl7uUHxF.js.map → RunDataJsonActions-QVURaY0g.js.map} +1 -1
- package/dist/assets/{RunDataSchema-zsup9Psk.js → RunDataSchema-8AcA4SSx.js} +2 -2
- package/dist/assets/{RunDataSchema-zsup9Psk.js.map → RunDataSchema-8AcA4SSx.js.map} +1 -1
- package/dist/assets/{RunDataTable-4PVwCliN.js → RunDataTable-aySP3LG2.js} +2 -2
- package/dist/assets/{RunDataTable-4PVwCliN.js.map → RunDataTable-aySP3LG2.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-a7AOJSPY.js → SamlOnboarding-g5DOLc7y.js} +2 -2
- package/dist/assets/{SamlOnboarding-a7AOJSPY.js.map → SamlOnboarding-g5DOLc7y.js.map} +1 -1
- package/dist/assets/{SettingsApiView-MKVmxKrc.js → SettingsApiView-368bFhYh.js} +2 -2
- package/dist/assets/{SettingsApiView-MKVmxKrc.js.map → SettingsApiView-368bFhYh.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-JSEAJRmQ.js → SettingsCommunityNodesView-4ma9ZrA6.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-JSEAJRmQ.js.map → SettingsCommunityNodesView-4ma9ZrA6.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-LATcSwCb.js → SettingsExternalSecrets-anO5H_X6.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-LATcSwCb.js.map → SettingsExternalSecrets-anO5H_X6.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-JXYglIiV.js → SettingsFakeDoorView-DP8hJH_b.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-JXYglIiV.js.map → SettingsFakeDoorView-DP8hJH_b.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-2qYzfmuL.js → SettingsLdapView-TVoyUgkx.js} +2 -2
- package/dist/assets/{SettingsLdapView-2qYzfmuL.js.map → SettingsLdapView-TVoyUgkx.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-Xc6EScgx.js → SettingsLogStreamingView-IIFjEkjs.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-Xc6EScgx.js.map → SettingsLogStreamingView-IIFjEkjs.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-Mb0LqGSl.js → SettingsSourceControl-1zDUY0dl.js} +2 -2
- package/dist/assets/{SettingsSourceControl-Mb0LqGSl.js.map → SettingsSourceControl-1zDUY0dl.js.map} +1 -1
- package/dist/assets/{SettingsSso-2YEXaMhF.js → SettingsSso-7dAOqmaA.js} +2 -2
- package/dist/assets/{SettingsSso-2YEXaMhF.js.map → SettingsSso-7dAOqmaA.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-_C19BOT1.js → SettingsUsageAndPlan-0b_7OZCC.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-_C19BOT1.js.map → SettingsUsageAndPlan-0b_7OZCC.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-salH__qs.js → SettingsUsersView-0AZ_F16e.js} +2 -2
- package/dist/assets/{SettingsUsersView-salH__qs.js.map → SettingsUsersView-0AZ_F16e.js.map} +1 -1
- package/dist/assets/{SettingsView-EBt-ouA4.js → SettingsView-pF2qlNhK.js} +2 -2
- package/dist/assets/SettingsView-pF2qlNhK.js.map +1 -0
- package/dist/assets/{SetupView-T7JQiE1O.js → SetupView-IPdjd4om.js} +2 -2
- package/dist/assets/{SetupView-T7JQiE1O.js.map → SetupView-IPdjd4om.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-lDl1ksax.js → SetupWorkflowCredentialsButton-fL7BC8Hp.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-lDl1ksax.js.map → SetupWorkflowCredentialsButton-fL7BC8Hp.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-uEG55eR-.js → SetupWorkflowFromTemplateView-mDNSG38Q.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-uEG55eR-.js.map → SetupWorkflowFromTemplateView-mDNSG38Q.js.map} +1 -1
- package/dist/assets/{SigninView-tsJLDDbt.js → SigninView-4mpqXNHu.js} +2 -2
- package/dist/assets/{SigninView-tsJLDDbt.js.map → SigninView-4mpqXNHu.js.map} +1 -1
- package/dist/assets/{SignupView-ckdGMylG.js → SignupView-v6AVy0zJ.js} +2 -2
- package/dist/assets/{SignupView-ckdGMylG.js.map → SignupView-v6AVy0zJ.js.map} +1 -1
- package/dist/assets/{TemplateDetails-YEZlo0n4.js → TemplateDetails-WQVyxQi7.js} +2 -2
- package/dist/assets/{TemplateDetails-YEZlo0n4.js.map → TemplateDetails-WQVyxQi7.js.map} +1 -1
- package/dist/assets/{TemplateList-OGWLmWk_.js → TemplateList--WJ98ZVH.js} +2 -2
- package/dist/assets/{TemplateList-OGWLmWk_.js.map → TemplateList--WJ98ZVH.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-Fx5qyXc6.js → TemplatesCollectionView-g59Pu268.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-Fx5qyXc6.js.map → TemplatesCollectionView-g59Pu268.js.map} +1 -1
- package/dist/assets/{TemplatesInfoCarousel-oLwAv_o3.js → TemplatesInfoCarousel-Nq4oRyBi.js} +2 -2
- package/dist/assets/{TemplatesInfoCarousel-oLwAv_o3.js.map → TemplatesInfoCarousel-Nq4oRyBi.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-TtSL2qyI.js → TemplatesSearchView-Lv0e5mOk.js} +2 -2
- package/dist/assets/{TemplatesSearchView-TtSL2qyI.js.map → TemplatesSearchView-Lv0e5mOk.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-Ipt1HHPc.js → TemplatesWorkflowView-FoPXbc_4.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-Ipt1HHPc.js.map → TemplatesWorkflowView-FoPXbc_4.js.map} +1 -1
- package/dist/assets/{VariablesView-pLmlCm20.js → VariablesView-Sg4v_4Ai.js} +2 -2
- package/dist/assets/{VariablesView-pLmlCm20.js.map → VariablesView-Sg4v_4Ai.js.map} +1 -1
- package/dist/assets/{WorkerView-Du8mpTon.js → WorkerView-y-y5Q5E5.js} +2 -2
- package/dist/assets/{WorkerView-Du8mpTon.js.map → WorkerView-y-y5Q5E5.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-MuCzpXdv.js → WorkflowActivator-vtOaSPI6.js} +2 -2
- package/dist/assets/{WorkflowActivator-MuCzpXdv.js.map → WorkflowActivator-vtOaSPI6.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsInfoAccordion-9gkfchSQ.js → WorkflowExecutionsInfoAccordion-Gm7eM0Un.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-9gkfchSQ.js.map → WorkflowExecutionsInfoAccordion-Gm7eM0Un.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-g4QNNuc4.js → WorkflowExecutionsLandingPage-C_oVBqy4.js} +2 -2
- package/dist/assets/{WorkflowExecutionsLandingPage-g4QNNuc4.js.map → WorkflowExecutionsLandingPage-C_oVBqy4.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsPreview-KNJgPBbn.js → WorkflowExecutionsPreview-Yw0HRwQz.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-KNJgPBbn.js.map → WorkflowExecutionsPreview-Yw0HRwQz.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsView-Iwwaw9Lt.js → WorkflowExecutionsView-dwh6ZDgY.js} +2 -2
- package/dist/assets/{WorkflowExecutionsView-Iwwaw9Lt.js.map → WorkflowExecutionsView-dwh6ZDgY.js.map} +1 -1
- package/dist/assets/{WorkflowHistory-HxH8_2Dt.js → WorkflowHistory-RGKALSm6.js} +2 -2
- package/dist/assets/{WorkflowHistory-HxH8_2Dt.js.map → WorkflowHistory-RGKALSm6.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-KirfsyFh.js → WorkflowOnboardingView-kAh_YIAL.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-KirfsyFh.js.map → WorkflowOnboardingView-kAh_YIAL.js.map} +1 -1
- package/dist/assets/{WorkflowsView-SJ6W5Ten.js → WorkflowsView-_nHq94Wq.js} +2 -2
- package/dist/assets/{WorkflowsView-SJ6W5Ten.js.map → WorkflowsView-_nHq94Wq.js.map} +1 -1
- package/dist/assets/{cloud-WKIHJYyR.js → cloud-jEANLTrV.js} +2 -2
- package/dist/assets/{cloud-WKIHJYyR.js.map → cloud-jEANLTrV.js.map} +1 -1
- package/dist/assets/{index-Qw68KAhz.js → index-6M_Mo9yq.js} +4 -4
- package/dist/assets/{index-Qw68KAhz.js.map → index-6M_Mo9yq.js.map} +1 -1
- package/dist/assets/{templateActions-5n_gDrp9.js → templateActions-l9fJr0Cu.js} +2 -2
- package/dist/assets/{templateActions-5n_gDrp9.js.map → templateActions-l9fJr0Cu.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-bM31shhY.js → useExecutionDebugging-ndesKh44.js} +2 -2
- package/dist/assets/{useExecutionDebugging-bM31shhY.js.map → useExecutionDebugging-ndesKh44.js.map} +1 -1
- package/dist/assets/{usePushConnection-YMVPmkf5.js → usePushConnection-vhkd7pw_.js} +2 -2
- package/dist/assets/{usePushConnection-YMVPmkf5.js.map → usePushConnection-vhkd7pw_.js.map} +1 -1
- package/dist/assets/{workflowActivate-L9KnNQBb.js → workflowActivate-dwxhdtFU.js} +2 -2
- package/dist/assets/{workflowActivate-L9KnNQBb.js.map → workflowActivate-dwxhdtFU.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-ZuNQUd29.js.map +0 -1
- package/dist/assets/SettingsView-EBt-ouA4.js.map +0 -1
package/dist/assets/{SettingsUsageAndPlan-_C19BOT1.js.map → SettingsUsageAndPlan-0b_7OZCC.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsUsageAndPlan-_C19BOT1.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 '@/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":"62CAYA,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-0b_7OZCC.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 '@/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":"62CAYA,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 _}from"./pinia-28uZ5ZtB.js";import{e as O,f as R,u as E,l as I,t as b,h as c,bp as h,V as B,bq as P,_ as A}from"./n8n-0pza0mdA.js";import{l as D,aA as V,aB as z}from"./index-
|
|
2
|
-
//# sourceMappingURL=SettingsUsersView-
|
|
1
|
+
import{m as _}from"./pinia-28uZ5ZtB.js";import{e as O,f as R,u as E,l as I,t as b,h as c,bp as h,V as B,bq as P,_ as A}from"./n8n-0pza0mdA.js";import{l as D,aA as V,aB as z}from"./index-6M_Mo9yq.js";import{G as N,l as n,m as l,p,T as i,O as o,S as v,R as S,I as g,Q as u,M as m,F as Q,a7 as q,ag as t}from"./vendor-KLOX9vbo.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const F=N({name:"SettingsUsersView",setup(){return{clipboard:D(),...O()}},async mounted(){this.showUMSetupWarning||await this.usersStore.fetchUsers()},computed:{..._(I,E,R,z,V),isSharingEnabled(){return this.settingsStore.isEnterpriseFeatureEnabled(b.Sharing)},showUMSetupWarning(){return c(["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=>c(["rbac"],{rbac:{scope:"user:delete"}})&&e.id!==this.usersStore.currentUserId},{label:this.$locale.baseText("settings.users.actions.copyPasswordResetLink"),value:"copyPasswordResetLink",guard:e=>c(["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(b.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 c(["rbac"],{rbac:{scope:["user:update","user:changeRole"]}})}},methods:{redirectToSetup(){this.$router.push({name:B.SETUP})},onInvite(){this.uiStore.openModal(P)},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(d){this.showError(d,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 d=await this.usersStore.getUserPasswordResetLink(s);this.clipboard.copy(d.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})}}}),K="_container_1qzsb_1",W="_usersContainer_1qzsb_9",G="_buttonContainer_1qzsb_13",Y="_setupInfoContainer_1qzsb_19",j="_alert_1qzsb_23",x={container:K,usersContainer:W,buttonContainer:G,setupInfoContainer:Y,alert:j};function H(e,s,d,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"),C=t("i18n-t"),$=t("n8n-notice"),f=t("n8n-option"),k=t("n8n-select"),M=t("n8n-users-list");return n(),l("div",{class:g(e.$style.container)},[p("div",null,[i(w,{size:"2xlarge"},{default:o(()=>[v(S(e.$locale.baseText("settings.users")),1)]),_:1}),e.showUMSetupWarning?u("",!0):(n(),l("div",{key:0,class:g(e.$style.buttonContainer)},[i(y,{disabled:!e.ssoStore.isSamlLoginEnabled},{content:o(()=>[p("span",null,S(e.$locale.baseText("settings.users.invite.tooltip")),1)]),default:o(()=>[p("div",null,[i(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)},[i(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:o(()=>[i(C,{keypath:"settings.users.advancedPermissions.warning"},{link:o(()=>[i(L,{size:"small",onClick:e.goToUpgradeAdvancedPermissions},{default:o(()=>[v(S(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)},[i(M,{actions:e.usersListActions,users:e.usersStore.allUsers,"current-user-id":e.usersStore.currentUserId,"is-saml-login-enabled":e.ssoStore.isSamlLoginEnabled,onDelete:e.onDelete,onReinvite:e.onReinvite,onCopyInviteLink:e.onCopyInviteLink,onCopyPasswordResetLink:e.onCopyPasswordResetLink,onAllowSSOManualLogin:e.onAllowSSOManualLogin,onDisallowSSOManualLogin:e.onDisallowSSOManualLogin},{actions:o(({user:r})=>[r.id!==e.usersStore.currentUserId?(n(),m(k,{key:0,"model-value":(r==null?void 0:r.role)||"global:member",disabled:!e.canUpdateRole,"data-test-id":"user-role-select","onUpdate:modelValue":a=>e.onRoleChange(r,a)},{default:o(()=>[(n(!0),l(Q,null,q(e.userRoles,a=>(n(),m(f,{key:a.value,value:a.value,label:a.label,disabled:a.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","onDelete","onReinvite","onCopyInviteLink","onCopyPasswordResetLink","onAllowSSOManualLogin","onDisallowSSOManualLogin"])],2)):u("",!0)],2)}const J={$style:x},_e=A(F,[["render",H],["__cssModules",J]]);export{_e as default};
|
|
2
|
+
//# sourceMappingURL=SettingsUsersView-0AZ_F16e.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsUsersView-salH__qs.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@delete=\"onDelete\"\n\t\t\t\t@reinvite=\"onReinvite\"\n\t\t\t\t@copy-invite-link=\"onCopyInviteLink\"\n\t\t\t\t@copy-password-reset-link=\"onCopyPasswordResetLink\"\n\t\t\t\t@allow-s-s-o-manual-login=\"onAllowSSOManualLogin\"\n\t\t\t\t@disallow-s-s-o-manual-login=\"onDisallowSSOManualLogin\"\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 { 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 '@/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\tasync mounted() {\n\t\tif (!this.showUMSetupWarning) {\n\t\t\tawait this.usersStore.fetchUsers();\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\tmethods: {\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","VIEWS","INVITE_USER_MODAL_KEY","userId","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","onDelete","onReinvite","onAllowSSOManualLogin","onDisallowSSOManualLogin","_createBlock","_component_n8n_select","$event","_Fragment","_renderList","role","_component_n8n_option"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsUsersView-0AZ_F16e.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@delete=\"onDelete\"\n\t\t\t\t@reinvite=\"onReinvite\"\n\t\t\t\t@copy-invite-link=\"onCopyInviteLink\"\n\t\t\t\t@copy-password-reset-link=\"onCopyPasswordResetLink\"\n\t\t\t\t@allow-s-s-o-manual-login=\"onAllowSSOManualLogin\"\n\t\t\t\t@disallow-s-s-o-manual-login=\"onDisallowSSOManualLogin\"\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 { 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 '@/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\tasync mounted() {\n\t\tif (!this.showUMSetupWarning) {\n\t\t\tawait this.usersStore.fetchUsers();\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\tmethods: {\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","VIEWS","INVITE_USER_MODAL_KEY","userId","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","onDelete","onReinvite","onAllowSSOManualLogin","onDisallowSSOManualLogin","_createBlock","_component_n8n_select","$event","_Fragment","_renderList","role","_component_n8n_option"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as $,l as N,m as R,V as t,h as v,A as C,cP as I,_ as d}from"./n8n-0pza0mdA.js";import{m as f}from"./pinia-28uZ5ZtB.js";import{g as y}from"./index-
|
|
2
|
-
//# sourceMappingURL=SettingsView-
|
|
1
|
+
import{u as $,l as N,m as R,V as t,h as v,A as C,cP as I,_ as d}from"./n8n-0pza0mdA.js";import{m as f}from"./pinia-28uZ5ZtB.js";import{g as y}from"./index-6M_Mo9yq.js";import{G as g,ag as n,l as _,m as h,T as o,O as r,I as i,p as a,R as p,S,K as O}from"./vendor-KLOX9vbo.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const U=g({name:"SettingsSidebar",mixins:[y],computed:{...f(R,N,$),settingsFakeDoorFeatures(){return this.uiStore.getFakeDoorByLocation("settings")},sidebarMenuItems(){const e=[{id:"settings-usage-and-plan",icon:"chart-bar",label:this.$locale.baseText("settings.usageAndPlan.title"),position:"top",available:this.canAccessUsageAndPlan(),route:{to:{name:t.USAGE}}},{id:"settings-personal",icon:"user-circle",label:this.$locale.baseText("settings.personal"),position:"top",available:this.canAccessPersonalSettings(),route:{to:{name:t.PERSONAL_SETTINGS}}},{id:"settings-users",icon:"user-friends",label:this.$locale.baseText("settings.users"),position:"top",available:this.canAccessUsersSettings(),route:{to:{name:t.USERS_SETTINGS}}},{id:"settings-api",icon:"plug",label:this.$locale.baseText("settings.n8napi"),position:"top",available:this.canAccessApiSettings(),route:{to:{name:t.API_SETTINGS}}},{id:"settings-external-secrets",icon:"vault",label:this.$locale.baseText("settings.externalSecrets.title"),position:"top",available:this.canAccessExternalSecrets(),route:{to:{name:t.EXTERNAL_SECRETS_SETTINGS}}},{id:"settings-source-control",icon:"code-branch",label:this.$locale.baseText("settings.sourceControl.title"),position:"top",available:this.canAccessSourceControl(),route:{to:{name:t.SOURCE_CONTROL}}},{id:"settings-sso",icon:"user-lock",label:this.$locale.baseText("settings.sso"),position:"top",available:this.canAccessSso(),route:{to:{name:t.SSO_SETTINGS}}},{id:"settings-ldap",icon:"network-wired",label:this.$locale.baseText("settings.ldap"),position:"top",available:this.canAccessLdapSettings(),route:{to:{name:t.LDAP_SETTINGS}}},{id:"settings-workersview",icon:"project-diagram",label:this.$locale.baseText("mainSidebar.workersView"),position:"top",available:this.settingsStore.isQueueModeEnabled&&v(["rbac"],{rbac:{scope:"workersView:manage"}}),route:{to:{name:t.WORKER_VIEW}}}];for(const s of this.settingsFakeDoorFeatures)s.uiLocations.includes("settings")&&e.push({id:s.id,icon:s.icon??"question",label:this.$locale.baseText(s.featureName),position:"top",available:!0,activateOnRoutePaths:[`/settings/coming-soon/${s.id}`]});return e.push({id:"settings-log-streaming",icon:"sign-in-alt",label:this.$locale.baseText("settings.log-streaming"),position:"top",available:this.canAccessLogStreamingSettings(),route:{to:{name:t.LOG_STREAMING_SETTINGS}}}),e.push({id:"settings-community-nodes",icon:"cube",label:this.$locale.baseText("settings.communityNodes"),position:"top",available:this.canAccessCommunityNodes(),route:{to:{name:t.COMMUNITY_NODES}}}),e}},methods:{canAccessPersonalSettings(){return this.canUserAccessRouteByName(t.PERSONAL_SETTINGS)},canAccessUsersSettings(){return this.canUserAccessRouteByName(t.USERS_SETTINGS)},canAccessCommunityNodes(){return this.canUserAccessRouteByName(t.COMMUNITY_NODES)},canAccessApiSettings(){return this.settingsStore.isPublicApiEnabled&&this.canUserAccessRouteByName(t.API_SETTINGS)},canAccessLdapSettings(){return this.canUserAccessRouteByName(t.LDAP_SETTINGS)},canAccessLogStreamingSettings(){return this.canUserAccessRouteByName(t.LOG_STREAMING_SETTINGS)},canAccessUsageAndPlan(){return this.canUserAccessRouteByName(t.USAGE)},canAccessExternalSecrets(){return this.canUserAccessRouteByName(t.EXTERNAL_SECRETS_SETTINGS)},canAccessSourceControl(){return this.canUserAccessRouteByName(t.SOURCE_CONTROL)},canAccessSso(){return this.canUserAccessRouteByName(t.SSO_SETTINGS)},onVersionClick(){this.uiStore.openModal(C)},openUpdatesPanel(){this.uiStore.openModal(I)},async navigateTo(e){this.$router.currentRoute.name!==e&&await this.$router.push({name:e})},async handleSelect(e){switch(e){case"users":case"logging":this.$router.push({name:t.FAKE_DOOR,params:{featureId:e}}).catch(()=>{});break}}}}),w="_container_w9grj_1",G="_returnButton_w9grj_10",B="_versionContainer_w9grj_18",k={container:w,returnButton:G,versionContainer:B},L={class:"mr-xs"};function M(e,s,c,l,b,T){const u=n("font-awesome-icon"),m=n("n8n-heading"),A=n("n8n-link"),E=n("n8n-menu");return _(),h("div",{class:i(e.$style.container)},[o(E,{items:e.sidebarMenuItems,onSelect:e.handleSelect},{header:r(()=>[a("div",{class:i(e.$style.returnButton),"data-test-id":"settings-back",onClick:s[0]||(s[0]=H=>e.$emit("return"))},[a("i",L,[o(u,{icon:"arrow-left"})]),o(m,{size:"large",bold:!0},{default:r(()=>[S(p(e.$locale.baseText("settings")),1)]),_:1})],2)]),menuSuffix:r(()=>[a("div",{class:i(e.$style.versionContainer)},[o(A,{size:"small",onClick:e.onVersionClick},{default:r(()=>[S(p(e.$locale.baseText("settings.version"))+" "+p(e.rootStore.versionCli),1)]),_:1},8,["onClick"])],2)]),_:1},8,["items","onSelect"])],2)}const P={$style:k},V=d(U,[["render",M],["__cssModules",P]]),x=g({name:"SettingsView",components:{SettingsSidebar:V},beforeRouteEnter(e,s,c){c(l=>{l.previousRoute=s})},data(){return{previousRoute:null}},methods:{onReturn(){this.$router.push(this.previousRoute?this.previousRoute.path:{name:t.HOMEPAGE})}}}),D=x,F="_container_11adc_1",K="_contentContainer_11adc_8 _container_11adc_1",j="_content_11adc_8",Y={container:F,contentContainer:K,content:j};function z(e,s,c,l,b,T){const u=n("SettingsSidebar"),m=n("router-view");return _(),h("div",{class:i(e.$style.container)},[o(u,{onReturn:e.onReturn},null,8,["onReturn"]),a("div",{class:i(e.$style.contentContainer)},[a("div",{class:i(e.$style.content)},[o(m,O({name:"settingsView"},e.$attrs),null,16)],2)],2)],2)}const W={$style:Y},Ne=d(D,[["render",z],["__cssModules",W]]);export{Ne as default};
|
|
2
|
+
//# sourceMappingURL=SettingsView-pF2qlNhK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsView-pF2qlNhK.js","sources":["../../src/components/SettingsSidebar.vue","../../src/views/SettingsView.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.container\">\n\t\t<n8n-menu :items=\"sidebarMenuItems\" @select=\"handleSelect\">\n\t\t\t<template #header>\n\t\t\t\t<div :class=\"$style.returnButton\" data-test-id=\"settings-back\" @click=\"$emit('return')\">\n\t\t\t\t\t<i class=\"mr-xs\">\n\t\t\t\t\t\t<font-awesome-icon icon=\"arrow-left\" />\n\t\t\t\t\t</i>\n\t\t\t\t\t<n8n-heading size=\"large\" :bold=\"true\">{{ $locale.baseText('settings') }}</n8n-heading>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template #menuSuffix>\n\t\t\t\t<div :class=\"$style.versionContainer\">\n\t\t\t\t\t<n8n-link size=\"small\" @click=\"onVersionClick\">\n\t\t\t\t\t\t{{ $locale.baseText('settings.version') }} {{ rootStore.versionCli }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-menu>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { ABOUT_MODAL_KEY, VERSIONS_MODAL_KEY, VIEWS } from '@/constants';\nimport { userHelpers } from '@/mixins/userHelpers';\nimport type { IFakeDoor } from '@/Interface';\nimport type { IMenuItem } from 'n8n-design-system';\nimport type { BaseTextKey } from '@/plugins/i18n';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { hasPermission } from '@/rbac/permissions';\n\nexport default defineComponent({\n\tname: 'SettingsSidebar',\n\tmixins: [userHelpers],\n\tcomputed: {\n\t\t...mapStores(useRootStore, useSettingsStore, useUIStore),\n\t\tsettingsFakeDoorFeatures(): IFakeDoor[] {\n\t\t\treturn this.uiStore.getFakeDoorByLocation('settings');\n\t\t},\n\t\tsidebarMenuItems(): IMenuItem[] {\n\t\t\tconst menuItems: IMenuItem[] = [\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-usage-and-plan',\n\t\t\t\t\ticon: 'chart-bar',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.usageAndPlan.title'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessUsageAndPlan(),\n\t\t\t\t\troute: { to: { name: VIEWS.USAGE } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-personal',\n\t\t\t\t\ticon: 'user-circle',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.personal'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessPersonalSettings(),\n\t\t\t\t\troute: { to: { name: VIEWS.PERSONAL_SETTINGS } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-users',\n\t\t\t\t\ticon: 'user-friends',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.users'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessUsersSettings(),\n\t\t\t\t\troute: { to: { name: VIEWS.USERS_SETTINGS } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-api',\n\t\t\t\t\ticon: 'plug',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.n8napi'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessApiSettings(),\n\t\t\t\t\troute: { to: { name: VIEWS.API_SETTINGS } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-external-secrets',\n\t\t\t\t\ticon: 'vault',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.externalSecrets.title'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessExternalSecrets(),\n\t\t\t\t\troute: { to: { name: VIEWS.EXTERNAL_SECRETS_SETTINGS } },\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-source-control',\n\t\t\t\t\ticon: 'code-branch',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.sourceControl.title'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessSourceControl(),\n\t\t\t\t\troute: { to: { name: VIEWS.SOURCE_CONTROL } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-sso',\n\t\t\t\t\ticon: 'user-lock',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.sso'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessSso(),\n\t\t\t\t\troute: { to: { name: VIEWS.SSO_SETTINGS } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-ldap',\n\t\t\t\t\ticon: 'network-wired',\n\t\t\t\t\tlabel: this.$locale.baseText('settings.ldap'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable: this.canAccessLdapSettings(),\n\t\t\t\t\troute: { to: { name: VIEWS.LDAP_SETTINGS } },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings-workersview',\n\t\t\t\t\ticon: 'project-diagram',\n\t\t\t\t\tlabel: this.$locale.baseText('mainSidebar.workersView'),\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tavailable:\n\t\t\t\t\t\tthis.settingsStore.isQueueModeEnabled &&\n\t\t\t\t\t\thasPermission(['rbac'], { rbac: { scope: 'workersView:manage' } }),\n\t\t\t\t\troute: { to: { name: VIEWS.WORKER_VIEW } },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tfor (const item of this.settingsFakeDoorFeatures) {\n\t\t\t\tif (item.uiLocations.includes('settings')) {\n\t\t\t\t\tmenuItems.push({\n\t\t\t\t\t\tid: item.id,\n\t\t\t\t\t\ticon: item.icon ?? 'question',\n\t\t\t\t\t\tlabel: this.$locale.baseText(item.featureName as BaseTextKey),\n\t\t\t\t\t\tposition: 'top',\n\t\t\t\t\t\tavailable: true,\n\t\t\t\t\t\tactivateOnRoutePaths: [`/settings/coming-soon/${item.id}`],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmenuItems.push({\n\t\t\t\tid: 'settings-log-streaming',\n\t\t\t\ticon: 'sign-in-alt',\n\t\t\t\tlabel: this.$locale.baseText('settings.log-streaming'),\n\t\t\t\tposition: 'top',\n\t\t\t\tavailable: this.canAccessLogStreamingSettings(),\n\t\t\t\troute: { to: { name: VIEWS.LOG_STREAMING_SETTINGS } },\n\t\t\t});\n\n\t\t\tmenuItems.push({\n\t\t\t\tid: 'settings-community-nodes',\n\t\t\t\ticon: 'cube',\n\t\t\t\tlabel: this.$locale.baseText('settings.communityNodes'),\n\t\t\t\tposition: 'top',\n\t\t\t\tavailable: this.canAccessCommunityNodes(),\n\t\t\t\troute: { to: { name: VIEWS.COMMUNITY_NODES } },\n\t\t\t});\n\n\t\t\treturn menuItems;\n\t\t},\n\t},\n\tmethods: {\n\t\tcanAccessPersonalSettings(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.PERSONAL_SETTINGS);\n\t\t},\n\t\tcanAccessUsersSettings(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.USERS_SETTINGS);\n\t\t},\n\t\tcanAccessCommunityNodes(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.COMMUNITY_NODES);\n\t\t},\n\t\tcanAccessApiSettings(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.settingsStore.isPublicApiEnabled && this.canUserAccessRouteByName(VIEWS.API_SETTINGS)\n\t\t\t);\n\t\t},\n\t\tcanAccessLdapSettings(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.LDAP_SETTINGS);\n\t\t},\n\t\tcanAccessLogStreamingSettings(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.LOG_STREAMING_SETTINGS);\n\t\t},\n\t\tcanAccessUsageAndPlan(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.USAGE);\n\t\t},\n\t\tcanAccessExternalSecrets(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.EXTERNAL_SECRETS_SETTINGS);\n\t\t},\n\t\tcanAccessSourceControl(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.SOURCE_CONTROL);\n\t\t},\n\t\tcanAccessSso(): boolean {\n\t\t\treturn this.canUserAccessRouteByName(VIEWS.SSO_SETTINGS);\n\t\t},\n\t\tonVersionClick() {\n\t\t\tthis.uiStore.openModal(ABOUT_MODAL_KEY);\n\t\t},\n\t\topenUpdatesPanel() {\n\t\t\tthis.uiStore.openModal(VERSIONS_MODAL_KEY);\n\t\t},\n\t\tasync navigateTo(routeName: (typeof VIEWS)[keyof typeof VIEWS]) {\n\t\t\tif (this.$router.currentRoute.name !== routeName) {\n\t\t\t\tawait this.$router.push({ name: routeName });\n\t\t\t}\n\t\t},\n\t\tasync handleSelect(key: string) {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'users': // Fakedoor feature added via hooks when user management is disabled on cloud\n\t\t\t\tcase 'logging':\n\t\t\t\t\tthis.$router.push({ name: VIEWS.FAKE_DOOR, params: { featureId: key } }).catch(() => {});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tmin-width: $sidebar-expanded-width;\n\theight: 100%;\n\tbackground-color: var(--color-background-xlight);\n\tborder-right: var(--border-base);\n\tposition: relative;\n\toverflow: auto;\n}\n\n.returnButton {\n\tpadding: var(--spacing-s) var(--spacing-l);\n\tcursor: pointer;\n\t&:hover {\n\t\tcolor: var(--color-primary);\n\t}\n}\n\n.versionContainer {\n\tpadding: var(--spacing-xs) var(--spacing-l);\n}\n\n@media screen and (max-height: 420px) {\n\t.versionContainer {\n\t\tdisplay: none;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<SettingsSidebar @return=\"onReturn\" />\n\t\t<div :class=\"$style.contentContainer\">\n\t\t\t<div :class=\"$style.content\">\n\t\t\t\t<!--\n\t\t\t\t\tBecause we're using nested routes the props are going to be bind to the top level route\n\t\t\t\t\tso we need to pass them down to the child component\n\t\t\t\t-->\n\t\t\t\t<router-view name=\"settingsView\" v-bind=\"$attrs\" />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { Route } from 'vue-router';\n\nimport { VIEWS } from '@/constants';\nimport SettingsSidebar from '@/components/SettingsSidebar.vue';\n\nconst SettingsView = defineComponent({\n\tname: 'SettingsView',\n\tcomponents: {\n\t\tSettingsSidebar,\n\t},\n\tbeforeRouteEnter(to, from, next) {\n\t\tnext((vm) => {\n\t\t\t(vm as unknown as InstanceType<typeof SettingsView>).previousRoute = from;\n\t\t});\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tpreviousRoute: null as Route | null,\n\t\t};\n\t},\n\tmethods: {\n\t\tonReturn() {\n\t\t\tvoid this.$router.push(\n\t\t\t\tthis.previousRoute ? this.previousRoute.path : { name: VIEWS.HOMEPAGE },\n\t\t\t);\n\t\t},\n\t},\n});\n\nexport default SettingsView;\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\theight: 100%;\n\twidth: 100%;\n\tdisplay: flex;\n\toverflow: hidden;\n}\n\n.contentContainer {\n\tcomposes: container;\n\tjustify-content: center;\n\tpadding-top: 70.5px;\n\theight: 100%;\n\toverflow: auto;\n\tbackground-color: var(--color-background-light);\n}\n\n.content {\n\theight: 100%;\n\twidth: 100%;\n\tmax-width: 800px;\n\tpadding: 0 var(--spacing-2xl);\n}\n</style>\n"],"names":["_sfc_main$1","defineComponent","userHelpers","mapStores","useRootStore","useSettingsStore","useUIStore","menuItems","VIEWS","hasPermission","item","ABOUT_MODAL_KEY","VERSIONS_MODAL_KEY","routeName","key","_resolveComponent","_normalizeClass","_ctx","handleSelect","_withCtx","_createElementVNode","$emit","_cache","$event","_createVNode","_component_font_awesome_icon","_component_n8n_heading","_createTextVNode","_toDisplayString","$style","onVersionClick","SettingsView","SettingsSidebar","to","from","next","vm","_sfc_main","_component_SettingsSidebar"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as o}from"./AuthView-
|
|
2
|
-
//# sourceMappingURL=SetupView-
|
|
1
|
+
import{A as o}from"./AuthView-CMX_-yPy.js";import{e as i,f as s,u as m,l as p,V as a,_ as l}from"./n8n-0pza0mdA.js";import{m as n}from"./pinia-28uZ5ZtB.js";import{G as u,l as c,M as h,ag as d}from"./vendor-KLOX9vbo.js";import"./index-6M_Mo9yq.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./lodash-es-wI9avrph.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./uuid-McvpxQtQ.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./luxon-ZRIU05qF.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./@vueuse/core-JpwZAlxf.js";import"./esprima-next-ulPLCZ1Z.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";const f=u({name:"SetupView",components:{AuthView:o},setup(){return i()},data(){return{FORM_CONFIG:{title:this.$locale.baseText("auth.setup.setupOwner"),buttonText:this.$locale.baseText("auth.setup.next"),inputs:[{name:"email",properties:{label:this.$locale.baseText("auth.email"),type:"email",required:!0,validationRules:[{name:"VALID_EMAIL"}],autocomplete:"email",capitalize:!0}},{name:"firstName",properties:{label:this.$locale.baseText("auth.firstName"),maxlength:32,required:!0,autocomplete:"given-name",capitalize:!0}},{name:"lastName",properties:{label:this.$locale.baseText("auth.lastName"),maxlength:32,required:!0,autocomplete:"family-name",capitalize:!0}},{name:"password",properties:{label:this.$locale.baseText("auth.password"),type:"password",required:!0,validationRules:[{name:"DEFAULT_PASSWORD_RULES"}],infoText:this.$locale.baseText("auth.defaultPasswordRequirements"),autocomplete:"new-password",capitalize:!0}},{name:"agree",properties:{label:this.$locale.baseText("auth.agreement.label"),type:"checkbox"}}]},loading:!1}},computed:{...n(p,m,s)},methods:{async onSubmit(e){try{const t=this.settingsStore.showSetupPage;if(this.loading=!0,await this.usersStore.createOwner(e),e.agree===!0)try{await this.uiStore.submitContactEmail(e.email.toString(),e.agree)}catch{}t?await this.$router.push({name:a.NEW_WORKFLOW}):await this.$router.push({name:a.USERS_SETTINGS})}catch(t){this.showError(t,this.$locale.baseText("auth.setup.settingUpOwnerError"))}this.loading=!1}}});function S(e,t,b,w,g,_){const r=d("AuthView");return c(),h(r,{form:e.FORM_CONFIG,"form-loading":e.loading,"data-test-id":"setup-form",onSubmit:e.onSubmit},null,8,["form","form-loading","onSubmit"])}const Q=l(f,[["render",S]]);export{Q as default};
|
|
2
|
+
//# sourceMappingURL=SetupView-IPdjd4om.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupView-
|
|
1
|
+
{"version":3,"file":"SetupView-IPdjd4om.js","sources":["../../src/views/SetupView.vue"],"sourcesContent":["<template>\n\t<AuthView\n\t\t:form=\"FORM_CONFIG\"\n\t\t:form-loading=\"loading\"\n\t\tdata-test-id=\"setup-form\"\n\t\t@submit=\"onSubmit\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport AuthView from './AuthView.vue';\nimport { defineComponent } from 'vue';\n\nimport { useToast } from '@/composables/useToast';\nimport type { IFormBoxConfig } from '@/Interface';\nimport { VIEWS } from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\n\nexport default defineComponent({\n\tname: 'SetupView',\n\tcomponents: {\n\t\tAuthView,\n\t},\n\tsetup() {\n\t\treturn useToast();\n\t},\n\tdata() {\n\t\tconst FORM_CONFIG: IFormBoxConfig = {\n\t\t\ttitle: this.$locale.baseText('auth.setup.setupOwner'),\n\t\t\tbuttonText: this.$locale.baseText('auth.setup.next'),\n\t\t\tinputs: [\n\t\t\t\t{\n\t\t\t\t\tname: 'email',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tlabel: this.$locale.baseText('auth.email'),\n\t\t\t\t\t\ttype: 'email',\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tvalidationRules: [{ name: 'VALID_EMAIL' }],\n\t\t\t\t\t\tautocomplete: 'email',\n\t\t\t\t\t\tcapitalize: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'firstName',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tlabel: this.$locale.baseText('auth.firstName'),\n\t\t\t\t\t\tmaxlength: 32,\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tautocomplete: 'given-name',\n\t\t\t\t\t\tcapitalize: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'lastName',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tlabel: this.$locale.baseText('auth.lastName'),\n\t\t\t\t\t\tmaxlength: 32,\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tautocomplete: 'family-name',\n\t\t\t\t\t\tcapitalize: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'password',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tlabel: this.$locale.baseText('auth.password'),\n\t\t\t\t\t\ttype: 'password',\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tvalidationRules: [{ name: 'DEFAULT_PASSWORD_RULES' }],\n\t\t\t\t\t\tinfoText: this.$locale.baseText('auth.defaultPasswordRequirements'),\n\t\t\t\t\t\tautocomplete: 'new-password',\n\t\t\t\t\t\tcapitalize: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'agree',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tlabel: this.$locale.baseText('auth.agreement.label'),\n\t\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\treturn {\n\t\t\tFORM_CONFIG,\n\t\t\tloading: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useSettingsStore, useUIStore, useUsersStore),\n\t},\n\tmethods: {\n\t\tasync onSubmit(values: { [key: string]: string | boolean }) {\n\t\t\ttry {\n\t\t\t\tconst forceRedirectedHere = this.settingsStore.showSetupPage;\n\t\t\t\tthis.loading = true;\n\t\t\t\tawait this.usersStore.createOwner(\n\t\t\t\t\tvalues as { firstName: string; lastName: string; email: string; password: string },\n\t\t\t\t);\n\n\t\t\t\tif (values.agree === true) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.uiStore.submitContactEmail(values.email.toString(), values.agree);\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\n\t\t\t\tif (forceRedirectedHere) {\n\t\t\t\t\tawait this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t} else {\n\t\t\t\t\tawait this.$router.push({ name: VIEWS.USERS_SETTINGS });\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('auth.setup.settingUpOwnerError'));\n\t\t\t}\n\t\t\tthis.loading = false;\n\t\t},\n\t},\n});\n</script>\n"],"names":["_sfc_main","defineComponent","AuthView","useToast","mapStores","useSettingsStore","useUIStore","useUsersStore","values","forceRedirectedHere","VIEWS","error","_resolveComponent","_openBlock","_createBlock","_component_AuthView","_ctx","onSubmit"],"mappings":"4mCAqBA,MAAAA,EAAeC,EAAgB,CAC9B,KAAM,YACN,WAAY,CACX,SAAAC,CACD,EACA,OAAQ,CACP,OAAOC,EAAS,CACjB,EACA,MAAO,CA0DC,MAAA,CACN,YA1DmC,CACnC,MAAO,KAAK,QAAQ,SAAS,uBAAuB,EACpD,WAAY,KAAK,QAAQ,SAAS,iBAAiB,EACnD,OAAQ,CACP,CACC,KAAM,QACN,WAAY,CACX,MAAO,KAAK,QAAQ,SAAS,YAAY,EACzC,KAAM,QACN,SAAU,GACV,gBAAiB,CAAC,CAAE,KAAM,cAAe,EACzC,aAAc,QACd,WAAY,EACb,CACD,EACA,CACC,KAAM,YACN,WAAY,CACX,MAAO,KAAK,QAAQ,SAAS,gBAAgB,EAC7C,UAAW,GACX,SAAU,GACV,aAAc,aACd,WAAY,EACb,CACD,EACA,CACC,KAAM,WACN,WAAY,CACX,MAAO,KAAK,QAAQ,SAAS,eAAe,EAC5C,UAAW,GACX,SAAU,GACV,aAAc,cACd,WAAY,EACb,CACD,EACA,CACC,KAAM,WACN,WAAY,CACX,MAAO,KAAK,QAAQ,SAAS,eAAe,EAC5C,KAAM,WACN,SAAU,GACV,gBAAiB,CAAC,CAAE,KAAM,yBAA0B,EACpD,SAAU,KAAK,QAAQ,SAAS,kCAAkC,EAClE,aAAc,eACd,WAAY,EACb,CACD,EACA,CACC,KAAM,QACN,WAAY,CACX,MAAO,KAAK,QAAQ,SAAS,sBAAsB,EACnD,KAAM,UACP,CACD,CACD,CAAA,EAKA,QAAS,EAAA,CAEX,EACA,SAAU,CACT,GAAGC,EAAUC,EAAkBC,EAAYC,CAAa,CACzD,EACA,QAAS,CACR,MAAM,SAASC,EAA6C,CACvD,GAAA,CACG,MAAAC,EAAsB,KAAK,cAAc,cAM3C,GALJ,KAAK,QAAU,GACf,MAAM,KAAK,WAAW,YACrBD,CAAA,EAGGA,EAAO,QAAU,GAChB,GAAA,CACG,MAAA,KAAK,QAAQ,mBAAmBA,EAAO,MAAM,SAAS,EAAGA,EAAO,KAAK,CAAA,MACpE,CAAC,CAGNC,EACH,MAAM,KAAK,QAAQ,KAAK,CAAE,KAAMC,EAAM,aAAc,EAEpD,MAAM,KAAK,QAAQ,KAAK,CAAE,KAAMA,EAAM,eAAgB,QAE/CC,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,gCAAgC,CAAC,CAC9E,CACA,KAAK,QAAU,EAChB,CACD,CACD,CAAC,kCAxHAC,EAKE,UAAA,EAHA,OAAAC,EAAA,EAAqBC,EAAAC,EAAA,CACtB,KAAAC,EAAA,YACC,eAAQC,EAAAA,QAAAA,eAAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v as S,y as _,u as E,aL as T,g6 as w,dY as m,x as k}from"./n8n-0pza0mdA.js";import{aS as b}from"./index-
|
|
2
|
-
//# sourceMappingURL=SetupWorkflowCredentialsButton-
|
|
1
|
+
import{v as S,y as _,u as E,aL as T,g6 as w,dY as m,x as k}from"./n8n-0pza0mdA.js";import{aS as b}from"./index-6M_Mo9yq.js";import{G as v,e as n,d as y,y as g,ag as M,l as N,M as I,u as x,Q as A}from"./vendor-KLOX9vbo.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./pinia-28uZ5ZtB.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const ae=v({__name:"SetupWorkflowCredentialsButton",setup(B){const o=S(),i=_(),a=E(),u=T(),d=k(),p=n(()=>{var e,t;return!!((t=(e=o.workflow)==null?void 0:e.meta)!=null&&t.templateCredsSetupCompleted)}),l=n(()=>{if(p.value)return!0;const e=o.getNodes();return e.length?e.every(t=>b(i,t)):!1}),c=n(()=>{var r,s;const e=u.isFeatureEnabled(w),t=!!((s=(r=o.workflow)==null?void 0:r.meta)!=null&&s.templateId);return!e||!t||p.value?!1:!l.value}),f=y(l,e=>{e&&(o.addToWorkflowMetadata({templateCredsSetupCompleted:!0}),f())}),C=()=>{a.openModal(m)};return g(()=>{a.closeModal(m)}),(e,t)=>{const r=M("n8n-button");return c.value?(N(),I(r,{key:0,label:x(d).baseText("nodeView.setupTemplate"),size:"large",icon:"box-open",type:"secondary",onClick:t[0]||(t[0]=s=>C())},null,8,["label"])):A("",!0)}}});export{ae as default};
|
|
2
|
+
//# sourceMappingURL=SetupWorkflowCredentialsButton-fL7BC8Hp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupWorkflowCredentialsButton-
|
|
1
|
+
{"version":3,"file":"SetupWorkflowCredentialsButton-fL7BC8Hp.js","sources":["../../src/components/SetupWorkflowCredentialsButton/SetupWorkflowCredentialsButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, watch } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { SETUP_CREDENTIALS_MODAL_KEY, TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT } from '@/constants';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { usePostHog } from '@/stores/posthog.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { doesNodeHaveAllCredentialsFilled } from '@/utils/nodes/nodeTransforms';\n\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst uiStore = useUIStore();\nconst posthogStore = usePostHog();\nconst i18n = useI18n();\n\nconst isTemplateSetupCompleted = computed(() => {\n\treturn !!workflowsStore.workflow?.meta?.templateCredsSetupCompleted;\n});\n\nconst allCredentialsFilled = computed(() => {\n\tif (isTemplateSetupCompleted.value) {\n\t\treturn true;\n\t}\n\n\tconst nodes = workflowsStore.getNodes();\n\tif (!nodes.length) {\n\t\treturn false;\n\t}\n\n\treturn nodes.every((node) => doesNodeHaveAllCredentialsFilled(nodeTypesStore, node));\n});\n\nconst showButton = computed(() => {\n\tconst isFeatureEnabled = posthogStore.isFeatureEnabled(TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT);\n\tconst isCreatedFromTemplate = !!workflowsStore.workflow?.meta?.templateId;\n\tif (!isFeatureEnabled || !isCreatedFromTemplate || isTemplateSetupCompleted.value) {\n\t\treturn false;\n\t}\n\n\treturn !allCredentialsFilled.value;\n});\n\nconst unsubscribe = watch(allCredentialsFilled, (newValue) => {\n\tif (newValue) {\n\t\tworkflowsStore.addToWorkflowMetadata({\n\t\t\ttemplateCredsSetupCompleted: true,\n\t\t});\n\n\t\tunsubscribe();\n\t}\n});\n\nconst handleClick = () => {\n\tuiStore.openModal(SETUP_CREDENTIALS_MODAL_KEY);\n};\n\nonBeforeUnmount(() => {\n\tuiStore.closeModal(SETUP_CREDENTIALS_MODAL_KEY);\n});\n</script>\n\n<template>\n\t<n8n-button\n\t\tv-if=\"showButton\"\n\t\t:label=\"i18n.baseText('nodeView.setupTemplate')\"\n\t\tsize=\"large\"\n\t\ticon=\"box-open\"\n\t\ttype=\"secondary\"\n\t\t@click=\"handleClick()\"\n\t/>\n</template>\n"],"names":["workflowsStore","useWorkflowsStore","nodeTypesStore","useNodeTypesStore","uiStore","useUIStore","posthogStore","usePostHog","i18n","useI18n","isTemplateSetupCompleted","computed","_b","_a","allCredentialsFilled","nodes","node","doesNodeHaveAllCredentialsFilled","showButton","isFeatureEnabled","TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT","isCreatedFromTemplate","unsubscribe","watch","newValue","handleClick","SETUP_CREDENTIALS_MODAL_KEY","onBeforeUnmount"],"mappings":"4qCAUA,MAAMA,EAAiBC,IACjBC,EAAiBC,IACjBC,EAAUC,IACVC,EAAeC,IACfC,EAAOC,IAEPC,EAA2BC,EAAS,IAAM,SAC/C,MAAO,CAAC,GAACC,GAAAC,EAAAb,EAAe,WAAf,YAAAa,EAAyB,OAAzB,MAAAD,EAA+B,4BAAA,CACxC,EAEKE,EAAuBH,EAAS,IAAM,CAC3C,GAAID,EAAyB,MACrB,MAAA,GAGF,MAAAK,EAAQf,EAAe,WACzB,OAACe,EAAM,OAIJA,EAAM,MAAOC,GAASC,EAAiCf,EAAgBc,CAAI,CAAC,EAH3E,EAG2E,CACnF,EAEKE,EAAaP,EAAS,IAAM,SAC3B,MAAAQ,EAAmBb,EAAa,iBAAiBc,CAAoC,EACrFC,EAAwB,CAAC,GAACT,GAAAC,EAAAb,EAAe,WAAf,YAAAa,EAAyB,OAAzB,MAAAD,EAA+B,YAC/D,MAAI,CAACO,GAAoB,CAACE,GAAyBX,EAAyB,MACpE,GAGD,CAACI,EAAqB,KAAA,CAC7B,EAEKQ,EAAcC,EAAMT,EAAuBU,GAAa,CACzDA,IACHxB,EAAe,sBAAsB,CACpC,4BAA6B,EAAA,CAC7B,EAEWsB,IACb,CACA,EAEKG,EAAc,IAAM,CACzBrB,EAAQ,UAAUsB,CAA2B,CAAA,EAG9C,OAAAC,EAAgB,IAAM,CACrBvB,EAAQ,WAAWsB,CAA2B,CAAA,CAC9C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as M,e as k,G as D,az as K,aG as z,d as G,D as q,b as Q,l as o,M as f,O as C,u as a,S as x,R as O,p as h,I as u,m as A,F as X,a7 as j,T as g,ag as W}from"./vendor-KLOX9vbo.js";import{d as J}from"./pinia-28uZ5ZtB.js";import{y as Y,B as Z,m as ee,v as te,V as E,ab as V,a9 as ae,O as $,aL as se,g6 as oe,dS as le,g7 as ne,x as re,_ as ie}from"./n8n-0pza0mdA.js";import{h as de,aG as pe,aH as ue,aI as ce}from"./index-
|
|
2
|
-
//# sourceMappingURL=SetupWorkflowFromTemplateView-
|
|
1
|
+
import{r as M,e as k,G as D,az as K,aG as z,d as G,D as q,b as Q,l as o,M as f,O as C,u as a,S as x,R as O,p as h,I as u,m as A,F as X,a7 as j,T as g,ag as W}from"./vendor-KLOX9vbo.js";import{d as J}from"./pinia-28uZ5ZtB.js";import{y as Y,B as Z,m as ee,v as te,V as E,ab as V,a9 as ae,O as $,aL as se,g6 as oe,dS as le,g7 as ne,x as re,_ as ie}from"./n8n-0pza0mdA.js";import{h as de,aG as pe,aH as ue,aI as ce}from"./index-6M_Mo9yq.js";import{c as me}from"./templateActions-l9fJr0Cu.js";import{T as fe}from"./TemplatesView-KPnGjjin.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const ye=J("setupTemplate",()=>{const l=M(""),e=M(!0),d=M(!1),c=de(),y=Y(),i=Z(),v=ee(),N=te(),n=k(()=>l.value?c.getFullTemplateById(l.value):null),R=k(()=>{var s;return((s=n.value)==null?void 0:s.workflow.nodes)??[]}),{appCredentials:P,credentialOverrides:I,credentialUsages:t,credentialsByKey:r,nodesRequiringCredentialsSorted:m,numFilledCredentials:b,selectedCredentialIdByKey:T,setSelectedCredentialId:p,unsetSelectedCredential:L}=pe(R),w=s=>{l.value=s},H=new Set(["httpBasicAuth","httpCustomAuth","httpDigestAuth","httpHeaderAuth","oAuth1Api","oAuth2Api","httpQueryAuth"]),B=()=>{for(const s of t.value){if(H.has(s.credentialType))continue;const _=i.getCredentialsByType(s.credentialType);_.length===1&&(T.value[s.key]=_[0].id)}},U=async()=>{n.value||!l.value||(await c.fetchTemplateById(l.value),B())};return{credentialsByKey:r,isLoading:e,isSaving:d,appCredentials:P,nodesRequiringCredentialsSorted:m,template:n,credentialUsages:t,selectedCredentialIdByKey:T,credentialOverrides:I,numFilledCredentials:b,createWorkflow:async s=>{const{router:_}=s,S=$();if(n.value)try{d.value=!0;const F=await me({template:n.value,credentialOverrides:I.value,rootStore:v,workflowsStore:N,nodeTypeProvider:y});S.track("User closed cred setup",{completed:!0,creds_filled:b.value,creds_needed:t.value.length,workflow_id:F.id}),S.track("User inserted workflow template",{source:"workflow",template_id:V(l.value),wf_template_repo_session_id:c.currentSessionId},{withPostHog:!0}),S.track("User saved new workflow from template",{template_id:V(l.value),workflow_id:F.id,wf_template_repo_session_id:c.currentSessionId}),await _.replace({name:E.WORKFLOW,params:{name:F.id}})}finally{d.value=!1}},skipSetup:async({router:s})=>{const _=ae(),S=$();await _.run("templatesWorkflowView.openWorkflow",{source:"workflow",template_id:l.value,wf_template_repo_session_id:c.currentSessionId}),S.track("User closed cred setup",{completed:!1,creds_filled:0,creds_needed:t.value.length,workflow_id:null}),await s.replace({name:E.TEMPLATE_IMPORT,params:{id:l.value}})},init:async()=>{e.value=!0;try{T.value={},await Promise.all([i.fetchAllCredentials(),i.fetchCredentialTypes(!1),y.loadNodeTypesIfNotLoaded(),U()]),B()}finally{e.value=!1}},loadTemplateIfNeeded:U,setInitialCredentialSelection:B,setTemplateId:w,setSelectedCredentialId:p,unsetSelectedCredential:L}}),ve={key:1},we=D({__name:"SetupWorkflowFromTemplateView",setup(l){const e=ye(),d=re(),c=se(),y=K(),i=z(),v=k(()=>Array.isArray(y.params.id)?y.params.id[0]:y.params.id),N=k(()=>{var t;return((t=e.template)==null?void 0:t.name)??"unknown"}),n=k(()=>!e.isLoading),R=k(()=>i.resolve({name:E.TEMPLATE_IMPORT,params:{id:v.value}}).fullPath);G(v,async t=>{e.setTemplateId(t),await e.loadTemplateIfNeeded()});const P=async t=>{t.preventDefault(),await e.skipSetup({router:i})},I=async()=>!e.template?!1:e.credentialUsages.length===0?(await e.skipSetup({router:i}),!0):!1;return e.setTemplateId(v.value),q(async()=>{c.isFeatureEnabled(oe)||i.replace({name:E.TEMPLATE_IMPORT,params:{id:v.value}})}),Q(async()=>{await e.init(),await I()}),(t,r)=>{const m=W("n8n-loading"),b=W("n8n-button"),T=W("n8n-tooltip");return o(),f(fe,{"go-back-enabled":!0},{header:C(()=>[n.value?(o(),f(a(le),{key:0,tag:"h1",size:"2xlarge"},{default:C(()=>[x(O(a(d).baseText("templateSetup.title",{interpolate:{name:N.value}})),1)]),_:1})):(o(),f(m,{key:1,variant:"h1"}))]),content:C(()=>[h("div",{class:u(t.$style.grid)},[h("div",{class:u(t.$style.notice),"data-test-id":"info-callout"},[n.value?(o(),f(ue,{key:0,"app-credentials":a(e).appCredentials},null,8,["app-credentials"])):(o(),f(m,{key:1,variant:"p"}))],2),h("div",null,[n.value?(o(),A("ol",{key:0,class:u(t.$style.appCredentialsContainer)},[(o(!0),A(X,null,j(a(e).credentialUsages,(p,L)=>(o(),f(ce,{key:p.key,class:u(t.$style.appCredential),order:L+1,credentials:p,"selected-credential-id":a(e).selectedCredentialIdByKey[p.key],onCredentialSelected:r[0]||(r[0]=w=>a(e).setSelectedCredentialId(w.credentialUsageKey,w.credentialId)),onCredentialDeselected:r[1]||(r[1]=w=>a(e).unsetSelectedCredential(w.credentialUsageKey))},null,8,["class","order","credentials","selected-credential-id"]))),128))],2)):(o(),A("div",{key:1,class:u(t.$style.appCredentialsContainer)},[g(m,{class:u(t.$style.appCredential),variant:"p",rows:3},null,8,["class"]),g(m,{class:u(t.$style.appCredential),variant:"p",rows:3},null,8,["class"])],2))]),h("div",{class:u(t.$style.actions)},[g(a(ne),{href:R.value,"new-window":!1,onClick:r[2]||(r[2]=p=>P(p))},{default:C(()=>[x(O(a(d).baseText("templateSetup.skip")),1)]),_:1},8,["href"]),n.value?(o(),f(T,{key:0,content:a(d).baseText("templateSetup.continue.button.fillRemaining"),disabled:a(e).numFilledCredentials>0},{default:C(()=>[g(b,{size:"large",label:a(d).baseText("templateSetup.continue.button"),disabled:a(e).isSaving||a(e).numFilledCredentials===0,"data-test-id":"continue-button",onClick:r[3]||(r[3]=p=>a(e).createWorkflow({router:a(i)}))},null,8,["label","disabled"])]),_:1},8,["content","disabled"])):(o(),A("div",ve,[g(m,{variant:"button"})]))],2)],2)]),_:1})}}}),_e="_grid_6bgsx_1",ke="_notice_6bgsx_9",Te="_appCredentialsContainer_6bgsx_13",Se="_appCredential_6bgsx_13",Ce="_actions_6bgsx_24",ge={grid:_e,notice:ke,appCredentialsContainer:Te,appCredential:Se,actions:Ce},Ie={$style:ge},ot=ie(we,[["__cssModules",Ie]]);export{ot as default};
|
|
2
|
+
//# sourceMappingURL=SetupWorkflowFromTemplateView-mDNSG38Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupWorkflowFromTemplateView-uEG55eR-.js","sources":["../../src/views/SetupWorkflowFromTemplateView/setupTemplate.store.ts","../../src/views/SetupWorkflowFromTemplateView/SetupWorkflowFromTemplateView.vue"],"sourcesContent":["import { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\nimport type { Router } from 'vue-router';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport type { INodeUi } from '@/Interface';\nimport { VIEWS } from '@/constants';\nimport { createWorkflowFromTemplate } from '@/utils/templates/templateActions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useCredentialSetupState } from '@/views/SetupWorkflowFromTemplateView/useCredentialSetupState';\nimport { tryToParseNumber } from '@/utils/typesUtils';\n\nexport type NodeAndType = {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n};\n\nexport type RequiredCredentials = {\n\tnode: INodeUi;\n\tcredentialName: string;\n\tcredentialType: string;\n};\n\nexport type AppCredentialCount = {\n\tappName: string;\n\tcount: number;\n};\n\n/**\n * Store for managing the state of the SetupWorkflowFromTemplateView\n */\nexport const useSetupTemplateStore = defineStore('setupTemplate', () => {\n\t//#region State\n\n\tconst templateId = ref<string>('');\n\tconst isLoading = ref(true);\n\tconst isSaving = ref(false);\n\n\t//#endregion State\n\n\tconst templatesStore = useTemplatesStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst credentialsStore = useCredentialsStore();\n\tconst rootStore = useRootStore();\n\tconst workflowsStore = useWorkflowsStore();\n\n\t//#region Getters\n\n\tconst template = computed(() => {\n\t\treturn templateId.value ? templatesStore.getFullTemplateById(templateId.value) : null;\n\t});\n\n\tconst templateNodes = computed(() => {\n\t\treturn template.value?.workflow.nodes ?? [];\n\t});\n\n\tconst {\n\t\tappCredentials,\n\t\tcredentialOverrides,\n\t\tcredentialUsages,\n\t\tcredentialsByKey,\n\t\tnodesRequiringCredentialsSorted,\n\t\tnumFilledCredentials,\n\t\tselectedCredentialIdByKey,\n\t\tsetSelectedCredentialId,\n\t\tunsetSelectedCredential,\n\t} = useCredentialSetupState(templateNodes);\n\n\t//#endregion Getters\n\n\t//#region Actions\n\n\tconst setTemplateId = (id: string) => {\n\t\ttemplateId.value = id;\n\t};\n\n\tconst ignoredAutoFillCredentialTypes = new Set([\n\t\t'httpBasicAuth',\n\t\t'httpCustomAuth',\n\t\t'httpDigestAuth',\n\t\t'httpHeaderAuth',\n\t\t'oAuth1Api',\n\t\t'oAuth2Api',\n\t\t'httpQueryAuth',\n\t]);\n\n\t/**\n\t * Selects initial credentials for the template. Credentials\n\t * need to be loaded before this.\n\t */\n\tconst setInitialCredentialSelection = () => {\n\t\tfor (const credUsage of credentialUsages.value) {\n\t\t\tif (ignoredAutoFillCredentialTypes.has(credUsage.credentialType)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst availableCreds = credentialsStore.getCredentialsByType(credUsage.credentialType);\n\n\t\t\tif (availableCreds.length === 1) {\n\t\t\t\tselectedCredentialIdByKey.value[credUsage.key] = availableCreds[0].id;\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Loads the template if it hasn't been loaded yet.\n\t */\n\tconst loadTemplateIfNeeded = async () => {\n\t\tif (!!template.value || !templateId.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait templatesStore.fetchTemplateById(templateId.value);\n\n\t\tsetInitialCredentialSelection();\n\t};\n\n\t/**\n\t * Initializes the store for a specific template.\n\t */\n\tconst init = async () => {\n\t\tisLoading.value = true;\n\t\ttry {\n\t\t\tselectedCredentialIdByKey.value = {};\n\n\t\t\tawait Promise.all([\n\t\t\t\tcredentialsStore.fetchAllCredentials(),\n\t\t\t\tcredentialsStore.fetchCredentialTypes(false),\n\t\t\t\tnodeTypesStore.loadNodeTypesIfNotLoaded(),\n\t\t\t\tloadTemplateIfNeeded(),\n\t\t\t]);\n\n\t\t\tsetInitialCredentialSelection();\n\t\t} finally {\n\t\t\tisLoading.value = false;\n\t\t}\n\t};\n\n\t/**\n\t * Skips the setup and goes directly to the workflow view.\n\t */\n\tconst skipSetup = async ({ router }: { router: Router }) => {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst telemetry = useTelemetry();\n\n\t\tawait externalHooks.run('templatesWorkflowView.openWorkflow', {\n\t\t\tsource: 'workflow',\n\t\t\ttemplate_id: templateId.value,\n\t\t\twf_template_repo_session_id: templatesStore.currentSessionId,\n\t\t});\n\n\t\ttelemetry.track('User closed cred setup', {\n\t\t\tcompleted: false,\n\t\t\tcreds_filled: 0,\n\t\t\tcreds_needed: credentialUsages.value.length,\n\t\t\tworkflow_id: null,\n\t\t});\n\n\t\t// Replace the URL so back button doesn't come back to this setup view\n\t\tawait router.replace({\n\t\t\tname: VIEWS.TEMPLATE_IMPORT,\n\t\t\tparams: { id: templateId.value },\n\t\t});\n\t};\n\n\t/**\n\t * Creates a workflow from the template and navigates to the workflow view.\n\t */\n\tconst createWorkflow = async (opts: { router: Router }) => {\n\t\tconst { router } = opts;\n\t\tconst telemetry = useTelemetry();\n\n\t\tif (!template.value) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tisSaving.value = true;\n\n\t\t\tconst createdWorkflow = await createWorkflowFromTemplate({\n\t\t\t\ttemplate: template.value,\n\t\t\t\tcredentialOverrides: credentialOverrides.value,\n\t\t\t\trootStore,\n\t\t\t\tworkflowsStore,\n\t\t\t\tnodeTypeProvider: nodeTypesStore,\n\t\t\t});\n\n\t\t\ttelemetry.track('User closed cred setup', {\n\t\t\t\tcompleted: true,\n\t\t\t\tcreds_filled: numFilledCredentials.value,\n\t\t\t\tcreds_needed: credentialUsages.value.length,\n\t\t\t\tworkflow_id: createdWorkflow.id,\n\t\t\t});\n\n\t\t\ttelemetry.track(\n\t\t\t\t'User inserted workflow template',\n\t\t\t\t{\n\t\t\t\t\tsource: 'workflow',\n\t\t\t\t\ttemplate_id: tryToParseNumber(templateId.value),\n\t\t\t\t\twf_template_repo_session_id: templatesStore.currentSessionId,\n\t\t\t\t},\n\t\t\t\t{ withPostHog: true },\n\t\t\t);\n\n\t\t\ttelemetry.track('User saved new workflow from template', {\n\t\t\t\ttemplate_id: tryToParseNumber(templateId.value),\n\t\t\t\tworkflow_id: createdWorkflow.id,\n\t\t\t\twf_template_repo_session_id: templatesStore.currentSessionId,\n\t\t\t});\n\n\t\t\t// Replace the URL so back button doesn't come back to this setup view\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\tparams: { name: createdWorkflow.id },\n\t\t\t});\n\t\t} finally {\n\t\t\tisSaving.value = false;\n\t\t}\n\t};\n\n\t//#endregion Actions\n\n\treturn {\n\t\tcredentialsByKey,\n\t\tisLoading,\n\t\tisSaving,\n\t\tappCredentials,\n\t\tnodesRequiringCredentialsSorted,\n\t\ttemplate,\n\t\tcredentialUsages,\n\t\tselectedCredentialIdByKey,\n\t\tcredentialOverrides,\n\t\tnumFilledCredentials,\n\t\tcreateWorkflow,\n\t\tskipSetup,\n\t\tinit,\n\t\tloadTemplateIfNeeded,\n\t\tsetInitialCredentialSelection,\n\t\tsetTemplateId,\n\t\tsetSelectedCredentialId,\n\t\tunsetSelectedCredential,\n\t};\n});\n","<script setup lang=\"ts\">\nimport { computed, onBeforeMount, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useSetupTemplateStore } from './setupTemplate.store';\nimport N8nHeading from 'n8n-design-system/components/N8nHeading';\nimport N8nLink from 'n8n-design-system/components/N8nLink';\nimport AppsRequiringCredsNotice from './AppsRequiringCredsNotice.vue';\nimport SetupTemplateFormStep from './SetupTemplateFormStep.vue';\nimport TemplatesView from '../TemplatesView.vue';\nimport { TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT, VIEWS } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { usePostHog } from '@/stores/posthog.store';\n\n// Store\nconst setupTemplateStore = useSetupTemplateStore();\nconst i18n = useI18n();\nconst posthogStore = usePostHog();\n\n// Router\nconst route = useRoute();\nconst router = useRouter();\n\n//#region Computed\n\nconst templateId = computed(() =>\n\tArray.isArray(route.params.id) ? route.params.id[0] : route.params.id,\n);\nconst title = computed(() => setupTemplateStore.template?.name ?? 'unknown');\nconst isReady = computed(() => !setupTemplateStore.isLoading);\n\nconst skipSetupUrl = computed(() => {\n\tconst resolvedRoute = router.resolve({\n\t\tname: VIEWS.TEMPLATE_IMPORT,\n\t\tparams: { id: templateId.value },\n\t});\n\treturn resolvedRoute.fullPath;\n});\n\n//#endregion Computed\n\n//#region Watchers\n\nwatch(templateId, async (newTemplateId) => {\n\tsetupTemplateStore.setTemplateId(newTemplateId);\n\tawait setupTemplateStore.loadTemplateIfNeeded();\n});\n\n//#endregion Watchers\n\n//#region Methods\n\nconst onSkipSetup = async (event: MouseEvent) => {\n\tevent.preventDefault();\n\n\tawait setupTemplateStore.skipSetup({\n\t\trouter,\n\t});\n};\n\nconst skipIfTemplateHasNoCreds = async () => {\n\tconst isTemplateLoaded = !!setupTemplateStore.template;\n\tif (!isTemplateLoaded) {\n\t\treturn false;\n\t}\n\n\tif (setupTemplateStore.credentialUsages.length === 0) {\n\t\tawait setupTemplateStore.skipSetup({\n\t\t\trouter,\n\t\t});\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n//#endregion Methods\n\n//#region Lifecycle hooks\n\nsetupTemplateStore.setTemplateId(templateId.value);\n\nonBeforeMount(async () => {\n\tif (!posthogStore.isFeatureEnabled(TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT)) {\n\t\tvoid router.replace({\n\t\t\tname: VIEWS.TEMPLATE_IMPORT,\n\t\t\tparams: { id: templateId.value },\n\t\t});\n\t}\n});\n\nonMounted(async () => {\n\tawait setupTemplateStore.init();\n\tawait skipIfTemplateHasNoCreds();\n});\n\n//#endregion Lifecycle hooks\n</script>\n\n<template>\n\t<TemplatesView :go-back-enabled=\"true\">\n\t\t<template #header>\n\t\t\t<N8nHeading v-if=\"isReady\" tag=\"h1\" size=\"2xlarge\"\n\t\t\t\t>{{ i18n.baseText('templateSetup.title', { interpolate: { name: title } }) }}\n\t\t\t</N8nHeading>\n\t\t\t<n8n-loading v-else variant=\"h1\" />\n\t\t</template>\n\n\t\t<template #content>\n\t\t\t<div :class=\"$style.grid\">\n\t\t\t\t<div :class=\"$style.notice\" data-test-id=\"info-callout\">\n\t\t\t\t\t<AppsRequiringCredsNotice\n\t\t\t\t\t\tv-if=\"isReady\"\n\t\t\t\t\t\t:app-credentials=\"setupTemplateStore.appCredentials\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-loading v-else variant=\"p\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div>\n\t\t\t\t\t<ol v-if=\"isReady\" :class=\"$style.appCredentialsContainer\">\n\t\t\t\t\t\t<SetupTemplateFormStep\n\t\t\t\t\t\t\tv-for=\"(credentials, index) in setupTemplateStore.credentialUsages\"\n\t\t\t\t\t\t\t:key=\"credentials.key\"\n\t\t\t\t\t\t\t:class=\"$style.appCredential\"\n\t\t\t\t\t\t\t:order=\"index + 1\"\n\t\t\t\t\t\t\t:credentials=\"credentials\"\n\t\t\t\t\t\t\t:selected-credential-id=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.selectedCredentialIdByKey[credentials.key]\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t@credential-selected=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.setSelectedCredentialId(\n\t\t\t\t\t\t\t\t\t$event.credentialUsageKey,\n\t\t\t\t\t\t\t\t\t$event.credentialId,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t@credential-deselected=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.unsetSelectedCredential($event.credentialUsageKey)\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ol>\n\t\t\t\t\t<div v-else :class=\"$style.appCredentialsContainer\">\n\t\t\t\t\t\t<n8n-loading :class=\"$style.appCredential\" variant=\"p\" :rows=\"3\" />\n\t\t\t\t\t\t<n8n-loading :class=\"$style.appCredential\" variant=\"p\" :rows=\"3\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div :class=\"$style.actions\">\n\t\t\t\t\t<N8nLink :href=\"skipSetupUrl\" :new-window=\"false\" @click=\"onSkipSetup($event)\">{{\n\t\t\t\t\t\ti18n.baseText('templateSetup.skip')\n\t\t\t\t\t}}</N8nLink>\n\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tv-if=\"isReady\"\n\t\t\t\t\t\t:content=\"i18n.baseText('templateSetup.continue.button.fillRemaining')\"\n\t\t\t\t\t\t:disabled=\"setupTemplateStore.numFilledCredentials > 0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\t:label=\"i18n.baseText('templateSetup.continue.button')\"\n\t\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.isSaving || setupTemplateStore.numFilledCredentials === 0\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\tdata-test-id=\"continue-button\"\n\t\t\t\t\t\t\t@click=\"setupTemplateStore.createWorkflow({ router })\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<div v-else>\n\t\t\t\t\t\t<n8n-loading variant=\"button\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</TemplatesView>\n</template>\n\n<style lang=\"scss\" module>\n.grid {\n\tmargin: 0 auto;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\tmax-width: 768px;\n}\n\n.notice {\n\tmargin-bottom: var(--spacing-2xl);\n}\n\n.appCredentialsContainer {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-2xl);\n}\n\n.appCredential:not(:last-of-type) {\n\tpadding-bottom: var(--spacing-2xl);\n\tborder-bottom: 1px solid var(--color-foreground-light);\n}\n\n.actions {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-top: var(--spacing-3xl);\n\tmargin-bottom: var(--spacing-3xl);\n}\n</style>\n"],"names":["useSetupTemplateStore","defineStore","templateId","ref","isLoading","isSaving","templatesStore","useTemplatesStore","nodeTypesStore","useNodeTypesStore","credentialsStore","useCredentialsStore","rootStore","useRootStore","workflowsStore","useWorkflowsStore","template","computed","templateNodes","_a","appCredentials","credentialOverrides","credentialUsages","credentialsByKey","nodesRequiringCredentialsSorted","numFilledCredentials","selectedCredentialIdByKey","setSelectedCredentialId","unsetSelectedCredential","useCredentialSetupState","setTemplateId","id","ignoredAutoFillCredentialTypes","setInitialCredentialSelection","credUsage","availableCreds","loadTemplateIfNeeded","opts","router","telemetry","useTelemetry","createdWorkflow","createWorkflowFromTemplate","tryToParseNumber","VIEWS","externalHooks","useExternalHooks","setupTemplateStore","i18n","useI18n","posthogStore","usePostHog","route","useRoute","useRouter","title","isReady","skipSetupUrl","watch","newTemplateId","onSkipSetup","event","skipIfTemplateHasNoCreds","onBeforeMount","TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT","onMounted"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SetupWorkflowFromTemplateView-mDNSG38Q.js","sources":["../../src/views/SetupWorkflowFromTemplateView/setupTemplate.store.ts","../../src/views/SetupWorkflowFromTemplateView/SetupWorkflowFromTemplateView.vue"],"sourcesContent":["import { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\nimport type { Router } from 'vue-router';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport type { INodeUi } from '@/Interface';\nimport { VIEWS } from '@/constants';\nimport { createWorkflowFromTemplate } from '@/utils/templates/templateActions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useCredentialSetupState } from '@/views/SetupWorkflowFromTemplateView/useCredentialSetupState';\nimport { tryToParseNumber } from '@/utils/typesUtils';\n\nexport type NodeAndType = {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n};\n\nexport type RequiredCredentials = {\n\tnode: INodeUi;\n\tcredentialName: string;\n\tcredentialType: string;\n};\n\nexport type AppCredentialCount = {\n\tappName: string;\n\tcount: number;\n};\n\n/**\n * Store for managing the state of the SetupWorkflowFromTemplateView\n */\nexport const useSetupTemplateStore = defineStore('setupTemplate', () => {\n\t//#region State\n\n\tconst templateId = ref<string>('');\n\tconst isLoading = ref(true);\n\tconst isSaving = ref(false);\n\n\t//#endregion State\n\n\tconst templatesStore = useTemplatesStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst credentialsStore = useCredentialsStore();\n\tconst rootStore = useRootStore();\n\tconst workflowsStore = useWorkflowsStore();\n\n\t//#region Getters\n\n\tconst template = computed(() => {\n\t\treturn templateId.value ? templatesStore.getFullTemplateById(templateId.value) : null;\n\t});\n\n\tconst templateNodes = computed(() => {\n\t\treturn template.value?.workflow.nodes ?? [];\n\t});\n\n\tconst {\n\t\tappCredentials,\n\t\tcredentialOverrides,\n\t\tcredentialUsages,\n\t\tcredentialsByKey,\n\t\tnodesRequiringCredentialsSorted,\n\t\tnumFilledCredentials,\n\t\tselectedCredentialIdByKey,\n\t\tsetSelectedCredentialId,\n\t\tunsetSelectedCredential,\n\t} = useCredentialSetupState(templateNodes);\n\n\t//#endregion Getters\n\n\t//#region Actions\n\n\tconst setTemplateId = (id: string) => {\n\t\ttemplateId.value = id;\n\t};\n\n\tconst ignoredAutoFillCredentialTypes = new Set([\n\t\t'httpBasicAuth',\n\t\t'httpCustomAuth',\n\t\t'httpDigestAuth',\n\t\t'httpHeaderAuth',\n\t\t'oAuth1Api',\n\t\t'oAuth2Api',\n\t\t'httpQueryAuth',\n\t]);\n\n\t/**\n\t * Selects initial credentials for the template. Credentials\n\t * need to be loaded before this.\n\t */\n\tconst setInitialCredentialSelection = () => {\n\t\tfor (const credUsage of credentialUsages.value) {\n\t\t\tif (ignoredAutoFillCredentialTypes.has(credUsage.credentialType)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst availableCreds = credentialsStore.getCredentialsByType(credUsage.credentialType);\n\n\t\t\tif (availableCreds.length === 1) {\n\t\t\t\tselectedCredentialIdByKey.value[credUsage.key] = availableCreds[0].id;\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Loads the template if it hasn't been loaded yet.\n\t */\n\tconst loadTemplateIfNeeded = async () => {\n\t\tif (!!template.value || !templateId.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait templatesStore.fetchTemplateById(templateId.value);\n\n\t\tsetInitialCredentialSelection();\n\t};\n\n\t/**\n\t * Initializes the store for a specific template.\n\t */\n\tconst init = async () => {\n\t\tisLoading.value = true;\n\t\ttry {\n\t\t\tselectedCredentialIdByKey.value = {};\n\n\t\t\tawait Promise.all([\n\t\t\t\tcredentialsStore.fetchAllCredentials(),\n\t\t\t\tcredentialsStore.fetchCredentialTypes(false),\n\t\t\t\tnodeTypesStore.loadNodeTypesIfNotLoaded(),\n\t\t\t\tloadTemplateIfNeeded(),\n\t\t\t]);\n\n\t\t\tsetInitialCredentialSelection();\n\t\t} finally {\n\t\t\tisLoading.value = false;\n\t\t}\n\t};\n\n\t/**\n\t * Skips the setup and goes directly to the workflow view.\n\t */\n\tconst skipSetup = async ({ router }: { router: Router }) => {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst telemetry = useTelemetry();\n\n\t\tawait externalHooks.run('templatesWorkflowView.openWorkflow', {\n\t\t\tsource: 'workflow',\n\t\t\ttemplate_id: templateId.value,\n\t\t\twf_template_repo_session_id: templatesStore.currentSessionId,\n\t\t});\n\n\t\ttelemetry.track('User closed cred setup', {\n\t\t\tcompleted: false,\n\t\t\tcreds_filled: 0,\n\t\t\tcreds_needed: credentialUsages.value.length,\n\t\t\tworkflow_id: null,\n\t\t});\n\n\t\t// Replace the URL so back button doesn't come back to this setup view\n\t\tawait router.replace({\n\t\t\tname: VIEWS.TEMPLATE_IMPORT,\n\t\t\tparams: { id: templateId.value },\n\t\t});\n\t};\n\n\t/**\n\t * Creates a workflow from the template and navigates to the workflow view.\n\t */\n\tconst createWorkflow = async (opts: { router: Router }) => {\n\t\tconst { router } = opts;\n\t\tconst telemetry = useTelemetry();\n\n\t\tif (!template.value) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tisSaving.value = true;\n\n\t\t\tconst createdWorkflow = await createWorkflowFromTemplate({\n\t\t\t\ttemplate: template.value,\n\t\t\t\tcredentialOverrides: credentialOverrides.value,\n\t\t\t\trootStore,\n\t\t\t\tworkflowsStore,\n\t\t\t\tnodeTypeProvider: nodeTypesStore,\n\t\t\t});\n\n\t\t\ttelemetry.track('User closed cred setup', {\n\t\t\t\tcompleted: true,\n\t\t\t\tcreds_filled: numFilledCredentials.value,\n\t\t\t\tcreds_needed: credentialUsages.value.length,\n\t\t\t\tworkflow_id: createdWorkflow.id,\n\t\t\t});\n\n\t\t\ttelemetry.track(\n\t\t\t\t'User inserted workflow template',\n\t\t\t\t{\n\t\t\t\t\tsource: 'workflow',\n\t\t\t\t\ttemplate_id: tryToParseNumber(templateId.value),\n\t\t\t\t\twf_template_repo_session_id: templatesStore.currentSessionId,\n\t\t\t\t},\n\t\t\t\t{ withPostHog: true },\n\t\t\t);\n\n\t\t\ttelemetry.track('User saved new workflow from template', {\n\t\t\t\ttemplate_id: tryToParseNumber(templateId.value),\n\t\t\t\tworkflow_id: createdWorkflow.id,\n\t\t\t\twf_template_repo_session_id: templatesStore.currentSessionId,\n\t\t\t});\n\n\t\t\t// Replace the URL so back button doesn't come back to this setup view\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\tparams: { name: createdWorkflow.id },\n\t\t\t});\n\t\t} finally {\n\t\t\tisSaving.value = false;\n\t\t}\n\t};\n\n\t//#endregion Actions\n\n\treturn {\n\t\tcredentialsByKey,\n\t\tisLoading,\n\t\tisSaving,\n\t\tappCredentials,\n\t\tnodesRequiringCredentialsSorted,\n\t\ttemplate,\n\t\tcredentialUsages,\n\t\tselectedCredentialIdByKey,\n\t\tcredentialOverrides,\n\t\tnumFilledCredentials,\n\t\tcreateWorkflow,\n\t\tskipSetup,\n\t\tinit,\n\t\tloadTemplateIfNeeded,\n\t\tsetInitialCredentialSelection,\n\t\tsetTemplateId,\n\t\tsetSelectedCredentialId,\n\t\tunsetSelectedCredential,\n\t};\n});\n","<script setup lang=\"ts\">\nimport { computed, onBeforeMount, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useSetupTemplateStore } from './setupTemplate.store';\nimport N8nHeading from 'n8n-design-system/components/N8nHeading';\nimport N8nLink from 'n8n-design-system/components/N8nLink';\nimport AppsRequiringCredsNotice from './AppsRequiringCredsNotice.vue';\nimport SetupTemplateFormStep from './SetupTemplateFormStep.vue';\nimport TemplatesView from '../TemplatesView.vue';\nimport { TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT, VIEWS } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { usePostHog } from '@/stores/posthog.store';\n\n// Store\nconst setupTemplateStore = useSetupTemplateStore();\nconst i18n = useI18n();\nconst posthogStore = usePostHog();\n\n// Router\nconst route = useRoute();\nconst router = useRouter();\n\n//#region Computed\n\nconst templateId = computed(() =>\n\tArray.isArray(route.params.id) ? route.params.id[0] : route.params.id,\n);\nconst title = computed(() => setupTemplateStore.template?.name ?? 'unknown');\nconst isReady = computed(() => !setupTemplateStore.isLoading);\n\nconst skipSetupUrl = computed(() => {\n\tconst resolvedRoute = router.resolve({\n\t\tname: VIEWS.TEMPLATE_IMPORT,\n\t\tparams: { id: templateId.value },\n\t});\n\treturn resolvedRoute.fullPath;\n});\n\n//#endregion Computed\n\n//#region Watchers\n\nwatch(templateId, async (newTemplateId) => {\n\tsetupTemplateStore.setTemplateId(newTemplateId);\n\tawait setupTemplateStore.loadTemplateIfNeeded();\n});\n\n//#endregion Watchers\n\n//#region Methods\n\nconst onSkipSetup = async (event: MouseEvent) => {\n\tevent.preventDefault();\n\n\tawait setupTemplateStore.skipSetup({\n\t\trouter,\n\t});\n};\n\nconst skipIfTemplateHasNoCreds = async () => {\n\tconst isTemplateLoaded = !!setupTemplateStore.template;\n\tif (!isTemplateLoaded) {\n\t\treturn false;\n\t}\n\n\tif (setupTemplateStore.credentialUsages.length === 0) {\n\t\tawait setupTemplateStore.skipSetup({\n\t\t\trouter,\n\t\t});\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n//#endregion Methods\n\n//#region Lifecycle hooks\n\nsetupTemplateStore.setTemplateId(templateId.value);\n\nonBeforeMount(async () => {\n\tif (!posthogStore.isFeatureEnabled(TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT)) {\n\t\tvoid router.replace({\n\t\t\tname: VIEWS.TEMPLATE_IMPORT,\n\t\t\tparams: { id: templateId.value },\n\t\t});\n\t}\n});\n\nonMounted(async () => {\n\tawait setupTemplateStore.init();\n\tawait skipIfTemplateHasNoCreds();\n});\n\n//#endregion Lifecycle hooks\n</script>\n\n<template>\n\t<TemplatesView :go-back-enabled=\"true\">\n\t\t<template #header>\n\t\t\t<N8nHeading v-if=\"isReady\" tag=\"h1\" size=\"2xlarge\"\n\t\t\t\t>{{ i18n.baseText('templateSetup.title', { interpolate: { name: title } }) }}\n\t\t\t</N8nHeading>\n\t\t\t<n8n-loading v-else variant=\"h1\" />\n\t\t</template>\n\n\t\t<template #content>\n\t\t\t<div :class=\"$style.grid\">\n\t\t\t\t<div :class=\"$style.notice\" data-test-id=\"info-callout\">\n\t\t\t\t\t<AppsRequiringCredsNotice\n\t\t\t\t\t\tv-if=\"isReady\"\n\t\t\t\t\t\t:app-credentials=\"setupTemplateStore.appCredentials\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-loading v-else variant=\"p\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div>\n\t\t\t\t\t<ol v-if=\"isReady\" :class=\"$style.appCredentialsContainer\">\n\t\t\t\t\t\t<SetupTemplateFormStep\n\t\t\t\t\t\t\tv-for=\"(credentials, index) in setupTemplateStore.credentialUsages\"\n\t\t\t\t\t\t\t:key=\"credentials.key\"\n\t\t\t\t\t\t\t:class=\"$style.appCredential\"\n\t\t\t\t\t\t\t:order=\"index + 1\"\n\t\t\t\t\t\t\t:credentials=\"credentials\"\n\t\t\t\t\t\t\t:selected-credential-id=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.selectedCredentialIdByKey[credentials.key]\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t@credential-selected=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.setSelectedCredentialId(\n\t\t\t\t\t\t\t\t\t$event.credentialUsageKey,\n\t\t\t\t\t\t\t\t\t$event.credentialId,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t@credential-deselected=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.unsetSelectedCredential($event.credentialUsageKey)\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ol>\n\t\t\t\t\t<div v-else :class=\"$style.appCredentialsContainer\">\n\t\t\t\t\t\t<n8n-loading :class=\"$style.appCredential\" variant=\"p\" :rows=\"3\" />\n\t\t\t\t\t\t<n8n-loading :class=\"$style.appCredential\" variant=\"p\" :rows=\"3\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div :class=\"$style.actions\">\n\t\t\t\t\t<N8nLink :href=\"skipSetupUrl\" :new-window=\"false\" @click=\"onSkipSetup($event)\">{{\n\t\t\t\t\t\ti18n.baseText('templateSetup.skip')\n\t\t\t\t\t}}</N8nLink>\n\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tv-if=\"isReady\"\n\t\t\t\t\t\t:content=\"i18n.baseText('templateSetup.continue.button.fillRemaining')\"\n\t\t\t\t\t\t:disabled=\"setupTemplateStore.numFilledCredentials > 0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\t:label=\"i18n.baseText('templateSetup.continue.button')\"\n\t\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t\tsetupTemplateStore.isSaving || setupTemplateStore.numFilledCredentials === 0\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\tdata-test-id=\"continue-button\"\n\t\t\t\t\t\t\t@click=\"setupTemplateStore.createWorkflow({ router })\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<div v-else>\n\t\t\t\t\t\t<n8n-loading variant=\"button\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</TemplatesView>\n</template>\n\n<style lang=\"scss\" module>\n.grid {\n\tmargin: 0 auto;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\tmax-width: 768px;\n}\n\n.notice {\n\tmargin-bottom: var(--spacing-2xl);\n}\n\n.appCredentialsContainer {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-2xl);\n}\n\n.appCredential:not(:last-of-type) {\n\tpadding-bottom: var(--spacing-2xl);\n\tborder-bottom: 1px solid var(--color-foreground-light);\n}\n\n.actions {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-top: var(--spacing-3xl);\n\tmargin-bottom: var(--spacing-3xl);\n}\n</style>\n"],"names":["useSetupTemplateStore","defineStore","templateId","ref","isLoading","isSaving","templatesStore","useTemplatesStore","nodeTypesStore","useNodeTypesStore","credentialsStore","useCredentialsStore","rootStore","useRootStore","workflowsStore","useWorkflowsStore","template","computed","templateNodes","_a","appCredentials","credentialOverrides","credentialUsages","credentialsByKey","nodesRequiringCredentialsSorted","numFilledCredentials","selectedCredentialIdByKey","setSelectedCredentialId","unsetSelectedCredential","useCredentialSetupState","setTemplateId","id","ignoredAutoFillCredentialTypes","setInitialCredentialSelection","credUsage","availableCreds","loadTemplateIfNeeded","opts","router","telemetry","useTelemetry","createdWorkflow","createWorkflowFromTemplate","tryToParseNumber","VIEWS","externalHooks","useExternalHooks","setupTemplateStore","i18n","useI18n","posthogStore","usePostHog","route","useRoute","useRouter","title","isReady","skipSetupUrl","watch","newTemplateId","onSkipSetup","event","skipIfTemplateHasNoCreds","onBeforeMount","TEMPLATE_CREDENTIAL_SETUP_EXPERIMENT","onMounted"],"mappings":"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"}
|