n8n-editor-ui
Version:
Workflow Editor UI for n8n
2,818 lines • 183 kB
JavaScript
;
(function () {
System.register(["./chunk-legacy-Re9CbdfL.js", "./vue.runtime.esm-bundler-legacy--Sn1h8On.js", "./_MapCache-legacy-DlYNX_X1.js", "./src-legacy-uZTNWMC0.js", "./_plugin-vue_export-helper-legacy-DZMI5HPp.js", "./truncate-legacy-BGje52Or.js", "./ParameterInputList-legacy-s9Bhch5Q.js", "./col-legacy-Dww_rGSc.js", "./useTelemetry-legacy-B3pzzkAE.js", "./useToast-legacy-C4Vu5mt9.js", "./constants-legacy-TKxWCqvM.js", "./assistant.store-legacy-Bo4ZVN6u.js", "./useDebounce-legacy-CqZ-fJEm.js", "./useExternalHooks-legacy-8pg6K3ln.js", "./nodeCreator.store-legacy-BeEd3d8s.js", "./nodeIcon-legacy-D1wFvzkX.js", "./useClipboard-legacy-DEPZr2pv.js", "./NodeIcon-legacy-D0j2KPV5.js", "./dataTable.store-legacy-CZUet4xq.js", "./CommunityNodeUpdateInfo-legacy-CIcs4x1D.js", "./VirtualSchema-legacy-BpSC2T1v.js", "./useActions-legacy-D-P-aVl-.js"], function (_export, _context) {
"use strict";
var __toESM, computed, toDisplayString, createElementBlock, createCommentVNode, getCurrentInstance, nextTick, unref, ref, onBeforeUnmount, h, createVNode, defineComponent, reactive, createBlock, toValue, onMounted, Fragment, watch, renderSlot, normalizeStyle, withCtx, openBlock, withModifiers, renderList, createTextVNode, useTemplateRef, vShow, useSlots, normalizeClass, createBaseVNode, withDirectives, useElementSize, isClient, noop, isIOS, useResizeObserver, toRef, directiveHooks, notNullish, I18nT, isVue2, toValue$1, onClickOutside, useI18n, useThrottleFn, tryOnScopeDispose, isObject, useDebounceFn, tryOnMounted, N8nBlockUi_default, N8nCallout_default, N8nNotice_default, ElCollapseTransition, N8nButton_default, N8nRadioButtons_default, N8nText_default, N8nIcon_default, N8nInlineTextEdit_default, N8nTabs_default, N8nTooltip_default, N8nIconButton_default, __plugin_vue_export_helper_default, require_get, useRoute, TitledList_default, useNodeCredentialOptions, NodeCredentials_default, collectParametersByTab, collectSettings, getNodeSettingsInitialValues, createCommonNodeSettings, ParameterInputList_default, useNodeSettingsParameters, nameIsParameter, ElRow, ElCol, COMMUNITY_NODES_INSTALLATION_DOCS_URL, useProjectsStore, useUIStore, useSettingsStore, useCredentialsStore, ProjectTypes, RenameNodeCommand, injectWorkflowState, useHistoryStore, COMMUNITY_PACKAGE_INSTALL_MODAL_KEY, useNDVStore, useNodeTypesStore, removePreviewToken, importCurlEventBus, useWorkflowHelpers, useUsersStore, useWorkflowsStore, useActionsGenerator, useTelemetry, useNodeHelpers, useToast, CHAT_TRIGGER_NODE_TYPE, deepCopy, CUSTOM_API_CALL_KEY, VIEWS, NodeConnectionTypes, PRODUCTION_ONLY_TRIGGER_NODE_TYPES, isCommunityPackageName, MCP_TRIGGER_NODE_TYPE, OPEN_URL_PANEL_TRIGGER_NODE_TYPES, DATA_TABLE_NODES, BASE_NODE_SURVEY_URL, FORM_TRIGGER_NODE_TYPE, OPEN_AI_API_CREDENTIAL_TYPE, CUSTOM_NODES_DOCS_URL, getNodeParameters, getNodeInputs, BUILTIN_NODES_DOCS_URL, NPM_PACKAGE_DOCS_BASE_URL, ndvEventBus, useDebounce, useExternalHooks, useNodeCreatorStore, getNodeIconSource, useClipboard, NodeIcon_default, useDataTableStore, useInstallNode, useInstalledCommunityPackage, CommunityNodeFooter_default, ContactAdministratorToInstall_default, CommunityNodeUpdateInfo_default, NodeExecuteButton_default, useActions, __vite_style__, _hoisted_1$6, LANGCHAIN_NODES_PREFIX, N8N_NODES_PREFIX, FreeAiCreditsCallout_vue_vue_type_script_setup_true_lang_default, FreeAiCreditsCallout_default, OnClickOutside, defaultWindow, _iOSWorkaround, vOnClickOutside, vOnKeyStroke, DEFAULT_DELAY, DEFAULT_THRESHOLD, vOnLongPress, vElementHover, vElementSize, vElementVisibility, ARRIVED_STATE_THRESHOLD_PIXELS, vInfiniteScroll, vIntersectionObserver, vScroll, elInitialOverflow, vScrollLock, _hoisted_1$5, _hoisted_2$4, _hoisted_3$2, _hoisted_4$2, _hoisted_5$2, _hoisted_6$1, NDVSubConnections_vue_vue_type_script_setup_true_lang_default, container$1, connections, connectionType, connectionLabel, hasIssues, connectedNodesWrapper, plusButton, connectedNodesWrapperExpanded, connectedNodesMultiple, connectedNode, connectedNodes, nodeWrapper, NDVSubConnections_vue_vue_type_style_index_0_lang_module_default, cssModules$6, NDVSubConnections_default, useNodeDocsUrl, NodeSettingsTabs_vue_vue_type_script_setup_true_lang_default, NodeSettingsTabs_default, NodeSettingsHeader_vue_vue_type_script_setup_true_lang_default, header$1, execute, tabs, NodeSettingsHeader_vue_vue_type_style_index_0_lang_module_default, cssModules$5, NodeSettingsHeader_default, _hoisted_1$4, _hoisted_2$3, _hoisted_3$1, _hoisted_4$1, _hoisted_5$1, _hoisted_6, _hoisted_7, _hoisted_8, _hoisted_9, _hoisted_10, _hoisted_11, _hoisted_12, NodeWebhooks_vue_vue_type_script_setup_true_lang_default, NodeWebhooks_default, ExperimentalEmbeddedNdvHeader_vue_vue_type_script_setup_true_lang_default, component$1, title, disabled, titleText, subTitleText, tabsContainer, ExperimentalEmbeddedNdvHeader_vue_vue_type_style_index_0_lang_module_default, cssModules$4, ExperimentalEmbeddedNdvHeader_default, _hoisted_1$3, NodeActionsList_vue_vue_type_script_setup_true_lang_default, component, label, option, selected, optionText, NodeActionsList_vue_vue_type_style_index_0_lang_module_default, cssModules$3, NodeActionsList_default, _hoisted_1$2, _hoisted_2$2, NodeSettingsInvalidNodeWarning_vue_vue_type_script_setup_true_lang_default, communityNodeActionsContainer, nodeIsNotValid, warningIcon, descriptionContainer, NodeSettingsInvalidNodeWarning_vue_vue_type_style_index_0_lang_module_default, cssModules$2, NodeSettingsInvalidNodeWarning_default, _hoisted_1$1, _hoisted_2$1, NodeStorageLimitCallout_vue_vue_type_script_setup_true_lang_default, NodeStorageLimitCallout_default, NodeTitle_vue_vue_type_script_setup_true_lang_default, container, textWrapper, iconWrapper, NodeTitle_vue_vue_type_style_index_0_lang_module_default, cssModules$1, NodeTitle_default, import_get, _hoisted_1, _hoisted_2, _hoisted_3, _hoisted_4, _hoisted_5, NodeSettings_vue_vue_type_script_setup_true_lang_default, header, featureRequest, uiBlockerNdvV2, NodeSettings_vue_vue_type_style_index_0_lang_module_default, cssModules, NodeSettings_default;
function unrefElement(elRef) {
var _a;
const plain = toValue$1(elRef);
return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
}
function useEventListener(...args) {
let target;
let events;
let listeners;
let options;
if (typeof args[0] === "string" || Array.isArray(args[0])) {
[events, listeners, options] = args;
target = defaultWindow;
} else [target, events, listeners, options] = args;
if (!target) return noop;
if (!Array.isArray(events)) events = [events];
if (!Array.isArray(listeners)) listeners = [listeners];
const cleanups = [];
const cleanup = () => {
cleanups.forEach(fn => fn());
cleanups.length = 0;
};
const register = (el, event, listener, options2) => {
el.addEventListener(event, listener, options2);
return () => el.removeEventListener(event, listener, options2);
};
const stopWatch = watch(() => [unrefElement(target), toValue$1(options)], ([el, options2]) => {
cleanup();
if (!el) return;
const optionsClone = isObject(options2) ? {
...options2
} : options2;
cleanups.push(...events.flatMap(event => {
return listeners.map(listener => register(el, event, listener, optionsClone));
}));
}, {
immediate: true,
flush: "post"
});
const stop = () => {
stopWatch();
cleanup();
};
tryOnScopeDispose(stop);
return stop;
}
function onClickOutside$1(target, handler, options = {}) {
const {
window: window$1 = defaultWindow,
ignore = [],
capture = true,
detectIframe = false
} = options;
if (!window$1) return noop;
if (isIOS && !_iOSWorkaround) {
_iOSWorkaround = true;
Array.from(window$1.document.body.children).forEach(el => el.addEventListener("click", noop));
window$1.document.documentElement.addEventListener("click", noop);
}
let shouldListen = true;
const shouldIgnore = event => {
return ignore.some(target2 => {
if (typeof target2 === "string") return Array.from(window$1.document.querySelectorAll(target2)).some(el => el === event.target || event.composedPath().includes(el));else {
const el = unrefElement(target2);
return el && (event.target === el || event.composedPath().includes(el));
}
});
};
const listener = event => {
const el = unrefElement(target);
if (!el || el === event.target || event.composedPath().includes(el)) return;
if (event.detail === 0) shouldListen = !shouldIgnore(event);
if (!shouldListen) {
shouldListen = true;
return;
}
handler(event);
};
const cleanup = [useEventListener(window$1, "click", listener, {
passive: true,
capture
}), useEventListener(window$1, "pointerdown", e => {
const el = unrefElement(target);
shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));
}, {
passive: true
}), detectIframe && useEventListener(window$1, "blur", event => {
setTimeout(() => {
var _a;
const el = unrefElement(target);
if (((_a = window$1.document.activeElement) == null ? void 0 : _a.tagName) === "IFRAME" && !(el == null ? void 0 : el.contains(window$1.document.activeElement))) handler(event);
}, 0);
})].filter(Boolean);
const stop = () => cleanup.forEach(fn => fn());
return stop;
}
function createKeyPredicate(keyFilter) {
if (typeof keyFilter === "function") return keyFilter;else if (typeof keyFilter === "string") return event => event.key === keyFilter;else if (Array.isArray(keyFilter)) return event => keyFilter.includes(event.key);
return () => true;
}
function onKeyStroke(...args) {
let key;
let handler;
let options = {};
if (args.length === 3) {
key = args[0];
handler = args[1];
options = args[2];
} else if (args.length === 2) {
if (typeof args[1] === "object") {
key = true;
handler = args[0];
options = args[1];
} else {
key = args[0];
handler = args[1];
}
} else {
key = true;
handler = args[0];
}
const {
target = defaultWindow,
eventName = "keydown",
passive = false,
dedupe = false
} = options;
const predicate = createKeyPredicate(key);
const listener = e => {
if (e.repeat && toValue$1(dedupe)) return;
if (predicate(e)) handler(e);
};
return useEventListener(target, eventName, listener, passive);
}
function onLongPress(target, handler, options) {
var _a, _b;
const elementRef = computed(() => unrefElement(target));
let timeout;
let posStart;
let startTimestamp;
let hasLongPressed = false;
function clear() {
if (timeout) {
clearTimeout(timeout);
timeout = void 0;
}
posStart = void 0;
startTimestamp = void 0;
hasLongPressed = false;
}
function onRelease(ev) {
var _a2, _b2, _c;
const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed];
clear();
if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp) return;
if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value) return;
if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent) ev.preventDefault();
if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop) ev.stopPropagation();
const dx = ev.x - _posStart.x;
const dy = ev.y - _posStart.y;
const distance = Math.sqrt(dx * dx + dy * dy);
options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed);
}
function onDown(ev) {
var _a2, _b2, _c, _d;
if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value) return;
clear();
if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent) ev.preventDefault();
if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop) ev.stopPropagation();
posStart = {
x: ev.x,
y: ev.y
};
startTimestamp = ev.timeStamp;
timeout = setTimeout(() => {
hasLongPressed = true;
handler(ev);
}, (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY);
}
function onMove(ev) {
var _a2, _b2, _c, _d;
if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value) return;
if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false) return;
if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent) ev.preventDefault();
if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop) ev.stopPropagation();
const dx = ev.x - posStart.x;
const dy = ev.y - posStart.y;
if (Math.sqrt(dx * dx + dy * dy) >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD)) clear();
}
const listenerOptions = {
capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,
once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once
};
const cleanup = [useEventListener(elementRef, "pointerdown", onDown, listenerOptions), useEventListener(elementRef, "pointermove", onMove, listenerOptions), useEventListener(elementRef, ["pointerup", "pointerleave"], onRelease, listenerOptions)];
const stop = () => cleanup.forEach(fn => fn());
return stop;
}
function useMounted() {
const isMounted = ref(false);
const instance = getCurrentInstance();
if (instance) onMounted(() => {
isMounted.value = true;
}, false ? void 0 : instance);
return isMounted;
}
function useSupported(callback) {
const isMounted = useMounted();
return computed(() => {
isMounted.value;
return Boolean(callback());
});
}
function useElementHover(el, options = {}) {
const {
delayEnter = 0,
delayLeave = 0,
window: window$1 = defaultWindow
} = options;
const isHovered = ref(false);
let timer;
const toggle = entering => {
const delay = entering ? delayEnter : delayLeave;
if (timer) {
clearTimeout(timer);
timer = void 0;
}
if (delay) timer = setTimeout(() => isHovered.value = entering, delay);else isHovered.value = entering;
};
if (!window$1) return isHovered;
useEventListener(el, "mouseenter", () => toggle(true), {
passive: true
});
useEventListener(el, "mouseleave", () => toggle(false), {
passive: true
});
return isHovered;
}
function useResizeObserver$1(target, callback, options = {}) {
const {
window: window$1 = defaultWindow,
...observerOptions
} = options;
let observer;
const isSupported = useSupported(() => window$1 && "ResizeObserver" in window$1);
const cleanup = () => {
if (observer) {
observer.disconnect();
observer = void 0;
}
};
const stopWatch = watch(computed(() => Array.isArray(target) ? target.map(el => unrefElement(el)) : [unrefElement(target)]), els => {
cleanup();
if (isSupported.value && window$1) {
observer = new ResizeObserver(callback);
for (const _el of els) _el && observer.observe(_el, observerOptions);
}
}, {
immediate: true,
flush: "post"
});
const stop = () => {
cleanup();
stopWatch();
};
tryOnScopeDispose(stop);
return {
isSupported,
stop
};
}
function useElementSize$1(target, initialSize = {
width: 0,
height: 0
}, options = {}) {
const {
window: window$1 = defaultWindow,
box = "content-box"
} = options;
const isSVG = computed(() => {
var _a, _b;
return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes("svg");
});
const width = ref(initialSize.width);
const height = ref(initialSize.height);
const {
stop: stop1
} = useResizeObserver$1(target, ([entry]) => {
const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;
if (window$1 && isSVG.value) {
const $elem = unrefElement(target);
if ($elem) {
const rect = $elem.getBoundingClientRect();
width.value = rect.width;
height.value = rect.height;
}
} else if (boxSize) {
const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];
width.value = formatBoxSize.reduce((acc, {
inlineSize
}) => acc + inlineSize, 0);
height.value = formatBoxSize.reduce((acc, {
blockSize
}) => acc + blockSize, 0);
} else {
width.value = entry.contentRect.width;
height.value = entry.contentRect.height;
}
}, options);
tryOnMounted(() => {
const ele = unrefElement(target);
if (ele) {
width.value = "offsetWidth" in ele ? ele.offsetWidth : initialSize.width;
height.value = "offsetHeight" in ele ? ele.offsetHeight : initialSize.height;
}
});
const stop2 = watch(() => unrefElement(target), ele => {
width.value = ele ? initialSize.width : 0;
height.value = ele ? initialSize.height : 0;
});
function stop() {
stop1();
stop2();
}
return {
width,
height,
stop
};
}
function useIntersectionObserver(target, callback, options = {}) {
const {
root,
rootMargin = "0px",
threshold = .1,
window: window$1 = defaultWindow,
immediate = true
} = options;
const isSupported = useSupported(() => window$1 && "IntersectionObserver" in window$1);
const targets = computed(() => {
const _target = toValue$1(target);
return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(notNullish);
});
let cleanup = noop;
const isActive = ref(immediate);
const stopWatch = isSupported.value ? watch(() => [targets.value, unrefElement(root), isActive.value], ([targets2, root2]) => {
cleanup();
if (!isActive.value) return;
if (!targets2.length) return;
const observer = new IntersectionObserver(callback, {
root: unrefElement(root2),
rootMargin,
threshold
});
targets2.forEach(el => el && observer.observe(el));
cleanup = () => {
observer.disconnect();
cleanup = noop;
};
}, {
immediate,
flush: "post"
}) : noop;
const stop = () => {
cleanup();
stopWatch();
isActive.value = false;
};
tryOnScopeDispose(stop);
return {
isSupported,
isActive,
pause() {
cleanup();
isActive.value = false;
},
resume() {
isActive.value = true;
},
stop
};
}
function useElementVisibility$1(element, options = {}) {
const {
window: window$1 = defaultWindow,
scrollTarget,
threshold = 0
} = options;
const elementIsVisible = ref(false);
useIntersectionObserver(element, intersectionObserverEntries => {
let isIntersecting = elementIsVisible.value;
let latestTime = 0;
for (const entry of intersectionObserverEntries) if (entry.time >= latestTime) {
latestTime = entry.time;
isIntersecting = entry.isIntersecting;
}
elementIsVisible.value = isIntersecting;
}, {
root: scrollTarget,
window: window$1,
threshold
});
return elementIsVisible;
}
function useScroll(element, options = {}) {
const {
throttle = 0,
idle = 200,
onStop = noop,
onScroll = noop,
offset = {
left: 0,
right: 0,
top: 0,
bottom: 0
},
eventListenerOptions = {
capture: false,
passive: true
},
behavior = "auto",
window: window$1 = defaultWindow,
onError = e => {
console.error(e);
}
} = options;
const internalX = ref(0);
const internalY = ref(0);
const x = computed({
get() {
return internalX.value;
},
set(x2) {
scrollTo(x2, void 0);
}
});
const y = computed({
get() {
return internalY.value;
},
set(y2) {
scrollTo(void 0, y2);
}
});
function scrollTo(_x, _y) {
var _a, _b, _c, _d;
if (!window$1) return;
const _element = toValue$1(element);
if (!_element) return;
(_c = _element instanceof Document ? window$1.document.body : _element) == null || _c.scrollTo({
top: (_a = toValue$1(_y)) != null ? _a : y.value,
left: (_b = toValue$1(_x)) != null ? _b : x.value,
behavior: toValue$1(behavior)
});
const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element;
if (x != null) internalX.value = scrollContainer.scrollLeft;
if (y != null) internalY.value = scrollContainer.scrollTop;
}
const isScrolling = ref(false);
const arrivedState = reactive({
left: true,
right: false,
top: true,
bottom: false
});
const directions = reactive({
left: false,
right: false,
top: false,
bottom: false
});
const onScrollEnd = e => {
if (!isScrolling.value) return;
isScrolling.value = false;
directions.left = false;
directions.right = false;
directions.top = false;
directions.bottom = false;
onStop(e);
};
const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);
const setArrivedState = target => {
var _a;
if (!window$1) return;
const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);
const {
display,
flexDirection
} = getComputedStyle(el);
const scrollLeft = el.scrollLeft;
directions.left = scrollLeft < internalX.value;
directions.right = scrollLeft > internalX.value;
const left = Math.abs(scrollLeft) <= (offset.left || 0);
const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
if (display === "flex" && flexDirection === "row-reverse") {
arrivedState.left = right;
arrivedState.right = left;
} else {
arrivedState.left = left;
arrivedState.right = right;
}
internalX.value = scrollLeft;
let scrollTop = el.scrollTop;
if (target === window$1.document && !scrollTop) scrollTop = window$1.document.body.scrollTop;
directions.top = scrollTop < internalY.value;
directions.bottom = scrollTop > internalY.value;
const top = Math.abs(scrollTop) <= (offset.top || 0);
const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
if (display === "flex" && flexDirection === "column-reverse") {
arrivedState.top = bottom;
arrivedState.bottom = top;
} else {
arrivedState.top = top;
arrivedState.bottom = bottom;
}
internalY.value = scrollTop;
};
const onScrollHandler = e => {
var _a;
if (!window$1) return;
setArrivedState((_a = e.target.documentElement) != null ? _a : e.target);
isScrolling.value = true;
onScrollEndDebounced(e);
onScroll(e);
};
useEventListener(element, "scroll", throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler, eventListenerOptions);
tryOnMounted(() => {
try {
const _element = toValue$1(element);
if (!_element) return;
setArrivedState(_element);
} catch (e) {
onError(e);
}
});
useEventListener(element, "scrollend", onScrollEnd, eventListenerOptions);
return {
x,
y,
isScrolling,
arrivedState,
directions,
measure() {
const _element = toValue$1(element);
if (window$1 && _element) setArrivedState(_element);
}
};
}
function resolveElement(el) {
if (typeof Window !== "undefined" && el instanceof Window) return el.document.documentElement;
if (typeof Document !== "undefined" && el instanceof Document) return el.documentElement;
return el;
}
function useInfiniteScroll(element, onLoadMore, options = {}) {
var _a;
const {
direction = "bottom",
interval = 100,
canLoadMore = () => true
} = options;
const state = reactive(useScroll(element, {
...options,
offset: {
[direction]: (_a = options.distance) != null ? _a : 0,
...options.offset
}
}));
const promise = ref();
const isLoading = computed(() => !!promise.value);
const observedElement = computed(() => {
return resolveElement(toValue$1(element));
});
const isElementVisible = useElementVisibility$1(observedElement);
function checkAndLoad() {
state.measure();
if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value)) return;
const {
scrollHeight,
clientHeight,
scrollWidth,
clientWidth
} = observedElement.value;
const isNarrower = direction === "bottom" || direction === "top" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;
if (state.arrivedState[direction] || isNarrower) {
if (!promise.value) promise.value = Promise.all([onLoadMore(state), new Promise(resolve => setTimeout(resolve, interval))]).finally(() => {
promise.value = null;
nextTick(() => checkAndLoad());
});
}
}
watch(() => [state.arrivedState[direction], isElementVisible.value], checkAndLoad, {
immediate: true
});
return {
isLoading
};
}
function checkOverflowScroll(ele) {
const style = window.getComputedStyle(ele);
if (style.overflowX === "scroll" || style.overflowY === "scroll" || style.overflowX === "auto" && ele.clientWidth < ele.scrollWidth || style.overflowY === "auto" && ele.clientHeight < ele.scrollHeight) return true;else {
const parent = ele.parentNode;
if (!parent || parent.tagName === "BODY") return false;
return checkOverflowScroll(parent);
}
}
function preventDefault(rawEvent) {
const e = rawEvent || window.event;
const _target = e.target;
if (checkOverflowScroll(_target)) return false;
if (e.touches.length > 1) return true;
if (e.preventDefault) e.preventDefault();
return false;
}
function useScrollLock(element, initialState = false) {
const isLocked = ref(initialState);
let stopTouchMoveListener = null;
let initialOverflow = "";
watch(toRef(element), el => {
const target = resolveElement(toValue$1(el));
if (target) {
const ele = target;
if (!elInitialOverflow.get(ele)) elInitialOverflow.set(ele, ele.style.overflow);
if (ele.style.overflow !== "hidden") initialOverflow = ele.style.overflow;
if (ele.style.overflow === "hidden") return isLocked.value = true;
if (isLocked.value) return ele.style.overflow = "hidden";
}
}, {
immediate: true
});
const lock = () => {
const el = resolveElement(toValue$1(element));
if (!el || isLocked.value) return;
if (isIOS) stopTouchMoveListener = useEventListener(el, "touchmove", e => {
preventDefault(e);
}, {
passive: false
});
el.style.overflow = "hidden";
isLocked.value = true;
};
const unlock = () => {
const el = resolveElement(toValue$1(element));
if (!el || !isLocked.value) return;
isIOS && stopTouchMoveListener?.();
el.style.overflow = initialOverflow;
elInitialOverflow.delete(el);
isLocked.value = false;
};
tryOnScopeDispose(unlock);
return computed({
get() {
return isLocked.value;
},
set(v) {
if (v) lock();else unlock();
}
});
}
function onScrollLock() {
let isMounted = false;
const state = ref(false);
return (el, binding) => {
state.value = binding.value;
if (isMounted) return;
isMounted = true;
const isLocked = useScrollLock(el, binding.value);
watch(state, v => isLocked.value = v);
};
}
return {
setters: [function (_chunkLegacy001Js) {
__toESM = _chunkLegacy001Js.o;
}, function (_vueRuntimeEsmBundlerLegacy003Js) {
computed = _vueRuntimeEsmBundlerLegacy003Js.C;
toDisplayString = _vueRuntimeEsmBundlerLegacy003Js.Cn;
createElementBlock = _vueRuntimeEsmBundlerLegacy003Js.D;
createCommentVNode = _vueRuntimeEsmBundlerLegacy003Js.E;
getCurrentInstance = _vueRuntimeEsmBundlerLegacy003Js.F;
nextTick = _vueRuntimeEsmBundlerLegacy003Js.G;
unref = _vueRuntimeEsmBundlerLegacy003Js.Gt;
ref = _vueRuntimeEsmBundlerLegacy003Js.It;
onBeforeUnmount = _vueRuntimeEsmBundlerLegacy003Js.J;
h = _vueRuntimeEsmBundlerLegacy003Js.L;
createVNode = _vueRuntimeEsmBundlerLegacy003Js.M;
defineComponent = _vueRuntimeEsmBundlerLegacy003Js.P;
reactive = _vueRuntimeEsmBundlerLegacy003Js.Pt;
createBlock = _vueRuntimeEsmBundlerLegacy003Js.T;
toValue = _vueRuntimeEsmBundlerLegacy003Js.Ut;
onMounted = _vueRuntimeEsmBundlerLegacy003Js.Z;
Fragment = _vueRuntimeEsmBundlerLegacy003Js._;
watch = _vueRuntimeEsmBundlerLegacy003Js._t;
renderSlot = _vueRuntimeEsmBundlerLegacy003Js.at;
normalizeStyle = _vueRuntimeEsmBundlerLegacy003Js.bn;
withCtx = _vueRuntimeEsmBundlerLegacy003Js.bt;
openBlock = _vueRuntimeEsmBundlerLegacy003Js.et;
withModifiers = _vueRuntimeEsmBundlerLegacy003Js.h;
renderList = _vueRuntimeEsmBundlerLegacy003Js.it;
createTextVNode = _vueRuntimeEsmBundlerLegacy003Js.j;
useTemplateRef = _vueRuntimeEsmBundlerLegacy003Js.mt;
vShow = _vueRuntimeEsmBundlerLegacy003Js.p;
useSlots = _vueRuntimeEsmBundlerLegacy003Js.pt;
normalizeClass = _vueRuntimeEsmBundlerLegacy003Js.vn;
createBaseVNode = _vueRuntimeEsmBundlerLegacy003Js.w;
withDirectives = _vueRuntimeEsmBundlerLegacy003Js.xt;
}, function (_MapCacheLegacy005Js) {
useElementSize = _MapCacheLegacy005Js.E;
isClient = _MapCacheLegacy005Js.G;
noop = _MapCacheLegacy005Js.J;
isIOS = _MapCacheLegacy005Js.K;
useResizeObserver = _MapCacheLegacy005Js.N;
toRef = _MapCacheLegacy005Js.Q;
directiveHooks = _MapCacheLegacy005Js.W;
notNullish = _MapCacheLegacy005Js.Y;
I18nT = _MapCacheLegacy005Js._t;
isVue2 = _MapCacheLegacy005Js.ct;
toValue$1 = _MapCacheLegacy005Js.et;
onClickOutside = _MapCacheLegacy005Js.g;
useI18n = _MapCacheLegacy005Js.gt;
useThrottleFn = _MapCacheLegacy005Js.it;
tryOnScopeDispose = _MapCacheLegacy005Js.nt;
isObject = _MapCacheLegacy005Js.q;
useDebounceFn = _MapCacheLegacy005Js.rt;
tryOnMounted = _MapCacheLegacy005Js.tt;
}, function (_srcLegacy007Js) {
N8nBlockUi_default = _srcLegacy007Js.$;
N8nCallout_default = _srcLegacy007Js.Bn;
N8nNotice_default = _srcLegacy007Js.D;
ElCollapseTransition = _srcLegacy007Js.Ft;
N8nButton_default = _srcLegacy007Js.Hn;
N8nRadioButtons_default = _srcLegacy007Js.S;
N8nText_default = _srcLegacy007Js.Vn;
N8nIcon_default = _srcLegacy007Js.Wn;
N8nInlineTextEdit_default = _srcLegacy007Js.a;
N8nTabs_default = _srcLegacy007Js.g;
N8nTooltip_default = _srcLegacy007Js.mt;
N8nIconButton_default = _srcLegacy007Js.xt;
}, function (_pluginVue_exportHelperLegacy00fJs) {
__plugin_vue_export_helper_default = _pluginVue_exportHelperLegacy00fJs.t;
}, function (_truncateLegacy00hJs) {
require_get = _truncateLegacy00hJs.r;
useRoute = _truncateLegacy00hJs.v;
}, function (_ParameterInputListLegacy00tJs) {
TitledList_default = _ParameterInputListLegacy00tJs.D;
useNodeCredentialOptions = _ParameterInputListLegacy00tJs.E;
NodeCredentials_default = _ParameterInputListLegacy00tJs.T;
collectParametersByTab = _ParameterInputListLegacy00tJs.d;
collectSettings = _ParameterInputListLegacy00tJs.f;
getNodeSettingsInitialValues = _ParameterInputListLegacy00tJs.h;
createCommonNodeSettings = _ParameterInputListLegacy00tJs.p;
ParameterInputList_default = _ParameterInputListLegacy00tJs.t;
useNodeSettingsParameters = _ParameterInputListLegacy00tJs.u;
nameIsParameter = _ParameterInputListLegacy00tJs.v;
}, function (_colLegacy00BJs) {
ElRow = _colLegacy00BJs.n;
ElCol = _colLegacy00BJs.t;
}, function (_useTelemetryLegacy00HJs) {
COMMUNITY_NODES_INSTALLATION_DOCS_URL = _useTelemetryLegacy00HJs.Bi;
useProjectsStore = _useTelemetryLegacy00HJs.En;
useUIStore = _useTelemetryLegacy00HJs.Fi;
useSettingsStore = _useTelemetryLegacy00HJs.Ho;
useCredentialsStore = _useTelemetryLegacy00HJs.Ht;
ProjectTypes = _useTelemetryLegacy00HJs.On;
RenameNodeCommand = _useTelemetryLegacy00HJs.Pr;
injectWorkflowState = _useTelemetryLegacy00HJs.Sn;
useHistoryStore = _useTelemetryLegacy00HJs.Tr;
COMMUNITY_PACKAGE_INSTALL_MODAL_KEY = _useTelemetryLegacy00HJs.Ui;
useNDVStore = _useTelemetryLegacy00HJs.a;
useNodeTypesStore = _useTelemetryLegacy00HJs.at;
removePreviewToken = _useTelemetryLegacy00HJs.bt;
importCurlEventBus = _useTelemetryLegacy00HJs.ki;
useWorkflowHelpers = _useTelemetryLegacy00HJs.mn;
useUsersStore = _useTelemetryLegacy00HJs.nr;
useWorkflowsStore = _useTelemetryLegacy00HJs.o;
useActionsGenerator = _useTelemetryLegacy00HJs.ot;
useTelemetry = _useTelemetryLegacy00HJs.t;
useNodeHelpers = _useTelemetryLegacy00HJs.xn;
}, function (_useToastLegacy00JJs) {
useToast = _useToastLegacy00JJs.t;
}, function (_constantsLegacy00TJs) {
CHAT_TRIGGER_NODE_TYPE = _constantsLegacy00TJs.Bt;
deepCopy = _constantsLegacy00TJs.Da;
CUSTOM_API_CALL_KEY = _constantsLegacy00TJs.I;
VIEWS = _constantsLegacy00TJs.Io;
NodeConnectionTypes = _constantsLegacy00TJs.Ka;
PRODUCTION_ONLY_TRIGGER_NODE_TYPES = _constantsLegacy00TJs.Kn;
isCommunityPackageName = _constantsLegacy00TJs.Oa;
MCP_TRIGGER_NODE_TYPE = _constantsLegacy00TJs.On;
OPEN_URL_PANEL_TRIGGER_NODE_TYPES = _constantsLegacy00TJs.Un;
DATA_TABLE_NODES = _constantsLegacy00TJs.Yt;
BASE_NODE_SURVEY_URL = _constantsLegacy00TJs.c;
FORM_TRIGGER_NODE_TYPE = _constantsLegacy00TJs.dn;
OPEN_AI_API_CREDENTIAL_TYPE = _constantsLegacy00TJs.do;
CUSTOM_NODES_DOCS_URL = _constantsLegacy00TJs.f;
getNodeParameters = _constantsLegacy00TJs.ra;
getNodeInputs = _constantsLegacy00TJs.ta;
BUILTIN_NODES_DOCS_URL = _constantsLegacy00TJs.u;
NPM_PACKAGE_DOCS_BASE_URL = _constantsLegacy00TJs.x;
}, function (_assistantStoreLegacy00XJs) {
ndvEventBus = _assistantStoreLegacy00XJs.n;
}, function (_useDebounceLegacy011Js) {
useDebounce = _useDebounceLegacy011Js.t;
}, function (_useExternalHooksLegacy013Js) {
useExternalHooks = _useExternalHooksLegacy013Js.t;
}, function (_nodeCreatorStoreLegacy01tJs) {
useNodeCreatorStore = _nodeCreatorStoreLegacy01tJs.t;
}, function (_nodeIconLegacy01vJs) {
getNodeIconSource = _nodeIconLegacy01vJs.t;
}, function (_useClipboardLegacy01xJs) {
useClipboard = _useClipboardLegacy01xJs.t;
}, function (_NodeIconLegacy01FJs) {
NodeIcon_default = _NodeIconLegacy01FJs.t;
}, function (_dataTableStoreLegacy01RJs) {
useDataTableStore = _dataTableStoreLegacy01RJs.t;
}, function (_CommunityNodeUpdateInfoLegacy02dJs) {
useInstallNode = _CommunityNodeUpdateInfoLegacy02dJs.a;
useInstalledCommunityPackage = _CommunityNodeUpdateInfoLegacy02dJs.i;
CommunityNodeFooter_default = _CommunityNodeUpdateInfoLegacy02dJs.n;
ContactAdministratorToInstall_default = _CommunityNodeUpdateInfoLegacy02dJs.r;
CommunityNodeUpdateInfo_default = _CommunityNodeUpdateInfoLegacy02dJs.t;
}, function (_VirtualSchemaLegacy02vJs) {
NodeExecuteButton_default = _VirtualSchemaLegacy02vJs.n;
}, function (_useActionsLegacy03tJs) {
useActions = _useActionsLegacy03tJs.t;
}],
execute: function () {
__vite_style__ = document.createElement('style');
__vite_style__.textContent = "/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n@keyframes _horizontal-shake_1kr6k_1 {\n0% {\n transform: translateX(0);\n}\n25% {\n transform: translateX(5px);\n}\n50% {\n transform: translateX(-5px);\n}\n75% {\n transform: translateX(5px);\n}\n100% {\n transform: translateX(0);\n}\n}\n._container_1kr6k_140 {\n --node--size: 45px;\n --plus-button--size: 30px;\n --ndv--sub-connections--duration: 150ms;\n --collapsed--offset: 10px;\n padding-top: calc(var(--node--size) + var(--spacing--3xs));\n}\n._connections_1kr6k_148 {\n min-height: calc(var(--node--size) + var(--spacing--md));\n position: absolute;\n bottom: calc(var(--node--size) / 2 * -1);\n left: 0;\n right: 0;\n -webkit-user-select: none;\n user-select: none;\n justify-content: space-between;\n display: grid;\n /* stylelint-disable-next-line @n8n/css-var-naming */\n grid-template-columns: repeat(var(--possible-connections), 1fr);\n}\n._connectionType_1kr6k_161 {\n display: flex;\n flex-direction: column;\n align-items: center;\n transition: all calc(var(--ndv--sub-connections--duration) - 50ms) ease;\n}\n._connectionLabel_1kr6k_168 {\n margin-bottom: var(--spacing--2xs);\n font-size: var(--font-size--2xs);\n -webkit-user-select: none;\n user-select: none;\n text-wrap: nowrap;\n}\n._connectionLabel_1kr6k_168._hasIssues_1kr6k_174 {\n color: var(--color--danger);\n}\n._connectedNodesWrapper_1kr6k_178 {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n position: relative;\n}\n._plusButton_1kr6k_186 {\n transition: all var(--ndv--sub-connections--duration) ease;\n position: absolute;\n top: var(--spacing--2xs);\n}\n._plusButton_1kr6k_186._hasIssues_1kr6k_174 {\n animation: _horizontal-shake_1kr6k_1 500ms;\n}\n._plusButton_1kr6k_186._hasIssues_1kr6k_174 button {\n --button--color--text: var(--color--danger);\n --button--border-color: var(--color--danger);\n}\n._plusButton_1kr6k_186:not(:last-child) {\n z-index: 1;\n right: 100%;\n margin-right: calc(var(--plus-button--size) * -1 * 0.9);\n pointer-events: none;\n}\n._connectedNodesWrapperExpanded_1kr6k_204 ._plusButton_1kr6k_186:not(:last-child) {\n margin-right: var(--spacing--2xs);\n opacity: 1;\n pointer-events: all;\n}\n._connectedNodesMultiple_1kr6k_210 {\n transition: all var(--ndv--sub-connections--duration) ease;\n}\n._connectedNodesWrapperExpanded_1kr6k_204 {\n z-index: 1;\n}\n._connections_1kr6k_148:has(._connectedNodesWrapperExpanded_1kr6k_204) ._connectionType_1kr6k_161:not(:has(._connectedNodesWrapperExpanded_1kr6k_204)) {\n opacity: 0;\n pointer-events: none;\n visibility: hidden;\n}\n._connectedNode_1kr6k_178 {\n border: var(--border);\n background-color: var(--node--color--background);\n border-radius: 100%;\n padding: var(--spacing--xs);\n cursor: pointer;\n pointer-events: all;\n transition: all var(--ndv--sub-connections--duration) ease;\n position: relative;\n display: flex;\n justify-self: center;\n align-self: center;\n}\n._connectedNodes_1kr6k_178 {\n display: flex;\n justify-content: center;\n /* stylelint-disable-next-line @n8n/css-var-naming */\n margin-right: calc((var(--nodes-length) - 1) * -1 * (var(--node--size) - var(--collapsed--offset)));\n}\n._connectedNodesWrapperExpanded_1kr6k_204 ._connectedNodes_1kr6k_178 {\n margin-right: 0;\n margin-right: calc((var(--spacing--2xs) + var(--plus-button--size)) * -1);\n}\n._nodeWrapper_1kr6k_249 {\n transition: all var(--ndv--sub-connections--duration) ease;\n transform-origin: center;\n z-index: 1;\n}\n._connectedNodesWrapperExpanded_1kr6k_204 ._nodeWrapper_1kr6k_249:not(:first-child) {\n margin-left: var(--spacing--2xs);\n}\n._nodeWrapper_1kr6k_249._hasIssues_1kr6k_174 ._connectedNode_1kr6k_178 {\n border-width: calc(var(--border-width) * 2);\n border-color: var(--color--danger);\n}\n._nodeWrapper_1kr6k_249:not(:first-child) {\n /* stylelint-disable-next-line @n8n/css-var-naming */\n transform: translateX(calc(var(--node-index) * -1 * (var(--node--size) - var(--collapsed--offset))));\n}\n._connectedNodesWrapperExpanded_1kr6k_204 ._nodeWrapper_1kr6k_249 {\n transform: translateX(0);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n#communityNode > div {\n cursor: auto;\n padding-right: 0;\n padding-left: 0;\n}\n#communityNode > div:hover {\n color: unset;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._header_qhhug_123 {\n --tabs--arrow-buttons--color: var(--color--background--light-3);\n display: flex;\n align-items: center;\n min-height: 40px;\n border-bottom: var(--border);\n}\n._execute_qhhug_131 {\n margin-right: var(--spacing--sm);\n}\n._tabs_qhhug_135 {\n align-self: flex-end;\n}\n._tabs_qhhug_135 #communityNode {\n padding-right: var(--spacing--2xs);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n.webhooks[data-v-66c974d9] {\n padding-bottom: var(--spacing--xs);\n margin: var(--spacing--xs) 0;\n border-bottom: 1px solid var(--color--text--tint-2);\n}\n.webhooks .headline[data-v-66c974d9] {\n color: var(--color--primary);\n font-weight: var(--font-weight--bold);\n font-size: var(--font-size--2xs);\n}\n.http-field[data-v-66c974d9] {\n position: absolute;\n width: 50px;\n display: inline-block;\n top: calc(50% - 8px);\n}\n.http-method[data-v-66c974d9] {\n background-color: var(--color--foreground--shade-2);\n width: 40px;\n height: 16px;\n line-height: 16px;\n margin-left: 5px;\n text-align: center;\n border-radius: 2px;\n font-size: var(--font-size--2xs);\n font-weight: var(--font-weight--bold);\n color: var(--color--foreground--tint-2);\n}\n.minimize-icon[data-v-66c974d9] {\n font-size: 1.3em;\n margin-right: 0.5em;\n}\n.mode-selection-headline[data-v-66c974d9] {\n line-height: 1.8em;\n}\n.node-webhooks[data-v-66c974d9] {\n margin-left: 1em;\n}\n.url-field[data-v-66c974d9] {\n display: inline-block;\n width: calc(100% - 60px);\n margin-left: 55px;\n}\n.url-field-full-width[data-v-66c974d9] {\n display: inline-block;\n margin: 5px 10px;\n}\n.url-selection[data-v-66c974d9] {\n margin-top: var(--spacing--xs);\n}\n.minimize-button[data-v-66c974d9] {\n display: inline-block;\n transition-duration: 0.5s;\n transition-property: transform;\n}\n.expanded .minimize-button[data-v-66c974d9] {\n transform: rotate(90deg);\n}\n.webhook-url[data-v-66c974d9] {\n position: relative;\n top: 0;\n width: 100%;\n font-size: var(--font-size--2xs);\n white-space: normal;\n overflow: visible;\n text-overflow: initial;\n color: var(--color--text--shade-1);\n text-align: left;\n direction: ltr;\n word-break: break-all;\n}\n.webhook-wrapper[data-v-66c974d9] {\n line-height: 1.5;\n position: relative;\n margin-top: var(--spacing--xs);\n background-color: var(--color--foreground--tint-2);\n border-radius: 3px;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._component_13igc_123 {\n border-bottom: var(--border);\n}\n._title_13igc_127 {\n display: flex;\n align-items: center;\n padding: var(--spacing--2xs) var(--spacing--3xs) var(--spacing--2xs) var(--spacing--xs);\n border-bottom: var(--border);\n gap: var(--spacing--4xs);\n cursor: grab;\n}\n._disabled_13igc_135 ._title_13igc_127 {\n background-color: var(--color--foreground--tint-1);\n}\n._titleText_13igc_139 {\n min-width: 0;\n flex-grow: 1;\n flex-shrink: 1;\n font-weight: var(--font-weight--medium);\n font-size: var(--font-size--sm);\n overflow: hidden;\n /* Same amount of padding and negative margin for border to not be cut by overflow: hidden */\n padding: var(--spacing--2xs);\n margin: calc(-1 * var(--spacing--2xs));\n}\n._subTitleText_13igc_151 {\n width: 0;\n flex-grow: 100;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: var(--spacing--5xs);\n}\n._tabsContainer_13igc_160 {\n padding-top: var(--spacing--xs);\n padding-inline: var(--spacing--xs);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._component_1vh3g_123 {\n padding-block: var(--spacing--2xs);\n}\n._label_1vh3g_127 {\n padding: var(--spacing--3xs) var(--spacing--sm);\n text-transform: uppercase;\n}\n._option_1vh3g_132 {\n display: flex;\n align-items: center;\n padding: var(--spacing--3xs) var(--spacing--sm);\n gap: var(--spacing--2xs);\n cursor: pointer;\n}\n._option_1vh3g_132._selected_1vh3g_139, ._option_1vh3g_132:hover {\n background-color: var(--color--background);\n}\n._optionText_1vh3g_143 {\n flex-grow: 1;\n flex-shrink: 1;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._communityNodeActionsContainer_1mqmg_123 {\n display: flex;\n gap: var(--spacing--2xs);\n}\n._nodeIsNotValid_1mqmg_128 {\n height: 75%;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n line-height: var(--line-height--md);\n}\n._warningIcon_1mqmg_139 {\n color: var(--color--text--tint-2);\n font-size: var(--font-size--2xl);\n}\n._descriptionContainer_1mqmg_144 {\n display: flex;\n flex-direction: column;\n gap: var(--spacing--2xs);\n align-items: center;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._container_oei61_123 {\n font-weight: var(--font-weight--medium);\n display: flex;\n font-size: var(--font-size--md);\n margin-right: var(--spacing--sm);\n color: var(--color--text--shade-1);\n width: 100%;\n}\n._textWrapper_oei61_132 {\n display: flex;\n flex-grow: 1;\n}\n._iconWrapper_oei61_137 {\n display: inline-flex;\n margin-right: var(--spacing--2xs);\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n._header_l6e8w_123 {\n background-color: var(--ndv--header--color);\n}\n._featureRequest_l6e8w_127 {\n margin-top: auto;\n align-self: center;\n}\n._featureRequest_l6e8w_127 a {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing--4xs);\n margin-top: var(--spacing--xl);\n font-size: var(--font-size--2xs);\n font-weight: var(--font-weight--bold);\n color: var(--color--text--tint-1);\n}\n._uiBlockerNdvV2_l6e8w_141 {\n border-radius: 0;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n.node-settings[data-v-e00dba95] {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background-color: var(--ndv--background--color);\n height: 100%;\n width: 100%;\n}\n.node-settings .no-parameters[data-v-e00dba95] {\n margin-top: var(--spacing--xs);\n}\n.node-settings .header-side-menu[data-v-e00dba95] {\n padding: var(--spacing--sm) var(--spacing--sm) var(--spacing--sm) var(--spacing--sm);\n font-size: var(--font-size--lg);\n display: flex;\n justify-content: space-between;\n}\n.node-settings .header-side-menu .node-name[data-v-e00dba95] {\n padding-top: var(--spacing--5xs);\n margin-right: var(--spacing--sm);\n}\n.node-settings .node-parameters-wrapper[data-v-e00dba95] {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n padding: 0 var(--spacing--md) var(--spacing--lg) var(--spacing--md);\n flex-grow: 1;\n}\n.node-settings .node-parameters-wrapper.ndv-v2[data-v-e00dba95] {\n padding: 0 var(--spacing--sm) var(--spacing--lg) var(--spacing--sm);\n}\n.node-settings.embedded .node-parameters-wrapper[data-v-e00dba95] {\n padding: 0 var(--spacing--xs) var(--spacing--xs) var(--spacing--xs);\n}\n.node-settings.embedded .node-parameters-wrapper[data-v-e00dba95]:has(.action-tab) {\n padding: 0 0 var(--spacing--xs) 0;\n}\n.node-settings.embedded .node-parameters-wrapper.with-static-scrollbar[data-v-e00dba95] {\n padding: 0 var(--spacing--4xs) var(--spacing--xs) var(--spacing--xs);\n}\n.node-settings.embedded .node-parameters-wrapper.with-static-scrollbar[data-v-e00dba95]:has(.action-tab) {\n padding: 0 0 var(--spacing--xs) 0;\n}\n@supports not (selector(::-webkit-scrollbar)) {\n.node-settings.embedded .node-parameters-wrapper.with-static-scrollbar[data-v-e00dba95] {\n scrollbar-width: thin;\n}\n}\n@supports selector(::-webkit-scrollbar) {\n.node-settings.embedded .node-parameters-wrapper.with-static-scrollbar[data-v-e00dba95]::-webkit-scrollbar {\n width: var(--spacing--2xs);\n}\n.node-settings.embedded .node-parameters-wrapper.with-static-scrollbar[data-v-e00dba95]::-webkit-scrollbar-thumb {\n border-radius: var(--spacing--2xs);\n background: var(--color--foreground--shade-1);\n border: var(--spacing--5xs) solid var(--color--background--light-3);\n}\n}\n.node-settings.dragging[data-v-e00dba95] {\n border-color: var(--color--primary);\n box-shadow: 0 6px 16px rgba(255, 74, 51, 0.15);\n}\n.parameter-content[data-v-e00dba95] {\n font-size: 0.9em;\n margin-right: -15px;\n margin-left: -15px;\n}\n.parameter-content input[data-v-e00dba95] {\n width: calc(100% - 35px);\n padding: 5px;\n}\n.parameter-content select[data-v-e00dba95] {\n width: calc(100% - 20px);\n padding: 5px;\n}\n.parameter-content[data-v-e00dba95]:before {\n display: table;\n content: \" \";\n position: relative;\n box-sizing: border-box;\n clear: both;\n}\n.parameter-wrapper[data-v-e00dba95] {\n padding: 0 1em;\n}\n.color-reset-button-wrapper[data-v-e00dba95] {\n position: relative;\n}\n.color-reset-button[data-v-e00dba95] {\n position: absolute;\n right: 7px;\n top: -25px;\n}\n.node-version[data-v-e00dba95] {\n border-top: var(--border);\n font-size: var(--font-size--xs);\n font-size: var(--font-size--2xs);\n padding: var(--spacing--xs) 0 var(--spacing--2xs) 0;\n color: var(--color--text--tint-1);\n}\n.parameter-value input.expression[data-v-e00dba95] {\n border-style: dashed;\n border-color: #ff9600;\n display: inline-block;\n position: relative;\n width: 100%;\n box-sizing: border-box;\n background-color: #793300;\n}/* BEM support Func\n -------------------------- */\n/* Transition\n-------------------------- */\n/* Color\n-------------------------- */\n/* Link\n-------------------------- */\n/* Border\n-------------------------- */\n/* Outline\n-------------------------- */\n/* Box shadow\n-------------------------- */\n/* Fill\n-------------------------- */\n/* Typography\n-------------------------- */\n/* z-index\n-------------------------- */\n/* Disable base\n-------------------------- */\n/* Icon\n-------------------------- */\n/* Checkbox\n-------------------------- */\n/* Radio\n-------------------------- */\n/* Select\n-------------------------- */\n/* Alert\n-------------------------- */\n/* MessageBox\n-------------------------- */\n/* Message\n-------------------------- */\n/* Notification\n-------------------------- */\n/* Input\n-------------------------- */\n/* Cascader\n-------------------------- */\n/* Group\n-------------------------- */\n/* Tab\n-------------------------- */\n/* Button\n-------------------------- */\n/* cascader\n-------------------------- */\n/* Switch\n-------------------------- */\n/* Dialog\n-------------------------- */\n/* Table\n-------------------------- */\n/* Pagination\n-------------------------- */\n/* Popup\n-------------------------- */\n/* Popover\n-------------------------- */\n/* Tooltip\n-------------------------- */\n/* Tag\n-------------------------- */\n/* Tree\n-------------------------- */\n/* Dropdown\n-------------------------- */\n/* Badge\n-------------------------- */\n/* Card\n--------------------------*/\n/* Slider\n--------------------------*/\n/* Steps\n--------------------------*/\n/* Menu\n--------------------------*/\n/* Rate\n--------------------------*/\n/* DatePicker\n--------------------------*/\n/* Loading\n--------------------------*/\n/* Scrollbar\n--------------------------*/\n/* Carousel\n--------------------------*/\n/* Collapse\n--------------------------*/\n/* Transfer\n--------------------------*/\n/* Header\n --------------------------*/\n/* Footer\n--------------------------*/\n/* Main\n--------------------------*/\n/* Timeline\n--------------------------*/\n/* Backtop\n--------------------------*/\n/* Link\n--------------------------*/\n/* Calendar\n--------------------------*/\n/* Form\n-------------------------- */\n/* Avatar\n--------------------------*/\n/* Break-point\n--------------------------*/\n/* Break-points\n -------------------------- */\n/* Scrollbar\n -------------------------- */\n/* Placeholder\n -------------------------- */\n/* BEM\n -------------------------- */\n[data-has-output-connection=true] .ndv-connection-hint-notice {\n display: none;\n}/*$vite$:1*/";
document.head.appendChild(__vite_style__);
//#region src/app/components/FreeAiCreditsCallout.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$6 = {
key: 2
};
LANGCHAIN_NODES_PREFIX = "@n8n/n8n-nodes-langchain.";
N8N_NODES_PREFIX = "@n8n/n8n-nodes.";
FreeAiCreditsCallout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "FreeAiCreditsCallout",
props: {
credentialTypeName: {}
},
setup(__props) {
const props = __props;
const NODES_WITH_OPEN_AI_API_CREDENTIAL = [`${LANGCHAIN_NODES_PREFIX}openAi`, `${LANGCHAIN_NODES_PREFIX}embeddingsOpenAi`, `${LANGCHAIN_NODES_PREFIX}lmChatOpenAi`, `${N8N_NODES_PREFIX}openAi`];
const showSuccessCallout = ref(false);
const claimingCredits = ref(false);
const settingsStore = useSettingsStore();
const credentialsStore = useCredentialsStore();
const usersStore = useUsersStore();
const ndvStore = useNDVStore();
const projectsStore = useProjectsStore();
const telemetry = useTelemetry();
const i18n = useI18n();
const toast = useToast();
const userHasOpenAiCredentialAlready = computed(() => !!credentialsStore.allCredentials.filter(credential => credential.type === OPEN_AI_API_CREDENTIAL_TYPE).length);
const isEditingOpenAiCredential = computed(() => props.credentialTypeName && props.credentialTypeName === "openAiApi");
const userHasClaimedAiCreditsAlready = computed(() => !!usersStore.currentUser?.settings?.userClaimedAiCredits);
const activeNodeHasOpenAiApiCredential = computed(() => ndvStore.activeNode?.type && NODES_WITH_OPEN_AI_API_CREDENTIAL.includes(ndvStore.activeNode.type));
const userCanClaimOpenAiCredits = computed(() => {
return settingsStore.isAiCreditsEnabled && (activeNodeHasOpenAiApiCredential.value || isEditingOpenAiCredential.value) && !userHasOpenAiCredentialAlready.value && !userHasClaimedAiCreditsAlready.value;
});
const onClaimCreditsClicked = async () => {
claimingCredits.value = true;
try {
await credentialsStore.claimFreeAiCredits(projectsStore.currentProject?.id);
if (usersStore?.currentUser?.settings) usersStore.currentUser.settings.userClaimedAiCredits = true;
telemetry.track("User claimed OpenAI credits");
showSuccessCallout.value = true;
} catch (e) {
toast.showError(e, i18n.baseText("freeAi.credits.showError.claim.title"), i18n.baseText("freeAi.credits.showError.claim.message"));
} finally {
claimingCredits.value = false;
}
};
return (_ctx, _cache) => {
return userCanClaimOpenAiCredits.value && !showSuccessCallout.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "secondary",
icon: "circle-alert",
class: "mt-xs"
}, {
trailingContent: withCtx(() => [createVNode(unref(N8nButton_default), {
type: "tertiary",
size: "small",
label: unref(i18n).baseText("freeAi.credits.callout.claim.button.label"),
loading: claimingCredits.value,
onClick: onClaimCreditsClicked
}, null, 8, ["label", "loading"])]),
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("freeAi.credits.callout.claim.title", {
interpolate: {
credits: unref(settingsStore).aiCreditsQuota
}
})) + " ", 1)]),
_: 1
})) : showSuccessCallout.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 1,
theme: "success",
icon: "circle-check",
class: "mt-xs"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), {
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("freeAi.credits.callout.success.title.part1", {
interpolate: {
credits: unref(settingsStore).aiCreditsQuota
}
})), 1)]),
_: 1
}), _cache[0] || (_cache[0] = createTextVNode(" \xA0 ")), createVNode(unref(N8nText_default), {
size: "small",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("freeAi.credits.callout.success.title.part2")), 1)]),
_: 1
})]),
_: 1
})) : (openBlock(), createElementBlock("div", _hoisted_1$6));
};
}
}); //#endregion
//#region src/app/components/FreeAiCreditsCallout.vue
_export("r", FreeAiCreditsCallout_default = FreeAiCreditsCallout_vue_vue_type_script_setup_true_lang_default); //#endregion
//#region ../../../node_modules/.pnpm/@vueuse+components@10.11.0_vue@3.5.13_typescript@5.9.2_/node_modules/@vueuse/components/index.mjs
OnClickOutside = /* @__PURE__ */defineComponent({
name: "OnClickOutside",
props: ["as", "options"],
emits: ["trigger"],
setup(props, {
slots,
emit
}) {
const target = ref();
onClickOutside(target, e => {
emit("trigger", e);
}, props.options);
return () => {
if (slots.default) return h(props.as || "div", {
ref: target
}, slots.default());
};
}
});
defaultWindow = isClient ? window : void 0;
_iOSWorkaround = false;
vOnClickOutside = {
[directiveHooks.mounted](el, binding) {
const capture = !binding.modifiers.bubble;
if (typeof binding.value === "function") el.__onClickOutside_stop = onClickOutside$1(el, binding.value, {
capture
});else {
const [handler, options] = binding.value;
el.__onClickOutside_stop = onClickOutside$1(el, handler, Object.assign({
capture
}, options));
}
},
[directiveHooks.unmounted](el) {
el.__onClickOutside_stop();
}
};
vOnKeyStroke = {
[directiveHooks.mounted](el, binding) {
var _a, _b;
const keys = (_b = (_a = binding.arg) == null ? void 0 : _a.split(",")) != null ? _b : true;
if (typeof binding.value === "function") onKeyStroke(keys, binding.value, {
target: el
});else {
const [handler, options] = binding.value;
onKeyStroke(keys, handler, {
target: el,
...options
});
}
}
};
DEFAULT_DELAY = 500;
DEFAULT_THRESHOLD = 10;
vOnLongPress = {
[directiveHooks.mounted](el, binding) {
if (typeof binding.value === "function") onLongPress(el, binding.value, {
modifiers: binding.modifiers
});else onLongPress(el, ...binding.value);
}
};
vElementHover = {
[directiveHooks.mounted](el, binding) {
if (typeof binding.value === "function") watch(useElementHover(el), v => binding.value(v));
}
};
vElementSize = {
[directiveHooks.mounted](el, binding) {
var _a;
const handler = typeof binding.value === "function" ? binding.value : (_a = binding.value) == null ? void 0 : _a[0];
const {
width,
height
} = useElementSize$1(el, ...(typeof binding.value === "function" ? [] : binding.value.slice(1)));
watch([width, height], ([width2, height2]) => handler({
width: width2,
height: height2
}));
}
};
vElementVisibility = {
[directiveHooks.mounted](el, binding) {
if (typeof binding.value === "function") {
const handler = binding.value;
watch(useElementVisibility$1(el), v => handler(v), {
immediate: true
});
} else {
const [handler, options] = binding.value;
watch(useElementVisibility$1(el, options), v => handler(v), {
immediate: true
});
}
}
};
ARRIVED_STATE_THRESHOLD_PIXELS = 1;
vInfiniteScroll = {
[directiveHooks.mounted](el, binding) {
if (typeof binding.value === "function") useInfiniteScroll(el, binding.value);else useInfiniteScroll(el, ...binding.value);
}
};
vIntersectionObserver = {
[directiveHooks.mounted](el, binding) {
if (typeof binding.value === "function") useIntersectionObserver(el, binding.value);else useIntersectionObserver(el, ...binding.value);
}
};
vScroll = {
[directiveHooks.mounted](el, binding) {
if (typeof binding.value === "function") {
const handler = binding.value;
const state = useScroll(el, {
onScroll() {
handler(state);
},
onStop() {
handler(state);
}
});
} else {
const [handler, options] = binding.value;
const state = useScroll(el, {
...options,
onScroll(e) {
var _a;
(_a = options.onScroll) == null || _a.call(options, e);
handler(state);
},
onStop(e) {
var _a;
(_a = options.onStop) == null || _a.call(options, e);
handler(state);
}
});
}
}
};
elInitialOverflow = /* @__PURE__ */new WeakMap();
vScrollLock = onScrollLock(); //#endregion
//#region src/features/ndv/panel/components/NDVSubConnections.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$5 = ["data-test-id"];
_hoisted_2$4 = ["textContent"];
_hoisted_3$2 = ["onClick"];
_hoisted_4$2 = ["onClick"];
_hoisted_5$2 = ["data-node-name"];
_hoisted_6$1 = ["onClick"];
NDVSubConnections_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NDVSubConnections",
props: {
rootNode: {}
},
emits: ["switchSelectedNode", "openConnectionNodeCreator"],
setup(__props, {
expose: __expose,
emit: __emit
}) {
const props = __props;
const workflowsStore = useWorkflowsStore();
const nodeTypesStore = useNodeTypesStore();
const nodeHelpers = useNodeHelpers();
const i18n = useI18n();
const {
debounce
} = useDebounce();
const emit = __emit;
const possibleConnections = ref([]);
const expandedGroups = ref([]);
const shouldShowNodeInputIssues = ref(false);
const nodeType = computed(() => nodeTypesStore.getNodeType(props.rootNode.type, props.rootNode.typeVersion));
const nodeData = computed(() => workflowsStore.getNodeByName(props.rootNode.name));
const ndvStore = useNDVStore();
const workflowObject = computed(() => workflowsStore.workflowObject);
const nodeInputIssues = computed(() => {
return nodeHelpers.getNodeIssues(nodeType.value, props.rootNode, workflowObject.value, ["typeUnknown", "parameters", "credentials", "execution"])?.input ?? {};
});
const connectedNodes$1 = computed(() => {
const typeIndexCounters = {};
return possibleConnections.value.reduce((acc, connection) => {
const typeIndex = typeIndexCounters[connection.type] ?? 0;
typeIndexCounters[connection.type] = typeIndex + 1;
const nodes = getINodesFromNames(((workflowObject.value.connectionsByDestinationNode[props.rootNode.name]?.[connection.type] ?? [])[typeIndex] ?? []).map(conn => conn.node));
const connectionKey = `${connection.type}-${typeIndex}`;
return {
...acc,
[connectionKey]: nodes
};
}, {});
});
function getConnectionContext(connection, globalIndex) {
let typeIndex = 0;
for (let i = 0; i < globalIndex; i++) if (possibleConnections.value[i].type === connection.type) typeIndex++;
return {
connectionType: connection.type,
typeIndex,
key: `${connection.type}-${typeIndex}`
};
}
function getConnectionKey(connection, globalIndex) {
return getConnectionContext(connection, globalIndex).key;
}
function getConnectionConfig(connectionType$1, typeIndex) {
return possibleConnections.value.filter(connection => connection.type === connectionType$1).at(typeIndex);
}
function isMultiConnection(connectionContext) {
return getConnectionConfig(connectionContext.connectionType, connectionContext.typeIndex)?.maxConnections !== 1;
}
function shouldShowConnectionTooltip(connectionContext) {
return isMultiConnection(connectionContext) && !expandedGroups.value.includes(connectionContext.connectionType);
}
function expandConnectionGroup(connectionContext, isExpanded) {
if (!isMultiConnection(connectionContext)) return;
if (isExpanded) expandedGroups.value = [...expandedGroups.value, connectionContext.connectionType];else expandedGroups.value = expandedGroups.value.filter(g => g !== connectionContext.connectionType);
}
function getINodesFromNames(names) {
return names.map(name => {
const node = workflowsStore.getNodeByName(name);
if (node) {
const matchedNodeType = nodeTypesStore.getNodeType(node.type);
if (matchedNodeType) {
const issues = nodeHelpers.getNodeIssues(matchedNodeType, node, workflowObject.value);
return {
node,
nodeType: matchedNodeType,
issues: issues ? nodeHelpers.nodeIssuesToString(issues, node) : ""
};
}
}
return null;
}).filter(n => n !== null);
}
function hasInputIssues(connectionContext) {
return shouldShowNodeInputIssues.value && (nodeInputIssues.value[connectionContext.connectionType] ?? []).length > 0;
}
function isNodeInputConfiguration(connectionConfig) {
if (typeof connectionConfig === "string") return false;
return "type" in connectionConfig;
}
function getPossibleSubInputConnections() {
if (!nodeType.value || !props.rootNode) return [];
return getNodeInputs(workflowObject.value, props.rootNode, nodeType.value).filter(input => {
if (!isNodeInputConfiguration(input)) return false;
return input.type !== "main";
});
}
function onNodeClick(nodeName, connectionContext) {
if (isMultiConnection(connectionContext) && !expandedGroups.value.includes(connectionContext.connectionType)) {
expandConnectionGroup(connectionContext, true);
return;
}
emit("switchSelectedNode", nodeName);
}
function onPlusClick(connectionContext) {
const connectionNodes = connectedNodes$1.value[connectionContext.key];
if (isMultiConnection(connectionContext) && !expandedGroups.value.includes(connectionContext.connectionType) && connectionNodes.length >= 1) {
expandConnectionGroup(connectionContext, true);
return;
}
emit("openConnectionNodeCreator", props.rootNode.name, connectionContext.connectionType, connectionContext.typeIndex);
}
function showNodeInputsIssues() {
shouldShowNodeInputIssues.value = false;
setTimeout(() => {
shouldShowNodeInputIssues.value = true;
}, 0);
}
watch([nodeData, ndvStore.activeNode], debounce(() => setTimeout(() => {
expandedGroups.value = [];
possibleConnections.value = getPossibleSubInputConnections();
}, 0), {
debounceTime: 1e3
}), {
immediate: true
});
__expose({
showNodeInputsIssues
});
return (_ctx, _cache) => {
return possibleConnections.value.length ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.container)
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.connections),
style: normalizeStyle(`--possible-connections: ${possibleConnections.value.length}`)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(possibleConnections.value, (connection, index) => {
return openBlock(), createElementBlock("div", {
key: getConnectionKey(connection, index),
"data-test-id": `subnode-connection-group-${getConnectionKey(connection, index)}`
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.connectionType)
}, [createBaseVNode("span", {
class: normalizeClass({
[_ctx.$style.connectionLabel]: true,
[_ctx.$style.hasIssues]: hasInputIssues(getConnectionContext(connection, index))
}),
textContent: toDisplayString(`${connection.displayName}${connection.required ? " *" : ""}`)
}, null, 10, _hoisted_2$4), createVNode(unref(OnClickOutside), {
onTrigger: $event => expandConnectionGroup(getConnectionContext(connection, index), false)
}, {
default: withCtx(() => [createBaseVNode("div", {
ref_for: true,
ref: "connectedNodesWrapper",
class: normalizeClass({
[_ctx.$style.connectedNodesWrapper]: true,
[_ctx.$style.connectedNodesWrapperExpanded]: expandedGroups.value.includes(connection.type)
}),
style: normalizeStyle(`--nodes-length: ${connectedNodes$1.value[getConnectionKey(connection, index)].length}`),
onClick: $event => expandConnectionGroup(getConnectionContext(connection, index), true)
}, [(connectedNodes$1.value[getConnectionKey(connection, index)].length >= 1 ? connection.maxConnections !== 1 : true) ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass({
[_ctx.$style.plusButton]: true,
[_ctx.$style.hasIssues]: hasInputIssues(getConnectionContext(connection, index))
}),
onClick: $event => onPlusClick(getConnectionContext(connection, index))
}, [createVNode(unref(N8nTooltip_default), {
placement: "top",
teleported: true,
offset: 10,
"show-after": 300,
disabled: shouldShowConnectionTooltip(getConnectionContext(connection, index)) && connectedNodes$1.value[getConnectionKey(connection, index)].length >= 1
}, {
content: withCtx(() => [createTextVNode(" Add " + toDisplayString(connection.displayName) + " ", 1), hasInputIssues(getConnectionContext(connection, index)) ? (openBlock(), createBlock(TitledList_default, {
key: 0,
title: `${unref(i18n).baseText("node.issues")}:`,
items: nodeInputIssues.value[connection.type]
}, null, 8, ["title", "items"])) : createCommentVNode("", true)]),
default: withCtx(() => [createVNode(unref(N8nIconButton_default), {
size: "medium",
icon: "plus",
type: "tertiary",
"data-test-id": `add-subnode-${getConnectionKey(connection, index)}`
}, null, 8, ["data-test-id"])]),
_: 2
}, 1032, ["disabled"])], 10, _hoisted_4$2)) : createCommentVNode("", true), connectedNodes$1.value[getConnectionKey(connection, index)].length > 0 ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass({
[_ctx.$style.connectedNodes]: true,
[_ctx.$style.connectedNodesMultiple]: connectedNodes$1.value[getConnectionKey(connection, index)].length > 1
})
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(connectedNodes$1.value[getConnectionKey(connection, index)], (node, nodeIndex) => {
return openBlock(), createElementBlock("div", {
key: node.node.name,
class: normalizeClass({
[_ctx.$style.nodeWrapper]: true,
[_ctx.$style.hasIssues]: node.issues
}),
"data-test-id": "floating-subnode",
"data-node-name": node.node.name,
style: normalizeStyle(`--node-index: ${nodeIndex}`)
}, [(openBlock(), createBlock(unref(N8nTooltip_default), {
key: node.node.name,
placement: "top",
teleported: true,
offset: 10,
"show-after": 300,
disabled: shouldShowConnectionTooltip(getConnectionContext(connection, index))
}, {
content: withCtx(() => [createTextVNode(toDisplayString(node.node.name) + " ", 1), node.issues ? (openBlock(), createBlock(TitledList_default, {
key: 0,
title: `${unref(i18n).baseText("node.issues")}:`,
items: node.issues
}, null, 8, ["title", "items"])) : createCommentVNode("", true)]),
default: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.connectedNode),
onClick: $event => onNodeClick(node.node.name, getConnectionContext(connection, index))
}, [createVNode(NodeIcon_default, {
"node-type": node.nodeType,
"node-name": node.node.name,
"tooltip-position": "top",
size: 20,
circle: ""
}, null, 8, ["node-type", "node-name"])], 10, _hoisted_6$1)]),
_: 2
}, 1032, ["disabled"]))], 14, _hoisted_5$2);
}), 128))], 2)) : createCommentVNode("", true)], 14, _hoisted_3$2)]),
_: 2
}, 1032, ["onTrigger"])], 2)], 8, _hoisted_1$5);
}), 128))], 6)], 2)) : createCommentVNode("", true);
};
}
}); //#endregion
//#region src/features/ndv/panel/components/NDVSubConnections.vue?vue&type=style&index=0&lang.module.scss
container$1 = "_container_1kr6k_140";
connections = "_connections_1kr6k_148";
connectionType = "_connectionType_1kr6k_161";
connectionLabel = "_connectionLabel_1kr6k_168";
hasIssues = "_hasIssues_1kr6k_174";
connectedNodesWrapper = "_connectedNodesWrapper_1kr6k_178";
plusButton = "_plusButton_1kr6k_186";
connectedNodesWrapperExpanded = "_connectedNodesWrapperExpanded_1kr6k_204";
connectedNodesMultiple = "_connectedNodesMultiple_1kr6k_210";
connectedNode = "_connectedNode_1kr6k_178";
connectedNodes = "_connectedNodes_1kr6k_178";
nodeWrapper = "_nodeWrapper_1kr6k_249";
NDVSubConnections_vue_vue_type_style_index_0_lang_module_default = {
container: container$1,
connections,
connectionType,
connectionLabel,
hasIssues,
connectedNodesWrapper,
plusButton,
"horizontal-shake": "_horizontal-shake_1kr6k_1",
connectedNodesWrapperExpanded,
connectedNodesMultiple,
connectedNode,
connectedNodes,
nodeWrapper
}; //#endregion
//#region src/features/ndv/panel/components/NDVSubConnections.vue
cssModules$6 = {
"$style": NDVSubConnections_vue_vue_type_style_index_0_lang_module_default
};
NDVSubConnections_default = /* @__PURE__ */__plugin_vue_export_helper_default(NDVSubConnections_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$6]]); //#endregion
//#region src/app/composables/useNodeDocsUrl.ts
_export("n", useNodeDocsUrl = ({
nodeType: nodeTypeRef
}) => {
const packageName = computed(() => toValue(nodeTypeRef)?.name.split(".")[0] ?? "");
const isCommunityNode = computed(() => {
const nodeType = toValue(nodeTypeRef);
if (nodeType) return isCommunityPackageName(nodeType.name);
return false;
});
return {
docsUrl: computed(() => {
const nodeType = toValue(nodeTypeRef);
if (!nodeType) return "";
if (nodeType.documentationUrl?.startsWith("http")) return nodeType.documentationUrl;
const utmParams = new URLSearchParams({
utm_source: "n8n_app",
utm_medium: "node_settings_modal-credential_link",
utm_campaign: nodeType.name
});
const primaryDocUrl = nodeType.codex?.resources?.primaryDocumentation?.[0]?.url;
if (primaryDocUrl) return `${primaryDocUrl}?${utmParams.toString()}`;
if (isCommunityNode.value) return `${NPM_PACKAGE_DOCS_BASE_URL}${packageName.value}`;
return `${BUILTIN_NODES_DOCS_URL}?${utmParams.toString()}`;
})
};
}); //#endregion
//#region src/features/ndv/settings/components/NodeSettingsTabs.vue?vue&type=script&setup=true&lang.ts
NodeSettingsTabs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeSettingsTabs",
props: {
modelValue: {
default: "params"
},
nodeType: {
default: void 0
},
pushRef: {
default: ""
},
hideDocs: {
type: Boolean
},
tabsVariant: {
default: void 0
},
includeAction: {
type: Boolean
},
includeCredential: {
type: Boolean
},
hasCredentialIssue: {
type: Boolean,
default: false
},
compact: {
type: Boolean
}
},
emits: ["update:model-value"],
setup(__props, {
emit: __emit
}) {
const props = __props;
const emit = __emit;
const externalHooks = useExternalHooks();
const ndvStore = useNDVStore();
const workflowsStore = useWorkflowsStore();
const i18n = useI18n();
const telemetry = useTelemetry();
const {
docsUrl
} = useNodeDocsUrl({
nodeType: () => props.nodeType
});
const activeNode = computed(() => ndvStore.activeNode);
const {
installedPackage,
isCommunityNode,
isUpdateCheckAvailable
} = useInstalledCommunityPackage(computed(() => props.nodeType?.name));
const packageName = computed(() => props.nodeType?.name.split(".")[0] ?? "");
const documentationUrl = computed(() => {
if (props.hideDocs) return "";
return docsUrl.value;
});
const options = computed(() => {
const ret = [];
if (props.includeAction) ret.push({
label: i18n.baseText("nodeSettings.action"),
value: "action"
});
if (props.includeCredential) ret.push({
label: i18n.baseText("nodeSettings.credential"),
value: "credential",
...(props.hasCredentialIssue && {
icon: "triangle-alert",
iconPosition: "right",
variant: "danger"
})
});
ret.push({
label: i18n.baseText(props.compact ? "nodeSettings.parametersShort" : "nodeSettings.parameters"),
value: "params"
}, {
value: "settings",
notification: isUpdateCheckAvailable.value && installedPackage.value?.updateAvailable ? true : void 0,
...(props.compact ? {
icon: "settings",
align: "right",
tooltip: i18n.baseText("nodeSettings.settings")
} : {
label: i18n.baseText("nodeSettings.settings")
})
});
if (isCommunityNode.value) ret.push({
icon: "box",
value: "communityNode",
align: "right",
tooltip: i18n.baseText("generic.communityNode.tooltip", {
interpolate: {
docUrl: COMMUNITY_NODES_INSTALLATION_DOCS_URL,
packageName: packageName.value
}
})
});
if (documentationUrl.value) ret.push({
value: "docs",
href: documentationUrl.value,
align: "right",
...(props.compact ? {
icon: "book-open",
tooltip: i18n.baseText("nodeSettings.docs")
} : {
label: i18n.baseText("nodeSettings.docs")
})
});
return ret;
});
function onTabSelect(tab) {
if (tab === "docs" && props.nodeType) {
externalHooks.run("dataDisplay.onDocumentationUrlClick", {
nodeType: props.nodeType,
documentationUrl: documentationUrl.value
});
telemetry.track("User clicked ndv link", {
node_type: activeNode.value?.type,
workflow_id: workflowsStore.workflowId,
push_ref: props.pushRef,
pane: NodeConnectionTypes.Main,
type: "docs"
});
}
if (tab === "settings" && props.nodeType) telemetry.track("User viewed node settings", {
node_type: props.nodeType.name,
workflow_id: workflowsStore.workflowId
});
if (tab === "settings" || tab === "params" || tab === "action" || tab === "credential") emit("update:model-value", tab);
}
function onTooltipClick(tab, event) {
if (tab === "communityNode" && event.target.localName === "a") telemetry.track("user clicked cnr docs link", {
source: "node details view"
});
}
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(N8nTabs_default), {
options: options.value,
"model-value": _ctx.modelValue,
variant: _ctx.tabsVariant,
size: _ctx.compact ? "small" : "medium",
"onUpdate:modelValue": onTabSelect,
onTooltipClick
}, null, 8, ["options", "model-value", "variant", "size"]);
};
}
}); //#endregion
//#region src/features/ndv/settings/components/NodeSettingsTabs.vue
NodeSettingsTabs_default = NodeSettingsTabs_vue_vue_type_script_setup_true_lang_default; //#endregion
//#region src/features/ndv/settings/components/NodeSettingsHeader.vue?vue&type=script&setup=true&lang.ts
NodeSettingsHeader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeSettingsHeader",
props: {
nodeName: {},
hideExecute: {
type: Boolean
},
hideDocs: {
type: Boolean
},
hideTabs: {
type: Boolean
},
disableExecute: {
type: Boolean
},
executeButtonTooltip: {},
selectedTab: {},
nodeType: {},
pushRef: {}
},
emits: ["execute", "stop-execution", "value-changed", "tab-changed"],
setup(__props, {
emit: __emit
}) {
const emit = __emit;
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.header)
}, [!_ctx.hideTabs ? (openBlock(), createBlock(NodeSettingsTabs_default, {
key: 0,
"hide-docs": _ctx.hideDocs,
"model-value": _ctx.selectedTab,
"node-type": _ctx.nodeType,
"push-ref": _ctx.pushRef,
class: normalizeClass(_ctx.$style.tabs),
"tabs-variant": "modern",
"onUpdate:modelValue": _cache[0] || (_cache[0] = $event => emit("tab-changed", $event))
}, null, 8, ["hide-docs", "model-value", "node-type", "push-ref", "class"])) : createCommentVNode("", true), !_ctx.hideExecute ? (openBlock(), createBlock(NodeExecuteButton_default, {
key: 1,
"data-test-id": "node-execute-button",
"node-name": _ctx.nodeName,
disabled: _ctx.disableExecute,
tooltip: _ctx.executeButtonTooltip,
class: normalizeClass(_ctx.$style.execute),
size: "small",
"telemetry-source": "parameters",
onExecute: _cache[1] || (_cache[1] = $event => emit("execute")),
onStopExecution: _cache[2] || (_cache[2] = $event => emit("stop-execution")),
onValueChanged: _cache[3] || (_cache[3] = $event => emit("value-changed", $event))
}, null, 8, ["node-name", "disabled", "tooltip", "class"])) : createCommentVNode("", true)], 2);
};
}
}); //#endregion
//#region src/features/ndv/settings/components/NodeSettingsHeader.vue?vue&type=style&index=0&lang.module.scss
header$1 = "_header_qhhug_123";
execute = "_execute_qhhug_131";
tabs = "_tabs_qhhug_135";
NodeSettingsHeader_vue_vue_type_style_index_0_lang_module_default = {
header: header$1,
execute,
tabs
}; //#endregion
//#region src/features/ndv/settings/components/NodeSettingsHeader.vue
cssModules$5 = {
"$style": NodeSettingsHeader_vue_vue_type_style_index_0_lang_module_default
};
NodeSettingsHeader_default = /* @__PURE__ */__plugin_vue_export_helper_default(NodeSettingsHeader_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$5]]); //#endregion
//#region src/features/ndv/settings/components/NodeWebhooks.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$4 = {
key: 0,
class: "webhooks"
};
_hoisted_2$3 = ["title"];
_hoisted_3$1 = {
key: 0,
class: "node-webhooks"
};
_hoisted_4$1 = {
key: 0,
class: "url-selection"
};
_hoisted_5$1 = {
key: 0,
class: "webhook-wrapper"
};
_hoisted_6 = {
class: "http-field"
};
_hoisted_7 = {
class: "http-method"
};
_hoisted_8 = {
class: "url-field"
};
_hoisted_9 = ["onClick"];
_hoisted_10 = {
key: 1,
class: "webhook-wrapper"
};
_hoisted_11 = {
class: "url-field-full-width"
};
_hoisted_12 = ["onClick"];
NodeWebhooks_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeWebhooks",
props: {
node: {},
nodeTypeDescription: {}
},
setup(__props) {
const props = __props;
const clipboard = useClipboard();
const workflowHelpers = useWorkflowHelpers();
const toast = useToast();
const i18n = useI18n();
const telemetry = useTelemetry();
const isMinimized = ref(props.nodeTypeDescription && !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(props.nodeTypeDescription.name));
const showUrlFor = ref("test");
const isProductionOnly = computed(() => {
return props.nodeTypeDescription && PRODUCTION_ONLY_TRIGGER_NODE_TYPES.includes(props.nodeTypeDescription.name);
});
const urlOptions = computed(() => [...(isProductionOnly.value ? [] : [{
label: baseText.value.testUrl,
value: "test"
}]), {
label: baseText.value.productionUrl,
value: "production"
}]);
const visibleWebhookUrls = computed(() => {
return webhooksNode.value.filter(webhook => {
if (typeof webhook.ndvHideUrl === "string") return !workflowHelpers.getWebhookExpressionValue(webhook, "ndvHideUrl");
return !webhook.ndvHideUrl;
});
});
const webhooksNode = computed(() => {
if (props.nodeTypeDescription?.webhooks === void 0) return [];
return props.nodeTypeDescription.webhooks.filter(webhookData => webhookData.restartWebhook !== true);
});
const baseText = computed(() => {
switch (props.nodeTypeDescription?.name) {
case CHAT_TRIGGER_NODE_TYPE:
return {
toggleTitle: i18n.baseText("nodeWebhooks.webhookUrls.chatTrigger"),
clickToDisplay: i18n.baseText("nodeWebhooks.clickToDisplayWebhookUrls.formTrigger"),
clickToHide: i18n.baseText("nodeWebhooks.clickToHideWebhookUrls.chatTrigger"),
clickToCopy: i18n.baseText("nodeWebhooks.clickToCopyWebhookUrls.chatTrigger"),
testUrl: i18n.baseText("nodeWebhooks.testUrl"),
productionUrl: i18n.baseText("nodeWebhooks.productionUrl"),
copyTitle: i18n.baseText("nodeWebhooks.showMessage.title.chatTrigger"),
copyMessage: i18n.baseText("nodeWebhooks.showMessage.message.chatTrigger")
};
case FORM_TRIGGER_NODE_TYPE:
return {
toggleTitle: i18n.baseText("nodeWebhooks.webhookUrls.formTrigger"),
clickToDisplay: i18n.baseText("nodeWebhooks.clickToDisplayWebhookUrls.formTrigger"),
clickToHide: i18n.baseText("nodeWebhooks.clickToHideWebhookUrls.formTrigger"),
clickToCopy: i18n.baseText("nodeWebhooks.clickToCopyWebhookUrls.formTrigger"),
testUrl: i18n.baseText("nodeWebhooks.testUrl"),
productionUrl: i18n.baseText("nodeWebhooks.productionUrl"),
copyTitle: i18n.baseText("nodeWebhooks.showMessage.title.formTrigger"),
copyMessage: i18n.baseText("nodeWebhooks.showMessage.message.formTrigger")
};
case MCP_TRIGGER_NODE_TYPE:
return {
toggleTitle: i18n.baseText("nodeWebhooks.webhookUrls.mcpTrigger"),
clickToDisplay: i18n.baseText("nodeWebhooks.clickToDisplayWebhookUrls.mcpTrigger"),
clickToHide: i18n.baseText("nodeWebhooks.clickToHideWebhookUrls.mcpTrigger"),
clickToCopy: i18n.baseText("nodeWebhooks.clickToCopyWebhookUrls.mcpTrigger"),
testUrl: i18n.baseText("nodeWebhooks.testUrl"),
productionUrl: i18n.baseText("nodeWebhooks.productionUrl"),
copyTitle: i18n.baseText("nodeWebhooks.showMessage.title.mcpTrigger"),
copyMessage: void 0
};
default:
return {
toggleTitle: i18n.baseText("nodeWebhooks.webhookUrls"),
clickToDisplay: i18n.baseText("nodeWebhooks.clickToDisplayWebhookUrls"),
clickToHide: i18n.baseText("nodeWebhooks.clickToHideWebhookUrls"),
clickToCopy: i18n.baseText("nodeWebhooks.clickToCopyWebhookUrls"),
testUrl: i18n.baseText("nodeWebhooks.testUrl"),
productionUrl: i18n.baseText("nodeWebhooks.productionUrl"),
copyTitle: i18n.baseText("nodeWebhooks.showMessage.title"),
copyMessage: void 0
};
}
});
function copyWebhookUrl(webhookData) {
const webhookUrl = getWebhookUrlDisplay(webhookData);
clipboard.copy(webhookUrl);
toast.showMessage({
title: baseText.value.copyTitle,
message: baseText.value.copyMessage,
type: "success"
});
telemetry.track("User copied webhook URL", {
pane: "parameters",
type: `${showUrlFor.value} url`
});
}
function getWebhookUrlDisplay(webhookData) {
if (props.node) return workflowHelpers.getWebhookUrl(webhookData, props.node, isProductionOnly.value ? "production" : showUrlFor.value);
return "";
}
function isWebhookMethodVisible(webhook) {
try {
const method = workflowHelpers.getWebhookExpressionValue(webhook, "httpMethod", false);
if (Array.isArray(method) && method.length !== 1) return false;
} catch (error) {}
if (typeof webhook.ndvHideMethod === "string") return !workflowHelpers.getWebhookExpressionValue(webhook, "ndvHideMethod");
return !webhook.ndvHideMethod;
}
function getWebhookHttpMethod(webhook) {
const method = workflowHelpers.getWebhookExpressionValue(webhook, "httpMethod", false);
if (Array.isArray(method)) return method[0];
return method;
}
watch(() => props.node, () => {
isMinimized.value = props.nodeTypeDescription && !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(props.nodeTypeDescription.name);
});
return (_ctx, _cache) => {
return webhooksNode.value.length && visibleWebhookUrls.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$4, [createBaseVNode("div", {
class: normalizeClass(["clickable headline", {
expanded: !isMinimized.value
}]),
title: isMinimized.value ? baseText.value.clickToDisplay : baseText.value.clickToHide,
onClick: _cache[0] || (_cache[0] = $event => isMinimized.value = !isMinimized.value)
}, [createVNode(unref(N8nIcon_default), {
icon: "chevron-right",
class: "minimize-button minimize-icon"
}), createTextVNode(" " + toDisplayString(baseText.value.toggleTitle), 1)], 10, _hoisted_2$3), createVNode(unref(ElCollapseTransition), null, {
default: withCtx(() => [!isMinimized.value ? (openBlock(), createElementBlock("div", _hoisted_3$1, [!isProductionOnly.value ? (openBlock(), createElementBlock("div", _hoisted_4$1, [createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 24
}, {
default: withCtx(() => [createVNode(unref(N8nRadioButtons_default), {
modelValue: showUrlFor.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = $event => showUrlFor.value = $event),
options: urlOptions.value
}, null, 8, ["modelValue", "options"])]),
_: 1
})]),
_: 1
})])) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(visibleWebhookUrls.value, (webhook, index) => {
return openBlock(), createBlock(unref(N8nTooltip_default), {
key: index,
class: "item",
content: baseText.value.clickToCopy,
placement: "left"
}, {
default: withCtx(() => [isWebhookMethodVisible(webhook) ? (openBlock(), createElementBlock("div", _hoisted_5$1, [createBaseVNode("div", _hoisted_6, [createBaseVNode("div", _hoisted_7, [createTextVNode(toDisplayString(getWebhookHttpMethod(webhook)), 1), _cache[2] || (_cache[2] = createBaseVNode("br", null, null, -1))])]), createBaseVNode("div", _hoisted_8, [createBaseVNode("div", {
class: "webhook-url left-ellipsis clickable",
onClick: $event => copyWebhookUrl(webhook)
}, [createTextVNode(toDisplayString(getWebhookUrlDisplay(webhook)), 1), _cache[3] || (_cache[3] = createBaseVNode("br", null, null, -1))], 8, _hoisted_9)])])) : (openBlock(), createElementBlock("div", _hoisted_10, [createBaseVNode("div", _hoisted_11, [createBaseVNode("div", {
class: "webhook-url left-ellipsis clickable",
onClick: $event => copyWebhookUrl(webhook)
}, [createTextVNode(toDisplayString(getWebhookUrlDisplay(webhook)), 1), _cache[4] || (_cache[4] = createBaseVNode("br", null, null, -1))], 8, _hoisted_12)])]))]),
_: 2
}, 1032, ["content"]);
}), 128))])) : createCommentVNode("", true)]),
_: 1
})])) : createCommentVNode("", true);
};
}
}); //#endregion
//#region src/features/ndv/settings/components/NodeWebhooks.vue
NodeWebhooks_default = /* @__PURE__ */__plugin_vue_export_helper_default(NodeWebhooks_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-66c974d9"]]); //#endregion
//#region src/features/workflows/canvas/experimental/components/ExperimentalEmbeddedNdvHeader.vue?vue&type=script&setup=true&lang.ts
ExperimentalEmbeddedNdvHeader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "ExperimentalEmbeddedNdvHeader",
props: {
node: {},
readOnly: {
type: Boolean
},
nodeType: {},
pushRef: {},
subTitle: {},
extraTabsClassName: {},
selectedTab: {},
includeAction: {
type: Boolean
},
includeCredential: {
type: Boolean
},
hasCredentialIssue: {
type: Boolean
}
},
emits: ["name-changed", "dblclick-title", "tab-changed"],
setup(__props, {
emit: __emit
}) {
const emit = __emit;
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass([_ctx.$style.component, _ctx.node.disabled ? _ctx.$style.disabled : ""])
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.title),
onDblclick: _cache[1] || (_cache[1] = $event => emit("dblclick-title", $event))
}, [createVNode(NodeIcon_default, {
"node-type": _ctx.nodeType,
size: 16
}, null, 8, ["node-type"]), createBaseVNode("div", {
class: normalizeClass(_ctx.$style.titleText)
}, [createVNode(unref(N8nInlineTextEdit_default), {
"min-width": 0,
"model-value": _ctx.node.name,
"read-only": _ctx.readOnly,
"onUpdate:modelValue": _cache[0] || (_cache[0] = $event => emit("name-changed", $event))
}, null, 8, ["model-value", "read-only"])], 2), createVNode(unref(N8nText_default), {
bold: "",
size: "small",
color: "text-light",
class: normalizeClass(_ctx.$style.subTitleText)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.subTitle), 1)]),
_: 1
}, 8, ["class"]), renderSlot(_ctx.$slots, "actions")], 34), createBaseVNode("div", {
class: normalizeClass(_ctx.$style.tabsContainer)
}, [createVNode(NodeSettingsTabs_default, {
class: normalizeClass(_ctx.extraTabsClassName),
"model-value": _ctx.selectedTab,
"node-type": _ctx.nodeType,
"push-ref": _ctx.pushRef,
"tabs-variant": "modern",
compact: "",
"include-action": _ctx.includeAction,
"include-credential": _ctx.includeCredential,
"has-credential-issue": _ctx.hasCredentialIssue,
"onUpdate:modelValue": _cache[2] || (_cache[2] = $event => emit("tab-changed", $event))
}, null, 8, ["class", "model-value", "node-type", "push-ref", "include-action", "include-credential", "has-credential-issue"])], 2)], 2);
};
}
}); //#endregion
//#region src/features/workflows/canvas/experimental/components/ExperimentalEmbeddedNdvHeader.vue?vue&type=style&index=0&lang.module.scss
component$1 = "_component_13igc_123";
title = "_title_13igc_127";
disabled = "_disabled_13igc_135";
titleText = "_titleText_13igc_139";
subTitleText = "_subTitleText_13igc_151";
tabsContainer = "_tabsContainer_13igc_160";
ExperimentalEmbeddedNdvHeader_vue_vue_type_style_index_0_lang_module_default = {
component: component$1,
title,
disabled,
titleText,
subTitleText,
tabsContainer
}; //#endregion
//#region src/features/workflows/canvas/experimental/components/ExperimentalEmbeddedNdvHeader.vue
cssModules$4 = {
"$style": ExperimentalEmbeddedNdvHeader_vue_vue_type_style_index_0_lang_module_default
};
ExperimentalEmbeddedNdvHeader_default = /* @__PURE__ */__plugin_vue_export_helper_default(ExperimentalEmbeddedNdvHeader_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$4]]); //#endregion
//#region src/app/components/NodeActionsList.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$3 = ["onClick"];
NodeActionsList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeActionsList",
props: {
node: {}
},
emits: ["actionSelected"],
setup(__props, {
emit: __emit
}) {
const emit = __emit;
const nodeTypesStore = useNodeTypesStore();
const {
generateMergedNodesAndActions
} = useActionsGenerator();
const {
parseCategoryActions,
getActionData
} = useActions();
const i18n = useI18n();
const selectedActionRef = ref();
const nodeType = computed(() => nodeTypesStore.getNodeType(__props.node.type, __props.node.typeVersion));
const options = computed(() => {
const {
actions
} = generateMergedNodesAndActions(nodeType.value ? [nodeType.value] : [], []);
return parseCategoryActions(Object.values(actions).flatMap(typeDescriptions => typeDescriptions.filter(({
actionKey
}) => actionKey !== CUSTOM_API_CALL_KEY).map(typeDescription => ({
type: "action",
subcategory: typeDescription.actionKey,
key: typeDescription.actionKey,
properties: typeDescription
}))), i18n.baseText("nodeCreator.actionsCategory.actions"), true).map(action => {
if (action.type !== "action") return {
action,
isSelected: false
};
const data = getActionData(action.properties).value;
let isSelected = true;
for (const [key, value] of Object.entries(data)) isSelected = isSelected && __props.node.parameters[key] === value;
return {
action,
isSelected
};
});
});
function handleClickOption(option$1) {
if (option$1.type !== "action") return;
emit("actionSelected", getActionData(option$1.properties).value);
}
function handleSelectedItemRef(el) {
if (el instanceof HTMLDivElement) selectedActionRef.value = el;
}
watch(selectedActionRef, selected$1 => {
selected$1?.scrollIntoView();
}, {
flush: "post"
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.component)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(options.value, option$1 => {
return openBlock(), createElementBlock(Fragment, {
key: option$1.action.key
}, [option$1.action.type === "label" ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
tag: "div",
class: normalizeClass(_ctx.$style.label),
size: "xsmall",
color: "text-base",
bold: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(option$1.action.key), 1)]),
_: 2
}, 1032, ["class"])) : option$1.action.type === "action" ? (openBlock(), createElementBlock("div", {
key: 1,
ref_for: true,
ref: option$1.isSelected ? handleSelectedItemRef : void 0,
class: normalizeClass({
[_ctx.$style.option]: true,
[_ctx.$style.selected]: option$1.isSelected
}),
role: "button",
onClick: $event => handleClickOption(option$1.action)
}, [createVNode(NodeIcon_default, {
size: 20,
"node-type": nodeType.value
}, null, 8, ["node-type"]), createVNode(unref(N8nText_default), {
size: "small",
bold: "",
class: normalizeClass(_ctx.$style.optionText)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(option$1.action.properties.displayName), 1)]),
_: 2
}, 1032, ["class"]), option$1.isSelected ? (openBlock(), createBlock(unref(N8nIcon_default), {
key: 0,
icon: "check",
color: "primary"
})) : createCommentVNode("", true)], 10, _hoisted_1$3)) : createCommentVNode("", true)], 64);
}), 128))], 2);
};
}
}); //#endregion
//#region src/app/components/NodeActionsList.vue?vue&type=style&index=0&lang.module.scss
component = "_component_1vh3g_123";
label = "_label_1vh3g_127";
option = "_option_1vh3g_132";
selected = "_selected_1vh3g_139";
optionText = "_optionText_1vh3g_143";
NodeActionsList_vue_vue_type_style_index_0_lang_module_default = {
component,
label,
option,
selected,
optionText
}; //#endregion
//#region src/app/components/NodeActionsList.vue
cssModules$3 = {
"$style": NodeActionsList_vue_vue_type_style_index_0_lang_module_default
};
NodeActionsList_default = /* @__PURE__ */__plugin_vue_export_helper_default(NodeActionsList_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$3]]); //#endregion
//#region src/features/ndv/settings/components/NodeSettingsInvalidNodeWarning.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$2 = {
class: "mt-s mb-xs"
};
_hoisted_2$2 = ["href", "textContent"];
NodeSettingsInvalidNodeWarning_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeSettingsInvalidNodeWarning",
props: {
node: {},
previewMode: {
type: Boolean,
default: false
}
},
setup(__props) {
const i18n = useI18n();
const telemetry = useTelemetry();
const nodeTypesStore = useNodeTypesStore();
const uiStore = useUIStore();
const ndvStore = useNDVStore();
const nodeCreatorStore = useNodeCreatorStore();
const usersStore = useUsersStore();
const isCommunityNode = computed(() => isCommunityPackageName(__props.node.type));
const isVerifiedCommunityNode = computed(() => isCommunityPackageName(__props.node.type) && nodeTypesStore.communityNodeType(__props.node.type)?.isOfficialNode);
const npmPackage = computed(() => removePreviewToken(__props.node.type.split(".")[0]));
const isOwner = computed(() => usersStore.isInstanceOwner);
const {
installNode,
loading
} = useInstallNode();
const isNodeDefined = computed(() => !!nodeTypesStore.nodeTypes[__props.node.type]);
async function onViewDetailsClick() {
telemetry.track("user clicked cnr docs link", {
source: "missing node modal source",
package_name: __props.node.type.split(".")[0],
node_type: __props.node.type
});
if (isVerifiedCommunityNode.value) await nodeCreatorStore.openNodeCreatorWithNode(__props.node.name);else if (npmPackage.value) window.open(`https://www.npmjs.com/package/${npmPackage.value}`, "_blank");
}
async function onInstallClick() {
telemetry.track("user clicked cnr install button", {
source: "missing node modal source",
package_name: npmPackage.value,
node_type: __props.node.type
});
if (isVerifiedCommunityNode.value) await installNode({
type: "verified",
packageName: npmPackage.value,
nodeType: __props.node.type
});else uiStore.openModalWithData({
name: COMMUNITY_PACKAGE_INSTALL_MODAL_KEY,
data: {
packageName: npmPackage.value,
disableInput: true,
hideSuggestion: true,
nodeType: __props.node.type
}
});
}
watch(isNodeDefined, () => {
if (isNodeDefined.value) ndvStore.unsetActiveNodeName();
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.nodeIsNotValid)
}, [createBaseVNode("p", {
class: normalizeClass(_ctx.$style.warningIcon)
}, [createVNode(unref(N8nIcon_default), {
icon: "triangle-alert"
})], 2), createBaseVNode("div", _hoisted_1$2, [createVNode(unref(N8nText_default), {
size: "large",
color: "text-dark",
bold: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.previewMode ? unref(i18n).baseText("nodeSettings.communityNodeUnknown.title.preview") : unref(i18n).baseText("nodeSettings.communityNodeUnknown.title")), 1)]),
_: 1
})]), isCommunityNode.value && !_ctx.previewMode ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.descriptionContainer)
}, [createVNode(unref(I18nT), {
keypath: "nodeSettings.communityNodeUnknown.description",
tag: "span",
scope: "global"
}, {
action: withCtx(() => [createVNode(unref(N8nText_default), {
size: "medium",
bold: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(npmPackage.value), 1)]),
_: 1
})]),
_: 1
}), isOwner.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.communityNodeActionsContainer)
}, [isOwner.value ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 0,
icon: "hard-drive-download",
type: "primary",
"data-test-id": "install-community-node-button",
loading: unref(loading),
disabled: unref(loading),
onClick: onInstallClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("nodeSettings.communityNodeUnknown.installButton.label")), 1)]),
_: 1
}, 8, ["loading", "disabled"])) : createCommentVNode("", true), createVNode(unref(N8nButton_default), {
icon: "external-link",
type: "secondary",
onClick: onViewDetailsClick,
"data-test-id": "view-details-button"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("nodeSettings.communityNodeUnknown.viewDetailsButton.label")), 1)]),
_: 1
})], 2)) : (openBlock(), createBlock(ContactAdministratorToInstall_default, {
key: 1,
box: false
}))], 2)) : !_ctx.previewMode ? (openBlock(), createBlock(unref(I18nT), {
key: 1,
keypath: "nodeSettings.nodeTypeUnknown.description",
tag: "span",
scope: "global"
}, {
action: withCtx(() => [createBaseVNode("a", {
href: unref(CUSTOM_NODES_DOCS_URL),
target: "_blank",
textContent: toDisplayString(unref(i18n).baseText("nodeSettings.nodeTypeUnknown.description.customNode"))
}, null, 8, _hoisted_2$2)]),
_: 1
})) : createCommentVNode("", true)], 2);
};
}
}); //#endregion
//#region src/features/ndv/settings/components/NodeSettingsInvalidNodeWarning.vue?vue&type=style&index=0&lang.module.scss
communityNodeActionsContainer = "_communityNodeActionsContainer_1mqmg_123";
nodeIsNotValid = "_nodeIsNotValid_1mqmg_128";
warningIcon = "_warningIcon_1mqmg_139";
descriptionContainer = "_descriptionContainer_1mqmg_144";
NodeSettingsInvalidNodeWarning_vue_vue_type_style_index_0_lang_module_default = {
communityNodeActionsContainer,
nodeIsNotValid,
warningIcon,
descriptionContainer
}; //#endregion
//#region src/features/ndv/settings/components/NodeSettingsInvalidNodeWarning.vue
cssModules$2 = {
"$style": NodeSettingsInvalidNodeWarning_vue_vue_type_style_index_0_lang_module_default
};
NodeSettingsInvalidNodeWarning_default = /* @__PURE__ */__plugin_vue_export_helper_default(NodeSettingsInvalidNodeWarning_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$2]]); //#endregion
//#region src/features/core/dataTable/components/NodeStorageLimitCallout.vue?vue&type=script&setup=true&lang.ts
_hoisted_1$1 = {
key: 0
};
_hoisted_2$1 = {
key: 1
};
NodeStorageLimitCallout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeStorageLimitCallout",
setup(__props) {
const i18n = useI18n();
const nvdStore = useNDVStore();
const dataTableStore = useDataTableStore();
const calloutType = computed(() => {
if (!DATA_TABLE_NODES.includes(nvdStore.activeNode?.type ?? "")) return null;
switch (dataTableStore.dataTableSizeLimitState) {
case "error":
return "danger";
case "warn":
return "warning";
default:
return null;
}
});
return (_ctx, _cache) => {
return calloutType.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: calloutType.value,
class: "mt-xs"
}, {
default: withCtx(() => [calloutType.value === "danger" ? (openBlock(), createElementBlock("span", _hoisted_1$1, toDisplayString(unref(i18n).baseText("dataTable.banner.storageLimitError.message", {
interpolate: {
usage: `${unref(dataTableStore).dataTableSize} / ${unref(dataTableStore).maxSizeMB}MB`
}
})), 1)) : (openBlock(), createElementBlock("span", _hoisted_2$1, toDisplayString(unref(i18n).baseText("dataTable.banner.storageLimitWarning.message", {
interpolate: {
usage: `${unref(dataTableStore).dataTableSize} / ${unref(dataTableStore).maxSizeMB}MB`
}
})), 1))]),
_: 1
}, 8, ["theme"])) : createCommentVNode("", true);
};
}
}); //#endregion
//#region src/features/core/dataTable/components/NodeStorageLimitCallout.vue
NodeStorageLimitCallout_default = NodeStorageLimitCallout_vue_vue_type_script_setup_true_lang_default; //#endregion
//#region src/app/components/NodeTitle.vue?vue&type=script&setup=true&lang.ts
NodeTitle_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeTitle",
props: {
modelValue: {
default: ""
},
nodeType: {
default: void 0
},
iconSource: {
default: void 0
},
readOnly: {
type: Boolean,
default: false
}
},
emits: ["update:model-value"],
setup(__props, {
emit: __emit
}) {
const emit = __emit;
function onRename(value) {
if (value.trim() !== "") emit("update:model-value", value.trim());
}
const wrapperRef = useTemplateRef("wrapperRef");
const {
width
} = useElementSize(wrapperRef);
return (_ctx, _cache) => {
return openBlock(), createElementBlock("span", {
class: normalizeClass(_ctx.$style.container),
"data-test-id": "node-title-container"
}, [createBaseVNode("span", {
class: normalizeClass(_ctx.$style.iconWrapper)
}, [!_ctx.iconSource ? (openBlock(), createBlock(NodeIcon_default, {
key: 0,
"node-type": _ctx.nodeType,
size: 18,
"show-tooltip": true,
"tooltip-position": "left"
}, null, 8, ["node-type"])) : (openBlock(), createBlock(NodeIcon_default, {
key: 1,
"icon-source": _ctx.iconSource,
"node-type": _ctx.nodeType,
size: 18,
"show-tooltip": true,
"tooltip-position": "left"
}, null, 8, ["icon-source", "node-type"]))], 2), createBaseVNode("div", {
ref_key: "wrapperRef",
ref: wrapperRef,
class: normalizeClass(_ctx.$style.textWrapper)
}, [createVNode(unref(N8nInlineTextEdit_default), {
"max-width": unref(width),
"model-value": _ctx.modelValue,
"read-only": _ctx.readOnly,
"onUpdate:modelValue": onRename
}, null, 8, ["max-width", "model-value", "read-only"])], 2)], 2);
};
}
}); //#endregion
//#region src/app/components/NodeTitle.vue?vue&type=style&index=0&lang.module.scss
container = "_container_oei61_123";
textWrapper = "_textWrapper_oei61_132";
iconWrapper = "_iconWrapper_oei61_137";
NodeTitle_vue_vue_type_style_index_0_lang_module_default = {
container,
textWrapper,
iconWrapper
}; //#endregion
//#region src/app/components/NodeTitle.vue
cssModules$1 = {
"$style": NodeTitle_vue_vue_type_style_index_0_lang_module_default
};
NodeTitle_default = /* @__PURE__ */__plugin_vue_export_helper_default(NodeTitle_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules$1]]); //#endregion
//#region src/features/ndv/settings/components/NodeSettings.vue?vue&type=script&setup=true&lang.ts
import_get = /* @__PURE__ */__toESM(require_get());
_hoisted_1 = ["data-has-output-connection"];
_hoisted_2 = {
class: "header-side-menu"
};
_hoisted_3 = {
key: 1,
class: "no-parameters"
};
_hoisted_4 = {
key: 2,
class: "parameter-item parameter-notice",
"data-test-id": "node-parameters-http-notice"
};
_hoisted_5 = {
class: "node-version",
"data-test-id": "node-version"
};
NodeSettings_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */defineComponent({
__name: "NodeSettings",
props: {
eventBus: {},
dragging: {
type: Boolean
},
pushRef: {},
readOnly: {
type: Boolean
},
foreignCredentials: {},
blockUI: {
type: Boolean
},
executable: {
type: Boolean
},
inputSize: {
default: 0
},
activeNode: {
default: void 0
},
isEmbeddedInCanvas: {
type: Boolean,
default: false
},
subTitle: {
default: void 0
},
extraTabsClassName: {},
extraParameterWrapperClassName: {},
isNdvV2: {
type: Boolean,
default: false
},
hideExecute: {
type: Boolean,
default: false
},
hideDocs: {
type: Boolean,
default: true
},
hideSubConnections: {
type: Boolean,
default: false
}
},
emits: ["stopExecution", "valueChanged", "switchSelectedNode", "openConnectionNodeCreator", "activate", "execute", "captureWheelBody", "dblclickHeader"],
setup(__props, {
emit: __emit
}) {
const props = __props;
const emit = __emit;
useSlots();
const nodeValues = ref(getNodeSettingsInitialValues());
const nodeTypesStore = useNodeTypesStore();
const ndvStore = useNDVStore();
const workflowsStore = useWorkflowsStore();
const workflowState = injectWorkflowState();
const credentialsStore = useCredentialsStore();
const historyStore = useHistoryStore();
const telemetry = useTelemetry();
const nodeHelpers = useNodeHelpers();
const externalHooks = useExternalHooks();
const i18n = useI18n();
const route = useRoute();
const nodeSettingsParameters = useNodeSettingsParameters();
const nodeParameterWrapper = useTemplateRef("nodeParameterWrapper");
const shouldShowStaticScrollbar = ref(false);
if (props.isEmbeddedInCanvas) useResizeObserver(nodeParameterWrapper, () => {
shouldShowStaticScrollbar.value = (nodeParameterWrapper.value?.scrollHeight ?? 0) > (nodeParameterWrapper.value?.offsetHeight ?? 0);
});
const nodeValid = ref(true);
const openPanel = ref("params");
const nodeValuesInitialized = ref(false);
const hiddenIssuesInputs = ref([]);
const subConnections = ref(null);
const isDemoRoute = computed(() => route?.name === VIEWS.DEMO);
const {
isPreviewMode
} = useSettingsStore();
const isDemoPreview = computed(() => isDemoRoute.value && isPreviewMode);
const currentWorkflow = computed(() => workflowsStore.getWorkflowById(workflowsStore.workflowObject.id));
const hasForeignCredential = computed(() => props.foreignCredentials.length > 0);
const isHomeProjectTeam = computed(() => currentWorkflow.value?.homeProject?.type === ProjectTypes.Team);
const isReadOnly = computed(() => props.readOnly || hasForeignCredential.value && !isHomeProjectTeam.value);
const node = computed(() => props.activeNode ?? ndvStore.activeNode);
const nodeType = computed(() => node.value ? nodeTypesStore.getNodeType(node.value.type, node.value.typeVersion) : null);
const {
areAllCredentialsSet
} = useNodeCredentialOptions(node, nodeType, "");
const {
installedPackage,
isUpdateCheckAvailable
} = useInstalledCommunityPackage(computed(() => node.value?.type));
const isTriggerNode = computed(() => !!node.value && nodeTypesStore.isTriggerNode(node.value.type));
const isToolNode = computed(() => !!node.value && nodeTypesStore.isToolNode(node.value.type));
const isExecutable = computed(() => nodeHelpers.isNodeExecutable(node.value, props.executable, props.foreignCredentials));
const nodeTypeVersions = computed(() => {
if (!node.value) return [];
return nodeTypesStore.getNodeVersions(node.value.type);
});
const latestVersion = computed(() => Math.max(...nodeTypeVersions.value));
const isLatestNodeVersion = computed(() => !node.value?.typeVersion || latestVersion.value === node.value.typeVersion);
const executeButtonTooltip = computed(() => {
if (node.value && isLatestNodeVersion.value && props.inputSize > 1 && !nodeHelpers.isSingleExecution(node.value.type, node.value.parameters)) return i18n.baseText("nodeSettings.executeButtonTooltip.times", {
interpolate: {
inputSize: props.inputSize
}
});
return "";
});
const nodeVersionTag = computed(() => {
if (!nodeType.value || nodeType.value.hidden) return i18n.baseText("nodeSettings.deprecated");
if (isLatestNodeVersion.value) return i18n.baseText("nodeSettings.latest");
return i18n.baseText("nodeSettings.latestVersion", {
interpolate: {
version: latestVersion.value.toString()
}
});
});
const parameters = computed(() => {
if (nodeType.value === null) return [];
return nodeType.value?.properties ?? [];
});
const parametersByTab = computed(() => collectParametersByTab(parameters.value, props.isEmbeddedInCanvas));
const isDisplayingCredentials = computed(() => credentialsStore.getCredentialTypesNodeDescriptions("", nodeType.value).filter(credentialTypeDescription => displayCredentials(credentialTypeDescription)).length > 0);
const showNoParametersNotice = computed(() => !isDisplayingCredentials.value && (parametersByTab.value.params ?? []).filter(item => item.type !== "notice").length === 0);
const outputPanelEditMode = computed(() => ndvStore.outputPanelEditMode);
const isCommunityNode = computed(() => !!node.value && isCommunityPackageName(node.value.type));
const packageName = computed(() => node.value?.type.split(".")[0] ?? "");
const usedCredentials = computed(() => Object.values(workflowsStore.usedCredentials).filter(credential => Object.values(node.value?.credentials || []).find(nodeCredential => nodeCredential.id === credential.id)));
const credentialOwnerName = computed(() => {
const credential = usedCredentials.value ? Object.values(usedCredentials.value).find(credential$1 => credential$1.id === props.foreignCredentials[0]) : void 0;
return credentialsStore.getCredentialOwnerName(credential);
});
const featureRequestUrl = computed(() => {
if (!nodeType.value) return "";
return `${BASE_NODE_SURVEY_URL}${nodeType.value.name}`;
});
const hasOutputConnection = computed(() => {
if (!node.value) return false;
const outgoingConnections = workflowsStore.outgoingConnectionsByNodeName(node.value.name);
return (Object.values(outgoingConnections)?.[0]?.[0] ?? []).length > 0;
});
const valueChanged = parameterData => {
let newValue;
if (parameterData.hasOwnProperty("value")) newValue = parameterData.value;else newValue = (0, import_get.default)(nodeValues.value, parameterData.name);
const nodeNameBefore = parameterData.node || node.value?.name;
if (!nodeNameBefore) return;
const _node = workflowsStore.getNodeByName(nodeNameBefore);
if (_node === null) return;
if (parameterData.name === "name") emit("valueChanged", {
value: newValue,
oldValue: nodeNameBefore,
name: parameterData.name
});else if (parameterData.name === "parameters") {
const _nodeType = nodeTypesStore.getNodeType(_node.type, _node.typeVersion);
if (!_nodeType) return;
let nodeParameters = getNodeParameters(_nodeType.properties, _node.parameters, false, false, _node, _nodeType);
const oldNodeParameters = Object.assign({}, nodeParameters);
nodeParameters = deepCopy(nodeParameters);
if (parameterData.value && typeof parameterData.value === "object") for (const [parameterName, parameterValue] of Object.entries(parameterData.value)) {
newValue = parameterValue;
const parameterPath = nodeSettingsParameters.updateParameterByPath(parameterName, newValue, nodeParameters, _nodeType, _node.typeVersion);
externalHooks.run("nodeSettings.valueChanged", {
parameterPath,
newValue,
parameters: parameters.value,
oldNodeParameters
});
}
nodeParameters = getNodeParameters(_nodeType.properties, nodeParameters, true, false, _node, _nodeType);
for (const key of Object.keys(nodeParameters)) if (nodeParameters?.[key] !== null && nodeParameters?.[key] !== void 0) nodeSettingsParameters.setValue(nodeValues, `parameters.${key}`, nodeParameters[key]);
if (nodeParameters) {
const updateInformation = {
name: _node.name,
value: nodeParameters
};
workflowState.setNodeParameters(updateInformation);
nodeHelpers.updateNodeParameterIssuesByName(_node.name);
nodeHelpers.updateNodeCredentialIssuesByName(_node.name);
}
} else if (nameIsParameter(parameterData)) nodeSettingsParameters.updateNodeParameter(nodeValues, parameterData, newValue, _node, isToolNode.value);else {
nodeValues.value = {
...nodeValues.value,
[parameterData.name]: newValue
};
const updateInformation = {
name: _node.name,
key: parameterData.name,
value: newValue
};
workflowState.setNodeValue(updateInformation);
}
};
const setHttpNodeParameters = parameters$1 => {
try {
valueChanged({
node: node.value?.name,
name: "parameters",
value: parameters$1
});
} catch {}
};
const onSwitchSelectedNode = node$1 => {
emit("switchSelectedNode", node$1);
};
const onOpenConnectionNodeCreator = (nodeName, connectionType$1, connectionIndex = 0) => {
emit("openConnectionNodeCreator", nodeName, connectionType$1, connectionIndex);
};
const populateHiddenIssuesSet = () => {
if (!node.value || !workflowsStore.isNodePristine(node.value.name)) return;
hiddenIssuesInputs.value.push("credentials");
parametersByTab.value.params.forEach(parameter => {
hiddenIssuesInputs.value.push(parameter.name);
});
workflowsStore.setNodePristine(node.value.name, false);
};
const nodeSettings = computed(() => createCommonNodeSettings(isExecutable.value, isToolNode.value, i18n.baseText.bind(i18n)));
const iconSource = computed(() => getNodeIconSource(nodeType.value ?? node.value?.type, node.value ?? null));
const onParameterBlur = parameterName => {
hiddenIssuesInputs.value = hiddenIssuesInputs.value.filter(name => name !== parameterName);
};
const onWorkflowActivate = () => {
hiddenIssuesInputs.value = [];
emit("activate");
};
const onNodeExecute = () => {
hiddenIssuesInputs.value = [];
subConnections.value?.showNodeInputsIssues();
emit("execute");
};
const credentialSelected = updateInformation => {
workflowState.updateNodeProperties(updateInformation);
const node$1 = workflowsStore.getNodeByName(updateInformation.name);
if (node$1) nodeHelpers.updateNodeCredentialIssues(node$1);
externalHooks.run("nodeSettings.credentialSelected", {
updateInformation
});
};
const nameChanged = name => {
if (node.value) historyStore.pushCommandToUndo(new RenameNodeCommand(node.value.name, name, Date.now()));
valueChanged({
value: name,
name: "name"
});
};
const setNodeValues = () => {
if (!node.value) {
nodeValuesInitialized.value = true;
return;
}
if (nodeType.value !== null) {
nodeValid.value = true;
nodeValues.value = collectSettings(node.value, nodeSettings.value);
} else nodeValid.value = false;
nodeValuesInitialized.value = true;
};
const onStopExecution = () => {
emit("stopExecution");
};
const openSettings = () => {
openPanel.value = "settings";
};
const onTabSelect = tab => {
openPanel.value = tab;
};
const onFeatureRequestClick = () => {
window.open(featureRequestUrl.value, "_blank");
if (node.value) telemetry.track("User clicked ndv link", {
node_type: node.value.type,
workflow_id: workflowsStore.workflowId,
push_ref: props.pushRef,
pane: NodeConnectionTypes.Main,
type: "i-wish-this-node-would"
});
};
watch(node, () => {
setNodeValues();
});
onMounted(async () => {
populateHiddenIssuesSet();
setNodeValues();
props.eventBus?.on("openSettings", openSettings);
if (node.value !== null) nodeHelpers.updateNodeParameterIssues(node.value, nodeType.value);
importCurlEventBus.on("setHttpNodeParameters", setHttpNodeParameters);
ndvEventBus.on("updateParameterValue", valueChanged);
});
onBeforeUnmount(() => {
props.eventBus?.off("openSettings", openSettings);
importCurlEventBus.off("setHttpNodeParameters", setHttpNodeParameters);
ndvEventBus.off("updateParameterValue", valueChanged);
});
function displayCredentials(credentialTypeDescription) {
if (credentialTypeDescription.displayOptions === void 0) return true;
return !!node.value && nodeHelpers.displayParameter(node.value.parameters, credentialTypeDescription, "", node.value);
}
function handleSelectAction(params) {
for (const [key, value] of Object.entries(params)) valueChanged({
name: `parameters.${key}`,
value
});
if (isDisplayingCredentials.value && !areAllCredentialsSet.value) {
onTabSelect("credential");
return;
}
if (parametersByTab.value.params.length > 0) onTabSelect("params");
}
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass({
"node-settings": true,
dragging: _ctx.dragging,
embedded: props.isEmbeddedInCanvas
}),
"data-has-output-connection": hasOutputConnection.value,
onKeydown: _cache[2] || (_cache[2] = withModifiers(() => {}, ["stop"]))
}, [_ctx.isEmbeddedInCanvas && node.value ? (openBlock(), createBlock(ExperimentalEmbeddedNdvHeader_default, {
key: 0,
node: node.value,
"selected-tab": openPanel.value,
"read-only": _ctx.readOnly,
"node-type": nodeType.value,
"push-ref": _ctx.pushRef,
"sub-title": _ctx.subTitle,
"extra-tabs-class-name": _ctx.extraTabsClassName,
"include-action": parametersByTab.value.action.length > 0,
"include-credential": isDisplayingCredentials.value,
"has-credential-issue": !unref(areAllCredentialsSet),
onNameChanged: nameChanged,
onTabChanged: onTabSelect,
onDblclickTitle: _cache[0] || (_cache[0] = $event => emit("dblclickHeader", $event))
}, {
actions: withCtx(() => [renderSlot(_ctx.$slots, "actions", {}, void 0, true)]),
_: 3
}, 8, ["node", "selected-tab", "read-only", "node-type", "push-ref", "sub-title", "extra-tabs-class-name", "include-action", "include-credential", "has-credential-issue"])) : !_ctx.isNdvV2 ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.header)
}, [createBaseVNode("div", _hoisted_2, [node.value ? (openBlock(), createBlock(NodeTitle_default, {
key: 0,
class: "node-name",
"model-value": node.value.name,
"icon-source": iconSource.value,
"read-only": isReadOnly.value,
"node-type": nodeType.value,
"onUpdate:modelValue": nameChanged
}, null, 8, ["model-value", "icon-source", "read-only", "node-type"])) : createCommentVNode("", true), isExecutable.value && !_ctx.blockUI && node.value && nodeValid.value ? (openBlock(), createBlock(NodeExecuteButton_default, {
key: 1,
"data-test-id": "node-execute-button",
"node-name": node.value.name,
disabled: outputPanelEditMode.value.enabled && !isTriggerNode.value,
tooltip: executeButtonTooltip.value,
size: "small",
"telemetry-source": "parameters",
onExecute: onNodeExecute,
onStopExecution,
onValueChanged: valueChanged
}, null, 8, ["node-name", "disabled", "tooltip"])) : createCommentVNode("", true)]), node.value && nodeValid.value ? (openBlock(), createBlock(NodeSettingsTabs_default, {
key: 0,
"model-value": openPanel.value,
"node-type": nodeType.value,
"push-ref": _ctx.pushRef,
"onUpdate:modelValue": onTabSelect
}, null, 8, ["model-value", "node-type", "push-ref"])) : createCommentVNode("", true)], 2)) : node.value && nodeValid.value ? (openBlock(), createBlock(NodeSettingsHeader_default, {
key: 2,
"selected-tab": openPanel.value,
"node-name": node.value.name,
"node-type": nodeType.value,
"execute-button-tooltip": executeButtonTooltip.value,
"hide-execute": props.hideExecute || !isExecutable.value || _ctx.blockUI || !node.value || !nodeValid.value,
"disable-execute": outputPanelEditMode.value.enabled && !isTriggerNode.value,
"hide-tabs": !nodeValid.value,
"hide-docs": props.hideDocs,
"push-ref": _ctx.pushRef,
onExecute: onNodeExecute,
onStopExecution,
onValueChanged: valueChanged,
onTabChanged: onTabSelect
}, null, 8, ["selected-tab", "node-name", "node-type", "execute-button-tooltip", "hide-execute", "disable-execute", "hide-tabs", "hide-docs", "push-ref"])) : createCommentVNode("", true), node.value && !nodeValid.value ? (openBlock(), createBlock(NodeSettingsInvalidNodeWarning_default, {
key: 3,
node: node.value,
"preview-mode": isDemoPreview.value
}, null, 8, ["node", "preview-mode"])) : createCommentVNode("", true), node.value && nodeValid.value ? (openBlock(), createElementBlock("div", {
key: 4,
ref_key: "nodeParameterWrapper",
ref: nodeParameterWrapper,
class: normalizeClass(["node-parameters-wrapper", shouldShowStaticScrollbar.value ? "with-static-scrollbar" : "", {
"ndv-v2": _ctx.isNdvV2
}, _ctx.extraParameterWrapperClassName ?? ""]),
"data-test-id": "node-parameters",
onWheelCapture: _cache[1] || (_cache[1] = $event => emit("captureWheelBody", $event))
}, [hasForeignCredential.value && !isHomeProjectTeam.value ? (openBlock(), createBlock(unref(N8nNotice_default), {
key: 0,
content: unref(i18n).baseText("nodeSettings.hasForeignCredential", {
interpolate: {
owner: credentialOwnerName.value
}
})
}, null, 8, ["content"])) : createCommentVNode("", true), createVNode(FreeAiCreditsCallout_default), createVNode(NodeStorageLimitCallout_default), openPanel.value === "action" ? (openBlock(), createBlock(NodeActionsList_default, {
key: 1,
class: "action-tab",
node: node.value,
onActionSelected: handleSelectAction
}, null, 8, ["node"])) : createCommentVNode("", true), openPanel.value === "credential" ? (openBlock(), createBlock(NodeCredentials_default, {
key: 2,
node: node.value,
readonly: isReadOnly.value,
"show-all": true,
"hide-issues": hiddenIssuesInputs.value.includes("credentials"),
onCredentialSelected: credentialSelected,
onValueChanged: valueChanged,
onBlur: onParameterBlur
}, null, 8, ["node", "readonly", "hide-issues"])) : createCommentVNode("", true), withDirectives(createBaseVNode("div", null, [createVNode(NodeWebhooks_default, {
node: node.value,
"node-type-description": nodeType.value
}, null, 8, ["node", "node-type-description"]), nodeValuesInitialized.value ? (openBlock(), createBlock(ParameterInputList_default, {
key: 0,
parameters: parametersByTab.value.params,
"hide-delete": true,
"node-values": nodeValues.value,
"is-read-only": isReadOnly.value,
"hidden-issues-inputs": hiddenIssuesInputs.value,
path: "parameters",
node: props.activeNode,
onValueChanged: valueChanged,
onActivate: onWorkflowActivate,
onParameterBlur
}, {
default: withCtx(() => [!_ctx.isEmbeddedInCanvas && !isDemoPreview.value ? (openBlock(), createBlock(NodeCredentials_default, {
key: 0,
node: node.value,
readonly: isReadOnly.value,
"show-all": true,
"hide-issues": hiddenIssuesInputs.value.includes("credentials"),
onCredentialSelected: credentialSelected,
onValueChanged: valueChanged,
onBlur: onParameterBlur
}, null, 8, ["node", "readonly", "hide-issues"])) : createCommentVNode("", true)]),
_: 1
}, 8, ["parameters", "node-values", "is-read-only", "hidden-issues-inputs", "node"])) : createCommentVNode("", true), showNoParametersNotice.value ? (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("nodeSettings.thisNodeDoesNotHaveAnyParameters")), 1)]),
_: 1
})])) : createCommentVNode("", true), unref(nodeHelpers).isCustomApiCallSelected(nodeValues.value) ? (openBlock(), createElementBlock("div", _hoisted_4, [createVNode(unref(N8nNotice_default), {
content: unref(i18n).baseText("nodeSettings.useTheHttpRequestNode", {
interpolate: {
nodeTypeDisplayName: nodeType.value?.displayName ?? ""
}
})
}, null, 8, ["content"])])) : createCommentVNode("", true)], 512), [[vShow, openPanel.value === "params"]]), withDirectives(createBaseVNode("div", null, [unref(isUpdateCheckAvailable) && unref(installedPackage)?.updateAvailable ? (openBlock(), createBlock(CommunityNodeUpdateInfo_default, {
key: 0,
"data-test-id": "update-available",
"package-name": packageName.value,
style: {
"margin-top": "var(--spacing--sm)"
},
source: "node settings"
}, null, 8, ["package-name"])) : createCommentVNode("", true), createVNode(ParameterInputList_default, {
parameters: parametersByTab.value.settings,
"node-values": nodeValues.value,
"is-read-only": isReadOnly.value,
"hide-delete": true,
"hidden-issues-inputs": hiddenIssuesInputs.value,
path: "parameters",
onValueChanged: valueChanged,
onParameterBlur
}, null, 8, ["parameters", "node-values", "is-read-only", "hidden-issues-inputs"]), createVNode(ParameterInputList_default, {
parameters: nodeSettings.value,
"hide-delete": true,
"node-values": nodeValues.value,
"is-read-only": isReadOnly.value,
"hidden-issues-inputs": hiddenIssuesInputs.value,
path: "",
onValueChanged: valueChanged,
onParameterBlur
}, null, 8, ["parameters", "node-values", "is-read-only", "hidden-issues-inputs"]), createBaseVNode("div", _hoisted_5, [createTextVNode(toDisplayString(unref(i18n).baseText("nodeSettings.nodeVersion", {
interpolate: {
node: nodeType.value?.displayName,
version: (node.value.typeVersion ?? latestVersion.value).toString()
}
})) + " ", 1), createBaseVNode("span", null, "(" + toDisplayString(nodeVersionTag.value) + ")", 1)])], 512), [[vShow, openPanel.value === "settings"]]), _ctx.isNdvV2 && featureRequestUrl.value && !_ctx.isEmbeddedInCanvas ? (openBlock(), createElementBlock("div", {
key: 3,
class: normalizeClass(_ctx.$style.featureRequest)
}, [createBaseVNode("a", {
target: "_blank",
onClick: onFeatureRequestClick
}, [createVNode(unref(N8nIcon_default), {
icon: "lightbulb"
}), createTextVNode(" " + toDisplayString(unref(i18n).baseText("ndv.featureRequest")), 1)])], 2)) : createCommentVNode("", true)], 34)) : createCommentVNode("", true), node.value && !_ctx.hideSubConnections ? (openBlock(), createBlock(NDVSubConnections_default, {
key: 5,
ref_key: "subConnections",
ref: subConnections,
"root-node": node.value,
onSwitchSelectedNode,
onOpenConnectionNodeCreator
}, null, 8, ["root-node"])) : createCommentVNode("", true), createVNode(unref(N8nBlockUi_default), {
show: _ctx.blockUI,
class: normalizeClass({
[_ctx.$style.uiBlockerNdvV2]: _ctx.isNdvV2
})
}, null, 8, ["show", "class"]), openPanel.value === "settings" && isCommunityNode.value ? (openBlock(), createBlock(CommunityNodeFooter_default, {
key: 6,
"package-name": packageName.value,
"show-manage": unref(useUsersStore)().isInstanceOwner
}, null, 8, ["package-name", "show-manage"])) : createCommentVNode("", true)], 42, _hoisted_1);
};
}
}); //#endregion
//#region src/features/ndv/settings/components/NodeSettings.vue?vue&type=style&index=0&lang.module.scss
header = "_header_l6e8w_123";
featureRequest = "_featureRequest_l6e8w_127";
uiBlockerNdvV2 = "_uiBlockerNdvV2_l6e8w_141";
NodeSettings_vue_vue_type_style_index_0_lang_module_default = {
header,
featureRequest,
uiBlockerNdvV2
}; //#endregion
//#region src/features/ndv/settings/components/NodeSettings.vue
cssModules = {
"$style": NodeSettings_vue_vue_type_style_index_0_lang_module_default
};
_export("t", NodeSettings_default = /* @__PURE__ */__plugin_vue_export_helper_default(NodeSettings_vue_vue_type_script_setup_true_lang_default, [["__cssModules", cssModules], ["__scopeId", "data-v-e00dba95"]])); //#endregion
}
};
});
})();