n8n-editor-ui 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/.turbo/turbo-build.log +15 -15
  2. package/dist/assets/{CanvasControls-cf48927a.js → CanvasControls-f8442535.js} +2 -2
  3. package/dist/assets/{CanvasControls-cf48927a.js.map → CanvasControls-f8442535.js.map} +1 -1
  4. package/dist/assets/{FixedCollectionParameter-f646d2bf.js → FixedCollectionParameter-8ad1e897.js} +2 -2
  5. package/dist/assets/{FixedCollectionParameter-f646d2bf.js.map → FixedCollectionParameter-8ad1e897.js.map} +1 -1
  6. package/dist/assets/{NodeCreation-bbf36a1a.js → NodeCreation-aa65a415.js} +2 -2
  7. package/dist/assets/{NodeCreation-bbf36a1a.js.map → NodeCreation-aa65a415.js.map} +1 -1
  8. package/dist/assets/NodeCreator-626fd9f1.js +2 -0
  9. package/dist/assets/NodeCreator-626fd9f1.js.map +1 -0
  10. package/dist/assets/{RunDataJson-6215e222.js → RunDataJson-1392d3f8.js} +2 -2
  11. package/dist/assets/{RunDataJson-6215e222.js.map → RunDataJson-1392d3f8.js.map} +1 -1
  12. package/dist/assets/{RunDataJsonActions-1d385291.js → RunDataJsonActions-b7eb9ddb.js} +2 -2
  13. package/dist/assets/{RunDataJsonActions-1d385291.js.map → RunDataJsonActions-b7eb9ddb.js.map} +1 -1
  14. package/dist/assets/{RunDataSchema-43df3299.js → RunDataSchema-066ea2d7.js} +2 -2
  15. package/dist/assets/{RunDataSchema-43df3299.js.map → RunDataSchema-066ea2d7.js.map} +1 -1
  16. package/dist/assets/{RunDataTable-7ab80bf8.js → RunDataTable-301414b2.js} +2 -2
  17. package/dist/assets/{RunDataTable-7ab80bf8.js.map → RunDataTable-301414b2.js.map} +1 -1
  18. package/dist/assets/{index-12dd1e47.css → index-445a502e.css} +1 -1
  19. package/dist/assets/{index-1cdec20f.js → index-adc9f77e.js} +5 -9
  20. package/dist/assets/index-adc9f77e.js.map +1 -0
  21. package/dist/index.html +2 -2
  22. package/package.json +1 -1
  23. package/dist/assets/NodeCreator-0d763ba3.js +0 -2
  24. package/dist/assets/NodeCreator-0d763ba3.js.map +0 -1
  25. package/dist/assets/index-1cdec20f.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeCreator-626fd9f1.js","sources":["../../src/utils/sortUtils.ts","../../src/components/transitions/SlideTransition.vue","../../src/components/Node/NodeCreator/composables/useKeyboardNavigation.ts","../../src/components/Node/NodeCreator/utils.ts","../../src/components/Node/NodeCreator/composables/useViewStacks.ts","../../src/components/Node/NodeCreator/composables/useActionsGeneration.ts","../../src/components/Node/NodeCreator/viewsData.ts","../../src/components/Node/NodeCreator/Panel/SearchBar.vue","../../src/components/Node/NodeCreator/composables/useActions.ts","../../src/components/Node/NodeCreator/ItemTypes/NodeItem.vue","../../src/components/Node/NodeCreator/ItemTypes/SubcategoryItem.vue","../../src/components/Node/NodeCreator/ItemTypes/ActionItem.vue","../../src/components/Node/NodeCreator/Renderers/ItemsRenderer.vue","../../src/components/Node/NodeCreator/ItemTypes/CategoryItem.vue","../../src/components/Node/NodeCreator/Renderers/CategorizedItemsRenderer.vue","../../src/components/Node/NodeCreator/Modes/ActionsMode.vue","../../src/components/Node/NodeCreator/Panel/NoResultsIcon.vue","../../src/components/Node/NodeCreator/Modes/NodesMode.vue","../../src/components/Node/NodeCreator/Panel/NodesListPanel.vue","../../src/components/Node/NodeCreator/NodeCreator.vue"],"sourcesContent":["/*\n\tConstants and utility functions used for searching for node types in node creator component\n*/\n\n// based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 30; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -5;\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty\n\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\toutScore += penalty;\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result: any = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tresult = result[segments[i]];\n\t\ti++;\n\t}\n\treturn result;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: Readonly<T[]>,\n\tkeys: Array<{ key: string; weight: number }>,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\taccu: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn accu;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!accu && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && accu && outScore > accu.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn accu;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\n\t}, []);\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n","<template>\n\t<transition name=\"slide\">\n\t\t<slot />\n\t</transition>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'SlideTransition',\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.slide-leave-active,\n.slide-enter-active {\n\ttransition: 200ms ease;\n}\n.slide-leave-to,\n.slide-enter-from {\n\ttransform: translateX(100%);\n}\n</style>\n","import { ref } from 'vue';\nimport { defineStore } from 'pinia';\n\nexport type KeyboardKey = (typeof WATCHED_KEYS)[number];\ninterface KeyHook {\n\tkeyboardKeys: KeyboardKey[];\n\tcondition?: (type: string, activeItemId: string) => boolean;\n\thandler: (activeItemId: string, keyboardKey: KeyboardKey) => void;\n}\n\nexport const KEYBOARD_ID_ATTR = 'data-keyboard-nav-id';\nexport const WATCHED_KEYS = [\n\t'ArrowUp',\n\t'ArrowDown',\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'Enter',\n\t'Escape',\n\t'Tab',\n];\n\nexport const useKeyboardNavigation = defineStore('nodeCreatorKeyboardNavigation', () => {\n\tconst selectableItems = ref<Array<WeakRef<Element>>>([]);\n\tconst activeItemId = ref<string | null>(null);\n\t// Array of objects that contains key code and handler\n\tconst keysHooks = ref<Record<string, KeyHook>>({});\n\n\tfunction getItemType(element?: Element) {\n\t\treturn element?.getAttribute('data-keyboard-nav-type');\n\t}\n\tfunction getElementId(element?: Element) {\n\t\treturn element?.getAttribute(KEYBOARD_ID_ATTR) || undefined;\n\t}\n\tasync function refreshSelectableItems(): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// Wait for DOM to update\n\t\t\tcleanupSelectableItems();\n\t\t\tsetTimeout(() => {\n\t\t\t\tselectableItems.value = Array.from(\n\t\t\t\t\tdocument.querySelectorAll('[data-keyboard-nav-type]'),\n\t\t\t\t).map((el) => new WeakRef(el));\n\t\t\t\tresolve();\n\t\t\t}, 0);\n\t\t});\n\t}\n\n\tfunction executeKeyHooks(keyboardKey: KeyboardKey, activeItem: Element) {\n\t\tconst flatHooks = Object.values(keysHooks.value);\n\t\tconst hooks = flatHooks.filter((hook) => hook.keyboardKeys.includes(keyboardKey));\n\n\t\thooks.forEach((hook) => {\n\t\t\tif (!activeItemId.value) return;\n\n\t\t\tconst conditionPassed =\n\t\t\t\thook.condition === undefined ||\n\t\t\t\thook.condition(getItemType(activeItem) || '', activeItemId.value);\n\n\t\t\tif (conditionPassed && activeItemId.value) {\n\t\t\t\thook.handler(activeItemId.value, keyboardKey);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync function onKeyDown(e: KeyboardEvent) {\n\t\tconst pressedKey = e.key;\n\t\tif (!WATCHED_KEYS.includes(pressedKey)) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tawait refreshSelectableItems();\n\t\tconst activeItemIndex = selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t\tconst activeItem = selectableItems.value[activeItemIndex]?.deref();\n\n\t\tconst isArrowDown = pressedKey === 'ArrowDown';\n\t\tconst isArrowUp = pressedKey === 'ArrowUp';\n\n\t\tif (!activeItem) return;\n\n\t\tif (isArrowDown) {\n\t\t\tconst nextItemIndex =\n\t\t\t\tactiveItemIndex < selectableItems.value.length - 1 ? activeItemIndex + 1 : 0;\n\n\t\t\tsetActiveItem(selectableItems.value[nextItemIndex]?.deref());\n\t\t}\n\t\tif (isArrowUp) {\n\t\t\tconst previousIndex =\n\t\t\t\tactiveItemIndex > 0 ? activeItemIndex - 1 : selectableItems.value.length - 1;\n\n\t\t\tsetActiveItem(selectableItems.value[previousIndex]?.deref());\n\t\t}\n\t\texecuteKeyHooks(pressedKey, activeItem);\n\t}\n\n\tfunction setActiveItemId(id: string) {\n\t\tactiveItemId.value = id;\n\t}\n\n\tfunction setActiveItem(item?: Element) {\n\t\tconst itemId = getElementId(item);\n\t\tif (!itemId) return;\n\n\t\tsetActiveItemId(itemId);\n\t\tif (item?.scrollIntoView) {\n\t\t\titem?.scrollIntoView({ block: 'center' });\n\t\t}\n\t}\n\n\tasync function setActiveItemIndex(index: number) {\n\t\tawait refreshSelectableItems();\n\n\t\tsetActiveItem(selectableItems.value[index]?.deref());\n\t}\n\n\tfunction attachKeydownEvent() {\n\t\tdocument.addEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction detachKeydownEvent() {\n\t\tcleanupSelectableItems();\n\t\tdocument.removeEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction registerKeyHook(name: string, hook: KeyHook) {\n\t\thook.keyboardKeys.forEach((keyboardKey) => {\n\t\t\tif (WATCHED_KEYS.includes(keyboardKey)) {\n\t\t\t\tkeysHooks.value = { ...keysHooks.value, [name]: hook };\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Key ${keyboardKey} is not supported`);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction cleanupSelectableItems() {\n\t\t// Cleanup to make sure DOM elements get garbage collected\n\t\tselectableItems.value = [];\n\t}\n\n\tfunction getActiveItemIndex() {\n\t\treturn selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t}\n\n\treturn {\n\t\tactiveItemId,\n\t\tattachKeydownEvent,\n\t\trefreshSelectableItems,\n\t\tdetachKeydownEvent,\n\t\tregisterKeyHook,\n\t\tgetActiveItemIndex,\n\t\tsetActiveItemId,\n\t\tsetActiveItemIndex,\n\t};\n});\n","import type {\n\tNodeCreateElement,\n\tActionCreateElement,\n\tSubcategorizedNodeTypes,\n\tSimplifiedNodeType,\n\tINodeCreateElement,\n} from '@/Interface';\nimport { CORE_NODES_CATEGORY, DEFAULT_SUBCATEGORY } from '@/constants';\nimport { v4 as uuidv4 } from 'uuid';\nimport { sublimeSearch } from '@/utils';\n\nexport function transformNodeType(\n\tnode: SimplifiedNodeType,\n\tsubcategory?: string,\n\ttype: 'node' | 'action' = 'node',\n): NodeCreateElement | ActionCreateElement {\n\tconst createElement = {\n\t\tuuid: uuidv4(),\n\t\tkey: node.name,\n\t\tsubcategory:\n\t\t\tsubcategory ?? node.codex?.subcategories?.[CORE_NODES_CATEGORY]?.[0] ?? DEFAULT_SUBCATEGORY,\n\t\tproperties: {\n\t\t\t...node,\n\t\t},\n\t\ttype,\n\t};\n\n\treturn type === 'action'\n\t\t? (createElement as ActionCreateElement)\n\t\t: (createElement as NodeCreateElement);\n}\n\nexport function subcategorizeItems(items: SimplifiedNodeType[]) {\n\treturn items.reduce((acc: SubcategorizedNodeTypes, item) => {\n\t\t// Only Core Nodes subcategories are valid, others are uncategorized\n\t\tconst isCoreNodesCategory = item.codex?.categories?.includes(CORE_NODES_CATEGORY);\n\t\tconst subcategories = isCoreNodesCategory\n\t\t\t? item?.codex?.subcategories?.[CORE_NODES_CATEGORY] ?? []\n\t\t\t: [DEFAULT_SUBCATEGORY];\n\n\t\tsubcategories.forEach((subcategory: string) => {\n\t\t\tif (!acc[subcategory]) {\n\t\t\t\tacc[subcategory] = [];\n\t\t\t}\n\t\t\tacc[subcategory].push(transformNodeType(item, subcategory));\n\t\t});\n\n\t\treturn acc;\n\t}, {});\n}\n\nexport function sortNodeCreateElements(nodes: INodeCreateElement[]) {\n\treturn nodes.sort((a, b) => {\n\t\tif (a.type !== 'node' || b.type !== 'node') return -1;\n\t\tconst displayNameA = a.properties?.displayName?.toLowerCase() || a.key;\n\t\tconst displayNameB = b.properties?.displayName?.toLowerCase() || b.key;\n\n\t\treturn displayNameA.localeCompare(displayNameB, undefined, { sensitivity: 'base' });\n\t});\n}\n\nexport function searchNodes(searchFilter: string, items: INodeCreateElement[]) {\n\t// In order to support the old search we need to remove the 'trigger' part\n\tconst trimmedFilter = searchFilter.toLowerCase().replace('trigger', '').trimEnd();\n\tconst result = (\n\t\tsublimeSearch<INodeCreateElement>(trimmedFilter, items, [\n\t\t\t{ key: 'properties.displayName', weight: 1.3 },\n\t\t\t{ key: 'properties.codex.alias', weight: 1 },\n\t\t]) || []\n\t).map(({ item }) => item);\n\n\treturn result;\n}\n","import { computed, ref } from 'vue';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport type { INodeCreateElement, NodeFilterType, SimplifiedNodeType } from '@/Interface';\nimport { DEFAULT_SUBCATEGORY, TRIGGER_NODE_CREATOR_VIEW } from '@/constants';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport { useKeyboardNavigation } from './useKeyboardNavigation';\nimport {\n\ttransformNodeType,\n\tsubcategorizeItems,\n\tsortNodeCreateElements,\n\tsearchNodes,\n} from '../utils';\n\ninterface ViewStack {\n\tuuid?: string;\n\ttitle?: string;\n\tsubtitle?: string;\n\tsearch?: string;\n\tsubcategory?: string;\n\tnodeIcon?: {\n\t\ticonType?: string;\n\t\ticon?: string;\n\t\tcolor?: string;\n\t};\n\ticonUrl?: string;\n\trootView?: NodeFilterType;\n\tactiveIndex?: number;\n\ttransitionDirection?: 'in' | 'out';\n\thasSearch?: boolean;\n\titems?: INodeCreateElement[];\n\tbaselineItems?: INodeCreateElement[];\n\tsearchItems?: SimplifiedNodeType[];\n\tforceIncludeNodes?: string[];\n\tmode?: 'actions' | 'nodes';\n\tbaseFilter?: (item: INodeCreateElement) => boolean;\n\titemsMapper?: (item: INodeCreateElement) => INodeCreateElement;\n}\n\nexport const useViewStacks = defineStore('nodeCreatorViewStacks', () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst { getActiveItemIndex } = useKeyboardNavigation();\n\n\tconst viewStacks = ref<ViewStack[]>([]);\n\n\tconst activeStackItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\n\t\tif (!stack?.baselineItems) {\n\t\t\treturn stack.items ? extendItemsWithUUID(stack.items) : [];\n\t\t}\n\n\t\tif (stack.search && searchBaseItems.value) {\n\t\t\tconst searchBase =\n\t\t\t\tsearchBaseItems.value.length > 0 ? searchBaseItems.value : stack.baselineItems;\n\n\t\t\treturn extendItemsWithUUID(searchNodes(stack.search || '', searchBase));\n\t\t}\n\t\treturn extendItemsWithUUID(stack.baselineItems);\n\t});\n\n\tconst activeViewStack = computed<ViewStack>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack) return {};\n\n\t\treturn {\n\t\t\t...stack,\n\t\t\titems: activeStackItems.value,\n\t\t\thasSearch: (stack.baselineItems || []).length > 8 || stack?.hasSearch,\n\t\t};\n\t});\n\n\tconst activeViewStackMode = computed(\n\t\t() => activeViewStack.value.mode || TRIGGER_NODE_CREATOR_VIEW,\n\t);\n\n\tconst searchBaseItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !stack.searchItems) return [];\n\n\t\treturn stack.searchItems.map((item) => transformNodeType(item, stack.subcategory));\n\t});\n\n\t// Generate a delta between the global search results(all nodes) and the stack search results\n\tconst globalSearchItemsDiff = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !stack.search) return [];\n\n\t\tconst allNodes = nodeCreatorStore.mergedNodes.map((item) => transformNodeType(item));\n\t\tconst globalSearchResult = extendItemsWithUUID(searchNodes(stack.search || '', allNodes));\n\n\t\treturn globalSearchResult.filter((item) => {\n\t\t\treturn !activeStackItems.value.find((activeItem) => activeItem.key === item.key);\n\t\t});\n\t});\n\n\tfunction setStackBaselineItems() {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !activeViewStack.value.uuid) return;\n\n\t\tconst subcategorizedItems = subcategorizeItems(nodeCreatorStore.mergedNodes);\n\t\tlet stackItems =\n\t\t\tstack?.items ?? subcategorizedItems[stack?.subcategory ?? DEFAULT_SUBCATEGORY] ?? [];\n\n\t\t// Ensure that the nodes specified in `stack.forceIncludeNodes` are always included,\n\t\t// regardless of whether the subcategory is matched\n\t\tif ((stack.forceIncludeNodes ?? []).length > 0) {\n\t\t\tconst matchedNodes = nodeCreatorStore.mergedNodes\n\t\t\t\t.filter((item) => stack.forceIncludeNodes?.includes(item.name))\n\t\t\t\t.map((item) => transformNodeType(item, stack.subcategory));\n\n\t\t\tstackItems.push(...matchedNodes);\n\t\t}\n\n\t\tif (stack.baseFilter) {\n\t\t\tstackItems = stackItems.filter(stack.baseFilter);\n\t\t}\n\n\t\tif (stack.itemsMapper) {\n\t\t\tstackItems = stackItems.map(stack.itemsMapper);\n\t\t}\n\n\t\t// Sort only if non-root view\n\t\tif (!stack.items) {\n\t\t\tsortNodeCreateElements(stackItems);\n\t\t}\n\n\t\tupdateCurrentViewStack({ baselineItems: stackItems });\n\t}\n\n\tfunction extendItemsWithUUID(items: INodeCreateElement[]) {\n\t\treturn items.map((item) => ({\n\t\t\t...item,\n\t\t\tuuid: `${item.key}-${uuid()}`,\n\t\t}));\n\t}\n\n\tfunction pushViewStack(stack: ViewStack) {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tupdateCurrentViewStack({ activeIndex: getActiveItemIndex() });\n\t\t}\n\n\t\tconst newStackUuid = uuid();\n\t\tviewStacks.value.push({\n\t\t\t...stack,\n\t\t\tuuid: newStackUuid,\n\t\t\ttransitionDirection: 'in',\n\t\t\tactiveIndex: 0,\n\t\t});\n\t\tsetStackBaselineItems();\n\t}\n\n\tfunction popViewStack() {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tviewStacks.value.pop();\n\t\t\tupdateCurrentViewStack({ transitionDirection: 'out' });\n\t\t}\n\t}\n\n\tfunction updateCurrentViewStack(stack: Partial<ViewStack>) {\n\t\tconst currentStack = viewStacks.value[viewStacks.value.length - 1];\n\t\tconst matchedIndex = viewStacks.value.findIndex((s) => s.uuid === currentStack.uuid);\n\t\tif (!currentStack) return;\n\n\t\t// For each key in the stack, update the matched stack\n\t\tObject.keys(stack).forEach((key) => {\n\t\t\tconst typedKey = key as keyof ViewStack;\n\t\t\tviewStacks.value[matchedIndex] = {\n\t\t\t\t...viewStacks.value[matchedIndex],\n\t\t\t\t[key]: stack[typedKey],\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction resetViewStacks() {\n\t\tviewStacks.value = [];\n\t}\n\n\treturn {\n\t\tviewStacks,\n\t\tactiveViewStack,\n\t\tactiveViewStackMode,\n\t\tglobalSearchItemsDiff,\n\t\tresetViewStacks,\n\t\tupdateCurrentViewStack,\n\t\tpushViewStack,\n\t\tpopViewStack,\n\t};\n});\n","import { memoize, startCase } from 'lodash-es';\nimport type {\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tINodeProperties,\n\tINodeTypeDescription,\n} from 'n8n-workflow';\nimport { CUSTOM_API_CALL_KEY } from '@/constants';\nimport type { ActionTypeDescription, SimplifiedNodeType, ActionsRecord } from '@/Interface';\n\nimport { i18n } from '@/plugins/i18n';\n\nconst PLACEHOLDER_RECOMMENDED_ACTION_KEY = 'placeholder_recommended';\n\nfunction translate(...args: Parameters<typeof i18n.baseText>) {\n\treturn i18n.baseText(...args);\n}\n// Memoize the translation function so we don't have to re-translate the same string\n// multiple times when generating the actions\nconst cachedBaseText = memoize(translate, (...args) => JSON.stringify(args));\n\nconst customNodeActionsParsers: {\n\t[key: string]: (\n\t\tmatchedProperty: INodeProperties,\n\t\tnodeTypeDescription: INodeTypeDescription,\n\t) => ActionTypeDescription[] | undefined;\n} = {\n\t['n8n-nodes-base.hubspotTrigger']: (matchedProperty, nodeTypeDescription) => {\n\t\tconst collection = matchedProperty?.options?.[0] as INodePropertyCollection;\n\n\t\treturn (collection?.values[0]?.options as INodePropertyOptions[])?.map(\n\t\t\t(categoryItem): ActionTypeDescription => ({\n\t\t\t\t...getNodeTypeBase(nodeTypeDescription),\n\t\t\t\tactionKey: categoryItem.value as string,\n\t\t\t\tdisplayName: cachedBaseText('nodeCreator.actionsCategory.onEvent', {\n\t\t\t\t\tinterpolate: { event: startCase(categoryItem.name) },\n\t\t\t\t}),\n\t\t\t\tdescription: categoryItem.description || '',\n\t\t\t\tdisplayOptions: matchedProperty.displayOptions,\n\t\t\t\tvalues: { eventsUi: { eventValues: [{ name: categoryItem.value }] } },\n\t\t\t}),\n\t\t);\n\t},\n};\n\nfunction getNodeTypeBase(nodeTypeDescription: INodeTypeDescription, label?: string) {\n\tconst isTrigger = nodeTypeDescription.group.includes('trigger');\n\tconst category = isTrigger\n\t\t? cachedBaseText('nodeCreator.actionsCategory.triggers')\n\t\t: cachedBaseText('nodeCreator.actionsCategory.actions');\n\treturn {\n\t\tname: nodeTypeDescription.name,\n\t\tgroup: nodeTypeDescription.group,\n\t\tcodex: {\n\t\t\tlabel: label || '',\n\t\t\tcategories: [category],\n\t\t},\n\t\ticonUrl: nodeTypeDescription.iconUrl,\n\t\ticon: nodeTypeDescription.icon,\n\t\tdefaults: nodeTypeDescription.defaults,\n\t};\n}\n\nfunction operationsCategory(nodeTypeDescription: INodeTypeDescription): ActionTypeDescription[] {\n\tif (!!nodeTypeDescription.properties.find((property) => property.name === 'resource')) return [];\n\n\tconst matchedProperty = nodeTypeDescription.properties.find(\n\t\t(property) => property.name?.toLowerCase() === 'operation',\n\t);\n\n\tif (!matchedProperty || !matchedProperty.options) return [];\n\n\tconst filteredOutItems = (matchedProperty.options as INodePropertyOptions[]).filter(\n\t\t(categoryItem: INodePropertyOptions) => !['*', '', ' '].includes(categoryItem.name),\n\t);\n\n\tconst items = filteredOutItems.map((item: INodePropertyOptions) => ({\n\t\t...getNodeTypeBase(nodeTypeDescription),\n\t\tactionKey: item.value as string,\n\t\tdisplayName: item.action ?? startCase(item.name),\n\t\tdescription: item.description ?? '',\n\t\tdisplayOptions: matchedProperty.displayOptions,\n\t\tvalues: {\n\t\t\t[matchedProperty.name]: matchedProperty.type === 'multiOptions' ? [item.value] : item.value,\n\t\t},\n\t}));\n\n\t// Do not return empty category\n\tif (items.length === 0) return [];\n\n\treturn items;\n}\n\nfunction triggersCategory(nodeTypeDescription: INodeTypeDescription): ActionTypeDescription[] {\n\tconst matchingKeys = ['event', 'events', 'trigger on'];\n\tconst isTrigger = nodeTypeDescription.displayName?.toLowerCase().includes('trigger');\n\tconst matchedProperty = nodeTypeDescription.properties.find((property) =>\n\t\tmatchingKeys.includes(property.displayName?.toLowerCase()),\n\t);\n\n\tif (!isTrigger) return [];\n\n\t// Inject placeholder action if no events are available\n\t// so user is able to add node to the canvas from the actions panel\n\tif (!matchedProperty || !matchedProperty.options) {\n\t\treturn [\n\t\t\t{\n\t\t\t\t...getNodeTypeBase(nodeTypeDescription),\n\t\t\t\tactionKey: PLACEHOLDER_RECOMMENDED_ACTION_KEY,\n\t\t\t\tdisplayName: cachedBaseText('nodeCreator.actionsCategory.onNewEvent', {\n\t\t\t\t\tinterpolate: { event: nodeTypeDescription.displayName.replace('Trigger', '').trimEnd() },\n\t\t\t\t}),\n\t\t\t\tdescription: '',\n\t\t\t},\n\t\t];\n\t}\n\n\tconst filteredOutItems = (matchedProperty.options as INodePropertyOptions[]).filter(\n\t\t(categoryItem: INodePropertyOptions) => !['*', '', ' '].includes(categoryItem.name),\n\t);\n\n\tconst customParsedItem = customNodeActionsParsers[nodeTypeDescription.name]?.(\n\t\tmatchedProperty,\n\t\tnodeTypeDescription,\n\t);\n\n\tconst items =\n\t\tcustomParsedItem ??\n\t\tfilteredOutItems.map((categoryItem: INodePropertyOptions) => ({\n\t\t\t...getNodeTypeBase(nodeTypeDescription),\n\t\t\tactionKey: categoryItem.value as string,\n\t\t\tdisplayName:\n\t\t\t\tcategoryItem.action ??\n\t\t\t\tcachedBaseText('nodeCreator.actionsCategory.onEvent', {\n\t\t\t\t\tinterpolate: { event: startCase(categoryItem.name) },\n\t\t\t\t}),\n\t\t\tdescription: categoryItem.description || '',\n\t\t\tdisplayOptions: matchedProperty.displayOptions,\n\t\t\tvalues: {\n\t\t\t\t[matchedProperty.name]:\n\t\t\t\t\tmatchedProperty.type === 'multiOptions' ? [categoryItem.value] : categoryItem.value,\n\t\t\t},\n\t\t}));\n\n\treturn items;\n}\n\nfunction resourceCategories(nodeTypeDescription: INodeTypeDescription): ActionTypeDescription[] {\n\tconst transformedNodes: ActionTypeDescription[] = [];\n\tconst matchedProperties = nodeTypeDescription.properties.filter(\n\t\t(property) => property.displayName?.toLowerCase() === 'resource',\n\t);\n\n\tmatchedProperties.forEach((property) => {\n\t\t((property.options as INodePropertyOptions[]) || [])\n\t\t\t.filter((option) => option.value !== CUSTOM_API_CALL_KEY)\n\t\t\t.forEach((resourceOption, i, options) => {\n\t\t\t\tconst isSingleResource = options.length === 1;\n\n\t\t\t\t// Match operations for the resource by checking if displayOptions matches or contains the resource name\n\t\t\t\tconst operations = nodeTypeDescription.properties.find(\n\t\t\t\t\t(operation) =>\n\t\t\t\t\t\toperation.name === 'operation' &&\n\t\t\t\t\t\t(operation.displayOptions?.show?.resource?.includes(resourceOption.value) ||\n\t\t\t\t\t\t\tisSingleResource),\n\t\t\t\t);\n\n\t\t\t\tif (!operations?.options) return;\n\n\t\t\t\tconst items = ((operations.options as INodePropertyOptions[]) || []).map(\n\t\t\t\t\t(operationOption) => {\n\t\t\t\t\t\tconst displayName =\n\t\t\t\t\t\t\toperationOption.action ?? `${resourceOption.name} ${startCase(operationOption.name)}`;\n\n\t\t\t\t\t\t// We need to manually populate displayOptions as they are not present in the node description\n\t\t\t\t\t\t// if the resource has only one option\n\t\t\t\t\t\tconst displayOptions = isSingleResource\n\t\t\t\t\t\t\t? { show: { resource: [(options as INodePropertyOptions[])[0]?.value] } }\n\t\t\t\t\t\t\t: operations?.displayOptions;\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...getNodeTypeBase(\n\t\t\t\t\t\t\t\tnodeTypeDescription,\n\t\t\t\t\t\t\t\t`${resourceOption.name} ${cachedBaseText('nodeCreator.actionsCategory.actions')}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tactionKey: operationOption.value as string,\n\t\t\t\t\t\t\tdescription: operationOption?.description ?? '',\n\t\t\t\t\t\t\tdisplayOptions,\n\t\t\t\t\t\t\tvalues: {\n\t\t\t\t\t\t\t\toperation:\n\t\t\t\t\t\t\t\t\toperations?.type === 'multiOptions'\n\t\t\t\t\t\t\t\t\t\t? [operationOption.value]\n\t\t\t\t\t\t\t\t\t\t: operationOption.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdisplayName,\n\t\t\t\t\t\t\tgroup: ['trigger'],\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\ttransformedNodes.push(...items);\n\t\t\t});\n\t});\n\n\treturn transformedNodes;\n}\n\nexport function useActionsGenerator() {\n\tfunction generateNodeActions(node: INodeTypeDescription | undefined) {\n\t\tif (!node) return [];\n\t\treturn [...triggersCategory(node), ...operationsCategory(node), ...resourceCategories(node)];\n\t}\n\tfunction filterActions(actions: ActionTypeDescription[]) {\n\t\t// Do not show single action nodes\n\t\tif (actions.length <= 1) return [];\n\t\treturn actions.filter(\n\t\t\t(action: ActionTypeDescription, _: number, arr: ActionTypeDescription[]) => {\n\t\t\t\tconst isApiCall = action.actionKey === CUSTOM_API_CALL_KEY;\n\t\t\t\tif (isApiCall) return false;\n\n\t\t\t\tconst isPlaceholderTriggerAction = action.actionKey === PLACEHOLDER_RECOMMENDED_ACTION_KEY;\n\t\t\t\treturn !isPlaceholderTriggerAction || (isPlaceholderTriggerAction && arr.length > 1);\n\t\t\t},\n\t\t);\n\t}\n\n\tfunction getSimplifiedNodeType(node: INodeTypeDescription): SimplifiedNodeType {\n\t\tconst { displayName, defaults, description, name, group, icon, iconUrl, codex } = node;\n\n\t\treturn {\n\t\t\tdisplayName,\n\t\t\tdefaults,\n\t\t\tdescription,\n\t\t\tname,\n\t\t\tgroup,\n\t\t\ticon,\n\t\t\ticonUrl,\n\t\t\tcodex,\n\t\t};\n\t}\n\n\tfunction generateMergedNodesAndActions(nodeTypes: INodeTypeDescription[]) {\n\t\tconst visibleNodeTypes = [...nodeTypes];\n\t\tconst actions: ActionsRecord<typeof mergedNodes> = {};\n\t\tconst mergedNodes: SimplifiedNodeType[] = [];\n\n\t\tvisibleNodeTypes\n\t\t\t.filter((node) => !node.group.includes('trigger'))\n\t\t\t.forEach((app) => {\n\t\t\t\tconst appActions = generateNodeActions(app);\n\t\t\t\tactions[app.name] = appActions;\n\n\t\t\t\tmergedNodes.push(getSimplifiedNodeType(app));\n\t\t\t});\n\n\t\tvisibleNodeTypes\n\t\t\t.filter((node) => node.group.includes('trigger'))\n\t\t\t.forEach((trigger) => {\n\t\t\t\tconst normalizedName = trigger.name.replace('Trigger', '');\n\t\t\t\tconst triggerActions = generateNodeActions(trigger);\n\t\t\t\tconst appActions = actions?.[normalizedName] || [];\n\t\t\t\tconst app = mergedNodes.find((node) => node.name === normalizedName);\n\n\t\t\t\tif (app && appActions?.length > 0) {\n\t\t\t\t\t// merge triggers into regular nodes that match\n\t\t\t\t\tconst mergedActions = filterActions([...appActions, ...triggerActions]);\n\t\t\t\t\tactions[normalizedName] = mergedActions;\n\n\t\t\t\t\tapp.description = trigger.description; // default to trigger description\n\t\t\t\t} else {\n\t\t\t\t\tactions[trigger.name] = filterActions(triggerActions);\n\t\t\t\t\tmergedNodes.push(getSimplifiedNodeType(trigger));\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn {\n\t\t\tactions,\n\t\t\tmergedNodes,\n\t\t};\n\t}\n\n\treturn {\n\t\tgenerateMergedNodesAndActions,\n\t};\n}\n","import {\n\tCORE_NODES_CATEGORY,\n\tWEBHOOK_NODE_TYPE,\n\tOTHER_TRIGGER_NODES_SUBCATEGORY,\n\tEXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRANSFORM_DATA_SUBCATEGORY,\n\tFILES_SUBCATEGORY,\n\tFLOWS_CONTROL_SUBCATEGORY,\n\tHELPERS_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEMAIL_IMAP_NODE_TYPE,\n\tDEFAULT_SUBCATEGORY,\n} from '@/constants';\nimport { useI18n } from '@/composables';\n\nexport function TriggerView() {\n\tconst i18n = useI18n();\n\n\treturn {\n\t\tvalue: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATrigger'),\n\t\tsubtitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATriggerDescription'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\tforceIncludeNodes: [WEBHOOK_NODE_TYPE, EMAIL_IMAP_NODE_TYPE],\n\t\t\t\t\ttitle: 'App Trigger Nodes',\n\t\t\t\t\ticon: 'satellite-dish',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDescription'),\n\t\t\t\t\ticon: 'fa:clock',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: WEBHOOK_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: WEBHOOK_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'webhook',\n\t\t\t\t\t\tfileBuffer: '/static/webhook-icon.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDescription'),\n\t\t\t\t\ticon: 'fa:mouse-pointer',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDescription'),\n\t\t\t\t\ticon: 'fa:sign-out-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\t\ticon: 'folder-open',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function RegularView() {\n\tconst i18n = useI18n();\n\n\treturn {\n\t\tvalue: REGULAR_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.whatHappensNext'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: 'App Regular Nodes',\n\t\t\t\t\ticon: 'globe',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\t\ticon: 'pen',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: HELPERS_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: HELPERS_SUBCATEGORY,\n\t\t\t\t\ticon: 'toolbox',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\t\ticon: 'code-branch',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FILES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FILES_SUBCATEGORY,\n\t\t\t\t\ticon: 'file-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: TRIGGER_NODE_CREATOR_VIEW,\n\t\t\t\ttype: 'view',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTrigger'),\n\t\t\t\t\ticon: 'bolt',\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTriggerDescription'),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n","<template>\n\t<div :class=\"$style.searchContainer\" data-test-id=\"search-bar\">\n\t\t<div :class=\"{ [$style.prefix]: true, [$style.active]: modelValue.length > 0 }\">\n\t\t\t<font-awesome-icon icon=\"search\" size=\"sm\" />\n\t\t</div>\n\t\t<div :class=\"$style.text\">\n\t\t\t<input\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:value=\"modelValue\"\n\t\t\t\t:class=\"$style.input\"\n\t\t\t\tref=\"inputRef\"\n\t\t\t\tautofocus\n\t\t\t\tdata-test-id=\"node-creator-search-bar\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@input=\"onInput\"\n\t\t\t/>\n\t\t</div>\n\t\t<div :class=\"$style.suffix\" v-if=\"modelValue.length > 0\" @click=\"clear\">\n\t\t\t<button :class=\"[$style.clear, $style.clickable]\">\n\t\t\t\t<font-awesome-icon icon=\"times-circle\" />\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, reactive, toRefs, onBeforeUnmount } from 'vue';\nimport { useWebhooksStore } from '@/stores/webhooks.store';\nimport { runExternalHook } from '@/utils';\n\nexport interface Props {\n\tplaceholder: string;\n\tmodelValue: string;\n}\n\nwithDefaults(defineProps<Props>(), {\n\tplaceholder: '',\n\tmodelValue: '',\n});\n\nconst emit = defineEmits<{\n\t(event: 'update:modelValue', value: string): void;\n}>();\n\nconst state = reactive({\n\tinputRef: null as HTMLInputElement | null,\n});\n\nfunction focus() {\n\tstate.inputRef?.focus();\n}\n\nfunction onInput(event: Event) {\n\tconst input = event.target as HTMLInputElement;\n\temit('update:modelValue', input.value);\n}\n\nfunction clear() {\n\temit('update:modelValue', '');\n}\n\nonMounted(() => {\n\tvoid runExternalHook('nodeCreator_searchBar.mount', useWebhooksStore(), {\n\t\tinputRef: state.inputRef,\n\t});\n\tsetTimeout(focus, 0);\n});\n\nonBeforeUnmount(() => {\n\tstate.inputRef?.remove();\n});\n\nconst { inputRef } = toRefs(state);\ndefineExpose({\n\tfocus,\n});\n</script>\n\n<style lang=\"scss\" module>\n.searchContainer {\n\tdisplay: flex;\n\theight: 40px;\n\tpadding: 0 var(--spacing-xs);\n\talign-items: center;\n\tmargin: var(--search-margin, var(--spacing-s));\n\tfilter: drop-shadow(0px 2px 5px rgba(46, 46, 50, 0.04));\n\n\tborder: 1px solid $node-creator-border-color;\n\tbackground-color: $node-creator-search-background-color;\n\tcolor: $node-creator-search-placeholder-color;\n\tborder-radius: 4px;\n\n\t&:focus-within {\n\t\tborder-color: var(--color-secondary);\n\t}\n}\n\n.prefix {\n\ttext-align: center;\n\tfont-size: var(--font-size-m);\n\tmargin-right: var(--spacing-xs);\n\n\t&.active {\n\t\tcolor: $color-primary !important;\n\t}\n}\n\n.text {\n\tflex-grow: 1;\n\n\tinput {\n\t\twidth: 100%;\n\t\tborder: none;\n\t\toutline: none;\n\t\tfont-size: var(--font-size-s);\n\t\tappearance: none;\n\t\tbackground-color: var(--color-background-xlight);\n\t\tcolor: var(--color-text-dark);\n\n\t\t&::placeholder,\n\t\t&::-webkit-input-placeholder {\n\t\t\tcolor: $node-creator-search-placeholder-color;\n\t\t}\n\t}\n}\n\n.suffix {\n\tmin-width: 20px;\n\ttext-align: right;\n\tdisplay: inline-block;\n}\n\n.clear {\n\tbackground-color: $node-creator-search-clear-color;\n\tpadding: 0;\n\tborder: none;\n\tcursor: pointer;\n\n\tsvg path {\n\t\tfill: $node-creator-search-clear-background-color;\n\t}\n\n\t&:hover svg path {\n\t\tfill: $node-creator-search-clear-background-color-hover;\n\t}\n}\n</style>\n","import { getCurrentInstance, computed } from 'vue';\nimport type { IDataObject, INodeParameters } from 'n8n-workflow';\nimport type {\n\tActionTypeDescription,\n\tINodeCreateElement,\n\tIUpdateInformation,\n\tLabelCreateElement,\n} from '@/Interface';\nimport {\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tWEBHOOK_NODE_TYPE,\n} from '@/constants';\n\nimport type { BaseTextKey } from '@/plugins/i18n';\nimport type { Telemetry } from '@/plugins/telemetry';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { runExternalHook } from '@/utils';\nimport { useWebhooksStore } from '@/stores/webhooks.store';\n\nimport { sortNodeCreateElements, transformNodeType } from '../utils';\n\nexport const useActions = () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst instance = getCurrentInstance();\n\n\tconst actionsCategoryLocales = computed(() => {\n\t\treturn {\n\t\t\tactions: instance?.proxy.$locale.baseText('nodeCreator.actionsCategory.actions') ?? '',\n\t\t\ttriggers: instance?.proxy.$locale.baseText('nodeCreator.actionsCategory.triggers') ?? '',\n\t\t};\n\t});\n\n\tfunction getPlaceholderTriggerActions(subcategory: string) {\n\t\tconst nodes = [WEBHOOK_NODE_TYPE, SCHEDULE_TRIGGER_NODE_TYPE];\n\n\t\tconst matchedNodeTypes = nodeCreatorStore.mergedNodes\n\t\t\t.filter((node) => nodes.some((n) => n === node.name))\n\t\t\t.map((node) => {\n\t\t\t\tconst transformed = transformNodeType(node, subcategory, 'action');\n\n\t\t\t\tif (transformed.type === 'action') {\n\t\t\t\t\tconst nameBase = node.name.replace('n8n-nodes-base.', '');\n\t\t\t\t\tconst localeKey = `nodeCreator.actionsPlaceholderNode.${nameBase}` as BaseTextKey;\n\t\t\t\t\tconst overwriteLocale = instance?.proxy.$locale.baseText(localeKey) as string;\n\n\t\t\t\t\t// If the locale key is not the same as the node name, it means it contain a translation\n\t\t\t\t\t// and we should use it\n\t\t\t\t\tif (overwriteLocale !== localeKey) {\n\t\t\t\t\t\ttransformed.properties.displayName = overwriteLocale;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn transformed;\n\t\t\t});\n\n\t\treturn matchedNodeTypes;\n\t}\n\n\tfunction filterActionsCategory(items: INodeCreateElement[], category: string) {\n\t\treturn items.filter(\n\t\t\t(item) => item.type === 'action' && item.properties.codex.categories.includes(category),\n\t\t);\n\t}\n\n\tfunction injectActionsLabels(items: INodeCreateElement[]): INodeCreateElement[] {\n\t\tconst extendedActions = sortNodeCreateElements([...items]);\n\t\tconst labelsSet = new Set<string>();\n\n\t\t// Collect unique labels\n\t\tfor (const action of extendedActions) {\n\t\t\tif (action.type !== 'action') continue;\n\t\t\tconst label = action.properties?.codex?.label;\n\t\t\tlabelsSet.add(label);\n\t\t}\n\n\t\tif (labelsSet.size <= 1) return extendedActions;\n\n\t\t// Create a map to store the first index of each label\n\t\tconst firstIndexMap = new Map<string, number>();\n\n\t\t// Iterate through the extendedActions to find the first index of each label\n\t\tfor (let i = 0; i < extendedActions.length; i++) {\n\t\t\tconst action = extendedActions[i];\n\t\t\tif (action.type !== 'action') continue;\n\t\t\tconst label = action.properties?.codex?.label;\n\t\t\tif (!firstIndexMap.has(label)) {\n\t\t\t\tfirstIndexMap.set(label, i);\n\t\t\t}\n\t\t}\n\n\t\t// Keep track of the number of inserted labels\n\t\tlet insertedLabels = 0;\n\n\t\t// Create and insert new label objects at the first index of each label\n\t\tfor (const label of labelsSet) {\n\t\t\tconst newLabel: LabelCreateElement = {\n\t\t\t\tuuid: label,\n\t\t\t\ttype: 'label',\n\t\t\t\tkey: label,\n\t\t\t\tsubcategory: extendedActions[0].key,\n\t\t\t\tproperties: {\n\t\t\t\t\tkey: label,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst insertIndex = firstIndexMap.get(label)! + insertedLabels;\n\t\t\textendedActions.splice(insertIndex, 0, newLabel);\n\t\t\tinsertedLabels++;\n\t\t}\n\n\t\treturn extendedActions;\n\t}\n\n\tfunction parseCategoryActions(\n\t\tactions: INodeCreateElement[],\n\t\tcategory: string,\n\t\twithLabels = true,\n\t) {\n\t\tconst filteredActions = filterActionsCategory(actions, category);\n\t\tif (withLabels) return injectActionsLabels(filteredActions);\n\t\treturn filteredActions;\n\t}\n\n\tfunction getActionData(actionItem: ActionTypeDescription): IUpdateInformation {\n\t\tconst displayOptions = actionItem.displayOptions;\n\n\t\tconst displayConditions = Object.keys(displayOptions?.show || {}).reduce(\n\t\t\t(acc: IDataObject, showCondition: string) => {\n\t\t\t\tacc[showCondition] = displayOptions?.show?.[showCondition]?.[0];\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{},\n\t\t);\n\n\t\treturn {\n\t\t\tname: actionItem.displayName,\n\t\t\tkey: actionItem.name as string,\n\t\t\tvalue: { ...actionItem.values, ...displayConditions } as INodeParameters,\n\t\t};\n\t}\n\n\tfunction getNodeTypesWithManualTrigger(nodeType?: string): string[] {\n\t\tif (!nodeType) return [];\n\n\t\tconst { selectedView, openSource } = useNodeCreatorStore();\n\t\tconst { workflowTriggerNodes } = useWorkflowsStore();\n\t\tconst isTrigger = useNodeTypesStore().isTriggerNode(nodeType);\n\t\tconst workflowContainsTrigger = workflowTriggerNodes.length > 0;\n\t\tconst isTriggerPanel = selectedView === TRIGGER_NODE_CREATOR_VIEW;\n\t\tconst isStickyNode = nodeType === STICKY_NODE_TYPE;\n\t\tconst singleNodeOpenSources = [\n\t\t\tNODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\t\tNODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t];\n\n\t\t// If the node creator was opened from the plus endpoint, node connection action, or node connection drop\n\t\t// then we do not want to append the manual trigger\n\t\tconst isSingleNodeOpenSource = singleNodeOpenSources.includes(openSource);\n\t\tconst shouldAppendManualTrigger =\n\t\t\t!isSingleNodeOpenSource &&\n\t\t\t!isTrigger &&\n\t\t\t!workflowContainsTrigger &&\n\t\t\tisTriggerPanel &&\n\t\t\t!isStickyNode;\n\n\t\tconst nodeTypes = shouldAppendManualTrigger ? [MANUAL_TRIGGER_NODE_TYPE, nodeType] : [nodeType];\n\n\t\treturn nodeTypes;\n\t}\n\n\t// Hook into addNode action to set the last node parameters & track the action selected\n\tfunction setAddedNodeActionParameters(\n\t\taction: IUpdateInformation,\n\t\ttelemetry?: Telemetry,\n\t\trootView = '',\n\t) {\n\t\tconst { $onAction: onWorkflowStoreAction } = useWorkflowsStore();\n\t\tconst storeWatcher = onWorkflowStoreAction(\n\t\t\t({ name, after, store: { setLastNodeParameters }, args }) => {\n\t\t\t\tif (name !== 'addNode' || args[0].type !== action.key) return;\n\t\t\t\tafter(() => {\n\t\t\t\t\tsetLastNodeParameters(action);\n\t\t\t\t\tif (telemetry) trackActionSelected(action, telemetry, rootView);\n\t\t\t\t\t// Unsubscribe from the store watcher\n\t\t\t\t\tstoreWatcher();\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\treturn storeWatcher;\n\t}\n\n\tfunction trackActionSelected(action: IUpdateInformation, telemetry: Telemetry, rootView: string) {\n\t\tconst payload = {\n\t\t\tnode_type: action.key,\n\t\t\taction: action.name,\n\t\t\tsource_mode: rootView.toLowerCase(),\n\t\t\tresource: (action.value as INodeParameters).resource || '',\n\t\t};\n\t\tvoid runExternalHook('nodeCreateList.addAction', useWebhooksStore(), payload);\n\t\ttelemetry?.trackNodesPanel('nodeCreateList.addAction', payload);\n\t}\n\n\treturn {\n\t\tactionsCategoryLocales,\n\t\tgetPlaceholderTriggerActions,\n\t\tparseCategoryActions,\n\t\tgetNodeTypesWithManualTrigger,\n\t\tgetActionData,\n\t\tsetAddedNodeActionParameters,\n\t};\n};\n","<template>\n\t<!-- Node Item is draggable only if it doesn't contain actions -->\n\t<n8n-node-creator-node\n\t\t:draggable=\"!showActionArrow\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t\t:class=\"$style.nodeItem\"\n\t\t:description=\"subcategory !== DEFAULT_SUBCATEGORY ? description : ''\"\n\t\t:title=\"displayName\"\n\t\t:show-action-arrow=\"showActionArrow\"\n\t\t:is-trigger=\"isTrigger\"\n\t\t:data-test-id=\"dataTestId\"\n\t>\n\t\t<template #icon>\n\t\t\t<node-icon :nodeType=\"nodeType\" />\n\t\t</template>\n\n\t\t<template #tooltip v-if=\"isCommunityNode\">\n\t\t\t<p\n\t\t\t\t:class=\"$style.communityNodeIcon\"\n\t\t\t\tv-html=\"\n\t\t\t\t\ti18n.baseText('generic.communityNode.tooltip', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tpackageName: nodeType.name.split('.')[0],\n\t\t\t\t\t\t\tdocURL: COMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t\t@click=\"onCommunityNodeTooltipClick\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #dragContent>\n\t\t\t<div :class=\"$style.draggableDataTransfer\" ref=\"draggableDataTransfer\" />\n\t\t\t<div :class=\"$style.draggable\" :style=\"draggableStyle\" v-show=\"dragging\">\n\t\t\t\t<node-icon :nodeType=\"nodeType\" @click.capture.stop :size=\"40\" :shrink=\"false\" />\n\t\t\t</div>\n\t\t</template>\n\t</n8n-node-creator-node>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport type { SimplifiedNodeType } from '@/Interface';\nimport { COMMUNITY_NODES_INSTALLATION_DOCS_URL, DEFAULT_SUBCATEGORY } from '@/constants';\n\nimport { isCommunityPackageName } from '@/utils';\nimport { getNewNodePosition, NODE_SIZE } from '@/utils/nodeViewUtils';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport NodeIcon from '@/components/NodeIcon.vue';\n\nimport { useActions } from '../composables/useActions';\nimport { useI18n, useTelemetry } from '@/composables';\n\nexport interface Props {\n\tnodeType: SimplifiedNodeType;\n\tsubcategory?: string;\n\tactive?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n\tactive: false,\n});\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\n\nconst { actions } = useNodeCreatorStore();\nconst { getNodeTypesWithManualTrigger } = useActions();\n\nconst dragging = ref(false);\nconst draggablePosition = ref({ x: -100, y: -100 });\nconst draggableDataTransfer = ref(null as Element | null);\n\nconst description = computed<string>(() => {\n\treturn i18n.headerText({\n\t\tkey: `headers.${shortNodeType.value}.description`,\n\t\tfallback: props.nodeType.description,\n\t}) as string;\n});\nconst showActionArrow = computed(() => hasActions.value);\nconst dataTestId = computed(() =>\n\thasActions.value ? 'node-creator-action-item' : 'node-creator-node-item',\n);\n\nconst hasActions = computed(() => {\n\treturn nodeActions.value.length > 1;\n});\n\nconst nodeActions = computed(() => {\n\tconst nodeActions = actions[props.nodeType.name] || [];\n\treturn nodeActions;\n});\n\nconst shortNodeType = computed<string>(() => i18n.shortNodeType(props.nodeType.name) || '');\n\nconst draggableStyle = computed<{ top: string; left: string }>(() => ({\n\ttop: `${draggablePosition.value.y}px`,\n\tleft: `${draggablePosition.value.x}px`,\n}));\n\nconst isCommunityNode = computed<boolean>(() => isCommunityPackageName(props.nodeType.name));\n\nconst displayName = computed<any>(() => {\n\tconst displayName = props.nodeType.displayName.trimEnd();\n\n\treturn i18n.headerText({\n\t\tkey: `headers.${shortNodeType.value}.displayName`,\n\t\tfallback: hasActions.value ? displayName.replace('Trigger', '') : displayName,\n\t});\n});\n\nconst isTrigger = computed<boolean>(() => {\n\treturn props.nodeType.group.includes('trigger') && !hasActions.value;\n});\nfunction onDragStart(event: DragEvent): void {\n\t/**\n\t * Workaround for firefox, that doesn't attach the pageX and pageY coordinates to \"ondrag\" event.\n\t * All browsers attach the correct page coordinates to the \"dragover\" event.\n\t * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n\t */\n\tdocument.body.addEventListener('dragover', onDragOver);\n\n\tconst { pageX: x, pageY: y } = event;\n\n\tif (event.dataTransfer) {\n\t\tevent.dataTransfer.effectAllowed = 'copy';\n\t\tevent.dataTransfer.dropEffect = 'copy';\n\t\tevent.dataTransfer.setDragImage(draggableDataTransfer.value as Element, 0, 0);\n\t\tevent.dataTransfer.setData(\n\t\t\t'nodeTypeName',\n\t\t\tgetNodeTypesWithManualTrigger(props.nodeType.name).join(','),\n\t\t);\n\t}\n\n\tdragging.value = true;\n\tdraggablePosition.value = { x, y };\n}\n\nfunction onDragOver(event: DragEvent): void {\n\tif (!dragging.value || (event.pageX === 0 && event.pageY === 0)) {\n\t\treturn;\n\t}\n\n\tconst [x, y] = getNewNodePosition([], [event.pageX - NODE_SIZE / 2, event.pageY - NODE_SIZE / 2]);\n\n\tdraggablePosition.value = { x, y };\n}\n\nfunction onDragEnd(event: DragEvent): void {\n\tdocument.body.removeEventListener('dragover', onDragOver);\n\n\tdragging.value = false;\n\tsetTimeout(() => {\n\t\tdraggablePosition.value = { x: -100, y: -100 };\n\t}, 300);\n}\n\nfunction onCommunityNodeTooltipClick(event: MouseEvent) {\n\tif ((event.target as Element).localName === 'a') {\n\t\ttelemetry.track('user clicked cnr docs link', { source: 'nodes panel node' });\n\t}\n}\n</script>\n<style lang=\"scss\" module>\n.nodeItem {\n\t--trigger-icon-background-color: #{$trigger-icon-background-color};\n\t--trigger-icon-border-color: #{$trigger-icon-border-color};\n\tmargin-left: 15px;\n\tmargin-right: 12px;\n\tuser-select: none;\n}\n\n.communityNodeIcon {\n\tvertical-align: top;\n}\n\n.draggable {\n\twidth: 100px;\n\theight: 100px;\n\tposition: fixed;\n\tz-index: 1;\n\topacity: 0.66;\n\tborder: 2px solid var(--color-foreground-xdark);\n\tborder-radius: var(--border-radius-large);\n\tbackground-color: var(--color-background-xlight);\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n}\n\n.draggableDataTransfer {\n\twidth: 1px;\n\theight: 1px;\n}\n</style>\n","<template>\n\t<n8n-node-creator-node\n\t\t:class=\"$style.subCategory\"\n\t\t:title=\"i18n.baseText(`nodeCreator.subcategoryNames.${subcategoryName}`)\"\n\t\t:isTrigger=\"false\"\n\t\t:description=\"i18n.baseText(`nodeCreator.subcategoryDescriptions.${subcategoryName}`)\"\n\t\t:showActionArrow=\"true\"\n\t>\n\t\t<template #icon>\n\t\t\t<n8n-node-icon type=\"icon\" :name=\"item.icon\" :circle=\"false\" :showTooltip=\"false\" />\n\t\t</template>\n\t</n8n-node-creator-node>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SubcategoryItemProps } from '@/Interface';\nimport { camelCase } from 'lodash-es';\nimport { computed } from 'vue';\nimport { useI18n } from '@/composables';\n\nexport interface Props {\n\titem: SubcategoryItemProps;\n}\n\nconst props = defineProps<Props>();\nconst i18n = useI18n();\nconst subcategoryName = computed(() => camelCase(props.item.subcategory || props.item.title));\n</script>\n\n<style lang=\"scss\" module>\n.subCategory {\n\t--action-arrow-color: var(--color-text-light);\n\tmargin-left: 15px;\n\tmargin-right: 12px;\n}\n</style>\n","<template>\n\t<n8n-node-creator-node\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t\tdraggable\n\t\t:class=\"$style.action\"\n\t\t:title=\"action.displayName\"\n\t\t:isTrigger=\"isTriggerAction(action)\"\n\t\tdata-keyboard-nav=\"true\"\n\t>\n\t\t<template #dragContent>\n\t\t\t<div :class=\"$style.draggableDataTransfer\" ref=\"draggableDataTransfer\" />\n\t\t\t<div :class=\"$style.draggable\" :style=\"draggableStyle\" v-show=\"dragging\">\n\t\t\t\t<node-icon :nodeType=\"nodeType\" @click.capture.stop :size=\"40\" :shrink=\"false\" />\n\t\t\t</div>\n\t\t</template>\n\t\t<template #icon>\n\t\t\t<node-icon :nodeType=\"action\" />\n\t\t</template>\n\t</n8n-node-creator-node>\n</template>\n\n<script setup lang=\"ts\">\nimport { reactive, computed, toRefs, getCurrentInstance } from 'vue';\nimport type { ActionTypeDescription, SimplifiedNodeType } from '@/Interface';\nimport { WEBHOOK_NODE_TYPE } from '@/constants';\n\nimport { getNewNodePosition, NODE_SIZE } from '@/utils/nodeViewUtils';\nimport NodeIcon from '@/components/NodeIcon.vue';\n\nimport { useViewStacks } from '../composables/useViewStacks';\nimport { useActions } from '../composables/useActions';\n\nexport interface Props {\n\tnodeType: SimplifiedNodeType;\n\taction: ActionTypeDescription;\n}\n\nconst props = defineProps<Props>();\n\nconst instance = getCurrentInstance();\nconst telemetry = instance?.proxy.$telemetry;\n\nconst { getActionData, getNodeTypesWithManualTrigger, setAddedNodeActionParameters } = useActions();\nconst { activeViewStack } = useViewStacks();\n\nconst state = reactive({\n\tdragging: false,\n\tdraggablePosition: {\n\t\tx: -100,\n\t\ty: -100,\n\t},\n\tstoreWatcher: null as Function | null,\n\tdraggableDataTransfer: null as Element | null,\n});\n\nconst draggableStyle = computed<{ top: string; left: string }>(() => ({\n\ttop: `${state.draggablePosition.y}px`,\n\tleft: `${state.draggablePosition.x}px`,\n}));\n\nconst actionData = computed(() => getActionData(props.action));\n\nconst isTriggerAction = (action: ActionTypeDescription) =>\n\taction.name?.toLowerCase().includes('trigger') || action.name === WEBHOOK_NODE_TYPE;\n\nfunction onDragStart(event: DragEvent): void {\n\t/**\n\t * Workaround for firefox, that doesn't attach the pageX and pageY coordinates to \"ondrag\" event.\n\t * All browsers attach the correct page coordinates to the \"dragover\" event.\n\t * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n\t */\n\tdocument.body.addEventListener('dragover', onDragOver);\n\tconst { pageX: x, pageY: y } = event;\n\tif (event.dataTransfer) {\n\t\tevent.dataTransfer.effectAllowed = 'copy';\n\t\tevent.dataTransfer.dropEffect = 'copy';\n\t\tevent.dataTransfer.setDragImage(state.draggableDataTransfer as Element, 0, 0);\n\t\tevent.dataTransfer.setData(\n\t\t\t'nodeTypeName',\n\t\t\tgetNodeTypesWithManualTrigger(actionData.value?.key).join(','),\n\t\t);\n\t\tif (telemetry) {\n\t\t\tstate.storeWatcher = setAddedNodeActionParameters(\n\t\t\t\tactionData.value,\n\t\t\t\ttelemetry,\n\t\t\t\tactiveViewStack.rootView,\n\t\t\t);\n\t\t}\n\t\tdocument.body.addEventListener('dragend', onDragEnd);\n\t}\n\n\tstate.dragging = true;\n\tstate.draggablePosition = { x, y };\n}\n\nfunction onDragOver(event: DragEvent): void {\n\tif (!state.dragging || (event.pageX === 0 && event.pageY === 0)) {\n\t\treturn;\n\t}\n\n\tconst [x, y] = getNewNodePosition([], [event.pageX - NODE_SIZE / 2, event.pageY - NODE_SIZE / 2]);\n\n\tstate.draggablePosition = { x, y };\n}\n\nfunction onDragEnd(event: DragEvent): void {\n\tif (state.storeWatcher) state.storeWatcher();\n\tdocument.body.removeEventListener('dragend', onDragEnd);\n\tdocument.body.removeEventListener('dragover', onDragOver);\n\n\tstate.dragging = false;\n\tsetTimeout(() => {\n\t\tstate.draggablePosition = { x: -100, y: -100 };\n\t}, 300);\n}\nconst { draggableDataTransfer, dragging } = toRefs(state);\n</script>\n\n<style lang=\"scss\" module>\n.action {\n\t--node-creator-name-size: var(--font-size-2xs);\n\t--node-creator-name-weight: var(--font-weight-normal);\n\t--trigger-icon-background-color: #{$trigger-icon-background-color};\n\t--trigger-icon-border-color: #{$trigger-icon-border-color};\n\t--node-icon-size: 20px;\n\t--node-icon-margin-right: var(--spacing-xs);\n\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-s);\n\tpadding: var(--spacing-2xs) 0;\n}\n.nodeIcon {\n\tmargin-right: var(--spacing-xs);\n}\n\n.draggable {\n\twidth: 100px;\n\theight: 100px;\n\tposition: fixed;\n\tz-index: 1;\n\topacity: 0.66;\n\tborder: 2px solid var(--color-foreground-xdark);\n\tborder-radius: var(--border-radius-large);\n\tbackground-color: var(--color-background-xlight);\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n}\n\n.draggableDataTransfer {\n\twidth: 1px;\n\theight: 1px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { INodeCreateElement } from '@/Interface';\nimport { onMounted, watch, onUnmounted, ref, computed } from 'vue';\n\nimport { useKeyboardNavigation } from '../composables/useKeyboardNavigation';\nimport NodeItem from '../ItemTypes/NodeItem.vue';\nimport SubcategoryItem from '../ItemTypes/SubcategoryItem.vue';\nimport LabelItem from '../ItemTypes/LabelItem.vue';\nimport ActionItem from '../ItemTypes/ActionItem.vue';\nimport ViewItem from '../ItemTypes/ViewItem.vue';\nexport interface Props {\n\telements: INodeCreateElement[];\n\tactiveIndex?: number;\n\tdisabled?: boolean;\n\tlazyRender?: boolean;\n}\n\nconst LAZY_LOAD_THRESHOLD = 20;\nconst LAZY_LOAD_ITEMS_PER_TICK = 5;\nconst props = withDefaults(defineProps<Props>(), {\n\telements: () => [],\n\tlazyRender: true,\n});\n\nconst emit = defineEmits<{\n\t(event: 'selected', element: INodeCreateElement, $e?: Event): void;\n\t(event: 'dragstart', element: INodeCreateElement, $e: Event): void;\n\t(event: 'dragend', element: INodeCreateElement, $e: Event): void;\n}>();\n\nconst renderedItems = ref<INodeCreateElement[]>([]);\nconst renderAnimationRequest = ref<number>(0);\n\nconst activeItemId = computed(() => useKeyboardNavigation()?.activeItemId);\n\n// Lazy render large items lists to prevent the browser from freezing\n// when loading many items.\nfunction renderItems() {\n\tif (props.elements.length <= LAZY_LOAD_THRESHOLD || props.lazyRender === false) {\n\t\trenderedItems.value = props.elements;\n\t\treturn;\n\t}\n\n\tif (renderedItems.value.length < props.elements.length) {\n\t\trenderedItems.value.push(\n\t\t\t...props.elements.slice(\n\t\t\t\trenderedItems.value.length,\n\t\t\t\trenderedItems.value.length + LAZY_LOAD_ITEMS_PER_TICK,\n\t\t\t),\n\t\t);\n\t\trenderAnimationRequest.value = window.requestAnimationFrame(renderItems);\n\t}\n}\n\nfunction wrappedEmit(\n\tevent: 'selected' | 'dragstart' | 'dragend',\n\telement: INodeCreateElement,\n\t$e?: Event,\n) {\n\tif (props.disabled) return;\n\n\temit((event as 'selected') || 'dragstart' || 'dragend', element, $e);\n}\n\nfunction beforeEnter(el: HTMLElement) {\n\tel.style.height = '0';\n}\n\nfunction enter(el: HTMLElement) {\n\tel.style.height = `${el.scrollHeight}px`;\n}\n\nfunction beforeLeave(el: HTMLElement) {\n\tel.style.height = `${el.scrollHeight}px`;\n}\n\nfunction leave(el: HTMLElement) {\n\tel.style.height = '0';\n}\n\nonMounted(() => {\n\trenderItems();\n});\n\nonUnmounted(() => {\n\twindow.cancelAnimationFrame(renderAnimationRequest.value);\n\trenderedItems.value = [];\n});\n\n// Make sure the active item is always visible\n// scroll if needed\nwatch(\n\t() => props.elements,\n\t() => {\n\t\twindow.cancelAnimationFrame(renderAnimationRequest.value);\n\t\trenderedItems.value = [];\n\t\trenderItems();\n\t},\n);\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"elements.length > 0\"\n\t\t:class=\"$style.itemsRenderer\"\n\t\tname=\"accordion\"\n\t\t@before-enter=\"beforeEnter\"\n\t\t@enter=\"enter\"\n\t\t@before-leave=\"beforeLeave\"\n\t\t@leave=\"leave\"\n\t>\n\t\t<slot />\n\t\t<div\n\t\t\tv-for=\"item in elements\"\n\t\t\t:key=\"item.uuid\"\n\t\t\tdata-test-id=\"item-iterator-item\"\n\t\t\t:class=\"{\n\t\t\t\tclickable: !disabled,\n\t\t\t\t[$style.active]: activeItemId === item.uuid,\n\t\t\t\t[$style.iteratorItem]: true,\n\t\t\t\t[$style[item.type]]: true,\n\t\t\t}\"\n\t\t\tref=\"iteratorItems\"\n\t\t\t:data-keyboard-nav-type=\"item.type !== 'label' ? item.type : undefined\"\n\t\t\t:data-keyboard-nav-id=\"item.uuid\"\n\t\t\t@click=\"wrappedEmit('selected', item)\"\n\t\t>\n\t\t\t<div v-if=\"renderedItems.includes(item)\">\n\t\t\t\t<label-item v-if=\"item.type === 'label'\" :item=\"item\" />\n\t\t\t\t<subcategory-item v-if=\"item.type === 'subcategory'\" :item=\"item.properties\" />\n\n\t\t\t\t<node-item\n\t\t\t\t\tv-if=\"item.type === 'node'\"\n\t\t\t\t\t:nodeType=\"item.properties\"\n\t\t\t\t\t:active=\"true\"\n\t\t\t\t\t:subcategory=\"item.subcategory\"\n\t\t\t\t/>\n\n\t\t\t\t<action-item\n\t\t\t\t\tv-if=\"item.type === 'action'\"\n\t\t\t\t\t:nodeType=\"item.properties\"\n\t\t\t\t\t:action=\"item.properties\"\n\t\t\t\t\t:active=\"true\"\n\t\t\t\t/>\n\n\t\t\t\t<view-item\n\t\t\t\t\tv-else-if=\"item.type === 'view'\"\n\t\t\t\t\t:view=\"item.properties\"\n\t\t\t\t\t:class=\"$style.viewItem\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<n8n-loading :loading=\"true\" :rows=\"1\" variant=\"p\" :class=\"$style.itemSkeleton\" v-else />\n\t\t</div>\n\t</div>\n\t<div :class=\"$style.empty\" v-else>\n\t\t<slot name=\"empty\" />\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.itemSkeleton {\n\theight: 50px;\n}\n.iteratorItem {\n\t// Make sure border is fully visible\n\tmargin-left: 1px;\n\tposition: relative;\n\t&::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tleft: -1px;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tborder-left: 2px solid transparent;\n\t}\n\t&:not(.label):not(.category):hover::before {\n\t\tborder-color: $node-creator-item-hover-border-color;\n\t}\n\n\t&.active:not(.category)::before {\n\t\tborder-color: $color-primary;\n\t}\n}\n.empty {\n\t:global([role='alert']) {\n\t\tmargin: var(--spacing-xs) var(--spacing-s);\n\t}\n}\n.itemsRenderer {\n\tdisplay: flex;\n\tflex-direction: column;\n\n\tscrollbar-width: none; /* Firefox 64 */\n\t& > *::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n}\n.view {\n\tmargin-top: var(--spacing-s);\n\tpadding-top: var(--spacing-xs);\n\tposition: relative;\n\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tleft: var(--spacing-s);\n\t\tright: var(--spacing-s);\n\t\ttop: 0;\n\t\tmargin: auto;\n\t\tbottom: 0;\n\t\tborder-top: 1px solid var(--color-foreground-base);\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\nexport interface Props {\n\texpanded?: boolean;\n\tactive?: boolean;\n\tcount?: number;\n\tname: string;\n\tisTrigger?: boolean;\n}\nconst props = withDefaults(defineProps<Props>(), {\n\texpanded: true,\n});\n\nconst categoryName = computed(() => {\n\tconst itemsCount = props.count || 0;\n\treturn itemsCount > 0 ? `${props.name} (${itemsCount})` : props.name;\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"$style.categoryWrapper\"\n\t\tv-bind=\"$attrs\"\n\t\tdata-keyboard-nav=\"true\"\n\t\tdata-test-id=\"node-creator-category-item\"\n\t>\n\t\t<div :class=\"{ [$style.category]: true, [$style.active]: active }\">\n\t\t\t<span :class=\"$style.name\">\n\t\t\t\t<span v-text=\"categoryName\" />\n\t\t\t\t<font-awesome-icon icon=\"bolt\" v-if=\"isTrigger\" size=\"xs\" :class=\"$style.triggerIcon\" />\n\t\t\t\t<slot />\n\t\t\t</span>\n\t\t\t<font-awesome-icon v-if=\"expanded\" icon=\"chevron-down\" :class=\"$style.arrow\" />\n\t\t\t<font-awesome-icon :class=\"$style.arrow\" icon=\"chevron-up\" v-else />\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.triggerIcon {\n\tcolor: var(--color-primary);\n\tmargin-left: var(--spacing-3xs);\n}\n.category {\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n\tline-height: var(--font-line-height-compact);\n\tpadding: var(--spacing-2xs) var(--spacing-s);\n\tborder-bottom: 1px solid $node-creator-border-color;\n\tdisplay: flex;\n\tcursor: pointer;\n\n\tposition: relative;\n\t&::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tborder-left: 2px solid transparent;\n\t}\n\t&:hover::before {\n\t\tborder-color: $node-creator-item-hover-border-color;\n\t}\n\t&.active::before {\n\t\tborder-color: $color-primary;\n\t}\n}\n\n.name {\n\tflex-grow: 1;\n\tcolor: var(--color-text-dark);\n}\n\n.arrow {\n\tfont-size: var(--font-size-2xs);\n\twidth: 12px;\n\tcolor: $node-creator-arrow-color;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, watch, ref, getCurrentInstance } from 'vue';\nimport type { INodeCreateElement } from '@/Interface';\n\nimport { useWorkflowsStore } from '@/stores/workflows.store';\n\nimport { useKeyboardNavigation } from '../composables/useKeyboardNavigation';\nimport { useViewStacks } from '../composables/useViewStacks';\nimport ItemsRenderer from './ItemsRenderer.vue';\nimport CategoryItem from '../ItemTypes/CategoryItem.vue';\n\nexport interface Props {\n\telements: INodeCreateElement[];\n\tcategory: string;\n\tdisabled?: boolean;\n\tactiveIndex?: number;\n\tisTriggerCategory?: boolean;\n\tmouseOverTooltip?: string;\n\texpanded?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n\telements: () => [],\n});\n\nconst instance = getCurrentInstance();\n\nconst { popViewStack } = useViewStacks();\nconst { registerKeyHook } = useKeyboardNavigation();\nconst { workflowId } = useWorkflowsStore();\n\nconst activeItemId = computed(() => useKeyboardNavigation()?.activeItemId);\nconst actionCount = computed(() => props.elements.filter(({ type }) => type === 'action').length);\nconst expanded = ref(props.expanded ?? false);\n\nfunction toggleExpanded() {\n\tsetExpanded(!expanded.value);\n}\n\nfunction setExpanded(isExpanded: boolean) {\n\texpanded.value = isExpanded;\n\n\tif (expanded.value) {\n\t\tinstance?.proxy.$telemetry.trackNodesPanel('nodeCreateList.onCategoryExpanded', {\n\t\t\tcategory_name: props.category,\n\t\t\tworkflow_id: workflowId,\n\t\t});\n\t}\n}\n\nfunction arrowRight() {\n\tif (expanded.value) return;\n\n\tsetExpanded(true);\n}\n\nfunction arrowLeft() {\n\tif (!expanded.value) {\n\t\tpopViewStack();\n\t\treturn;\n\t}\n\n\tsetExpanded(false);\n}\n\nwatch(\n\t() => props.elements,\n\t() => {\n\t\tsetExpanded(true);\n\t},\n);\n\nregisterKeyHook(`CategoryRight_${props.category}`, {\n\tkeyboardKeys: ['ArrowRight'],\n\tcondition: (type, activeItemId) => type === 'category' && props.category === activeItemId,\n\thandler: arrowRight,\n});\nregisterKeyHook(`CategoryToggle_${props.category}`, {\n\tkeyboardKeys: ['Enter'],\n\tcondition: (type, activeItemId) => type === 'category' && props.category === activeItemId,\n\thandler: toggleExpanded,\n});\n\nregisterKeyHook(`CategoryLeft_${props.category}`, {\n\tkeyboardKeys: ['ArrowLeft'],\n\tcondition: (type, activeItemId) => type === 'category' && props.category === activeItemId,\n\thandler: arrowLeft,\n});\n</script>\n\n<template>\n\t<div :class=\"$style.categorizedItemsRenderer\" :data-category-collapsed=\"!expanded\">\n\t\t<CategoryItem\n\t\t\t:class=\"$style.categoryItem\"\n\t\t\t:name=\"category\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:active=\"activeItemId === category\"\n\t\t\t:count=\"actionCount\"\n\t\t\t:expanded=\"expanded\"\n\t\t\t:isTrigger=\"isTriggerCategory\"\n\t\t\tdata-keyboard-nav-type=\"category\"\n\t\t\t:data-keyboard-nav-id=\"category\"\n\t\t\t@click=\"toggleExpanded\"\n\t\t>\n\t\t\t<span :class=\"$style.mouseOverTooltip\" v-if=\"mouseOverTooltip\">\n\t\t\t\t<n8n-tooltip placement=\"top\" :popper-class=\"$style.tooltipPopper\">\n\t\t\t\t\t<n8n-icon icon=\"question-circle\" size=\"small\" />\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div v-html=\"mouseOverTooltip\" />\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</span>\n\t\t</CategoryItem>\n\t\t<div :class=\"$style.contentSlot\" v-if=\"expanded && actionCount > 0 && $slots.default\">\n\t\t\t<slot />\n\t\t</div>\n\t\t<!-- Pass through listeners & empty slot to ItemsRenderer -->\n\t\t<ItemsRenderer\n\t\t\tv-if=\"expanded\"\n\t\t\tv-bind=\"$attrs\"\n\t\t\t:elements=\"elements\"\n\t\t\t:isTrigger=\"isTriggerCategory\"\n\t\t>\n\t\t\t<template #default> </template>\n\t\t\t<template #empty>\n\t\t\t\t<slot name=\"empty\" v-bind=\"{ elements }\" />\n\t\t\t</template>\n\t\t</ItemsRenderer>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.mouseOverTooltip {\n\topacity: 0;\n\tmargin-left: var(--spacing-3xs);\n\t&:hover {\n\t\tcolor: var(--color-primary);\n\t}\n\n\t.categorizedItemsRenderer:hover & {\n\t\topacity: 1;\n\t}\n}\n.tooltipPopper {\n\tmax-width: 260px;\n}\n.contentSlot {\n\tpadding: 0 var(--spacing-s) var(--spacing-3xs);\n\tmargin-top: var(--spacing-xs);\n}\n.categorizedItemsRenderer {\n\tpadding-bottom: var(--spacing-s);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, onMounted, defineComponent, h } from 'vue';\nimport type { PropType } from 'vue';\nimport type {\n\tINodeCreateElement,\n\tActionTypeDescription,\n\tNodeFilterType,\n\tIUpdateInformation,\n\tActionCreateElement,\n} from '@/Interface';\nimport {\n\tHTTP_REQUEST_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tCUSTOM_API_CALL_KEY,\n} from '@/constants';\n\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWebhooksStore } from '@/stores/webhooks.store';\nimport { runExternalHook } from '@/utils';\n\nimport { useActions } from '../composables/useActions';\nimport { useKeyboardNavigation } from '../composables/useKeyboardNavigation';\nimport { useViewStacks } from '../composables/useViewStacks';\n\nimport ItemsRenderer from '../Renderers/ItemsRenderer.vue';\nimport CategorizedItemsRenderer from '../Renderers/CategorizedItemsRenderer.vue';\n\nconst emit = defineEmits({\n\tnodeTypeSelected: (nodeTypes: string[]) => true,\n});\nconst instance = getCurrentInstance();\nconst telemetry = instance?.proxy.$telemetry;\n\nconst { userActivated } = useUsersStore();\nconst { popViewStack, updateCurrentViewStack } = useViewStacks();\nconst { registerKeyHook } = useKeyboardNavigation();\nconst {\n\tgetNodeTypesWithManualTrigger,\n\tsetAddedNodeActionParameters,\n\tgetActionData,\n\tgetPlaceholderTriggerActions,\n\tparseCategoryActions,\n\tactionsCategoryLocales,\n} = useActions();\n\n// We only inject labels if search is empty\nconst parsedTriggerActions = computed(() =>\n\tparseActions(actions.value, actionsCategoryLocales.value.triggers, false),\n);\nconst parsedActionActions = computed(() =>\n\tparseActions(actions.value, actionsCategoryLocales.value.actions, !search.value),\n);\nconst parsedTriggerActionsBaseline = computed(() =>\n\tparseActions(\n\t\tuseViewStacks().activeViewStack.baselineItems || [],\n\t\tactionsCategoryLocales.value.triggers,\n\t\tfalse,\n\t),\n);\nconst parsedActionActionsBaseline = computed(() =>\n\tparseActions(\n\t\tuseViewStacks().activeViewStack.baselineItems || [],\n\t\tactionsCategoryLocales.value.actions,\n\t\t!search.value,\n\t),\n);\n\n// Because the placeholder items are inserted into the slots, we need to\n// add the placeholder count to the category name manually\nconst triggerCategoryName = computed(() =>\n\tparsedTriggerActions.value.length || search.value\n\t\t? actionsCategoryLocales.value.triggers\n\t\t: `${actionsCategoryLocales.value.triggers} (${placeholderTriggerActions.length})`,\n);\n\nconst actions = computed(() => {\n\treturn (useViewStacks().activeViewStack.items || []).filter(\n\t\t(p) => (p as ActionCreateElement).properties.actionKey !== CUSTOM_API_CALL_KEY,\n\t);\n});\n\nconst search = computed(() => useViewStacks().activeViewStack.search);\n\nconst subcategory = computed(() => useViewStacks().activeViewStack.subcategory);\n\nconst rootView = computed(() => useViewStacks().activeViewStack.rootView);\n\nconst placeholderTriggerActions = getPlaceholderTriggerActions(subcategory.value || '');\n\nconst hasNoTriggerActions = computed(\n\t() =>\n\t\tparseCategoryActions(\n\t\t\tuseViewStacks().activeViewStack.baselineItems || [],\n\t\t\tactionsCategoryLocales.value.triggers,\n\t\t\t!search.value,\n\t\t).length === 0,\n);\n\nconst containsAPIAction = computed(() => {\n\tconst actions = useViewStacks().activeViewStack.baselineItems || [];\n\n\tconst result = actions.some((p) => {\n\t\treturn ((p as ActionCreateElement).properties.actionKey ?? '') === CUSTOM_API_CALL_KEY;\n\t});\n\n\treturn result === true;\n});\n\nconst isTriggerRootView = computed(() => rootView.value === TRIGGER_NODE_CREATOR_VIEW);\n\nregisterKeyHook('ActionsKeyRight', {\n\tkeyboardKeys: ['ArrowRight', 'Enter'],\n\tcondition: (type) => type === 'action',\n\thandler: onKeySelect,\n});\n\nregisterKeyHook('ActionsKeyLeft', {\n\tkeyboardKeys: ['ArrowLeft'],\n\tcondition: (type) => type === 'action',\n\thandler: arrowLeft,\n});\n\nfunction parseActions(base: INodeCreateElement[], locale: string, withLabels = false) {\n\treturn parseCategoryActions(base, locale, withLabels);\n}\n\nfunction arrowLeft() {\n\tpopViewStack();\n}\n\nfunction onKeySelect(activeItemId: string) {\n\tconst mergedActions = [...actions.value, ...placeholderTriggerActions];\n\tconst activeAction = mergedActions.find((a) => a.uuid === activeItemId);\n\n\tif (activeAction) onSelected(activeAction);\n}\n\nfunction onSelected(actionCreateElement: INodeCreateElement) {\n\tconst actionData = getActionData(actionCreateElement.properties as ActionTypeDescription);\n\tconst isPlaceholderTriggerAction = placeholderTriggerActions.some(\n\t\t(p) => p.key === actionCreateElement.key,\n\t);\n\n\tif (isPlaceholderTriggerAction && isTriggerRootView.value) {\n\t\tconst actionNode = actions.value[0].key;\n\n\t\temit('nodeTypeSelected', [actionData.key as string, actionNode]);\n\t} else {\n\t\temit('nodeTypeSelected', getNodeTypesWithManualTrigger(actionData.key));\n\t}\n\n\tif (telemetry) setAddedNodeActionParameters(actionData, telemetry, rootView.value);\n}\n\nfunction trackActionsView() {\n\tconst activeViewStack = useViewStacks().activeViewStack;\n\n\tconst trigger_action_count = (activeViewStack.baselineItems || [])?.filter((action) =>\n\t\taction.key.toLowerCase().includes('trigger'),\n\t).length;\n\n\tconst appIdentifier = [...actions.value, ...placeholderTriggerActions][0].key;\n\n\tconst trackingPayload = {\n\t\tapp_identifier: appIdentifier,\n\t\tactions: (activeViewStack.baselineItems || [])?.map(\n\t\t\t(action) => (action as ActionCreateElement).properties.displayName,\n\t\t),\n\t\tregular_action_count: (activeViewStack.baselineItems || [])?.length - trigger_action_count,\n\t\ttrigger_action_count,\n\t};\n\n\tvoid runExternalHook('nodeCreateList.onViewActions', useWebhooksStore(), trackingPayload);\n\ttelemetry?.trackNodesPanel('nodeCreateList.onViewActions', trackingPayload);\n}\n\nfunction resetSearch() {\n\tupdateCurrentViewStack({ search: '' });\n}\n\nfunction addHttpNode() {\n\tconst updateData = {\n\t\tname: '',\n\t\tkey: HTTP_REQUEST_NODE_TYPE,\n\t\tvalue: {\n\t\t\tauthentication: 'predefinedCredentialType',\n\t\t},\n\t} as IUpdateInformation;\n\n\temit('nodeTypeSelected', [HTTP_REQUEST_NODE_TYPE]);\n\tif (telemetry) setAddedNodeActionParameters(updateData);\n\n\tconst app_identifier = actions.value[0].key;\n\tvoid runExternalHook('nodeCreateList.onActionsCustmAPIClicked', useWebhooksStore(), {\n\t\tapp_identifier,\n\t});\n\ttelemetry?.trackNodesPanel('nodeCreateList.onActionsCustmAPIClicked', { app_identifier });\n}\n\n// Anonymous component to handle triggers and actions rendering order\nconst OrderSwitcher = defineComponent({\n\tprops: {\n\t\trootView: {\n\t\t\ttype: String as PropType<NodeFilterType>,\n\t\t},\n\t},\n\tsetup(props, { slots }) {\n\t\treturn () =>\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{},\n\t\t\t\tprops.rootView === REGULAR_NODE_CREATOR_VIEW\n\t\t\t\t\t? [slots.actions?.(), slots.triggers?.()]\n\t\t\t\t\t: [slots.triggers?.(), slots.actions?.()],\n\t\t\t);\n\t},\n});\n\nonMounted(() => {\n\ttrackActionsView();\n});\n</script>\n\n<template>\n\t<div :class=\"$style.container\">\n\t\t<OrderSwitcher :rootView=\"rootView\">\n\t\t\t<template #triggers v-if=\"isTriggerRootView || parsedTriggerActionsBaseline.length !== 0\">\n\t\t\t\t<!-- Triggers Category -->\n\t\t\t\t<CategorizedItemsRenderer\n\t\t\t\t\t:elements=\"parsedTriggerActions\"\n\t\t\t\t\t:category=\"triggerCategoryName\"\n\t\t\t\t\t:mouseOverTooltip=\"$locale.baseText('nodeCreator.actionsTooltip.triggersStartWorkflow')\"\n\t\t\t\t\tisTriggerCategory\n\t\t\t\t\t:expanded=\"isTriggerRootView || parsedActionActions.length === 0\"\n\t\t\t\t\t@selected=\"onSelected\"\n\t\t\t\t>\n\t\t\t\t\t<!-- Empty state -->\n\t\t\t\t\t<template #empty v-if=\"hasNoTriggerActions\">\n\t\t\t\t\t\t<n8n-callout\n\t\t\t\t\t\t\tv-if=\"hasNoTriggerActions\"\n\t\t\t\t\t\t\ttheme=\"info\"\n\t\t\t\t\t\t\ticonless\n\t\t\t\t\t\t\tslim\n\t\t\t\t\t\t\tdata-test-id=\"actions-panel-no-triggers-callout\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t\t\t$locale.baseText('nodeCreator.actionsCallout.noTriggerItems', {\n\t\t\t\t\t\t\t\t\t\tinterpolate: { nodeName: subcategory },\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</n8n-callout>\n\t\t\t\t\t\t<ItemsRenderer @selected=\"onSelected\" :elements=\"placeholderTriggerActions\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #empty v-else>\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t:class=\"$style.resetSearch\"\n\t\t\t\t\t\t\tv-html=\"$locale.baseText('nodeCreator.actionsCategory.noMatchingTriggers')\"\n\t\t\t\t\t\t\t@click=\"resetSearch\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</CategorizedItemsRenderer>\n\t\t\t</template>\n\t\t\t<template #actions v-if=\"!isTriggerRootView || parsedActionActionsBaseline.length !== 0\">\n\t\t\t\t<!-- Actions Category -->\n\t\t\t\t<CategorizedItemsRenderer\n\t\t\t\t\t:elements=\"parsedActionActions\"\n\t\t\t\t\t:category=\"actionsCategoryLocales.actions\"\n\t\t\t\t\t:mouseOverTooltip=\"$locale.baseText('nodeCreator.actionsTooltip.actionsPerformStep')\"\n\t\t\t\t\t:expanded=\"!isTriggerRootView || parsedTriggerActions.length === 0\"\n\t\t\t\t\t@selected=\"onSelected\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-callout\n\t\t\t\t\t\ttheme=\"info\"\n\t\t\t\t\t\ticonless\n\t\t\t\t\t\tv-if=\"!userActivated && isTriggerRootView\"\n\t\t\t\t\t\tslim\n\t\t\t\t\t\tdata-test-id=\"actions-panel-activation-callout\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span v-html=\"$locale.baseText('nodeCreator.actionsCallout.triggersStartWorkflow')\" />\n\t\t\t\t\t</n8n-callout>\n\t\t\t\t\t<!-- Empty state -->\n\t\t\t\t\t<template #empty>\n\t\t\t\t\t\t<n8n-info-tip theme=\"info\" type=\"note\" v-if=\"!search\" :class=\"$style.actionsEmpty\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t\t\t$locale.baseText('nodeCreator.actionsCallout.noActionItems', {\n\t\t\t\t\t\t\t\t\t\tinterpolate: { nodeName: subcategory },\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t:class=\"$style.resetSearch\"\n\t\t\t\t\t\t\tv-html=\"$locale.baseText('nodeCreator.actionsCategory.noMatchingActions')\"\n\t\t\t\t\t\t\t@click=\"resetSearch\"\n\t\t\t\t\t\t\tdata-test-id=\"actions-panel-no-matching-actions\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</CategorizedItemsRenderer>\n\t\t\t</template>\n\t\t</OrderSwitcher>\n\t\t<div :class=\"$style.apiHint\" v-if=\"containsAPIAction\">\n\t\t\t<span\n\t\t\t\t@click.prevent=\"addHttpNode\"\n\t\t\t\tv-html=\"\n\t\t\t\t\t$locale.baseText('nodeCreator.actionsList.apiCall', {\n\t\t\t\t\t\tinterpolate: { node: subcategory },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-bottom: var(--spacing-3xl);\n}\n\n.resetSearch {\n\tcursor: pointer;\n\tline-height: var(--font-line-height-regular);\n\tfont-weight: var(--font-weight-regular);\n\tfont-size: var(--font-size-2xs);\n\tpadding: var(--spacing-2xs) var(--spacing-s) 0;\n\tcolor: var(--color-text-base);\n\n\ti {\n\t\tfont-weight: var(--font-weight-bold);\n\t\tfont-style: normal;\n\t\ttext-decoration: underline;\n\t}\n}\n.actionsEmpty {\n\tpadding: var(--spacing-2xs) var(--spacing-xs) var(--spacing-s);\n\tfont-weight: var(--font-weight-regular);\n\n\tstrong {\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n}\n.apiHint {\n\tpadding: 0 var(--spacing-s) var(--spacing-xl);\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-text-base);\n\tline-height: var(--font-line-height-regular);\n\tz-index: 1;\n}\n</style>\n","<template>\n\t<svg\n\t\twidth=\"75px\"\n\t\theight=\"75px\"\n\t\tviewBox=\"0 0 75 75\"\n\t\tversion=\"1.1\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<title>no-nodes-keyart</title>\n\t\t<g\n\t\t\tid=\"Nodes-panel-prototype-V2.1\"\n\t\t\tstroke=\"none\"\n\t\t\tstroke-width=\"1\"\n\t\t\tfill=\"none\"\n\t\t\tfill-rule=\"evenodd\"\n\t\t>\n\t\t\t<g id=\"nodes-panel-(component)\" transform=\"translate(-2085.000000, -352.000000)\">\n\t\t\t\t<g id=\"nodes_panel\" transform=\"translate(1880.000000, 151.000000)\">\n\t\t\t\t\t<g id=\"Panel\" transform=\"translate(50.000000, 0.000000)\">\n\t\t\t\t\t\t<g id=\"Group-3\" transform=\"translate(105.000000, 171.000000)\">\n\t\t\t\t\t\t\t<g id=\"no-nodes-keyart\" transform=\"translate(50.000000, 30.000000)\">\n\t\t\t\t\t\t\t\t<rect id=\"Rectangle\" x=\"0\" y=\"0\" width=\"75\" height=\"75\"></rect>\n\t\t\t\t\t\t\t\t<g\n\t\t\t\t\t\t\t\t\tid=\"Group\"\n\t\t\t\t\t\t\t\t\ttransform=\"translate(6.562500, 8.164062)\"\n\t\t\t\t\t\t\t\t\tfill=\"#C4C8D1\"\n\t\t\t\t\t\t\t\t\tfill-rule=\"nonzero\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<polygon\n\t\t\t\t\t\t\t\t\t\tid=\"Rectangle\"\n\t\t\t\t\t\t\t\t\t\ttransform=\"translate(49.192016, 45.302553) rotate(-45.000000) translate(-49.192016, -45.302553) \"\n\t\t\t\t\t\t\t\t\t\tpoints=\"44.5045606 32.0526802 53.8794707 32.0526802 53.8794707 58.5524261 44.5045606 58.5524261\"\n\t\t\t\t\t\t\t\t\t></polygon>\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\td=\"M48.125,23.0859375 C54.15625,23.0859375 59.0625,18.1796875 59.0625,12.1484375 C59.0625,10.3359375 58.5625,8.6484375 57.78125,7.1484375 L49.34375,15.5859375 L44.6875,10.9296875 L53.125,2.4921875 C51.625,1.7109375 49.9375,1.2109375 48.125,1.2109375 C42.09375,1.2109375 37.1875,6.1171875 37.1875,12.1484375 C37.1875,13.4296875 37.4375,14.6484375 37.84375,15.7734375 L32.0625,21.5546875 L26.5,15.9921875 L28.71875,13.7734375 L24.3125,9.3671875 L30.9375,2.7421875 C27.28125,-0.9140625 21.34375,-0.9140625 17.6875,2.7421875 L6.625,13.8046875 L11.03125,18.2109375 L2.21875,18.2109375 L1.38777878e-15,20.4296875 L11.0625,31.4921875 L13.28125,29.2734375 L13.28125,20.4296875 L17.6875,24.8359375 L19.90625,22.6171875 L25.46875,28.1796875 L2.3125,51.3359375 L8.9375,57.9609375 L44.5,22.4296875 C45.625,22.8359375 46.84375,23.0859375 48.125,23.0859375 Z\"\n\t\t\t\t\t\t\t\t\t\tid=\"Path\"\n\t\t\t\t\t\t\t\t\t></path>\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\n\t</svg>\n</template>\n","<script setup lang=\"ts\">\nimport { camelCase } from 'lodash-es';\nimport { computed } from 'vue';\nimport type { INodeCreateElement, NodeFilterType } from '@/Interface';\nimport { TRIGGER_NODE_CREATOR_VIEW, HTTP_REQUEST_NODE_TYPE, WEBHOOK_NODE_TYPE } from '@/constants';\n\nimport type { BaseTextKey } from '@/plugins/i18n';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport { TriggerView, RegularView } from '../viewsData';\nimport { transformNodeType } from '../utils';\nimport { useViewStacks } from '../composables/useViewStacks';\nimport { useActions } from '../composables/useActions';\nimport { useKeyboardNavigation } from '../composables/useKeyboardNavigation';\nimport ItemsRenderer from '../Renderers/ItemsRenderer.vue';\nimport CategorizedItemsRenderer from '../Renderers/CategorizedItemsRenderer.vue';\nimport NoResults from '../Panel/NoResults.vue';\nimport { useI18n, useTelemetry } from '@/composables';\n\nexport interface Props {\n\trootView: 'trigger' | 'action';\n}\n\nconst emit = defineEmits({\n\tnodeTypeSelected: (nodeTypes: string[]) => true,\n});\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\n\nconst { mergedNodes, actions } = useNodeCreatorStore();\nconst { baseUrl } = useRootStore();\nconst { getNodeTypesWithManualTrigger } = useActions();\nconst { pushViewStack, popViewStack } = useViewStacks();\n\nconst { registerKeyHook } = useKeyboardNavigation();\n\nconst activeViewStack = computed(() => useViewStacks().activeViewStack);\nconst globalSearchItemsDiff = computed(() => useViewStacks().globalSearchItemsDiff);\n\nfunction selectNodeType(nodeTypes: string[]) {\n\temit(\n\t\t'nodeTypeSelected',\n\t\tnodeTypes.length === 1 ? getNodeTypesWithManualTrigger(nodeTypes[0]) : nodeTypes,\n\t);\n}\n\nfunction onSelected(item: INodeCreateElement) {\n\tif (item.type === 'subcategory') {\n\t\tconst title = i18n.baseText(\n\t\t\t`nodeCreator.subcategoryNames.${camelCase(item.properties.title)}` as BaseTextKey,\n\t\t);\n\n\t\tpushViewStack({\n\t\t\tsubcategory: item.key,\n\t\t\ttitle,\n\t\t\tmode: 'nodes',\n\t\t\trootView: activeViewStack.value.rootView,\n\t\t\tforceIncludeNodes: item.properties.forceIncludeNodes,\n\t\t\tbaseFilter: baseSubcategoriesFilter,\n\t\t\titemsMapper: subcategoriesMapper,\n\t\t});\n\n\t\ttelemetry.trackNodesPanel('nodeCreateList.onSubcategorySelected', {\n\t\t\tsubcategory: item.key,\n\t\t});\n\t}\n\n\tif (item.type === 'node') {\n\t\tconst nodeActions = actions?.[item.key] || [];\n\t\tif (nodeActions.length <= 1) {\n\t\t\tselectNodeType([item.key]);\n\t\t\treturn;\n\t\t}\n\n\t\tconst icon = item.properties.iconUrl\n\t\t\t? `${baseUrl}${item.properties.iconUrl}`\n\t\t\t: item.properties.icon?.split(':')[1];\n\n\t\tconst transformedActions = nodeActions?.map((a) =>\n\t\t\ttransformNodeType(a, item.properties.displayName, 'action'),\n\t\t);\n\n\t\tpushViewStack({\n\t\t\tsubcategory: item.properties.displayName,\n\t\t\ttitle: item.properties.displayName,\n\t\t\tnodeIcon: {\n\t\t\t\tcolor: item.properties.defaults?.color || '',\n\t\t\t\ticon,\n\t\t\t\ticonType: item.properties.iconUrl ? 'file' : 'icon',\n\t\t\t},\n\n\t\t\trootView: activeViewStack.value.rootView,\n\t\t\thasSearch: true,\n\t\t\tmode: 'actions',\n\t\t\titems: transformedActions,\n\t\t});\n\t}\n\n\tif (item.type === 'view') {\n\t\tconst view = item.key === TRIGGER_NODE_CREATOR_VIEW ? TriggerView() : RegularView();\n\n\t\tpushViewStack({\n\t\t\ttitle: view.title,\n\t\t\tsubtitle: view?.subtitle ?? '',\n\t\t\titems: view.items as INodeCreateElement[],\n\t\t\thasSearch: true,\n\t\t\trootView: view.value as NodeFilterType,\n\t\t\tmode: 'nodes',\n\t\t\t// Root search should include all nodes\n\t\t\tsearchItems: mergedNodes,\n\t\t});\n\t}\n}\n\nfunction subcategoriesMapper(item: INodeCreateElement) {\n\tif (item.type !== 'node') return item;\n\n\tconst hasTriggerGroup = item.properties.group.includes('trigger');\n\tconst nodeActions = actions?.[item.key] || [];\n\tconst hasActions = nodeActions.length > 0;\n\n\tif (hasTriggerGroup && hasActions) {\n\t\tif (item.properties?.codex) {\n\t\t\t// Store the original name in the alias so we can search for it\n\t\t\titem.properties.codex.alias = [\n\t\t\t\t...(item.properties.codex?.alias || []),\n\t\t\t\titem.properties.displayName,\n\t\t\t];\n\t\t}\n\t\titem.properties.displayName = item.properties.displayName.replace(' Trigger', '');\n\t}\n\treturn item;\n}\n\nfunction baseSubcategoriesFilter(item: INodeCreateElement) {\n\tif (item.type !== 'node') return false;\n\n\tconst hasTriggerGroup = item.properties.group.includes('trigger');\n\tconst nodeActions = actions?.[item.key] || [];\n\tconst hasActions = nodeActions.length > 0;\n\n\tconst isTriggerRootView = activeViewStack.value.rootView === TRIGGER_NODE_CREATOR_VIEW;\n\tif (isTriggerRootView) {\n\t\treturn hasActions || hasTriggerGroup;\n\t}\n\n\treturn hasActions || !hasTriggerGroup;\n}\n\nfunction arrowLeft() {\n\tpopViewStack();\n}\n\nfunction onKeySelect(activeItemId: string) {\n\tconst mergedItems = [\n\t\t...(activeViewStack.value.items || []),\n\t\t...(globalSearchItemsDiff.value || []),\n\t];\n\n\tconst item = mergedItems.find((i) => i.uuid === activeItemId);\n\tif (!item) return;\n\n\tonSelected(item as INodeCreateElement);\n}\n\nregisterKeyHook('MainViewArrowRight', {\n\tkeyboardKeys: ['ArrowRight', 'Enter'],\n\tcondition: (type) => ['subcategory', 'node', 'view'].includes(type),\n\thandler: onKeySelect,\n});\n\nregisterKeyHook('MainViewArrowLeft', {\n\tkeyboardKeys: ['ArrowLeft'],\n\tcondition: (type) => ['subcategory', 'node', 'view'].includes(type),\n\thandler: arrowLeft,\n});\n</script>\n\n<template>\n\t<span>\n\t\t<!-- Main Node Items -->\n\t\t<ItemsRenderer :elements=\"activeViewStack.items\" @selected=\"onSelected\" :class=\"$style.items\">\n\t\t\t<template\n\t\t\t\t#empty\n\t\t\t\tv-if=\"(activeViewStack.items || []).length === 0 && globalSearchItemsDiff.length === 0\"\n\t\t\t>\n\t\t\t\t<NoResults\n\t\t\t\t\t:rootView=\"activeViewStack.rootView\"\n\t\t\t\t\tshowIcon\n\t\t\t\t\tshowRequest\n\t\t\t\t\t@addWebhookNode=\"selectNodeType([WEBHOOK_NODE_TYPE])\"\n\t\t\t\t\t@addHttpNode=\"selectNodeType([HTTP_REQUEST_NODE_TYPE])\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</ItemsRenderer>\n\t\t<!-- Results in other categories -->\n\t\t<CategorizedItemsRenderer\n\t\t\tv-if=\"globalSearchItemsDiff.length > 0\"\n\t\t\t:elements=\"globalSearchItemsDiff\"\n\t\t\t:category=\"$locale.baseText('nodeCreator.categoryNames.otherCategories')\"\n\t\t\t@selected=\"onSelected\"\n\t\t>\n\t\t</CategorizedItemsRenderer>\n\t</span>\n</template>\n\n<style lang=\"scss\" module>\n.items {\n\tmargin-bottom: var(--spacing-s);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, watch } from 'vue';\nimport type { INodeCreateElement } from '@/Interface';\nimport { TRIGGER_NODE_CREATOR_VIEW } from '@/constants';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport { TriggerView, RegularView } from '../viewsData';\nimport { useViewStacks } from '../composables/useViewStacks';\nimport { useKeyboardNavigation } from '../composables/useKeyboardNavigation';\nimport SearchBar from './SearchBar.vue';\nimport ActionsRenderer from '../Modes/ActionsMode.vue';\nimport NodesRenderer from '../Modes/NodesMode.vue';\nimport { useI18n } from '@/composables';\n\nconst i18n = useI18n();\n\nconst { mergedNodes } = useNodeCreatorStore();\nconst { pushViewStack, popViewStack, updateCurrentViewStack } = useViewStacks();\nconst { setActiveItemIndex, attachKeydownEvent, detachKeydownEvent } = useKeyboardNavigation();\n\nconst activeViewStack = computed(() => useViewStacks().activeViewStack);\n\nconst viewStacks = computed(() => useViewStacks().viewStacks);\n\nconst isActionsMode = computed(() => useViewStacks().activeViewStackMode === 'actions');\nconst searchPlaceholder = computed(() =>\n\tisActionsMode.value\n\t\t? i18n.baseText('nodeCreator.actionsCategory.searchActions', {\n\t\t\t\tinterpolate: { node: activeViewStack.value.title as string },\n\t\t })\n\t\t: i18n.baseText('nodeCreator.searchBar.searchNodes'),\n);\n\nconst nodeCreatorView = computed(() => useNodeCreatorStore().selectedView);\n\nfunction onSearch(value: string) {\n\tif (activeViewStack.value.uuid) {\n\t\tupdateCurrentViewStack({ search: value });\n\t\tvoid setActiveItemIndex(activeViewStack.value.activeIndex ?? 0);\n\t}\n}\n\nfunction onTransitionEnd() {\n\t// For actions, set the active focus to the first action, not category\n\tconst newStackIndex = activeViewStack.value.mode === 'actions' ? 1 : 0;\n\tvoid setActiveItemIndex(activeViewStack.value.activeIndex || 0 || newStackIndex);\n}\n\nonMounted(() => {\n\tattachKeydownEvent();\n\tvoid setActiveItemIndex(activeViewStack.value.activeIndex ?? 0);\n});\n\nonUnmounted(() => {\n\tdetachKeydownEvent();\n});\n\nwatch(\n\t() => nodeCreatorView.value,\n\t(selectedView) => {\n\t\tconst view = selectedView === TRIGGER_NODE_CREATOR_VIEW ? TriggerView() : RegularView();\n\n\t\tpushViewStack({\n\t\t\ttitle: view.title,\n\t\t\tsubtitle: view?.subtitle ?? '',\n\t\t\titems: view.items as INodeCreateElement[],\n\t\t\thasSearch: true,\n\t\t\tmode: 'nodes',\n\t\t\trootView: selectedView,\n\t\t\t// Root search should include all nodes\n\t\t\tsearchItems: mergedNodes,\n\t\t});\n\t},\n\t{ immediate: true },\n);\n\nfunction onBackButton() {\n\tpopViewStack();\n}\n</script>\n\n<template>\n\t<transition\n\t\tv-if=\"viewStacks.length > 0\"\n\t\t:name=\"`panel-slide-${activeViewStack.transitionDirection}`\"\n\t\t@afterLeave=\"onTransitionEnd\"\n\t>\n\t\t<aside :class=\"$style.nodesListPanel\" @keydown.capture.stop :key=\"`${activeViewStack.uuid}`\">\n\t\t\t<header\n\t\t\t\t:class=\"{ [$style.header]: true, [$style.hasBg]: !activeViewStack.subtitle }\"\n\t\t\t\tdata-test-id=\"nodes-list-header\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.top\">\n\t\t\t\t\t<button :class=\"$style.backButton\" @click=\"onBackButton\" v-if=\"viewStacks.length > 1\">\n\t\t\t\t\t\t<font-awesome-icon :class=\"$style.backButtonIcon\" icon=\"arrow-left\" size=\"2x\" />\n\t\t\t\t\t</button>\n\t\t\t\t\t<n8n-node-icon\n\t\t\t\t\t\tv-if=\"activeViewStack.nodeIcon\"\n\t\t\t\t\t\t:class=\"$style.nodeIcon\"\n\t\t\t\t\t\t:type=\"activeViewStack.nodeIcon.iconType || 'unknown'\"\n\t\t\t\t\t\t:src=\"activeViewStack.nodeIcon.icon\"\n\t\t\t\t\t\t:name=\"activeViewStack.nodeIcon.icon\"\n\t\t\t\t\t\t:color=\"activeViewStack.nodeIcon.color\"\n\t\t\t\t\t\t:circle=\"false\"\n\t\t\t\t\t\t:showTooltip=\"false\"\n\t\t\t\t\t\t:size=\"16\"\n\t\t\t\t\t/>\n\t\t\t\t\t<p :class=\"$style.title\" v-text=\"activeViewStack.title\" v-if=\"activeViewStack.title\" />\n\t\t\t\t</div>\n\t\t\t\t<p\n\t\t\t\t\tv-if=\"activeViewStack.subtitle\"\n\t\t\t\t\t:class=\"{ [$style.subtitle]: true, [$style.offsetSubtitle]: viewStacks.length > 1 }\"\n\t\t\t\t\tv-text=\"activeViewStack.subtitle\"\n\t\t\t\t/>\n\t\t\t</header>\n\t\t\t<search-bar\n\t\t\t\tv-if=\"activeViewStack.hasSearch\"\n\t\t\t\t:class=\"$style.searchBar\"\n\t\t\t\t:placeholder=\"\n\t\t\t\t\tsearchPlaceholder\n\t\t\t\t\t\t? searchPlaceholder\n\t\t\t\t\t\t: $locale.baseText('nodeCreator.searchBar.searchNodes')\n\t\t\t\t\"\n\t\t\t\t:modelValue=\"activeViewStack.search\"\n\t\t\t\t@update:modelValue=\"onSearch\"\n\t\t\t/>\n\t\t\t<div :class=\"$style.renderedItems\">\n\t\t\t\t<!-- Actions mode -->\n\t\t\t\t<ActionsRenderer v-if=\"isActionsMode && activeViewStack.subcategory\" v-bind=\"$attrs\" />\n\n\t\t\t\t<!-- Nodes Mode -->\n\t\t\t\t<NodesRenderer v-else :rootView=\"nodeCreatorView\" v-bind=\"$attrs\" />\n\t\t\t</div>\n\t\t</aside>\n\t</transition>\n</template>\n\n<style lang=\"scss\" module>\n:global(.panel-slide-in-leave-active),\n:global(.panel-slide-in-enter-active),\n:global(.panel-slide-out-leave-active),\n:global(.panel-slide-out-enter-active) {\n\ttransition: transform 200ms ease;\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n}\n\n:global(.panel-slide-out-enter-from),\n:global(.panel-slide-in-leave-to) {\n\ttransform: translateX(0);\n\tz-index: -1;\n}\n\n:global(.panel-slide-out-leave-to),\n:global(.panel-slide-in-enter-from) {\n\ttransform: translateX(100%);\n\t// Make sure the leaving panel stays on top\n\t// for the slide-out panel effect\n\tz-index: 1;\n}\n.backButton {\n\tbackground: transparent;\n\tborder: none;\n\tcursor: pointer;\n\tpadding: 0 var(--spacing-xs) 0 0;\n}\n\n.backButtonIcon {\n\tcolor: $node-creator-arrow-color;\n\theight: 16px;\n\tpadding: 0;\n}\n.nodeIcon {\n\t--node-icon-size: 16px;\n\tmargin-right: var(--spacing-s);\n}\n.renderedItems {\n\toverflow: auto;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tscrollbar-width: none; /* Firefox 64 */\n\tpadding-bottom: var(--spacing-xl);\n\t&::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n}\n.searchBar {\n\tflex-shrink: 0;\n}\n.nodesListPanel {\n\tbackground: var(--color-background-xlight);\n\theight: 100%;\n\tbackground-color: $node-creator-background-color;\n\twidth: 385px;\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t&:before {\n\t\tbox-sizing: border-box;\n\t\tcontent: '';\n\t\tborder-left: 1px solid $node-creator-border-color;\n\t\twidth: 1px;\n\t\tposition: absolute;\n\t\theight: 100%;\n\t}\n}\n.footer {\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-text-base);\n\tmargin: 0 var(--spacing-xs) 0;\n\tpadding: var(--spacing-4xs) 0;\n\tline-height: var(--font-line-height-regular);\n\tborder-top: 1px solid var(--color-foreground-base);\n\tz-index: 1;\n\tmargin-top: -1px;\n}\n.top {\n\tdisplay: flex;\n\talign-items: center;\n}\n.header {\n\tfont-size: var(--font-size-l);\n\tfont-weight: var(--font-weight-bold);\n\tline-height: var(--font-line-height-compact);\n\n\tpadding: var(--spacing-s) var(--spacing-s);\n\n\t&.hasBg {\n\t\tborder-bottom: $node-creator-border-color solid 1px;\n\t\tbackground-color: $node-creator-subcategory-panel-header-bacground-color;\n\t}\n}\n.title {\n\tline-height: 24px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-l);\n\n\t.hasBg & {\n\t\tfont-size: var(--font-size-s-m);\n\t\tline-height: 22px;\n\t}\n}\n.subtitle {\n\tmargin-top: var(--spacing-4xs);\n\tfont-size: var(--font-size-s);\n\tline-height: 19px;\n\tcolor: var(--color-text-base);\n\tfont-weight: var(--font-weight-regular);\n}\n.offsetSubtitle {\n\tmargin-left: calc(var(--spacing-xl) + var(--spacing-4xs));\n}\n</style>\n","<template>\n\t<div>\n\t\t<aside :class=\"{ [$style.nodeCreatorScrim]: true, [$style.active]: showScrim }\" />\n\t\t<slide-transition>\n\t\t\t<div\n\t\t\t\tv-if=\"active\"\n\t\t\t\t:class=\"$style.nodeCreator\"\n\t\t\t\t:style=\"nodeCreatorInlineStyle\"\n\t\t\t\tref=\"nodeCreator\"\n\t\t\t\t@dragover=\"onDragOver\"\n\t\t\t\t@drop=\"onDrop\"\n\t\t\t\t@mousedown=\"onMouseDown\"\n\t\t\t\t@mouseup=\"onMouseUp\"\n\t\t\t\tdata-test-id=\"node-creator\"\n\t\t\t>\n\t\t\t\t<NodesListPanel @nodeTypeSelected=\"onNodeTypeSelected\" />\n\t\t\t</div>\n\t\t</slide-transition>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { watch, reactive, toRefs, computed, onBeforeUnmount } from 'vue';\n\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport SlideTransition from '@/components/transitions/SlideTransition.vue';\n\nimport { useViewStacks } from './composables/useViewStacks';\nimport { useKeyboardNavigation } from './composables/useKeyboardNavigation';\nimport { useActionsGenerator } from './composables/useActionsGeneration';\nimport NodesListPanel from './Panel/NodesListPanel.vue';\nimport { useUIStore } from '@/stores';\n\nexport interface Props {\n\tactive?: boolean;\n\tonNodeTypeSelected?: (nodeType: string) => void;\n}\n\nconst props = defineProps<Props>();\nconst { resetViewStacks } = useViewStacks();\nconst { registerKeyHook } = useKeyboardNavigation();\nconst emit = defineEmits<{\n\t(event: 'closeNodeCreator'): void;\n\t(event: 'nodeTypeSelected', value: string[]): void;\n}>();\nconst uiStore = useUIStore();\n\nconst { setShowScrim, setActions, setMergeNodes } = useNodeCreatorStore();\nconst { generateMergedNodesAndActions } = useActionsGenerator();\n\nconst state = reactive({\n\tnodeCreator: null as HTMLElement | null,\n\tmousedownInsideEvent: null as MouseEvent | null,\n});\n\nconst showScrim = computed(() => useNodeCreatorStore().showScrim);\n\nconst viewStacksLength = computed(() => useViewStacks().viewStacks.length);\n\nconst nodeCreatorInlineStyle = computed(() => {\n\treturn { top: `${uiStore.bannersHeight + uiStore.headerHeight}px` };\n});\nfunction onMouseUpOutside() {\n\tif (state.mousedownInsideEvent) {\n\t\tconst clickEvent = new MouseEvent('click', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tstate.mousedownInsideEvent.target?.dispatchEvent(clickEvent);\n\t\tstate.mousedownInsideEvent = null;\n\t\tunBindOnMouseUpOutside();\n\t}\n}\nfunction unBindOnMouseUpOutside() {\n\tdocument.removeEventListener('mouseup', onMouseUpOutside);\n\tdocument.removeEventListener('touchstart', onMouseUpOutside);\n}\nfunction onMouseUp() {\n\tstate.mousedownInsideEvent = null;\n\tunBindOnMouseUpOutside();\n}\nfunction onMouseDown(event: MouseEvent) {\n\tstate.mousedownInsideEvent = event;\n\tdocument.addEventListener('mouseup', onMouseUpOutside);\n\tdocument.addEventListener('touchstart', onMouseUpOutside);\n}\nfunction onDragOver(event: DragEvent) {\n\tevent.preventDefault();\n}\nfunction onDrop(event: DragEvent) {\n\tif (!event.dataTransfer) {\n\t\treturn;\n\t}\n\n\tconst nodeTypeName = event.dataTransfer.getData('nodeTypeName');\n\tconst nodeCreatorBoundingRect = (state.nodeCreator as Element).getBoundingClientRect();\n\n\t// Abort drag end event propagation if dropped inside nodes panel\n\tif (\n\t\tnodeTypeName &&\n\t\tevent.pageX >= nodeCreatorBoundingRect.x &&\n\t\tevent.pageY >= nodeCreatorBoundingRect.y\n\t) {\n\t\tevent.stopPropagation();\n\t}\n}\n\nwatch(\n\t() => props.active,\n\t(isActive) => {\n\t\tif (isActive === false) {\n\t\t\tsetShowScrim(false);\n\t\t\tresetViewStacks();\n\t\t}\n\t},\n);\n\n// Close node creator when the last view stacks is closed\nwatch(viewStacksLength, (viewStacksLength) => {\n\tif (viewStacksLength === 0) {\n\t\temit('closeNodeCreator');\n\t\tsetShowScrim(false);\n\t}\n});\n\nregisterKeyHook('NodeCreatorCloseEscape', {\n\tkeyboardKeys: ['Escape'],\n\thandler: () => emit('closeNodeCreator'),\n});\nregisterKeyHook('NodeCreatorCloseTab', {\n\tkeyboardKeys: ['Tab'],\n\thandler: () => emit('closeNodeCreator'),\n});\n\nwatch(\n\t() => useNodeTypesStore().visibleNodeTypes,\n\t(nodeTypes) => {\n\t\tconst { actions, mergedNodes } = generateMergedNodesAndActions(nodeTypes);\n\n\t\tsetActions(actions);\n\t\tsetMergeNodes(mergedNodes);\n\t},\n\t{ immediate: true },\n);\nconst { nodeCreator } = toRefs(state);\n\nonBeforeUnmount(() => {\n\tunBindOnMouseUpOutside();\n});\n</script>\n\n<style module lang=\"scss\">\n:global(strong) {\n\tfont-weight: var(--font-weight-bold);\n}\n.nodeCreator {\n\t--node-icon-color: var(--color-text-base);\n\tposition: fixed;\n\ttop: $header-height;\n\tbottom: 0;\n\tright: 0;\n\tz-index: 200;\n\twidth: $node-creator-width;\n\tcolor: $node-creator-text-color;\n}\n\n.nodeCreatorScrim {\n\tposition: fixed;\n\ttop: $header-height;\n\tright: 0;\n\tbottom: 0;\n\tleft: $sidebar-width;\n\topacity: 0;\n\tz-index: 1;\n\tbackground: var(--color-background-dark);\n\tpointer-events: none;\n\ttransition: opacity 200ms ease-in-out;\n\n\t&.active {\n\t\topacity: 0.7;\n\t}\n}\n</style>\n"],"names":["SEQUENTIAL_BONUS","SEPARATOR_BONUS","CAMEL_BONUS","FIRST_LETTER_BONUS","LEADING_LETTER_PENALTY","MAX_LEADING_LETTER_PENALTY","UNMATCHED_LETTER_PENALTY","fuzzyMatchSimple","pattern","target","patternIdx","strIdx","patternChar","targetChar","fuzzyMatch","fuzzyMatchRecursive","patternCurIndex","targetCurrIndex","targetMatches","matches","maxMatches","nextMatch","recursionCount","recursionLimit","outScore","recursiveMatch","bestRecursiveMatches","bestRecursiveScore","firstMatch","recursiveMatches","recursiveResult","recursiveScore","matched","penalty","unmatched","i","currIdx","prevIdx","neighbor","curr","getValue","obj","prop","segments","result","sublimeSearch","filter","data","keys","results","accu","item","values","key","weight","value","v","itemMatch","match","a","b","_sfc_main$f","defineComponent","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createBlock","_Transition","_withCtx","KEYBOARD_ID_ATTR","WATCHED_KEYS","useKeyboardNavigation","defineStore","selectableItems","ref","activeItemId","keysHooks","getItemType","element","getElementId","refreshSelectableItems","resolve","cleanupSelectableItems","el","executeKeyHooks","keyboardKey","activeItem","hook","onKeyDown","e","pressedKey","activeItemIndex","_a","isArrowDown","isArrowUp","nextItemIndex","setActiveItem","_b","previousIndex","_c","setActiveItemId","id","itemId","setActiveItemIndex","index","attachKeydownEvent","detachKeydownEvent","registerKeyHook","name","getActiveItemIndex","transformNodeType","node","subcategory","type","createElement","uuidv4","CORE_NODES_CATEGORY","DEFAULT_SUBCATEGORY","subcategorizeItems","items","acc","_d","sortNodeCreateElements","nodes","displayNameA","displayNameB","searchNodes","searchFilter","trimmedFilter","useViewStacks","nodeCreatorStore","useNodeCreatorStore","viewStacks","activeStackItems","computed","stack","extendItemsWithUUID","searchBaseItems","searchBase","activeViewStack","activeViewStackMode","TRIGGER_NODE_CREATOR_VIEW","globalSearchItemsDiff","allNodes","setStackBaselineItems","subcategorizedItems","stackItems","matchedNodes","updateCurrentViewStack","uuid","pushViewStack","newStackUuid","popViewStack","currentStack","matchedIndex","s","typedKey","resetViewStacks","PLACEHOLDER_RECOMMENDED_ACTION_KEY","translate","args","i18n","cachedBaseText","memoize","customNodeActionsParsers","matchedProperty","nodeTypeDescription","collection","categoryItem","getNodeTypeBase","startCase","label","isTrigger","category","operationsCategory","property","triggersCategory","matchingKeys","filteredOutItems","resourceCategories","transformedNodes","option","CUSTOM_API_CALL_KEY","resourceOption","options","isSingleResource","operations","operation","operationOption","displayName","displayOptions","useActionsGenerator","generateNodeActions","filterActions","actions","action","_","arr","isPlaceholderTriggerAction","getSimplifiedNodeType","defaults","description","group","icon","iconUrl","codex","generateMergedNodesAndActions","nodeTypes","visibleNodeTypes","mergedNodes","app","appActions","trigger","normalizedName","triggerActions","mergedActions","TriggerView","useI18n","WEBHOOK_NODE_TYPE","EMAIL_IMAP_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","MANUAL_TRIGGER_NODE_TYPE","EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE","OTHER_TRIGGER_NODES_SUBCATEGORY","RegularView","REGULAR_NODE_CREATOR_VIEW","TRANSFORM_DATA_SUBCATEGORY","HELPERS_SUBCATEGORY","FLOWS_CONTROL_SUBCATEGORY","FILES_SUBCATEGORY","state","reactive","focus","onInput","event","input","emit","clear","onMounted","runExternalHook","useWebhooksStore","onBeforeUnmount","inputRef","toRefs","__expose","useActions","instance","getCurrentInstance","actionsCategoryLocales","getPlaceholderTriggerActions","n","transformed","localeKey","overwriteLocale","filterActionsCategory","injectActionsLabels","extendedActions","labelsSet","firstIndexMap","insertedLabels","newLabel","insertIndex","parseCategoryActions","withLabels","filteredActions","getActionData","actionItem","displayConditions","showCondition","getNodeTypesWithManualTrigger","nodeType","selectedView","openSource","workflowTriggerNodes","useWorkflowsStore","useNodeTypesStore","workflowContainsTrigger","isTriggerPanel","isStickyNode","STICKY_NODE_TYPE","NODE_CREATOR_OPEN_SOURCES","setAddedNodeActionParameters","telemetry","rootView","onWorkflowStoreAction","storeWatcher","after","setLastNodeParameters","trackActionSelected","payload","useTelemetry","dragging","draggablePosition","draggableDataTransfer","shortNodeType","props","showActionArrow","hasActions","dataTestId","nodeActions","draggableStyle","isCommunityNode","isCommunityPackageName","onDragStart","onDragOver","x","y","getNewNodePosition","NODE_SIZE","onDragEnd","onCommunityNodeTooltipClick","subcategoryName","camelCase","actionData","isTriggerAction","LAZY_LOAD_THRESHOLD","LAZY_LOAD_ITEMS_PER_TICK","renderedItems","renderAnimationRequest","renderItems","wrappedEmit","$e","beforeEnter","enter","beforeLeave","leave","onUnmounted","watch","categoryName","itemsCount","workflowId","actionCount","expanded","toggleExpanded","setExpanded","isExpanded","arrowRight","arrowLeft","userActivated","useUsersStore","parsedTriggerActions","parseActions","parsedActionActions","search","parsedTriggerActionsBaseline","parsedActionActionsBaseline","triggerCategoryName","placeholderTriggerActions","p","hasNoTriggerActions","containsAPIAction","isTriggerRootView","onKeySelect","base","locale","activeAction","onSelected","actionCreateElement","actionNode","trackActionsView","trigger_action_count","trackingPayload","resetSearch","addHttpNode","updateData","HTTP_REQUEST_NODE_TYPE","app_identifier","OrderSwitcher","slots","h","_hoisted_1","_hoisted_4","baseUrl","useRootStore","selectNodeType","title","baseSubcategoriesFilter","subcategoriesMapper","transformedActions","view","hasTriggerGroup","isActionsMode","searchPlaceholder","nodeCreatorView","onSearch","onTransitionEnd","newStackIndex","onBackButton","uiStore","useUIStore","setShowScrim","setActions","setMergeNodes","showScrim","viewStacksLength","nodeCreatorInlineStyle","onMouseUpOutside","clickEvent","unBindOnMouseUpOutside","onMouseUp","onMouseDown","onDrop","nodeTypeName","nodeCreatorBoundingRect","isActive","nodeCreator"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as b,_ as P}from"./n8n-80219ee5.js";import{V as f}from"./vue-json-pretty-c769fa0d.js";import{e as v,c as j,n as k,d as J,f as N,j as S,s as M,i as E,k as $}from"./index-1cdec20f.js";import"./axios-c5a64f4c.js";import{m as A}from"./pinia-82c4461b.js";import{M as T}from"./MappingPill-0406b335.js";import{d as V,y as p,aE as C,b as r,o as s,f as i,c as d,w as o,k as c,aF as I,e as u,g as F,n as m,t as l}from"./vendor-18a4b4e1.js";import"./luxon-19e1de07.js";import"./esprima-next-8c7e8ff9.js";import"./lodash-es-876af2e5.js";import"./@fortawesome/vue-fontawesome-f597912a.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./flatted-8b14da7d.js";import"./vue-i18n-c3b0f366.js";import"./uuid-cf522c50.js";import"./dateformat-ec5521d1.js";import"./@jsplumb/browser-ui-70b0a0d6.js";import"./@jsplumb/core-0a463c13.js";import"./@jsplumb/util-98a92a84.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-53998944.js";import"./@n8n/codemirror-lang-sql-9a304659.js";import"./codemirror-lang-n8n-expression-47e67c3a.js";import"./codemirror-lang-html-n8n-4223f8c7.js";import"./fast-json-stable-stringify-7a62a64e.js";import"./prettier-51497383.js";import"./@vueuse/core-60457efe.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-338130ab.js";import"./file-saver-a0bd4f44.js";import"./humanize-duration-706bc8a1.js";import"./v3-infinite-loading-8fbfd594.js";import"./vue-agile-19059f80.js";import"./copy-to-clipboard-067d994e.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-d79f1537.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";const w=C(async()=>b(()=>import("./RunDataJsonActions-1d385291.js"),["assets/RunDataJsonActions-1d385291.js","assets/pinia-82c4461b.js","assets/n8n-80219ee5.js","assets/luxon-19e1de07.js","assets/esprima-next-8c7e8ff9.js","assets/vendor-18a4b4e1.js","assets/lodash-es-876af2e5.js","assets/@fortawesome/vue-fontawesome-f597912a.js","assets/@fortawesome/fontawesome-svg-core-984d6dde.js","assets/n8n-dc7cfc9d.css","assets/jsonpath-ffd1f20f.js","assets/index-1cdec20f.js","assets/axios-c5a64f4c.js","assets/flatted-8b14da7d.js","assets/vue-i18n-c3b0f366.js","assets/uuid-cf522c50.js","assets/dateformat-ec5521d1.js","assets/@jsplumb/browser-ui-70b0a0d6.js","assets/@jsplumb/core-0a463c13.js","assets/@jsplumb/util-98a92a84.js","assets/@jsplumb/common-fe415eb9.js","assets/@jsplumb/connector-bezier-53998944.js","assets/@n8n/codemirror-lang-sql-9a304659.js","assets/codemirror-lang-n8n-expression-47e67c3a.js","assets/codemirror-lang-html-n8n-4223f8c7.js","assets/fast-json-stable-stringify-7a62a64e.js","assets/prettier-51497383.js","assets/@vueuse/core-60457efe.js","assets/timeago.js-a9e71aec.js","assets/qrcode.vue-338130ab.js","assets/file-saver-a0bd4f44.js","assets/vue-json-pretty-c769fa0d.js","assets/humanize-duration-706bc8a1.js","assets/v3-infinite-loading-8fbfd594.js","assets/vue-agile-19059f80.js","assets/vue-agile-d964f598.css","assets/copy-to-clipboard-067d994e.js","assets/vue3-touch-events-ee55ce04.js","assets/@fortawesome/free-solid-svg-icons-d79f1537.js","assets/@fortawesome/free-regular-svg-icons-74cb85f8.js","assets/index-12dd1e47.css","assets/RunDataJsonActions-698bad68.css"])),R=V({name:"run-data-json",mixins:[v],components:{VueJsonPretty:f,Draggable:j,RunDataJsonActions:w,MappingPill:T},props:{editMode:{type:Object},sessionId:{type:String},paneType:{type:String},node:{type:Object},inputData:{type:Array},mappingEnabled:{type:Boolean},distanceFromActive:{type:Number},runIndex:{type:Number},totalRuns:{type:Number}},setup(){const e=p(k),a=p(null),n=p("json");return{selectedJsonPath:e,draggingPath:a,displayMode:n}},computed:{...A(N,J),jsonData(){return S(this.inputData)}},methods:{getShortKey(e){return e?M(e.dataset.name||"",16,2):""},getJsonParameterPath(e){const a=e.replace(/^(\["?\d"?])/,"");return E({nodeName:this.node.name,distanceFromActive:this.distanceFromActive,path:a})},onDragStart(e){e&&e.dataset.path&&(this.draggingPath=e.dataset.path),this.ndvStore.resetMappingTelemetry()},onDragEnd(e){this.draggingPath=null,setTimeout(()=>{const a=this.ndvStore.mappingTelemetry,n={src_node_type:this.node.type,src_field_name:e.dataset.name||"",src_nodes_back:this.distanceFromActive,src_run_index:this.runIndex,src_runs_total:this.totalRuns,src_field_nest_level:e.dataset.depth||0,src_view:"json",src_element:e,success:!1,...a};this.$externalHooks().run("runDataJson.onDragEnd",n),this.$telemetry.track("User dragged data for mapping",n)},1e3)},getContent(e){return $(e)?`"${e}"`:JSON.stringify(e)},getListItemName(e){return e.replace(/^(\["?\d"?]\.?)/g,"")}}}),B="_jsonDisplay_5i0kz_5",z="_mappable_5i0kz_25",K="_dragged_5i0kz_32",L={jsonDisplay:B,mappable:z,dragged:K};const O=["data-value","data-name","data-path","data-depth"],H={key:0},U=["data-value","data-name","data-path","data-depth"];function W(e,a,n,G,Q,X){const h=r("run-data-json-actions"),y=r("MappingPill"),_=r("vue-json-pretty"),D=r("draggable");return s(),i("div",{class:m(e.$style.jsonDisplay)},[(s(),d(I,null,{default:o(()=>[e.editMode.enabled?c("",!0):(s(),d(h,{key:0,node:e.node,sessioId:e.sessionId,displayMode:e.displayMode,distanceFromActive:e.distanceFromActive,selectedJsonPath:e.selectedJsonPath,jsonData:e.jsonData,paneType:e.paneType},null,8,["node","sessioId","displayMode","distanceFromActive","selectedJsonPath","jsonData","paneType"]))]),_:1})),u(D,{type:"mapping",targetDataKey:"mappable",disabled:!e.mappingEnabled,onDragstart:e.onDragStart,onDragend:e.onDragEnd},{preview:o(({canDrop:t,el:g})=>[g?(s(),d(y,{key:0,html:e.getShortKey(g),"can-drop":t},null,8,["html","can-drop"])):c("",!0)]),default:o(()=>[u(_,{data:e.jsonData,deep:10,showLength:!0,selectedValue:e.selectedJsonPath,rootPath:"",selectableType:"single",class:"json-data","onUpdate:selectedValue":a[0]||(a[0]=t=>e.selectedJsonPath=t)},{renderNodeKey:o(({node:t})=>[F("span",{"data-target":"mappable","data-value":e.getJsonParameterPath(t.path),"data-name":t.key,"data-path":t.path,"data-depth":t.level,class:m({[e.$style.mappable]:e.mappingEnabled,[e.$style.dragged]:e.draggingPath===t.path})},'"'+l(t.key)+'"',11,O)]),renderNodeValue:o(({node:t})=>[isNaN(t.index)?(s(),i("span",H,l(e.getContent(t.content)),1)):(s(),i("span",{key:1,"data-target":"mappable","data-value":e.getJsonParameterPath(t.path),"data-name":e.getListItemName(t.path),"data-path":t.path,"data-depth":t.level,class:m([{[e.$style.mappable]:e.mappingEnabled,[e.$style.dragged]:e.draggingPath===t.path},"ph-no-capture"])},l(e.getContent(t.content)),11,U))]),_:1},8,["data","selectedValue"])]),_:1},8,["disabled","onDragstart","onDragend"])],2)}const q={$style:L},Ce=P(R,[["render",W],["__cssModules",q]]);export{Ce as default};
