n8n-editor-ui
Version:
Workflow Editor UI for n8n
285 lines (284 loc) • 12.1 kB
JavaScript
import { C as computed, Cn as toDisplayString, D as createElementBlock, Gt as unref, It as ref, M as createVNode, P as defineComponent, T as createBlock, Z as onMounted, _ as Fragment, _t as watch, bt as withCtx, et as openBlock, it as renderList, j as createTextVNode, vn as normalizeClass, w as createBaseVNode } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
import { _t as useI18n } from "./_MapCache-ficiegRb.js";
import { Sn as N8nButton_default, at as N8nLoading_default, ht as N8nTooltip_default, mt as N8nLink_default, yn as N8nHeading_default } from "./src-DgvumQTi.js";
import "./en-CF30SCh2.js";
import "./preload-helper-CR0ecmWK.js";
import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
import { v as useRoute, y as useRouter } from "./truncate-B1HVeveJ.js";
import { N as useWorkflowsStore, Nt as useNodeTypesStore, O as useTelemetry, Xi as tryToParseNumber, b as useExternalHooks, c as useTemplatesStore, gn as useCredentialsStore } from "./builder.store-sBTWwxRU.js";
import "./empty-BuGRxzl4.js";
import "./sanitize-html-Cc45ZKm8.js";
import "./CalendarDate-zWqgZMlk.js";
import "./path-browserify-BtCDmZ3_.js";
import { Ro as VIEWS } from "./constants-BbpucWL4.js";
import "./merge-k8vSyyXH.js";
import { k as defineStore, r as useRootStore } from "./_baseOrderBy-B_6CV8x6.js";
import "./dateformat-CM9k0--B.js";
import "./useDebounce-Bnb8W2LR.js";
import "./nodeIcon-DI2Acud1.js";
import "./NodeIcon-BVhrZNYI.js";
import "./nodeTransforms-Lk_uXh7p.js";
import "./templateTransforms-CdDWSirY.js";
import { n as AppsRequiringCredsNotice_default, r as useCredentialSetupState, t as SetupTemplateFormStep_default } from "./SetupTemplateFormStep-BnqPLZOK.js";
import "./CredentialPicker-C5gvgCLr.js";
import { t as createWorkflowFromTemplate } from "./templateActions-D7NBFcji.js";
import { t as TemplatesView_default } from "./TemplatesView-oCiQur38.js";
const useSetupTemplateStore = defineStore("setupTemplate", () => {
const templateId = ref("");
const isLoading = ref(true);
const isSaving = ref(false);
const templatesStore = useTemplatesStore();
const nodeTypesStore = useNodeTypesStore();
const credentialsStore = useCredentialsStore();
const rootStore = useRootStore();
const workflowsStore = useWorkflowsStore();
const template = computed(() => {
return templateId.value ? templatesStore.getFullTemplateById(templateId.value) : null;
});
const { appCredentials, credentialOverrides, credentialUsages, credentialsByKey, nodesRequiringCredentialsSorted, numFilledCredentials, selectedCredentialIdByKey, setSelectedCredentialId, unsetSelectedCredential } = useCredentialSetupState(computed(() => {
return template.value?.workflow.nodes ?? [];
}));
const setTemplateId = (id) => {
templateId.value = id;
};
const ignoredAutoFillCredentialTypes = new Set([
"httpBasicAuth",
"httpCustomAuth",
"httpDigestAuth",
"httpHeaderAuth",
"oAuth1Api",
"oAuth2Api",
"httpQueryAuth"
]);
const setInitialCredentialSelection = () => {
for (const credUsage of credentialUsages.value) {
if (ignoredAutoFillCredentialTypes.has(credUsage.credentialType)) continue;
const availableCreds = credentialsStore.getCredentialsByType(credUsage.credentialType);
if (availableCreds.length === 1) selectedCredentialIdByKey.value[credUsage.key] = availableCreds[0].id;
}
};
const loadTemplateIfNeeded = async () => {
if (!!template.value || !templateId.value) return;
await templatesStore.fetchTemplateById(templateId.value);
setInitialCredentialSelection();
};
const init = async () => {
isLoading.value = true;
try {
selectedCredentialIdByKey.value = {};
await Promise.all([
credentialsStore.fetchAllCredentials(),
credentialsStore.fetchCredentialTypes(false),
nodeTypesStore.loadNodeTypesIfNotLoaded(),
loadTemplateIfNeeded()
]);
setInitialCredentialSelection();
} finally {
isLoading.value = false;
}
};
const skipSetup = async ({ router }) => {
const externalHooks = useExternalHooks();
const telemetry = useTelemetry();
await externalHooks.run("templatesWorkflowView.openWorkflow", {
source: "workflow",
template_id: templateId.value,
wf_template_repo_session_id: templatesStore.currentSessionId
});
telemetry.track("User closed cred setup", {
completed: false,
creds_filled: 0,
creds_needed: credentialUsages.value.length,
workflow_id: null
});
await router.replace({
name: VIEWS.TEMPLATE_IMPORT,
params: { id: templateId.value }
});
};
const createWorkflow = async (opts) => {
const { router } = opts;
const telemetry = useTelemetry();
if (!template.value) return;
try {
isSaving.value = true;
const createdWorkflow = await createWorkflowFromTemplate({
template: template.value,
credentialOverrides: credentialOverrides.value,
rootStore,
workflowsStore,
nodeTypeProvider: nodeTypesStore
});
telemetry.track("User closed cred setup", {
completed: true,
creds_filled: numFilledCredentials.value,
creds_needed: credentialUsages.value.length,
workflow_id: createdWorkflow.id
});
telemetry.track("User inserted workflow template", {
source: "workflow",
template_id: tryToParseNumber(templateId.value),
wf_template_repo_session_id: templatesStore.currentSessionId
});
telemetry.track("User saved new workflow from template", {
template_id: tryToParseNumber(templateId.value),
workflow_id: createdWorkflow.id,
wf_template_repo_session_id: templatesStore.currentSessionId
});
await router.replace({
name: VIEWS.WORKFLOW,
params: { name: createdWorkflow.id }
});
} finally {
isSaving.value = false;
}
};
return {
credentialsByKey,
isLoading,
isSaving,
appCredentials,
nodesRequiringCredentialsSorted,
template,
credentialUsages,
selectedCredentialIdByKey,
credentialOverrides,
numFilledCredentials,
createWorkflow,
skipSetup,
init,
loadTemplateIfNeeded,
setInitialCredentialSelection,
setTemplateId,
setSelectedCredentialId,
unsetSelectedCredential
};
});
var _hoisted_1 = { key: 1 };
var SetupWorkflowFromTemplateView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "SetupWorkflowFromTemplateView",
setup(__props) {
const setupTemplateStore = useSetupTemplateStore();
const i18n = useI18n();
const route = useRoute();
const router = useRouter();
const templateId = computed(() => Array.isArray(route.params.id) ? route.params.id[0] : route.params.id);
const title = computed(() => setupTemplateStore.template?.name ?? "unknown");
const isReady = computed(() => !setupTemplateStore.isLoading);
const skipSetupUrl = computed(() => {
return router.resolve({
name: VIEWS.TEMPLATE_IMPORT,
params: { id: templateId.value }
}).fullPath;
});
watch(templateId, async (newTemplateId) => {
setupTemplateStore.setTemplateId(newTemplateId);
await setupTemplateStore.loadTemplateIfNeeded();
});
const onSkipSetup = async (event) => {
event.preventDefault();
await setupTemplateStore.skipSetup({ router });
};
const skipIfTemplateHasNoCreds = async () => {
if (!!!setupTemplateStore.template) return false;
if (setupTemplateStore.credentialUsages.length === 0) {
await setupTemplateStore.skipSetup({ router });
return true;
}
return false;
};
setupTemplateStore.setTemplateId(templateId.value);
onMounted(async () => {
await setupTemplateStore.init();
await skipIfTemplateHasNoCreds();
});
return (_ctx, _cache) => {
return openBlock(), createBlock(TemplatesView_default, { "go-back-enabled": true }, {
header: withCtx(() => [isReady.value ? (openBlock(), createBlock(unref(N8nHeading_default), {
key: 0,
tag: "h1",
size: "2xlarge"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("templateSetup.title", { interpolate: { name: title.value } })), 1)]),
_: 1
})) : (openBlock(), createBlock(unref(N8nLoading_default), {
key: 1,
variant: "h1"
}))]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.grid) }, [
createBaseVNode("div", {
class: normalizeClass(_ctx.$style.notice),
"data-test-id": "info-callout"
}, [isReady.value ? (openBlock(), createBlock(AppsRequiringCredsNotice_default, {
key: 0,
"app-credentials": unref(setupTemplateStore).appCredentials
}, null, 8, ["app-credentials"])) : (openBlock(), createBlock(unref(N8nLoading_default), {
key: 1,
variant: "p"
}))], 2),
createBaseVNode("div", null, [isReady.value ? (openBlock(), createElementBlock("ol", {
key: 0,
class: normalizeClass(_ctx.$style.appCredentialsContainer)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(setupTemplateStore).credentialUsages, (credentials, index) => {
return openBlock(), createBlock(SetupTemplateFormStep_default, {
key: credentials.key,
class: normalizeClass(_ctx.$style.appCredential),
order: index + 1,
credentials,
"selected-credential-id": unref(setupTemplateStore).selectedCredentialIdByKey[credentials.key],
onCredentialSelected: _cache[0] || (_cache[0] = ($event) => unref(setupTemplateStore).setSelectedCredentialId($event.credentialUsageKey, $event.credentialId)),
onCredentialDeselected: _cache[1] || (_cache[1] = ($event) => unref(setupTemplateStore).unsetSelectedCredential($event.credentialUsageKey))
}, null, 8, [
"class",
"order",
"credentials",
"selected-credential-id"
]);
}), 128))], 2)) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.appCredentialsContainer)
}, [createVNode(unref(N8nLoading_default), {
class: normalizeClass(_ctx.$style.appCredential),
variant: "p",
rows: 3
}, null, 8, ["class"]), createVNode(unref(N8nLoading_default), {
class: normalizeClass(_ctx.$style.appCredential),
variant: "p",
rows: 3
}, null, 8, ["class"])], 2))]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.actions) }, [createVNode(unref(N8nLink_default), {
href: skipSetupUrl.value,
"new-window": false,
onClick: _cache[2] || (_cache[2] = ($event) => onSkipSetup($event))
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("templateSetup.skip")), 1)]),
_: 1
}, 8, ["href"]), isReady.value ? (openBlock(), createBlock(unref(N8nTooltip_default), {
key: 0,
content: unref(i18n).baseText("templateSetup.continue.button.fillRemaining"),
disabled: unref(setupTemplateStore).numFilledCredentials > 0
}, {
default: withCtx(() => [createVNode(unref(N8nButton_default), {
size: "large",
label: unref(i18n).baseText("templateSetup.continue.button"),
disabled: unref(setupTemplateStore).isSaving || unref(setupTemplateStore).numFilledCredentials === 0,
"data-test-id": "continue-button",
onClick: _cache[3] || (_cache[3] = ($event) => unref(setupTemplateStore).createWorkflow({ router: unref(router) }))
}, null, 8, ["label", "disabled"])]),
_: 1
}, 8, ["content", "disabled"])) : (openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(N8nLoading_default), { variant: "button" })]))], 2)
], 2)]),
_: 1
});
};
}
});
var SetupWorkflowFromTemplateView_vue_vue_type_style_index_0_lang_module_default = {
grid: "_grid_e7pvm_123",
notice: "_notice_e7pvm_131",
appCredentialsContainer: "_appCredentialsContainer_e7pvm_135",
appCredential: "_appCredential_e7pvm_135",
actions: "_actions_e7pvm_146"
};
var SetupWorkflowFromTemplateView_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SetupWorkflowFromTemplateView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SetupWorkflowFromTemplateView_vue_vue_type_style_index_0_lang_module_default }]]);
export { SetupWorkflowFromTemplateView_default as default };