2
- //# sourceMappingURL=RunDataJson-6215e222.js.map
1
+ import{h as b,_ as P}from"./n8n-80219ee5.js";import{V as f}from"./vue-json-pretty-c769fa0d.js";import{e as v,c as j,n as k,d as J,f as N,j as S,s as M,i as E,k as $}from"./index-adc9f77e.js";import"./axios-c5a64f4c.js";import{m as A}from"./pinia-82c4461b.js";import{M as T}from"./MappingPill-0406b335.js";import{d as V,y as p,aE as C,b as r,o as s,f as i,c as d,w as o,k as c,aF as I,e as u,g as F,n as m,t as l}from"./vendor-18a4b4e1.js";import"./luxon-19e1de07.js";import"./esprima-next-8c7e8ff9.js";import"./lodash-es-876af2e5.js";import"./@fortawesome/vue-fontawesome-f597912a.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./flatted-8b14da7d.js";import"./vue-i18n-c3b0f366.js";import"./uuid-cf522c50.js";import"./dateformat-ec5521d1.js";import"./@jsplumb/browser-ui-70b0a0d6.js";import"./@jsplumb/core-0a463c13.js";import"./@jsplumb/util-98a92a84.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-53998944.js";import"./@n8n/codemirror-lang-sql-9a304659.js";import"./codemirror-lang-n8n-expression-47e67c3a.js";import"./codemirror-lang-html-n8n-4223f8c7.js";import"./fast-json-stable-stringify-7a62a64e.js";import"./prettier-51497383.js";import"./@vueuse/core-60457efe.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-338130ab.js";import"./file-saver-a0bd4f44.js";import"./humanize-duration-706bc8a1.js";import"./v3-infinite-loading-8fbfd594.js";import"./vue-agile-19059f80.js";import"./copy-to-clipboard-067d994e.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-d79f1537.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";const w=C(async()=>b(()=>import("./RunDataJsonActions-b7eb9ddb.js"),["assets/RunDataJsonActions-b7eb9ddb.js","assets/pinia-82c4461b.js","assets/n8n-80219ee5.js","assets/luxon-19e1de07.js","assets/esprima-next-8c7e8ff9.js","assets/vendor-18a4b4e1.js","assets/lodash-es-876af2e5.js","assets/@fortawesome/vue-fontawesome-f597912a.js","assets/@fortawesome/fontawesome-svg-core-984d6dde.js","assets/n8n-dc7cfc9d.css","assets/jsonpath-ffd1f20f.js","assets/index-adc9f77e.js","assets/axios-c5a64f4c.js","assets/flatted-8b14da7d.js","assets/vue-i18n-c3b0f366.js","assets/uuid-cf522c50.js","assets/dateformat-ec5521d1.js","assets/@jsplumb/browser-ui-70b0a0d6.js","assets/@jsplumb/core-0a463c13.js","assets/@jsplumb/util-98a92a84.js","assets/@jsplumb/common-fe415eb9.js","assets/@jsplumb/connector-bezier-53998944.js","assets/@n8n/codemirror-lang-sql-9a304659.js","assets/codemirror-lang-n8n-expression-47e67c3a.js","assets/codemirror-lang-html-n8n-4223f8c7.js","assets/fast-json-stable-stringify-7a62a64e.js","assets/prettier-51497383.js","assets/@vueuse/core-60457efe.js","assets/timeago.js-a9e71aec.js","assets/qrcode.vue-338130ab.js","assets/file-saver-a0bd4f44.js","assets/vue-json-pretty-c769fa0d.js","assets/humanize-duration-706bc8a1.js","assets/v3-infinite-loading-8fbfd594.js","assets/vue-agile-19059f80.js","assets/vue-agile-d964f598.css","assets/copy-to-clipboard-067d994e.js","assets/vue3-touch-events-ee55ce04.js","assets/@fortawesome/free-solid-svg-icons-d79f1537.js","assets/@fortawesome/free-regular-svg-icons-74cb85f8.js","assets/index-445a502e.css","assets/RunDataJsonActions-698bad68.css"])),R=V({name:"run-data-json",mixins:[v],components:{VueJsonPretty:f,Draggable:j,RunDataJsonActions:w,MappingPill:T},props:{editMode:{type:Object},sessionId:{type:String},paneType:{type:String},node:{type:Object},inputData:{type:Array},mappingEnabled:{type:Boolean},distanceFromActive:{type:Number},runIndex:{type:Number},totalRuns:{type:Number}},setup(){const e=p(k),a=p(null),n=p("json");return{selectedJsonPath:e,draggingPath:a,displayMode:n}},computed:{...A(N,J),jsonData(){return S(this.inputData)}},methods:{getShortKey(e){return e?M(e.dataset.name||"",16,2):""},getJsonParameterPath(e){const a=e.replace(/^(\["?\d"?])/,"");return E({nodeName:this.node.name,distanceFromActive:this.distanceFromActive,path:a})},onDragStart(e){e&&e.dataset.path&&(this.draggingPath=e.dataset.path),this.ndvStore.resetMappingTelemetry()},onDragEnd(e){this.draggingPath=null,setTimeout(()=>{const a=this.ndvStore.mappingTelemetry,n={src_node_type:this.node.type,src_field_name:e.dataset.name||"",src_nodes_back:this.distanceFromActive,src_run_index:this.runIndex,src_runs_total:this.totalRuns,src_field_nest_level:e.dataset.depth||0,src_view:"json",src_element:e,success:!1,...a};this.$externalHooks().run("runDataJson.onDragEnd",n),this.$telemetry.track("User dragged data for mapping",n)},1e3)},getContent(e){return $(e)?`"${e}"`:JSON.stringify(e)},getListItemName(e){return e.replace(/^(\["?\d"?]\.?)/g,"")}}}),B="_jsonDisplay_5i0kz_5",z="_mappable_5i0kz_25",K="_dragged_5i0kz_32",L={jsonDisplay:B,mappable:z,dragged:K};const O=["data-value","data-name","data-path","data-depth"],H={key:0},U=["data-value","data-name","data-path","data-depth"];function W(e,a,n,G,Q,X){const h=r("run-data-json-actions"),y=r("MappingPill"),_=r("vue-json-pretty"),D=r("draggable");return s(),i("div",{class:m(e.$style.jsonDisplay)},[(s(),d(I,null,{default:o(()=>[e.editMode.enabled?c("",!0):(s(),d(h,{key:0,node:e.node,sessioId:e.sessionId,displayMode:e.displayMode,distanceFromActive:e.distanceFromActive,selectedJsonPath:e.selectedJsonPath,jsonData:e.jsonData,paneType:e.paneType},null,8,["node","sessioId","displayMode","distanceFromActive","selectedJsonPath","jsonData","paneType"]))]),_:1})),u(D,{type:"mapping",targetDataKey:"mappable",disabled:!e.mappingEnabled,onDragstart:e.onDragStart,onDragend:e.onDragEnd},{preview:o(({canDrop:t,el:g})=>[g?(s(),d(y,{key:0,html:e.getShortKey(g),"can-drop":t},null,8,["html","can-drop"])):c("",!0)]),default:o(()=>[u(_,{data:e.jsonData,deep:10,showLength:!0,selectedValue:e.selectedJsonPath,rootPath:"",selectableType:"single",class:"json-data","onUpdate:selectedValue":a[0]||(a[0]=t=>e.selectedJsonPath=t)},{renderNodeKey:o(({node:t})=>[F("span",{"data-target":"mappable","data-value":e.getJsonParameterPath(t.path),"data-name":t.key,"data-path":t.path,"data-depth":t.level,class:m({[e.$style.mappable]:e.mappingEnabled,[e.$style.dragged]:e.draggingPath===t.path})},'"'+l(t.key)+'"',11,O)]),renderNodeValue:o(({node:t})=>[isNaN(t.index)?(s(),i("span",H,l(e.getContent(t.content)),1)):(s(),i("span",{key:1,"data-target":"mappable","data-value":e.getJsonParameterPath(t.path),"data-name":e.getListItemName(t.path),"data-path":t.path,"data-depth":t.level,class:m([{[e.$style.mappable]:e.mappingEnabled,[e.$style.dragged]:e.draggingPath===t.path},"ph-no-capture"])},l(e.getContent(t.content)),11,U))]),_:1},8,["data","selectedValue"])]),_:1},8,["disabled","onDragstart","onDragend"])],2)}const q={$style:L},Ce=P(R,[["render",W],["__cssModules",q]]);export{Ce as default};
2
+ //# sourceMappingURL=RunDataJson-1392d3f8.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["RunDataJsonActions","defineAsyncComponent","__vitePreload","_sfc_main","defineComponent","externalHooks","VueJsonPretty","Draggable","MappingPill","selectedJsonPath","ref","nonExistingJsonPath","draggingPath","displayMode","mapStores","useNDVStore","useWorkflowsStore","executionDataToJson","el","shorten","path","subPath","getMappedExpression","mappingTelemetry","telemetryPayload","value","isString","_resolveComponent","_ctx","_createBlock","_Suspense","_withCtx","_openBlock","_component_run_data_json_actions","_component_draggable","canDrop","_component_MappingPill","_createCommentVNode","_createVNode","_component_vue_json_pretty","_cache","$event","node","_createElementVNode","_normalizeClass","_toDisplayString","_hoisted_1","_createElementBlock","_hoisted_2"],"sources":["../../src/components/RunDataJson.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.jsonDisplay\">\n\t\t<Suspense>\n\t\t\t<run-data-json-actions\n\t\t\t\tv-if=\"!editMode.enabled\"\n\t\t\t\t:node=\"node\"\n\t\t\t\t:sessioId=\"sessionId\"\n\t\t\t\t:displayMode=\"displayMode\"\n\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t:selectedJsonPath=\"selectedJsonPath\"\n\t\t\t\t:jsonData=\"jsonData\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t/>\n\t\t</Suspense>\n\t\t<draggable\n\t\t\ttype=\"mapping\"\n\t\t\ttargetDataKey=\"mappable\"\n\t\t\t:disabled=\"!mappingEnabled\"\n\t\t\t@dragstart=\"onDragStart\"\n\t\t\t@dragend=\"onDragEnd\"\n\t\t>\n\t\t\t<template #preview=\"{ canDrop, el }\">\n\t\t\t\t<MappingPill v-if=\"el\" :html=\"getShortKey(el)\" :can-drop=\"canDrop\" />\n\t\t\t</template>\n\t\t\t<vue-json-pretty\n\t\t\t\t:data=\"jsonData\"\n\t\t\t\t:deep=\"10\"\n\t\t\t\t:showLength=\"true\"\n\t\t\t\t:selectedValue=\"selectedJsonPath\"\n\t\t\t\trootPath=\"\"\n\t\t\t\tselectableType=\"single\"\n\t\t\t\tclass=\"json-data\"\n\t\t\t\t@update:selectedValue=\"selectedJsonPath = $event\"\n\t\t\t>\n\t\t\t\t<template #renderNodeKey=\"{ node }\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tdata-target=\"mappable\"\n\t\t\t\t\t\t:data-value=\"getJsonParameterPath(node.path)\"\n\t\t\t\t\t\t:data-name=\"node.key\"\n\t\t\t\t\t\t:data-path=\"node.path\"\n\t\t\t\t\t\t:data-depth=\"node.level\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.mappable]: mappingEnabled,\n\t\t\t\t\t\t\t[$style.dragged]: draggingPath === node.path,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t>\"{{ node.key }}\"</span\n\t\t\t\t\t>\n\t\t\t\t</template>\n\t\t\t\t<template #renderNodeValue=\"{ node }\">\n\t\t\t\t\t<span v-if=\"isNaN(node.index)\">{{ getContent(node.content) }}</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tdata-target=\"mappable\"\n\t\t\t\t\t\t:data-value=\"getJsonParameterPath(node.path)\"\n\t\t\t\t\t\t:data-name=\"getListItemName(node.path)\"\n\t\t\t\t\t\t:data-path=\"node.path\"\n\t\t\t\t\t\t:data-depth=\"node.level\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.mappable]: mappingEnabled,\n\t\t\t\t\t\t\t[$style.dragged]: draggingPath === node.path,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\tclass=\"ph-no-capture\"\n\t\t\t\t\t\t>{{ getContent(node.content) }}</span\n\t\t\t\t\t>\n\t\t\t\t</template>\n\t\t\t</vue-json-pretty>\n\t\t</draggable>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, ref } from 'vue';\nimport type { PropType } from 'vue';\nimport VueJsonPretty from 'vue-json-pretty';\nimport type { IDataObject, INodeExecutionData } from 'n8n-workflow';\nimport Draggable from '@/components/Draggable.vue';\nimport { executionDataToJson, isString, shorten } from '@/utils';\nimport type { INodeUi } from '@/Interface';\nimport { externalHooks } from '@/mixins/externalHooks';\nimport { mapStores } from 'pinia';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport MappingPill from './MappingPill.vue';\nimport { getMappedExpression } from '@/utils/mappingUtils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { nonExistingJsonPath } from '@/constants';\n\nconst RunDataJsonActions = defineAsyncComponent(\n\tasync () => import('@/components/RunDataJsonActions.vue'),\n);\n\nexport default defineComponent({\n\tname: 'run-data-json',\n\tmixins: [externalHooks],\n\tcomponents: {\n\t\tVueJsonPretty,\n\t\tDraggable,\n\t\tRunDataJsonActions,\n\t\tMappingPill,\n\t},\n\tprops: {\n\t\teditMode: {\n\t\t\ttype: Object as () => { enabled?: boolean; value?: string },\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String,\n\t\t},\n\t\tnode: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t},\n\t\tinputData: {\n\t\t\ttype: Array as PropType<INodeExecutionData[]>,\n\t\t},\n\t\tmappingEnabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t},\n\t\ttotalRuns: {\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst selectedJsonPath = ref(nonExistingJsonPath);\n\t\tconst draggingPath = ref<null | string>(null);\n\t\tconst displayMode = ref('json');\n\n\t\treturn {\n\t\t\tselectedJsonPath,\n\t\t\tdraggingPath,\n\t\t\tdisplayMode,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tjsonData(): IDataObject[] {\n\t\t\treturn executionDataToJson(this.inputData);\n\t\t},\n\t},\n\tmethods: {\n\t\tgetShortKey(el: HTMLElement): string {\n\t\t\tif (!el) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\treturn shorten(el.dataset.name || '', 16, 2);\n\t\t},\n\t\tgetJsonParameterPath(path: string): string {\n\t\t\tconst subPath = path.replace(/^(\\[\"?\\d\"?])/, ''); // remove item position\n\n\t\t\treturn getMappedExpression({\n\t\t\t\tnodeName: this.node.name,\n\t\t\t\tdistanceFromActive: this.distanceFromActive,\n\t\t\t\tpath: subPath,\n\t\t\t});\n\t\t},\n\t\tonDragStart(el: HTMLElement) {\n\t\t\tif (el && el.dataset.path) {\n\t\t\t\tthis.draggingPath = el.dataset.path;\n\t\t\t}\n\n\t\t\tthis.ndvStore.resetMappingTelemetry();\n\t\t},\n\t\tonDragEnd(el: HTMLElement) {\n\t\t\tthis.draggingPath = null;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst mappingTelemetry = this.ndvStore.mappingTelemetry;\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tsrc_node_type: this.node.type,\n\t\t\t\t\tsrc_field_name: el.dataset.name || '',\n\t\t\t\t\tsrc_nodes_back: this.distanceFromActive,\n\t\t\t\t\tsrc_run_index: this.runIndex,\n\t\t\t\t\tsrc_runs_total: this.totalRuns,\n\t\t\t\t\tsrc_field_nest_level: el.dataset.depth || 0,\n\t\t\t\t\tsrc_view: 'json',\n\t\t\t\t\tsrc_element: el,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\t...mappingTelemetry,\n\t\t\t\t};\n\n\t\t\t\tvoid this.$externalHooks().run('runDataJson.onDragEnd', telemetryPayload);\n\n\t\t\t\tthis.$telemetry.track('User dragged data for mapping', telemetryPayload);\n\t\t\t}, 1000); // ensure dest data gets set if drop\n\t\t},\n\t\tgetContent(value: unknown): string {\n\t\t\treturn isString(value) ? `\"${value}\"` : JSON.stringify(value);\n\t\t},\n\t\tgetListItemName(path: string): string {\n\t\t\treturn path.replace(/^(\\[\"?\\d\"?]\\.?)/g, '');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.jsonDisplay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding-left: var(--spacing-s);\n\tright: 0;\n\toverflow-y: auto;\n\tline-height: 1.5;\n\tword-break: normal;\n\theight: 100%;\n\tpadding-bottom: var(--spacing-3xl);\n\tbackground-color: var(--color-background-base);\n\n\t&:hover {\n\t\t/* Shows .actionsGroup element from <run-data-json-actions /> child component */\n\t\t> div:first-child {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.mappable {\n\tcursor: grab;\n\n\t&:hover {\n\t\tbackground-color: var(--color-json-highlight);\n\t}\n}\n\n.dragged {\n\t&,\n\t&:hover {\n\t\tbackground-color: var(--color-primary-tint-2);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n.vjs-tree {\n\tcolor: var(--color-json-default);\n}\n\n.vjs-tree-node {\n\t&:hover {\n\t\tbackground-color: transparent;\n\t}\n\n\t&.is-highlight {\n\t\tbackground-color: var(--color-json-highlight);\n\t}\n}\n\n.vjs-key,\n.vjs-value {\n\t> span {\n\t\tcolor: var(--color-text-dark);\n\t\tline-height: 1.7;\n\t\tborder-radius: var(--border-radius-base);\n\t}\n}\n\n.vjs-value {\n\t> span {\n\t\tpadding: 0 var(--spacing-5xs) 0 var(--spacing-5xs);\n\t\tmargin-left: var(--spacing-5xs);\n\t}\n}\n\n.vjs-tree .vjs-value-null {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-null);\n\t}\n}\n\n.vjs-tree .vjs-value-boolean {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-boolean);\n\t}\n}\n\n.vjs-tree .vjs-value-number {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-number);\n\t}\n}\n\n.vjs-tree .vjs-value-string {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-string);\n\t}\n}\n\n.vjs-tree .vjs-key {\n\tcolor: var(--color-json-key);\n}\n\n.vjs-tree .vjs-tree__brackets {\n\tcolor: var(--color-json-brackets);\n}\n\n.vjs-tree .vjs-tree__brackets:hover {\n\tcolor: var(--color-json-brackets-hover);\n}\n\n.vjs-tree .vjs-tree__content.has-line {\n\tborder-left: 1px dotted var(--color-json-line);\n}\n</style>\n"],"file":"assets/RunDataJson-6215e222.js"}
1
+ {"version":3,"mappings":"+lDAsFA,MAAMA,EAAqBC,EAC1B,SAAAC,EAAA,IAAY,OAAO,kCAAqC,8/CACzD,EAEAC,EAAeC,EAAgB,CAC9B,KAAM,gBACN,OAAQ,CAACC,CAAa,EACtB,WAAY,CACX,cAAAC,EACA,UAAAC,EACA,mBAAAP,EACA,YAAAQ,CACD,EACA,MAAO,CACN,SAAU,CACT,KAAM,MACP,EACA,UAAW,CACV,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,EACA,KAAM,CACL,KAAM,MACP,EACA,UAAW,CACV,KAAM,KACP,EACA,eAAgB,CACf,KAAM,OACP,EACA,mBAAoB,CACnB,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,EACA,UAAW,CACV,KAAM,MACP,CACD,EACA,OAAQ,CACD,MAAAC,EAAmBC,EAAIC,CAAmB,EAC1CC,EAAeF,EAAmB,IAAI,EACtCG,EAAcH,EAAI,MAAM,EAEvB,OACN,iBAAAD,EACA,aAAAG,EACA,YAAAC,CAAA,CAEF,EACA,SAAU,CACT,GAAGC,EAAUC,EAAaC,CAAiB,EAC3C,UAA0B,CAClB,OAAAC,EAAoB,KAAK,SAAS,CAC1C,CACD,EACA,QAAS,CACR,YAAYC,EAAyB,CACpC,OAAKA,EAIEC,EAAQD,EAAG,QAAQ,MAAQ,GAAI,GAAI,CAAC,EAHnC,EAIT,EACA,qBAAqBE,EAAsB,CAC1C,MAAMC,EAAUD,EAAK,QAAQ,eAAgB,EAAE,EAE/C,OAAOE,EAAoB,CAC1B,SAAU,KAAK,KAAK,KACpB,mBAAoB,KAAK,mBACzB,KAAMD,CAAA,CACN,CACF,EACA,YAAYH,EAAiB,CACxBA,GAAMA,EAAG,QAAQ,OACf,kBAAeA,EAAG,QAAQ,MAGhC,KAAK,SAAS,uBACf,EACA,UAAUA,EAAiB,CAC1B,KAAK,aAAe,KAEpB,WAAW,IAAM,CACV,MAAAK,EAAmB,KAAK,SAAS,iBACjCC,EAAmB,CACxB,cAAe,KAAK,KAAK,KACzB,eAAgBN,EAAG,QAAQ,MAAQ,GACnC,eAAgB,KAAK,mBACrB,cAAe,KAAK,SACpB,eAAgB,KAAK,UACrB,qBAAsBA,EAAG,QAAQ,OAAS,EAC1C,SAAU,OACV,YAAaA,EACb,QAAS,GACT,GAAGK,CAAA,EAGC,KAAK,eAAiB,MAAI,wBAAyBC,CAAgB,EAEnE,gBAAW,MAAM,gCAAiCA,CAAgB,GACrE,GAAI,CACR,EACA,WAAWC,EAAwB,CAC3B,OAAAC,EAASD,CAAK,EAAI,IAAIA,CAAK,IAAM,KAAK,UAAUA,CAAK,CAC7D,EACA,gBAAgBL,EAAsB,CAC9B,OAAAA,EAAK,QAAQ,mBAAoB,EAAE,CAC3C,CACD,CACD,CAAC,kVAtMAO,EAkEM,yCAjELC,EAWW,2BATcC,EAAAC,EAAA,MADxB,QAAAC,EAAA,KAAAH,EAAA,2BAAAI,EAEY,EAAAH,EAAAI,EAAA,CACV,MACA,KAAWL,EAAA,KACX,SAAAA,EAAA,UACA,YAAkBA,EAAA,YAClB,mBAAUA,EAAQ,mBAClB,iBAAUA,EAAQ,0BAAAA,EAAA,yIAGrB,SAECM,EAAwB,CACvB,eACA,cAAW,WACX,SAAO,CAAEN,EAAA,2BAAAA,EAAA,YAEC,UAAOA,EAAA,wBACjB,QAAAO,EAAqE,GAAAjB,CAAA,KAAAA,GAAAc,EAAA,EAAzBH,EAAAO,EAAA,CAAI,WAAAR,EAAA,YAAAV,CAAA,cA2C/B,+BAAAmB,EAAA,SAxCZ,QAAAN,EAAE,IAAQ,CACNO,EAAAC,EAAA,CACR,KAAUX,EAAA,SACV,QACD,WAAW,GACX,cAAcA,EAAC,iBACf,SAAM,GACL,0CAEU,yBAYTY,EAZ8B,KAAAA,EAAA,GAAAC,GAAAb,EAAA,iBAAAa,EAAA,GAE9B,cAAAV,EAAY,CAAU,MAAAW,KAAA,CACTC,EAAA,QACZ,cAAW,WACX,aAAWf,EAAK,qBAAIc,EAAA,MACpB,YAAUA,EAAM,IAChB,YAAKA,EAAA,KAAY,aAAeA,EAAG,MAAwB,MAAOE,EAAU,EAAAhB,EAAA,iBAAAA,EAAA,eAI3E,CAAAA,EAAA,gBAAAA,EAAA,eAAcc,EAAC,MAGR,MAAAG,EAAmBH,EAAI,YAAAI,CAAA,IACjC,gBAAAf,EAAA,OAAAW,KAAA,OAAAA,EAAA,QAAAV,EAAA,EAAAe,EAAA,OAAAC,EAAAH,EAAAjB,EAAA,WAAAc,EAAA,eAAAV,EAAA,EAGYe,EAAW,QACrB,MACA,cAAW,WACX,aAAWnB,EAAK,qBAAIc,EAAA,MACpB,YAAUd,EAAM,gBAAMc,EAAA,MACtB,YAAKA,EAAA,KAAY,aAAkBA,EAAA,MAAwB,MAAOE,EAAU,GAAAhB,EAIvE,OAAe,UAAAA,EAAA,gBAAAA,EAAA,gBAAAA,EAAA,eACNc,EAAK","names":["RunDataJsonActions","defineAsyncComponent","__vitePreload","_sfc_main","defineComponent","externalHooks","VueJsonPretty","Draggable","MappingPill","selectedJsonPath","ref","nonExistingJsonPath","draggingPath","displayMode","mapStores","useNDVStore","useWorkflowsStore","executionDataToJson","el","shorten","path","subPath","getMappedExpression","mappingTelemetry","telemetryPayload","value","isString","_resolveComponent","_ctx","_createBlock","_Suspense","_withCtx","_openBlock","_component_run_data_json_actions","_component_draggable","canDrop","_component_MappingPill","_createCommentVNode","_createVNode","_component_vue_json_pretty","_cache","$event","node","_createElementVNode","_normalizeClass","_toDisplayString","_hoisted_1","_createElementBlock","_hoisted_2"],"sources":["../../src/components/RunDataJson.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.jsonDisplay\">\n\t\t<Suspense>\n\t\t\t<run-data-json-actions\n\t\t\t\tv-if=\"!editMode.enabled\"\n\t\t\t\t:node=\"node\"\n\t\t\t\t:sessioId=\"sessionId\"\n\t\t\t\t:displayMode=\"displayMode\"\n\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t:selectedJsonPath=\"selectedJsonPath\"\n\t\t\t\t:jsonData=\"jsonData\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t/>\n\t\t</Suspense>\n\t\t<draggable\n\t\t\ttype=\"mapping\"\n\t\t\ttargetDataKey=\"mappable\"\n\t\t\t:disabled=\"!mappingEnabled\"\n\t\t\t@dragstart=\"onDragStart\"\n\t\t\t@dragend=\"onDragEnd\"\n\t\t>\n\t\t\t<template #preview=\"{ canDrop, el }\">\n\t\t\t\t<MappingPill v-if=\"el\" :html=\"getShortKey(el)\" :can-drop=\"canDrop\" />\n\t\t\t</template>\n\t\t\t<vue-json-pretty\n\t\t\t\t:data=\"jsonData\"\n\t\t\t\t:deep=\"10\"\n\t\t\t\t:showLength=\"true\"\n\t\t\t\t:selectedValue=\"selectedJsonPath\"\n\t\t\t\trootPath=\"\"\n\t\t\t\tselectableType=\"single\"\n\t\t\t\tclass=\"json-data\"\n\t\t\t\t@update:selectedValue=\"selectedJsonPath = $event\"\n\t\t\t>\n\t\t\t\t<template #renderNodeKey=\"{ node }\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tdata-target=\"mappable\"\n\t\t\t\t\t\t:data-value=\"getJsonParameterPath(node.path)\"\n\t\t\t\t\t\t:data-name=\"node.key\"\n\t\t\t\t\t\t:data-path=\"node.path\"\n\t\t\t\t\t\t:data-depth=\"node.level\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.mappable]: mappingEnabled,\n\t\t\t\t\t\t\t[$style.dragged]: draggingPath === node.path,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t>\"{{ node.key }}\"</span\n\t\t\t\t\t>\n\t\t\t\t</template>\n\t\t\t\t<template #renderNodeValue=\"{ node }\">\n\t\t\t\t\t<span v-if=\"isNaN(node.index)\">{{ getContent(node.content) }}</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tdata-target=\"mappable\"\n\t\t\t\t\t\t:data-value=\"getJsonParameterPath(node.path)\"\n\t\t\t\t\t\t:data-name=\"getListItemName(node.path)\"\n\t\t\t\t\t\t:data-path=\"node.path\"\n\t\t\t\t\t\t:data-depth=\"node.level\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.mappable]: mappingEnabled,\n\t\t\t\t\t\t\t[$style.dragged]: draggingPath === node.path,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\tclass=\"ph-no-capture\"\n\t\t\t\t\t\t>{{ getContent(node.content) }}</span\n\t\t\t\t\t>\n\t\t\t\t</template>\n\t\t\t</vue-json-pretty>\n\t\t</draggable>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, ref } from 'vue';\nimport type { PropType } from 'vue';\nimport VueJsonPretty from 'vue-json-pretty';\nimport type { IDataObject, INodeExecutionData } from 'n8n-workflow';\nimport Draggable from '@/components/Draggable.vue';\nimport { executionDataToJson, isString, shorten } from '@/utils';\nimport type { INodeUi } from '@/Interface';\nimport { externalHooks } from '@/mixins/externalHooks';\nimport { mapStores } from 'pinia';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport MappingPill from './MappingPill.vue';\nimport { getMappedExpression } from '@/utils/mappingUtils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { nonExistingJsonPath } from '@/constants';\n\nconst RunDataJsonActions = defineAsyncComponent(\n\tasync () => import('@/components/RunDataJsonActions.vue'),\n);\n\nexport default defineComponent({\n\tname: 'run-data-json',\n\tmixins: [externalHooks],\n\tcomponents: {\n\t\tVueJsonPretty,\n\t\tDraggable,\n\t\tRunDataJsonActions,\n\t\tMappingPill,\n\t},\n\tprops: {\n\t\teditMode: {\n\t\t\ttype: Object as () => { enabled?: boolean; value?: string },\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String,\n\t\t},\n\t\tnode: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t},\n\t\tinputData: {\n\t\t\ttype: Array as PropType<INodeExecutionData[]>,\n\t\t},\n\t\tmappingEnabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t},\n\t\ttotalRuns: {\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst selectedJsonPath = ref(nonExistingJsonPath);\n\t\tconst draggingPath = ref<null | string>(null);\n\t\tconst displayMode = ref('json');\n\n\t\treturn {\n\t\t\tselectedJsonPath,\n\t\t\tdraggingPath,\n\t\t\tdisplayMode,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tjsonData(): IDataObject[] {\n\t\t\treturn executionDataToJson(this.inputData);\n\t\t},\n\t},\n\tmethods: {\n\t\tgetShortKey(el: HTMLElement): string {\n\t\t\tif (!el) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\treturn shorten(el.dataset.name || '', 16, 2);\n\t\t},\n\t\tgetJsonParameterPath(path: string): string {\n\t\t\tconst subPath = path.replace(/^(\\[\"?\\d\"?])/, ''); // remove item position\n\n\t\t\treturn getMappedExpression({\n\t\t\t\tnodeName: this.node.name,\n\t\t\t\tdistanceFromActive: this.distanceFromActive,\n\t\t\t\tpath: subPath,\n\t\t\t});\n\t\t},\n\t\tonDragStart(el: HTMLElement) {\n\t\t\tif (el && el.dataset.path) {\n\t\t\t\tthis.draggingPath = el.dataset.path;\n\t\t\t}\n\n\t\t\tthis.ndvStore.resetMappingTelemetry();\n\t\t},\n\t\tonDragEnd(el: HTMLElement) {\n\t\t\tthis.draggingPath = null;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst mappingTelemetry = this.ndvStore.mappingTelemetry;\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tsrc_node_type: this.node.type,\n\t\t\t\t\tsrc_field_name: el.dataset.name || '',\n\t\t\t\t\tsrc_nodes_back: this.distanceFromActive,\n\t\t\t\t\tsrc_run_index: this.runIndex,\n\t\t\t\t\tsrc_runs_total: this.totalRuns,\n\t\t\t\t\tsrc_field_nest_level: el.dataset.depth || 0,\n\t\t\t\t\tsrc_view: 'json',\n\t\t\t\t\tsrc_element: el,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\t...mappingTelemetry,\n\t\t\t\t};\n\n\t\t\t\tvoid this.$externalHooks().run('runDataJson.onDragEnd', telemetryPayload);\n\n\t\t\t\tthis.$telemetry.track('User dragged data for mapping', telemetryPayload);\n\t\t\t}, 1000); // ensure dest data gets set if drop\n\t\t},\n\t\tgetContent(value: unknown): string {\n\t\t\treturn isString(value) ? `\"${value}\"` : JSON.stringify(value);\n\t\t},\n\t\tgetListItemName(path: string): string {\n\t\t\treturn path.replace(/^(\\[\"?\\d\"?]\\.?)/g, '');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.jsonDisplay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding-left: var(--spacing-s);\n\tright: 0;\n\toverflow-y: auto;\n\tline-height: 1.5;\n\tword-break: normal;\n\theight: 100%;\n\tpadding-bottom: var(--spacing-3xl);\n\tbackground-color: var(--color-background-base);\n\n\t&:hover {\n\t\t/* Shows .actionsGroup element from <run-data-json-actions /> child component */\n\t\t> div:first-child {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.mappable {\n\tcursor: grab;\n\n\t&:hover {\n\t\tbackground-color: var(--color-json-highlight);\n\t}\n}\n\n.dragged {\n\t&,\n\t&:hover {\n\t\tbackground-color: var(--color-primary-tint-2);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n.vjs-tree {\n\tcolor: var(--color-json-default);\n}\n\n.vjs-tree-node {\n\t&:hover {\n\t\tbackground-color: transparent;\n\t}\n\n\t&.is-highlight {\n\t\tbackground-color: var(--color-json-highlight);\n\t}\n}\n\n.vjs-key,\n.vjs-value {\n\t> span {\n\t\tcolor: var(--color-text-dark);\n\t\tline-height: 1.7;\n\t\tborder-radius: var(--border-radius-base);\n\t}\n}\n\n.vjs-value {\n\t> span {\n\t\tpadding: 0 var(--spacing-5xs) 0 var(--spacing-5xs);\n\t\tmargin-left: var(--spacing-5xs);\n\t}\n}\n\n.vjs-tree .vjs-value-null {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-null);\n\t}\n}\n\n.vjs-tree .vjs-value-boolean {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-boolean);\n\t}\n}\n\n.vjs-tree .vjs-value-number {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-number);\n\t}\n}\n\n.vjs-tree .vjs-value-string {\n\t&,\n\tspan {\n\t\tcolor: var(--color-json-string);\n\t}\n}\n\n.vjs-tree .vjs-key {\n\tcolor: var(--color-json-key);\n}\n\n.vjs-tree .vjs-tree__brackets {\n\tcolor: var(--color-json-brackets);\n}\n\n.vjs-tree .vjs-tree__brackets:hover {\n\tcolor: var(--color-json-brackets-hover);\n}\n\n.vjs-tree .vjs-tree__content.has-line {\n\tborder-left: 1px dotted var(--color-json-line);\n}\n</style>\n"],"file":"assets/RunDataJson-1392d3f8.js"}
@@ -1,2 +1,2 @@
1
- import{m as w}from"./pinia-82c4461b.js";import{j as g}from"./jsonpath-ffd1f20f.js";import{_ as T,$ as b,a0 as v,a1 as $,n as u,a2 as J,d as j,f as k,a3 as C,j as S,a4 as y,G as x}from"./index-1cdec20f.js";import"./axios-c5a64f4c.js";import{_ as D}from"./n8n-80219ee5.js";import{d as I,b as p,o as l,f as N,c as P,w as i,e as r,l as c,t as d,g as V,n as G}from"./vendor-18a4b4e1.js";import"./flatted-8b14da7d.js";import"./@fortawesome/vue-fontawesome-f597912a.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./vue-i18n-c3b0f366.js";import"./uuid-cf522c50.js";import"./dateformat-ec5521d1.js";import"./lodash-es-876af2e5.js";import"./luxon-19e1de07.js";import"./@jsplumb/browser-ui-70b0a0d6.js";import"./@jsplumb/core-0a463c13.js";import"./@jsplumb/util-98a92a84.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-53998944.js";import"./@n8n/codemirror-lang-sql-9a304659.js";import"./codemirror-lang-n8n-expression-47e67c3a.js";import"./codemirror-lang-html-n8n-4223f8c7.js";import"./fast-json-stable-stringify-7a62a64e.js";import"./prettier-51497383.js";import"./esprima-next-8c7e8ff9.js";import"./@vueuse/core-60457efe.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-338130ab.js";import"./file-saver-a0bd4f44.js";import"./vue-json-pretty-c769fa0d.js";import"./humanize-duration-706bc8a1.js";import"./v3-infinite-loading-8fbfd594.js";import"./vue-agile-19059f80.js";import"./copy-to-clipboard-067d994e.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-d79f1537.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";const O=I({name:"run-data-json-actions",mixins:[T,b,v,$],props:{node:{type:Object},paneType:{type:String},sessionId:{type:String},currentOutputIndex:{type:Number},runIndex:{type:Number},displayMode:{type:String},distanceFromActive:{type:Number},selectedJsonPath:{type:String,default:u},jsonData:{type:Array,required:!0}},setup(){return{i18n:x(),...J()}},computed:{...w(k,j),activeNode(){return this.ndvStore.activeNode},noSelection(){return this.selectedJsonPath===u},normalisedJsonPath(){return this.noSelection?'[""]':this.selectedJsonPath}},methods:{getJsonValue(){let t=g.query(this.jsonData,`$${this.normalisedJsonPath}`)[0];this.noSelection&&(this.hasPinData?t=C(this.pinData):t=S(this.getNodeInputData(this.node,this.runIndex,this.currentOutputIndex)));let e="";return typeof t=="object"?e=JSON.stringify(t,null,2):e=t.toString(),e},getJsonItemPath(){const t=y(this.normalisedJsonPath);let e="",s="";const a=t.split("]"),o=a[0].slice(1);return s=a.slice(1).join("]"),e=`$item(${o}).$node["${this.node.name}"].json`,{path:s,startPath:e}},getJsonParameterPath(){const e=y(this.normalisedJsonPath).split("]").slice(1).join("]");let s=`$node["${this.node.name}"].json`;return this.distanceFromActive===1&&(s="$json"),{path:e,startPath:s}},handleCopyClick(t){let e;if(t.command==="value")e=this.getJsonValue(),this.showToast({title:this.i18n.baseText("runData.copyValue.toast"),message:"",type:"success",duration:2e3});else{let a="",o="";if(t.command==="itemPath"){const n=this.getJsonItemPath();a=n.startPath,o=n.path,this.showToast({title:this.i18n.baseText("runData.copyItemPath.toast"),message:"",type:"success",duration:2e3})}else if(t.command==="parameterPath"){const n=this.getJsonParameterPath();a=n.startPath,o=n.path,this.showToast({title:this.i18n.baseText("runData.copyParameterPath.toast"),message:"",type:"success",duration:2e3})}!o.startsWith("[")&&!o.startsWith(".")&&o&&(o+="."),e=`{{ ${a+o} }}`}const s={value:"selection",itemPath:"item_path",parameterPath:"parameter_path"}[t.command];this.$telemetry.track("User copied ndv data",{node_type:this.activeNode.type,session_id:this.sessionId,run_index:this.runIndex,view:"json",copy_type:s,workflow_id:this.workflowsStore.workflowId,pane:this.paneType,in_execution_log:this.isReadOnlyRoute}),this.copyToClipboard(e)}}}),A="_actionsGroup_1ai92_5",B={actionsGroup:A},M={class:"el-dropdown-link"};function R(t,e,s,a,o,n){const h=p("n8n-icon-button"),m=p("el-dropdown-item"),f=p("el-dropdown-menu"),_=p("el-dropdown");return l(),N("div",{class:G(t.$style.actionsGroup)},[t.noSelection?(l(),P(h,{key:0,title:t.i18n.baseText("runData.copyToClipboard"),icon:"copy",type:"tertiary",circle:!1,onClick:e[0]||(e[0]=q=>t.handleCopyClick({command:"value"}))},null,8,["title"])):(l(),P(_,{key:1,trigger:"click",onCommand:t.handleCopyClick},{dropdown:i(()=>[r(f,null,{default:i(()=>[r(m,{command:{command:"value"}},{default:i(()=>[c(d(t.i18n.baseText("runData.copyValue")),1)]),_:1}),r(m,{command:{command:"itemPath"},divided:""},{default:i(()=>[c(d(t.i18n.baseText("runData.copyItemPath")),1)]),_:1}),r(m,{command:{command:"parameterPath"}},{default:i(()=>[c(d(t.i18n.baseText("runData.copyParameterPath")),1)]),_:1})]),_:1})]),default:i(()=>[V("span",M,[r(h,{title:t.i18n.baseText("runData.copyToClipboard"),icon:"copy",type:"tertiary",circle:!1},null,8,["title"])])]),_:1},8,["onCommand"]))],2)}const W={$style:B},jt=D(O,[["render",R],["__cssModules",W]]);export{jt as default};
2
- //# sourceMappingURL=RunDataJsonActions-1d385291.js.map
1
+ import{m as w}from"./pinia-82c4461b.js";import{j as g}from"./jsonpath-ffd1f20f.js";import{_ as T,$ as b,a0 as v,a1 as $,n as u,a2 as J,d as j,f as k,a3 as C,j as S,a4 as y,G as x}from"./index-adc9f77e.js";import"./axios-c5a64f4c.js";import{_ as D}from"./n8n-80219ee5.js";import{d as I,b as p,o as l,f as N,c as P,w as i,e as r,l as c,t as d,g as V,n as G}from"./vendor-18a4b4e1.js";import"./flatted-8b14da7d.js";import"./@fortawesome/vue-fontawesome-f597912a.js";import"./@fortawesome/fontawesome-svg-core-984d6dde.js";import"./vue-i18n-c3b0f366.js";import"./uuid-cf522c50.js";import"./dateformat-ec5521d1.js";import"./lodash-es-876af2e5.js";import"./luxon-19e1de07.js";import"./@jsplumb/browser-ui-70b0a0d6.js";import"./@jsplumb/core-0a463c13.js";import"./@jsplumb/util-98a92a84.js";import"./@jsplumb/common-fe415eb9.js";import"./@jsplumb/connector-bezier-53998944.js";import"./@n8n/codemirror-lang-sql-9a304659.js";import"./codemirror-lang-n8n-expression-47e67c3a.js";import"./codemirror-lang-html-n8n-4223f8c7.js";import"./fast-json-stable-stringify-7a62a64e.js";import"./prettier-51497383.js";import"./esprima-next-8c7e8ff9.js";import"./@vueuse/core-60457efe.js";import"./timeago.js-a9e71aec.js";import"./qrcode.vue-338130ab.js";import"./file-saver-a0bd4f44.js";import"./vue-json-pretty-c769fa0d.js";import"./humanize-duration-706bc8a1.js";import"./v3-infinite-loading-8fbfd594.js";import"./vue-agile-19059f80.js";import"./copy-to-clipboard-067d994e.js";import"./vue3-touch-events-ee55ce04.js";import"./@fortawesome/free-solid-svg-icons-d79f1537.js";import"./@fortawesome/free-regular-svg-icons-74cb85f8.js";const O=I({name:"run-data-json-actions",mixins:[T,b,v,$],props:{node:{type:Object},paneType:{type:String},sessionId:{type:String},currentOutputIndex:{type:Number},runIndex:{type:Number},displayMode:{type:String},distanceFromActive:{type:Number},selectedJsonPath:{type:String,default:u},jsonData:{type:Array,required:!0}},setup(){return{i18n:x(),...J()}},computed:{...w(k,j),activeNode(){return this.ndvStore.activeNode},noSelection(){return this.selectedJsonPath===u},normalisedJsonPath(){return this.noSelection?'[""]':this.selectedJsonPath}},methods:{getJsonValue(){let t=g.query(this.jsonData,`$${this.normalisedJsonPath}`)[0];this.noSelection&&(this.hasPinData?t=C(this.pinData):t=S(this.getNodeInputData(this.node,this.runIndex,this.currentOutputIndex)));let e="";return typeof t=="object"?e=JSON.stringify(t,null,2):e=t.toString(),e},getJsonItemPath(){const t=y(this.normalisedJsonPath);let e="",s="";const a=t.split("]"),o=a[0].slice(1);return s=a.slice(1).join("]"),e=`$item(${o}).$node["${this.node.name}"].json`,{path:s,startPath:e}},getJsonParameterPath(){const e=y(this.normalisedJsonPath).split("]").slice(1).join("]");let s=`$node["${this.node.name}"].json`;return this.distanceFromActive===1&&(s="$json"),{path:e,startPath:s}},handleCopyClick(t){let e;if(t.command==="value")e=this.getJsonValue(),this.showToast({title:this.i18n.baseText("runData.copyValue.toast"),message:"",type:"success",duration:2e3});else{let a="",o="";if(t.command==="itemPath"){const n=this.getJsonItemPath();a=n.startPath,o=n.path,this.showToast({title:this.i18n.baseText("runData.copyItemPath.toast"),message:"",type:"success",duration:2e3})}else if(t.command==="parameterPath"){const n=this.getJsonParameterPath();a=n.startPath,o=n.path,this.showToast({title:this.i18n.baseText("runData.copyParameterPath.toast"),message:"",type:"success",duration:2e3})}!o.startsWith("[")&&!o.startsWith(".")&&o&&(o+="."),e=`{{ ${a+o} }}`}const s={value:"selection",itemPath:"item_path",parameterPath:"parameter_path"}[t.command];this.$telemetry.track("User copied ndv data",{node_type:this.activeNode.type,session_id:this.sessionId,run_index:this.runIndex,view:"json",copy_type:s,workflow_id:this.workflowsStore.workflowId,pane:this.paneType,in_execution_log:this.isReadOnlyRoute}),this.copyToClipboard(e)}}}),A="_actionsGroup_1ai92_5",B={actionsGroup:A},M={class:"el-dropdown-link"};function R(t,e,s,a,o,n){const h=p("n8n-icon-button"),m=p("el-dropdown-item"),f=p("el-dropdown-menu"),_=p("el-dropdown");return l(),N("div",{class:G(t.$style.actionsGroup)},[t.noSelection?(l(),P(h,{key:0,title:t.i18n.baseText("runData.copyToClipboard"),icon:"copy",type:"tertiary",circle:!1,onClick:e[0]||(e[0]=q=>t.handleCopyClick({command:"value"}))},null,8,["title"])):(l(),P(_,{key:1,trigger:"click",onCommand:t.handleCopyClick},{dropdown:i(()=>[r(f,null,{default:i(()=>[r(m,{command:{command:"value"}},{default:i(()=>[c(d(t.i18n.baseText("runData.copyValue")),1)]),_:1}),r(m,{command:{command:"itemPath"},divided:""},{default:i(()=>[c(d(t.i18n.baseText("runData.copyItemPath")),1)]),_:1}),r(m,{command:{command:"parameterPath"}},{default:i(()=>[c(d(t.i18n.baseText("runData.copyParameterPath")),1)]),_:1})]),_:1})]),default:i(()=>[V("span",M,[r(h,{title:t.i18n.baseText("runData.copyToClipboard"),icon:"copy",type:"tertiary",circle:!1},null,8,["title"])])]),_:1},8,["onCommand"]))],2)}const W={$style:B},jt=D(O,[["render",R],["__cssModules",W]]);export{jt as default};
2
+ //# sourceMappingURL=RunDataJsonActions-b7eb9ddb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RunDataJsonActions-1d385291.js","sources":["../../src/components/RunDataJsonActions.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.actionsGroup\">\n\t\t<n8n-icon-button\n\t\t\tv-if=\"noSelection\"\n\t\t\t:title=\"i18n.baseText('runData.copyToClipboard')\"\n\t\t\ticon=\"copy\"\n\t\t\ttype=\"tertiary\"\n\t\t\t:circle=\"false\"\n\t\t\t@click=\"handleCopyClick({ command: 'value' })\"\n\t\t/>\n\t\t<el-dropdown v-else trigger=\"click\" @command=\"handleCopyClick\">\n\t\t\t<span class=\"el-dropdown-link\">\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\t:title=\"i18n.baseText('runData.copyToClipboard')\"\n\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t:circle=\"false\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t\t<template #dropdown>\n\t\t\t\t<el-dropdown-menu>\n\t\t\t\t\t<el-dropdown-item :command=\"{ command: 'value' }\">\n\t\t\t\t\t\t{{ i18n.baseText('runData.copyValue') }}\n\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t<el-dropdown-item :command=\"{ command: 'itemPath' }\" divided>\n\t\t\t\t\t\t{{ i18n.baseText('runData.copyItemPath') }}\n\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t<el-dropdown-item :command=\"{ command: 'parameterPath' }\">\n\t\t\t\t\t\t{{ i18n.baseText('runData.copyParameterPath') }}\n\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t</el-dropdown-menu>\n\t\t\t</template>\n\t\t</el-dropdown>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport jp from 'jsonpath';\nimport type { INodeUi } from '@/Interface';\nimport type { IDataObject } from 'n8n-workflow';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { pinData } from '@/mixins/pinData';\nimport { nodeHelpers } from '@/mixins/nodeHelpers';\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { clearJsonKey, convertPath, executionDataToJson } from '@/utils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useI18n, useToast } from '@/composables';\nimport { nonExistingJsonPath } from '@/constants';\n\ntype JsonPathData = {\n\tpath: string;\n\tstartPath: string;\n};\n\nexport default defineComponent({\n\tname: 'run-data-json-actions',\n\tmixins: [genericHelpers, nodeHelpers, pinData, copyPaste],\n\n\tprops: {\n\t\tnode: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tcurrentOutputIndex: {\n\t\t\ttype: Number,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t},\n\t\tdisplayMode: {\n\t\t\ttype: String,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\tselectedJsonPath: {\n\t\t\ttype: String,\n\t\t\tdefault: nonExistingJsonPath,\n\t\t},\n\t\tjsonData: {\n\t\t\ttype: Array as PropType<IDataObject[]>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst i18n = useI18n();\n\n\t\treturn {\n\t\t\ti18n,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tnoSelection() {\n\t\t\treturn this.selectedJsonPath === nonExistingJsonPath;\n\t\t},\n\t\tnormalisedJsonPath(): string {\n\t\t\treturn this.noSelection ? '[\"\"]' : this.selectedJsonPath;\n\t\t},\n\t},\n\tmethods: {\n\t\tgetJsonValue(): string {\n\t\t\tlet selectedValue = jp.query(this.jsonData, `$${this.normalisedJsonPath}`)[0];\n\t\t\tif (this.noSelection) {\n\t\t\t\tif (this.hasPinData) {\n\t\t\t\t\tselectedValue = clearJsonKey(this.pinData as object);\n\t\t\t\t} else {\n\t\t\t\t\tselectedValue = executionDataToJson(\n\t\t\t\t\t\tthis.getNodeInputData(this.node, this.runIndex, this.currentOutputIndex),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet value = '';\n\t\t\tif (typeof selectedValue === 'object') {\n\t\t\t\tvalue = JSON.stringify(selectedValue, null, 2);\n\t\t\t} else {\n\t\t\t\tvalue = selectedValue.toString();\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\t\tgetJsonItemPath(): JsonPathData {\n\t\t\tconst newPath = convertPath(this.normalisedJsonPath);\n\t\t\tlet startPath = '';\n\t\t\tlet path = '';\n\n\t\t\tconst pathParts = newPath.split(']');\n\t\t\tconst index = pathParts[0].slice(1);\n\t\t\tpath = pathParts.slice(1).join(']');\n\t\t\tstartPath = `$item(${index}).$node[\"${this.node!.name}\"].json`;\n\n\t\t\treturn { path, startPath };\n\t\t},\n\t\tgetJsonParameterPath(): JsonPathData {\n\t\t\tconst newPath = convertPath(this.normalisedJsonPath);\n\t\t\tconst path = newPath.split(']').slice(1).join(']');\n\t\t\tlet startPath = `$node[\"${this.node!.name}\"].json`;\n\n\t\t\tif (this.distanceFromActive === 1) {\n\t\t\t\tstartPath = '$json';\n\t\t\t}\n\n\t\t\treturn { path, startPath };\n\t\t},\n\t\thandleCopyClick(commandData: { command: string }) {\n\t\t\tlet value: string;\n\t\t\tif (commandData.command === 'value') {\n\t\t\t\tvalue = this.getJsonValue();\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttitle: this.i18n.baseText('runData.copyValue.toast'),\n\t\t\t\t\tmessage: '',\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tduration: 2000,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlet startPath = '';\n\t\t\t\tlet path = '';\n\t\t\t\tif (commandData.command === 'itemPath') {\n\t\t\t\t\tconst jsonItemPath = this.getJsonItemPath();\n\t\t\t\t\tstartPath = jsonItemPath.startPath;\n\t\t\t\t\tpath = jsonItemPath.path;\n\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttitle: this.i18n.baseText('runData.copyItemPath.toast'),\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t});\n\t\t\t\t} else if (commandData.command === 'parameterPath') {\n\t\t\t\t\tconst jsonParameterPath = this.getJsonParameterPath();\n\t\t\t\t\tstartPath = jsonParameterPath.startPath;\n\t\t\t\t\tpath = jsonParameterPath.path;\n\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttitle: this.i18n.baseText('runData.copyParameterPath.toast'),\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!path.startsWith('[') && !path.startsWith('.') && path) {\n\t\t\t\t\tpath += '.';\n\t\t\t\t}\n\t\t\t\tvalue = `{{ ${startPath + path} }}`;\n\t\t\t}\n\n\t\t\tconst copyType = {\n\t\t\t\tvalue: 'selection',\n\t\t\t\titemPath: 'item_path',\n\t\t\t\tparameterPath: 'parameter_path',\n\t\t\t}[commandData.command];\n\n\t\t\tthis.$telemetry.track('User copied ndv data', {\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tview: 'json',\n\t\t\t\tcopy_type: copyType,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tin_execution_log: this.isReadOnlyRoute,\n\t\t\t});\n\n\t\t\tthis.copyToClipboard(value);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.actionsGroup {\n\tposition: sticky;\n\theight: 0;\n\toverflow: visible;\n\tz-index: 10;\n\ttop: 0;\n\tpadding-right: var(--spacing-s);\n\topacity: 0;\n\ttransition: opacity 0.3s ease;\n\ttext-align: right;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","genericHelpers","nodeHelpers","pinData","copyPaste","nonExistingJsonPath","useI18n","useToast","mapStores","useNDVStore","useWorkflowsStore","selectedValue","jp","clearJsonKey","executionDataToJson","value","newPath","convertPath","startPath","path","pathParts","index","commandData","jsonItemPath","jsonParameterPath","copyType","_resolveComponent","_normalizeClass","_ctx","_createBlock","_component_n8n_icon_button","_cache","$event","_openBlock","_component_el_dropdown","_withCtx","_createVNode","_component_el_dropdown_menu","_component_el_dropdown_item","_createElementVNode","_hoisted_1"],"mappings":"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"}
1
+ {"version":3,"file":"RunDataJsonActions-b7eb9ddb.js","sources":["../../src/components/RunDataJsonActions.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.actionsGroup\">\n\t\t<n8n-icon-button\n\t\t\tv-if=\"noSelection\"\n\t\t\t:title=\"i18n.baseText('runData.copyToClipboard')\"\n\t\t\ticon=\"copy\"\n\t\t\ttype=\"tertiary\"\n\t\t\t:circle=\"false\"\n\t\t\t@click=\"handleCopyClick({ command: 'value' })\"\n\t\t/>\n\t\t<el-dropdown v-else trigger=\"click\" @command=\"handleCopyClick\">\n\t\t\t<span class=\"el-dropdown-link\">\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\t:title=\"i18n.baseText('runData.copyToClipboard')\"\n\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t:circle=\"false\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t\t<template #dropdown>\n\t\t\t\t<el-dropdown-menu>\n\t\t\t\t\t<el-dropdown-item :command=\"{ command: 'value' }\">\n\t\t\t\t\t\t{{ i18n.baseText('runData.copyValue') }}\n\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t<el-dropdown-item :command=\"{ command: 'itemPath' }\" divided>\n\t\t\t\t\t\t{{ i18n.baseText('runData.copyItemPath') }}\n\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t\t<el-dropdown-item :command=\"{ command: 'parameterPath' }\">\n\t\t\t\t\t\t{{ i18n.baseText('runData.copyParameterPath') }}\n\t\t\t\t\t</el-dropdown-item>\n\t\t\t\t</el-dropdown-menu>\n\t\t\t</template>\n\t\t</el-dropdown>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport jp from 'jsonpath';\nimport type { INodeUi } from '@/Interface';\nimport type { IDataObject } from 'n8n-workflow';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { pinData } from '@/mixins/pinData';\nimport { nodeHelpers } from '@/mixins/nodeHelpers';\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { clearJsonKey, convertPath, executionDataToJson } from '@/utils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useI18n, useToast } from '@/composables';\nimport { nonExistingJsonPath } from '@/constants';\n\ntype JsonPathData = {\n\tpath: string;\n\tstartPath: string;\n};\n\nexport default defineComponent({\n\tname: 'run-data-json-actions',\n\tmixins: [genericHelpers, nodeHelpers, pinData, copyPaste],\n\n\tprops: {\n\t\tnode: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tcurrentOutputIndex: {\n\t\t\ttype: Number,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t},\n\t\tdisplayMode: {\n\t\t\ttype: String,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\tselectedJsonPath: {\n\t\t\ttype: String,\n\t\t\tdefault: nonExistingJsonPath,\n\t\t},\n\t\tjsonData: {\n\t\t\ttype: Array as PropType<IDataObject[]>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst i18n = useI18n();\n\n\t\treturn {\n\t\t\ti18n,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tnoSelection() {\n\t\t\treturn this.selectedJsonPath === nonExistingJsonPath;\n\t\t},\n\t\tnormalisedJsonPath(): string {\n\t\t\treturn this.noSelection ? '[\"\"]' : this.selectedJsonPath;\n\t\t},\n\t},\n\tmethods: {\n\t\tgetJsonValue(): string {\n\t\t\tlet selectedValue = jp.query(this.jsonData, `$${this.normalisedJsonPath}`)[0];\n\t\t\tif (this.noSelection) {\n\t\t\t\tif (this.hasPinData) {\n\t\t\t\t\tselectedValue = clearJsonKey(this.pinData as object);\n\t\t\t\t} else {\n\t\t\t\t\tselectedValue = executionDataToJson(\n\t\t\t\t\t\tthis.getNodeInputData(this.node, this.runIndex, this.currentOutputIndex),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet value = '';\n\t\t\tif (typeof selectedValue === 'object') {\n\t\t\t\tvalue = JSON.stringify(selectedValue, null, 2);\n\t\t\t} else {\n\t\t\t\tvalue = selectedValue.toString();\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\t\tgetJsonItemPath(): JsonPathData {\n\t\t\tconst newPath = convertPath(this.normalisedJsonPath);\n\t\t\tlet startPath = '';\n\t\t\tlet path = '';\n\n\t\t\tconst pathParts = newPath.split(']');\n\t\t\tconst index = pathParts[0].slice(1);\n\t\t\tpath = pathParts.slice(1).join(']');\n\t\t\tstartPath = `$item(${index}).$node[\"${this.node!.name}\"].json`;\n\n\t\t\treturn { path, startPath };\n\t\t},\n\t\tgetJsonParameterPath(): JsonPathData {\n\t\t\tconst newPath = convertPath(this.normalisedJsonPath);\n\t\t\tconst path = newPath.split(']').slice(1).join(']');\n\t\t\tlet startPath = `$node[\"${this.node!.name}\"].json`;\n\n\t\t\tif (this.distanceFromActive === 1) {\n\t\t\t\tstartPath = '$json';\n\t\t\t}\n\n\t\t\treturn { path, startPath };\n\t\t},\n\t\thandleCopyClick(commandData: { command: string }) {\n\t\t\tlet value: string;\n\t\t\tif (commandData.command === 'value') {\n\t\t\t\tvalue = this.getJsonValue();\n\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttitle: this.i18n.baseText('runData.copyValue.toast'),\n\t\t\t\t\tmessage: '',\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tduration: 2000,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlet startPath = '';\n\t\t\t\tlet path = '';\n\t\t\t\tif (commandData.command === 'itemPath') {\n\t\t\t\t\tconst jsonItemPath = this.getJsonItemPath();\n\t\t\t\t\tstartPath = jsonItemPath.startPath;\n\t\t\t\t\tpath = jsonItemPath.path;\n\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttitle: this.i18n.baseText('runData.copyItemPath.toast'),\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t});\n\t\t\t\t} else if (commandData.command === 'parameterPath') {\n\t\t\t\t\tconst jsonParameterPath = this.getJsonParameterPath();\n\t\t\t\t\tstartPath = jsonParameterPath.startPath;\n\t\t\t\t\tpath = jsonParameterPath.path;\n\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttitle: this.i18n.baseText('runData.copyParameterPath.toast'),\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!path.startsWith('[') && !path.startsWith('.') && path) {\n\t\t\t\t\tpath += '.';\n\t\t\t\t}\n\t\t\t\tvalue = `{{ ${startPath + path} }}`;\n\t\t\t}\n\n\t\t\tconst copyType = {\n\t\t\t\tvalue: 'selection',\n\t\t\t\titemPath: 'item_path',\n\t\t\t\tparameterPath: 'parameter_path',\n\t\t\t}[commandData.command];\n\n\t\t\tthis.$telemetry.track('User copied ndv data', {\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tview: 'json',\n\t\t\t\tcopy_type: copyType,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tin_execution_log: this.isReadOnlyRoute,\n\t\t\t});\n\n\t\t\tthis.copyToClipboard(value);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.actionsGroup {\n\tposition: sticky;\n\theight: 0;\n\toverflow: visible;\n\tz-index: 10;\n\ttop: 0;\n\tpadding-right: var(--spacing-s);\n\topacity: 0;\n\ttransition: opacity 0.3s ease;\n\ttext-align: right;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","genericHelpers","nodeHelpers","pinData","copyPaste","nonExistingJsonPath","useI18n","useToast","mapStores","useNDVStore","useWorkflowsStore","selectedValue","jp","clearJsonKey","executionDataToJson","value","newPath","convertPath","startPath","path","pathParts","index","commandData","jsonItemPath","jsonParameterPath","copyType","_resolveComponent","_normalizeClass","_ctx","_createBlock","_component_n8n_icon_button","_cache","$event","_openBlock","_component_el_dropdown","_withCtx","_createVNode","_component_el_dropdown_menu","_component_el_dropdown_item","_createElementVNode","_hoisted_1"],"mappings":"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"}