n8n-editor-ui 1.19.1 → 1.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +60 -60
- package/dist/assets/{AuthView-pnWQAK0S.js → AuthView-KzKyZSHz.js} +2 -2
- package/dist/assets/{AuthView-pnWQAK0S.js.map → AuthView-KzKyZSHz.js.map} +1 -1
- package/dist/assets/{CanvasControls-kb3__O2G.js → CanvasControls-6jR1_mnm.js} +2 -2
- package/dist/assets/{CanvasControls-kb3__O2G.js.map → CanvasControls-6jR1_mnm.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-w8ZDdsHs.js → ChangePasswordView-TW8EQPS0.js} +2 -2
- package/dist/assets/{ChangePasswordView-w8ZDdsHs.js.map → ChangePasswordView-TW8EQPS0.js.map} +1 -1
- package/dist/assets/{CredentialsView-9EPVLguD.js → CredentialsView-AVQZL_tm.js} +2 -2
- package/dist/assets/{CredentialsView-9EPVLguD.js.map → CredentialsView-AVQZL_tm.js.map} +1 -1
- package/dist/assets/{ExecutionFilter-xWjqUjz0.js → ExecutionFilter-tcX3bN8y.js} +2 -2
- package/dist/assets/{ExecutionFilter-xWjqUjz0.js.map → ExecutionFilter-tcX3bN8y.js.map} +1 -1
- package/dist/assets/{ExecutionPreview-IQ7v5u01.js → ExecutionPreview-OuL-2qRR.js} +2 -2
- package/dist/assets/{ExecutionPreview-IQ7v5u01.js.map → ExecutionPreview-OuL-2qRR.js.map} +1 -1
- package/dist/assets/{ExecutionsInfoAccordion-GNoSEKPt.js → ExecutionsInfoAccordion-J0VUGzOg.js} +2 -2
- package/dist/assets/{ExecutionsInfoAccordion-GNoSEKPt.js.map → ExecutionsInfoAccordion-J0VUGzOg.js.map} +1 -1
- package/dist/assets/{ExecutionsLandingPage-bMbJUz4X.js → ExecutionsLandingPage-LNx1ct-F.js} +2 -2
- package/dist/assets/{ExecutionsLandingPage-bMbJUz4X.js.map → ExecutionsLandingPage-LNx1ct-F.js.map} +1 -1
- package/dist/assets/{ExecutionsList-VqMNpnno.js → ExecutionsList-1jr8ziaw.js} +2 -2
- package/dist/assets/ExecutionsList-1jr8ziaw.js.map +1 -0
- package/dist/assets/{ExecutionsView-cib3hepc.js → ExecutionsView-vfalxf-N.js} +2 -2
- package/dist/assets/{ExecutionsView-cib3hepc.js.map → ExecutionsView-vfalxf-N.js.map} +1 -1
- package/dist/assets/{FixedCollectionParameter-2NZhE0YP.js → FixedCollectionParameter-i4v0_RBC.js} +3 -3
- package/dist/assets/{FixedCollectionParameter-2NZhE0YP.js.map → FixedCollectionParameter-i4v0_RBC.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-JpQD0IzR.js → ForgotMyPasswordView-n-WXfUXB.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-JpQD0IzR.js.map → ForgotMyPasswordView-n-WXfUXB.js.map} +1 -1
- package/dist/assets/{MainHeader-_EB1A67D.js → MainHeader-it41_mme.js} +2 -2
- package/dist/assets/{MainHeader-_EB1A67D.js.map → MainHeader-it41_mme.js.map} +1 -1
- package/dist/assets/{MainSidebar-QaJ5uvnW.js → MainSidebar-K22ttpb5.js} +2 -2
- package/dist/assets/{MainSidebar-QaJ5uvnW.js.map → MainSidebar-K22ttpb5.js.map} +1 -1
- package/dist/assets/{NodeCreation-OxTpBRfP.js → NodeCreation-3pcb_BwC.js} +3 -3
- package/dist/assets/{NodeCreation-OxTpBRfP.js.map → NodeCreation-3pcb_BwC.js.map} +1 -1
- package/dist/assets/{NodeCreator-_GxUysbY.js → NodeCreator-r6gxY14d.js} +2 -2
- package/dist/assets/{NodeCreator-_GxUysbY.js.map → NodeCreator-r6gxY14d.js.map} +1 -1
- package/dist/assets/{NodeView-CdR2fi_x.js → NodeView-LzPrYfwG.js} +3 -3
- package/dist/assets/{NodeView-CdR2fi_x.js.map → NodeView-LzPrYfwG.js.map} +1 -1
- package/dist/assets/{ResourcesListLayout-XUIQQpyB.js → ResourcesListLayout-XbNZXU-j.js} +2 -2
- package/dist/assets/{ResourcesListLayout-XUIQQpyB.js.map → ResourcesListLayout-XbNZXU-j.js.map} +1 -1
- package/dist/assets/{RunDataAi-4m1wWDUf.js → RunDataAi-ueFTZBht.js} +2 -2
- package/dist/assets/{RunDataAi-4m1wWDUf.js.map → RunDataAi-ueFTZBht.js.map} +1 -1
- package/dist/assets/{RunDataJson-FZZoF8ao.js → RunDataJson-VFzb6R4m.js} +3 -3
- package/dist/assets/{RunDataJson-FZZoF8ao.js.map → RunDataJson-VFzb6R4m.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-LZGsgNyW.js → RunDataJsonActions-LDR8SlAW.js} +2 -2
- package/dist/assets/{RunDataJsonActions-LZGsgNyW.js.map → RunDataJsonActions-LDR8SlAW.js.map} +1 -1
- package/dist/assets/{RunDataSchema-wjyR7MiY.js → RunDataSchema-BB0j0bVA.js} +2 -2
- package/dist/assets/{RunDataSchema-wjyR7MiY.js.map → RunDataSchema-BB0j0bVA.js.map} +1 -1
- package/dist/assets/{RunDataTable-690SZ7_1.js → RunDataTable-Qas85Wnj.js} +2 -2
- package/dist/assets/{RunDataTable-690SZ7_1.js.map → RunDataTable-Qas85Wnj.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-9tSVzIi2.js → SamlOnboarding-4D4QjACf.js} +2 -2
- package/dist/assets/{SamlOnboarding-9tSVzIi2.js.map → SamlOnboarding-4D4QjACf.js.map} +1 -1
- package/dist/assets/{SettingsApiView-95Wb-oA5.js → SettingsApiView-0Ne2kemN.js} +2 -2
- package/dist/assets/{SettingsApiView-95Wb-oA5.js.map → SettingsApiView-0Ne2kemN.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-WW65T1Gl.js → SettingsCommunityNodesView-zzzz0aj6.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-WW65T1Gl.js.map → SettingsCommunityNodesView-zzzz0aj6.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-6YJbQ8LH.js → SettingsExternalSecrets-bsdr9nMJ.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-6YJbQ8LH.js.map → SettingsExternalSecrets-bsdr9nMJ.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-6ZiGYnHw.js → SettingsFakeDoorView-0ioWE56l.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-6ZiGYnHw.js.map → SettingsFakeDoorView-0ioWE56l.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-G9lNDLq4.js → SettingsLdapView-nV_D5CDp.js} +2 -2
- package/dist/assets/{SettingsLdapView-G9lNDLq4.js.map → SettingsLdapView-nV_D5CDp.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-hOxp5upg.js → SettingsLogStreamingView-GPC6oqoB.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-hOxp5upg.js.map → SettingsLogStreamingView-GPC6oqoB.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-A4p6uSTm.js → SettingsSourceControl-YlWPbedb.js} +2 -2
- package/dist/assets/{SettingsSourceControl-A4p6uSTm.js.map → SettingsSourceControl-YlWPbedb.js.map} +1 -1
- package/dist/assets/{SettingsSso-kXl38iOM.js → SettingsSso-o3FTQjpW.js} +2 -2
- package/dist/assets/{SettingsSso-kXl38iOM.js.map → SettingsSso-o3FTQjpW.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-E00t5N2Z.js → SettingsUsageAndPlan-lypv7X6a.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-E00t5N2Z.js.map → SettingsUsageAndPlan-lypv7X6a.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-4PoSbZc_.js → SettingsUsersView-BP40GKuA.js} +2 -2
- package/dist/assets/{SettingsUsersView-4PoSbZc_.js.map → SettingsUsersView-BP40GKuA.js.map} +1 -1
- package/dist/assets/{SettingsView-ITSZzUOy.js → SettingsView-UI5wnO8B.js} +2 -2
- package/dist/assets/{SettingsView-ITSZzUOy.js.map → SettingsView-UI5wnO8B.js.map} +1 -1
- package/dist/assets/{SetupView-iFHyYLKM.js → SetupView-jUHcBldc.js} +2 -2
- package/dist/assets/{SetupView-iFHyYLKM.js.map → SetupView-jUHcBldc.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-1mq-ZIl2.js → SetupWorkflowFromTemplateView-xZok8Ro-.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-1mq-ZIl2.js.map → SetupWorkflowFromTemplateView-xZok8Ro-.js.map} +1 -1
- package/dist/assets/{SigninView-eqdMLCtk.js → SigninView-jH2VFMFu.js} +2 -2
- package/dist/assets/{SigninView-eqdMLCtk.js.map → SigninView-jH2VFMFu.js.map} +1 -1
- package/dist/assets/{SignupView-a26ywVgy.js → SignupView-cQJowW7M.js} +2 -2
- package/dist/assets/{SignupView-a26ywVgy.js.map → SignupView-cQJowW7M.js.map} +1 -1
- package/dist/assets/{TemplateDetails-neZvQLcE.js → TemplateDetails-FXwRGgg3.js} +2 -2
- package/dist/assets/{TemplateDetails-neZvQLcE.js.map → TemplateDetails-FXwRGgg3.js.map} +1 -1
- package/dist/assets/{TemplateList-apw79EVp.js → TemplateList-ygiFPwW5.js} +2 -2
- package/dist/assets/{TemplateList-apw79EVp.js.map → TemplateList-ygiFPwW5.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-2NGTxXTg.js → TemplatesCollectionView-iJK5C7dQ.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-2NGTxXTg.js.map → TemplatesCollectionView-iJK5C7dQ.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-0FL2pP83.js → TemplatesSearchView-HA2xad9U.js} +2 -2
- package/dist/assets/{TemplatesSearchView-0FL2pP83.js.map → TemplatesSearchView-HA2xad9U.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-D4Lnmnhg.js → TemplatesWorkflowView-KdHMuTUs.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-D4Lnmnhg.js.map → TemplatesWorkflowView-KdHMuTUs.js.map} +1 -1
- package/dist/assets/{VariablesView-tzHYYMLV.js → VariablesView-BGFOVdr1.js} +2 -2
- package/dist/assets/{VariablesView-tzHYYMLV.js.map → VariablesView-BGFOVdr1.js.map} +1 -1
- package/dist/assets/{WorkerView-AmUPKGBk.js → WorkerView-FnskutaO.js} +2 -2
- package/dist/assets/{WorkerView-AmUPKGBk.js.map → WorkerView-FnskutaO.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-haTVfR4g.js → WorkflowActivator-B2Cg8gE_.js} +2 -2
- package/dist/assets/{WorkflowActivator-haTVfR4g.js.map → WorkflowActivator-B2Cg8gE_.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-azyuxv8R.js → WorkflowOnboardingView-ZBFcAyXB.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-azyuxv8R.js.map → WorkflowOnboardingView-ZBFcAyXB.js.map} +1 -1
- package/dist/assets/{WorkflowsView-oE-PnjgI.js → WorkflowsView-ZCzM_7eW.js} +2 -2
- package/dist/assets/{WorkflowsView-oE-PnjgI.js.map → WorkflowsView-ZCzM_7eW.js.map} +1 -1
- package/dist/assets/{cloud-TMu3mk45.js → cloud-B6sgy7jV.js} +2 -2
- package/dist/assets/{cloud-TMu3mk45.js.map → cloud-B6sgy7jV.js.map} +1 -1
- package/dist/assets/{executionsHelpers-jpam7Sff.js → executionsHelpers-8_uqSfWi.js} +2 -2
- package/dist/assets/{executionsHelpers-jpam7Sff.js.map → executionsHelpers-8_uqSfWi.js.map} +1 -1
- package/dist/assets/{index-hMVAffQ3.js → index-sMRiWGJS.js} +4 -4
- package/dist/assets/{index-hMVAffQ3.js.map → index-sMRiWGJS.js.map} +1 -1
- package/dist/assets/{pushConnection-NKwmlD0l.js → pushConnection-SP3wVlD4.js} +2 -2
- package/dist/assets/{pushConnection-NKwmlD0l.js.map → pushConnection-SP3wVlD4.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-WpRAbEhr.js → useExecutionDebugging-vYjc-e7j.js} +2 -2
- package/dist/assets/{useExecutionDebugging-WpRAbEhr.js.map → useExecutionDebugging-vYjc-e7j.js.map} +1 -1
- package/dist/assets/{workflowActivate-UB1_xc5U.js → workflowActivate-FonyQsS3.js} +2 -2
- package/dist/assets/{workflowActivate-UB1_xc5U.js.map → workflowActivate-FonyQsS3.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/ExecutionsList-VqMNpnno.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeCreator-_GxUysbY.js","sources":["../../src/components/transitions/SlideTransition.vue","../../src/components/Node/NodeCreator/composables/useActionsGeneration.ts","../../src/components/Node/NodeCreator/Panel/SearchBar.vue","../../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":["<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 type { ActionTypeDescription, ActionsRecord, SimplifiedNodeType } from '@/Interface';\nimport { CUSTOM_API_CALL_KEY, HTTP_REQUEST_NODE_TYPE } from '@/constants';\nimport { memoize, startCase } from 'lodash-es';\nimport type {\n\tICredentialType,\n\tINodeProperties,\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tINodeTypeDescription,\n} from 'n8n-workflow';\n\nimport { i18n } from '@/plugins/i18n';\n\nimport { getCredentialOnlyNodeType } from '@/utils/credentialOnlyNodes';\n\nconst PLACEHOLDER_RECOMMENDED_ACTION_KEY = 'placeholder_recommended';\n\nfunction translate(...args: Parameters<typeof i18n.baseText>) {\n\treturn i18n.baseText(...args);\n}\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\toutputs: nodeTypeDescription.outputs,\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?.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?.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((operation) => {\n\t\t\t\t\tconst isOperation = operation.name === 'operation';\n\t\t\t\t\tconst isMatchingResource =\n\t\t\t\t\t\toperation.displayOptions?.show?.resource?.includes(resourceOption.value) ||\n\t\t\t\t\t\tisSingleResource;\n\n\t\t\t\t\t// If the operation doesn't have a version defined, it should be\n\t\t\t\t\t// available for all versions. Otherwise, make sure the node type\n\t\t\t\t\t// version matches the operation version\n\t\t\t\t\tconst operationVersions = operation.displayOptions?.show?.['@version'];\n\t\t\t\t\tconst nodeTypeVersions = Array.isArray(nodeTypeDescription.version)\n\t\t\t\t\t\t? nodeTypeDescription.version\n\t\t\t\t\t\t: [nodeTypeDescription.version];\n\n\t\t\t\t\tconst isMatchingVersion = operationVersions\n\t\t\t\t\t\t? operationVersions.some((version) => nodeTypeVersions.includes(version))\n\t\t\t\t\t\t: true;\n\n\t\t\t\t\treturn isOperation && isMatchingResource && isMatchingVersion;\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[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 {\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\tbadgeIconUrl,\n\t\t\toutputs,\n\t\t\tcodex,\n\t\t} = 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\tbadgeIconUrl,\n\t\t\toutputs,\n\t\t\tcodex,\n\t\t};\n\t}\n\n\tfunction generateMergedNodesAndActions(\n\t\tnodeTypes: INodeTypeDescription[],\n\t\thttpOnlyCredentials: ICredentialType[],\n\t) {\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\tif (app.name === HTTP_REQUEST_NODE_TYPE) {\n\t\t\t\t\tconst credentialOnlyNodes = httpOnlyCredentials.map((credentialType) =>\n\t\t\t\t\t\tgetSimplifiedNodeType(getCredentialOnlyNodeType(app, credentialType)),\n\t\t\t\t\t);\n\t\t\t\t\tmergedNodes.push(...credentialOnlyNodes);\n\t\t\t\t}\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","<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 { useExternalHooks } from '@/composables/useExternalHooks';\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\nconst externalHooks = useExternalHooks();\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 externalHooks.run('nodeCreatorSearchBar.mount', { inputRef: state.inputRef });\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","<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=\"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<div v-if=\"isSubNode\" :class=\"$style.subNodeBackground\"></div>\n\t\t\t<node-icon :class=\"$style.nodeIcon\" :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 {\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tCREDENTIAL_ONLY_NODE_PREFIX,\n\tDEFAULT_SUBCATEGORY,\n\tDRAG_EVENT_DATA_KEY,\n} from '@/constants';\n\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\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 } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\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 { getAddedNodesAndConnections } = 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\tif (\n\t\tprops.subcategory === DEFAULT_SUBCATEGORY &&\n\t\t!props.nodeType.name.startsWith(CREDENTIAL_ONLY_NODE_PREFIX)\n\t) {\n\t\treturn '';\n\t}\n\n\treturn i18n.headerText({\n\t\tkey: `headers.${shortNodeType.value}.description`,\n\t\tfallback: props.nodeType.description,\n\t});\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<string>(() => {\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 isSubNode = computed<boolean>(() => {\n\tif (!props.nodeType.outputs || typeof props.nodeType.outputs === 'string') {\n\t\treturn false;\n\t}\n\tconst outputTypes = NodeHelpers.getConnectionTypes(props.nodeType.outputs);\n\treturn outputTypes\n\t\t? outputTypes.filter((output) => output !== NodeConnectionType.Main).length > 0\n\t\t: false;\n});\n\nconst isTrigger = computed<boolean>(() => {\n\treturn props.nodeType.group.includes('trigger') && !hasActions.value;\n});\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\tDRAG_EVENT_DATA_KEY,\n\t\t\tJSON.stringify(getAddedNodesAndConnections([{ type: props.nodeType.name }])),\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.nodeIcon {\n\tz-index: 2;\n}\n\n.subNodeBackground {\n\tbackground-color: var(--node-type-supplemental-background);\n\tborder-radius: 50%;\n\theight: 40px;\n\tposition: absolute;\n\ttransform: translate(-7px, -7px);\n\twidth: 40px;\n\tz-index: 1;\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\n\t\t\t\ttype=\"icon\"\n\t\t\t\t:name=\"item.icon\"\n\t\t\t\t:circle=\"false\"\n\t\t\t\t:showTooltip=\"false\"\n\t\t\t\tv-bind=\"item.iconProps\"\n\t\t\t/>\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/useI18n';\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, DRAG_EVENT_DATA_KEY } 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, getAddedNodesAndConnections, 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 && actionData.value.key) {\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\tDRAG_EVENT_DATA_KEY,\n\t\t\tJSON.stringify(getAddedNodesAndConnections([{ type: actionData.value.key }])),\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) {\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, 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\tposition: relative;\n\n\t&:last-child {\n\t\tmargin-top: var(--spacing-s);\n\t\tpadding-top: var(--spacing-xs);\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tleft: var(--spacing-s);\n\t\t\tright: var(--spacing-s);\n\t\t\ttop: 0;\n\t\t\tmargin: auto;\n\t\t\tbottom: 0;\n\t\t\tborder-top: 1px solid var(--color-foreground-base);\n\t\t}\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\tcolor: var(--color-foreground-xdark);\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 { runExternalHook } from '@/utils/externalHooks';\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;\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', [actionData.key as string]);\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', 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', {\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 {\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tHTTP_REQUEST_NODE_TYPE,\n\tWEBHOOK_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tAI_NODE_CREATOR_VIEW,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n} 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, AIView, AINodesView } from '../viewsData';\nimport { transformNodeType } from '../utils';\nimport { useViewStacks } from '../composables/useViewStacks';\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 } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\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 { 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('nodeTypeSelected', nodeTypes);\n}\n\nfunction onSelected(item: INodeCreateElement) {\n\tif (item.type === 'subcategory') {\n\t\tconst subcategoryKey = camelCase(item.properties.title);\n\t\tconst title = i18n.baseText(`nodeCreator.subcategoryNames.${subcategoryKey}` as BaseTextKey);\n\n\t\tpushViewStack({\n\t\t\tsubcategory: item.key,\n\t\t\ttitle,\n\t\t\tmode: 'nodes',\n\t\t\t...(item.properties.icon\n\t\t\t\t? {\n\t\t\t\t\t\tnodeIcon: {\n\t\t\t\t\t\t\ticon: item.properties.icon,\n\t\t\t\t\t\t\ticonType: 'icon',\n\t\t\t\t\t\t},\n\t\t\t\t }\n\t\t\t\t: {}),\n\t\t\t...(item.properties.panelClass ? { panelClass: item.properties.panelClass } : {}),\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 views = {\n\t\t\t[TRIGGER_NODE_CREATOR_VIEW]: TriggerView,\n\t\t\t[REGULAR_NODE_CREATOR_VIEW]: RegularView,\n\t\t\t[AI_NODE_CREATOR_VIEW]: AIView,\n\t\t\t[AI_OTHERS_NODE_CREATOR_VIEW]: AINodesView,\n\t\t};\n\n\t\tconst itemKey = item.key as keyof typeof views;\n\t\tconst matchedView = views[itemKey];\n\n\t\tif (!matchedView) {\n\t\t\tconsole.warn(`No view found for ${itemKey}`);\n\t\t\treturn;\n\t\t}\n\t\tconst view = matchedView(mergedNodes);\n\n\t\tpushViewStack({\n\t\t\ttitle: view.title,\n\t\t\tsubtitle: view?.subtitle ?? '',\n\t\t\tinfo: view?.info ?? '',\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);\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 {\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tAI_NODE_CREATOR_VIEW,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRIGGER_NODE_CREATOR_VIEW,\n} from '@/constants';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport { TriggerView, RegularView, AIView, AINodesView } 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/useI18n';\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 views = {\n\t\t\t[TRIGGER_NODE_CREATOR_VIEW]: TriggerView,\n\t\t\t[REGULAR_NODE_CREATOR_VIEW]: RegularView,\n\t\t\t[AI_NODE_CREATOR_VIEW]: AIView,\n\t\t\t[AI_OTHERS_NODE_CREATOR_VIEW]: AINodesView,\n\t\t};\n\n\t\tconst itemKey = selectedView;\n\t\tconst matchedView = views[itemKey];\n\n\t\tif (!matchedView) {\n\t\t\tconsole.warn(`No view found for ${itemKey}`);\n\t\t\treturn;\n\t\t}\n\t\tconst view = matchedView(mergedNodes);\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\tinfo: view.info,\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\n\t\t\t:class=\"[$style.nodesListPanel, activeViewStack.panelClass]\"\n\t\t\t@keydown.capture.stop\n\t\t\t:key=\"`${activeViewStack.uuid}`\"\n\t\t>\n\t\t\t<header\n\t\t\t\t:class=\"{\n\t\t\t\t\t[$style.header]: true,\n\t\t\t\t\t[$style.hasBg]: !activeViewStack.subtitle,\n\t\t\t\t\t'nodes-list-panel-header': true,\n\t\t\t\t}\"\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\n\t\t\t\t\t\t:class=\"$style.backButton\"\n\t\t\t\t\t\t@click=\"onBackButton\"\n\t\t\t\t\t\tv-if=\"viewStacks.length > 1 && !activeViewStack.preventBack\"\n\t\t\t\t\t>\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=\"20\"\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<n8n-notice\n\t\t\t\t\tv-if=\"activeViewStack.info && !activeViewStack.search\"\n\t\t\t\t\t:class=\"$style.info\"\n\t\t\t\t\t:content=\"activeViewStack.info\"\n\t\t\t\t\ttheme=\"warning\"\n\t\t\t\t/>\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.info {\n\tmargin: var(--spacing-2xs) var(--spacing-s);\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: 20px;\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\t--color-background-node-icon-badge: var(--color-background-xlight);\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\n<style lang=\"scss\">\n@each $node-type in $supplemental-node-types {\n\t.nodes-list-panel-#{$node-type} .nodes-list-panel-header {\n\t\t.n8n-node-icon svg {\n\t\t\tcolor: var(--node-type-#{$node-type}-color);\n\t\t}\n\t}\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 { useCredentialsStore } from '@/stores/credentials.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { DRAG_EVENT_DATA_KEY } from '@/constants';\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 dragData = event.dataTransfer.getData(DRAG_EVENT_DATA_KEY);\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\tdragData &&\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) {\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() => ({\n\t\thttpOnlyCredentials: useCredentialsStore().httpOnlyCredentialTypes,\n\t\tnodeTypes: useNodeTypesStore().visibleNodeTypes,\n\t}),\n\t({ nodeTypes, httpOnlyCredentials }) => {\n\t\tconst { actions, mergedNodes } = generateMergedNodesAndActions(nodeTypes, httpOnlyCredentials);\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-dialog-overlay-background);\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":["_sfc_main$f","defineComponent","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createBlock","_Transition","_withCtx","PLACEHOLDER_RECOMMENDED_ACTION_KEY","translate","args","i18n","cachedBaseText","memoize","customNodeActionsParsers","matchedProperty","nodeTypeDescription","collection","_a","_c","_b","categoryItem","getNodeTypeBase","startCase","label","isTrigger","category","operationsCategory","property","items","item","triggersCategory","matchingKeys","filteredOutItems","resourceCategories","transformedNodes","option","CUSTOM_API_CALL_KEY","resourceOption","i","options","isSingleResource","operations","operation","isOperation","isMatchingResource","operationVersions","_e","_d","nodeTypeVersions","isMatchingVersion","version","operationOption","displayName","displayOptions","useActionsGenerator","generateNodeActions","node","filterActions","actions","action","arr","isPlaceholderTriggerAction","getSimplifiedNodeType","defaults","description","name","group","icon","iconUrl","badgeIconUrl","outputs","codex","generateMergedNodesAndActions","nodeTypes","httpOnlyCredentials","visibleNodeTypes","mergedNodes","app","appActions","HTTP_REQUEST_NODE_TYPE","credentialOnlyNodes","credentialType","getCredentialOnlyNodeType","trigger","normalizedName","triggerActions","mergedActions","state","reactive","externalHooks","useExternalHooks","focus","onInput","event","input","emit","clear","onMounted","onBeforeUnmount","inputRef","toRefs","__expose","useI18n","telemetry","useTelemetry","useNodeCreatorStore","getAddedNodesAndConnections","useActions","dragging","ref","draggablePosition","draggableDataTransfer","computed","props","DEFAULT_SUBCATEGORY","CREDENTIAL_ONLY_NODE_PREFIX","shortNodeType","showActionArrow","hasActions","dataTestId","nodeActions","draggableStyle","isCommunityNode","isCommunityPackageName","isSubNode","outputTypes","NodeHelpers.getConnectionTypes","output","NodeConnectionType","onDragStart","onDragOver","x","y","DRAG_EVENT_DATA_KEY","getNewNodePosition","NODE_SIZE","onDragEnd","onCommunityNodeTooltipClick","subcategoryName","camelCase","instance","getCurrentInstance","getActionData","setAddedNodeActionParameters","activeViewStack","useViewStacks","actionData","isTriggerAction","WEBHOOK_NODE_TYPE","LAZY_LOAD_THRESHOLD","LAZY_LOAD_ITEMS_PER_TICK","renderedItems","renderAnimationRequest","activeItemId","useKeyboardNavigation","renderItems","wrappedEmit","element","$e","beforeEnter","el","enter","beforeLeave","leave","onUnmounted","watch","categoryName","itemsCount","popViewStack","registerKeyHook","workflowId","useWorkflowsStore","actionCount","type","expanded","toggleExpanded","setExpanded","isExpanded","arrowRight","arrowLeft","userActivated","useUsersStore","updateCurrentViewStack","getNodeTypesWithManualTrigger","getPlaceholderTriggerActions","parseCategoryActions","actionsCategoryLocales","parsedTriggerActions","parseActions","parsedActionActions","search","parsedTriggerActionsBaseline","parsedActionActionsBaseline","triggerCategoryName","placeholderTriggerActions","p","subcategory","rootView","hasNoTriggerActions","containsAPIAction","isTriggerRootView","TRIGGER_NODE_CREATOR_VIEW","onKeySelect","base","locale","withLabels","activeAction","a","onSelected","actionCreateElement","actionNode","trackActionsView","trigger_action_count","trackingPayload","runExternalHook","resetSearch","addHttpNode","updateData","app_identifier","OrderSwitcher","slots","h","REGULAR_NODE_CREATOR_VIEW","_hoisted_1","_hoisted_4","baseUrl","useRootStore","pushViewStack","globalSearchItemsDiff","selectNodeType","subcategoryKey","title","baseSubcategoriesFilter","subcategoriesMapper","transformedActions","transformNodeType","views","TriggerView","RegularView","AI_NODE_CREATOR_VIEW","AIView","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","itemKey","matchedView","view","hasTriggerGroup","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","viewStacks","isActionsMode","searchPlaceholder","nodeCreatorView","onSearch","value","onTransitionEnd","newStackIndex","selectedView","onBackButton","resetViewStacks","uiStore","useUIStore","setShowScrim","setActions","setMergeNodes","showScrim","viewStacksLength","nodeCreatorInlineStyle","onMouseUpOutside","clickEvent","unBindOnMouseUpOutside","onMouseUp","onMouseDown","onDrop","dragData","nodeCreatorBoundingRect","isActive","useCredentialsStore","useNodeTypesStore","nodeCreator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NodeCreator-r6gxY14d.js","sources":["../../src/components/transitions/SlideTransition.vue","../../src/components/Node/NodeCreator/composables/useActionsGeneration.ts","../../src/components/Node/NodeCreator/Panel/SearchBar.vue","../../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":["<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 type { ActionTypeDescription, ActionsRecord, SimplifiedNodeType } from '@/Interface';\nimport { CUSTOM_API_CALL_KEY, HTTP_REQUEST_NODE_TYPE } from '@/constants';\nimport { memoize, startCase } from 'lodash-es';\nimport type {\n\tICredentialType,\n\tINodeProperties,\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tINodeTypeDescription,\n} from 'n8n-workflow';\n\nimport { i18n } from '@/plugins/i18n';\n\nimport { getCredentialOnlyNodeType } from '@/utils/credentialOnlyNodes';\n\nconst PLACEHOLDER_RECOMMENDED_ACTION_KEY = 'placeholder_recommended';\n\nfunction translate(...args: Parameters<typeof i18n.baseText>) {\n\treturn i18n.baseText(...args);\n}\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\toutputs: nodeTypeDescription.outputs,\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?.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?.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((operation) => {\n\t\t\t\t\tconst isOperation = operation.name === 'operation';\n\t\t\t\t\tconst isMatchingResource =\n\t\t\t\t\t\toperation.displayOptions?.show?.resource?.includes(resourceOption.value) ||\n\t\t\t\t\t\tisSingleResource;\n\n\t\t\t\t\t// If the operation doesn't have a version defined, it should be\n\t\t\t\t\t// available for all versions. Otherwise, make sure the node type\n\t\t\t\t\t// version matches the operation version\n\t\t\t\t\tconst operationVersions = operation.displayOptions?.show?.['@version'];\n\t\t\t\t\tconst nodeTypeVersions = Array.isArray(nodeTypeDescription.version)\n\t\t\t\t\t\t? nodeTypeDescription.version\n\t\t\t\t\t\t: [nodeTypeDescription.version];\n\n\t\t\t\t\tconst isMatchingVersion = operationVersions\n\t\t\t\t\t\t? operationVersions.some((version) => nodeTypeVersions.includes(version))\n\t\t\t\t\t\t: true;\n\n\t\t\t\t\treturn isOperation && isMatchingResource && isMatchingVersion;\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[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 {\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\tbadgeIconUrl,\n\t\t\toutputs,\n\t\t\tcodex,\n\t\t} = 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\tbadgeIconUrl,\n\t\t\toutputs,\n\t\t\tcodex,\n\t\t};\n\t}\n\n\tfunction generateMergedNodesAndActions(\n\t\tnodeTypes: INodeTypeDescription[],\n\t\thttpOnlyCredentials: ICredentialType[],\n\t) {\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\tif (app.name === HTTP_REQUEST_NODE_TYPE) {\n\t\t\t\t\tconst credentialOnlyNodes = httpOnlyCredentials.map((credentialType) =>\n\t\t\t\t\t\tgetSimplifiedNodeType(getCredentialOnlyNodeType(app, credentialType)),\n\t\t\t\t\t);\n\t\t\t\t\tmergedNodes.push(...credentialOnlyNodes);\n\t\t\t\t}\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","<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 { useExternalHooks } from '@/composables/useExternalHooks';\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\nconst externalHooks = useExternalHooks();\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 externalHooks.run('nodeCreatorSearchBar.mount', { inputRef: state.inputRef });\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","<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=\"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<div v-if=\"isSubNode\" :class=\"$style.subNodeBackground\"></div>\n\t\t\t<node-icon :class=\"$style.nodeIcon\" :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 {\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tCREDENTIAL_ONLY_NODE_PREFIX,\n\tDEFAULT_SUBCATEGORY,\n\tDRAG_EVENT_DATA_KEY,\n} from '@/constants';\n\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\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 } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\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 { getAddedNodesAndConnections } = 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\tif (\n\t\tprops.subcategory === DEFAULT_SUBCATEGORY &&\n\t\t!props.nodeType.name.startsWith(CREDENTIAL_ONLY_NODE_PREFIX)\n\t) {\n\t\treturn '';\n\t}\n\n\treturn i18n.headerText({\n\t\tkey: `headers.${shortNodeType.value}.description`,\n\t\tfallback: props.nodeType.description,\n\t});\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<string>(() => {\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 isSubNode = computed<boolean>(() => {\n\tif (!props.nodeType.outputs || typeof props.nodeType.outputs === 'string') {\n\t\treturn false;\n\t}\n\tconst outputTypes = NodeHelpers.getConnectionTypes(props.nodeType.outputs);\n\treturn outputTypes\n\t\t? outputTypes.filter((output) => output !== NodeConnectionType.Main).length > 0\n\t\t: false;\n});\n\nconst isTrigger = computed<boolean>(() => {\n\treturn props.nodeType.group.includes('trigger') && !hasActions.value;\n});\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\tDRAG_EVENT_DATA_KEY,\n\t\t\tJSON.stringify(getAddedNodesAndConnections([{ type: props.nodeType.name }])),\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.nodeIcon {\n\tz-index: 2;\n}\n\n.subNodeBackground {\n\tbackground-color: var(--node-type-supplemental-background);\n\tborder-radius: 50%;\n\theight: 40px;\n\tposition: absolute;\n\ttransform: translate(-7px, -7px);\n\twidth: 40px;\n\tz-index: 1;\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\n\t\t\t\ttype=\"icon\"\n\t\t\t\t:name=\"item.icon\"\n\t\t\t\t:circle=\"false\"\n\t\t\t\t:showTooltip=\"false\"\n\t\t\t\tv-bind=\"item.iconProps\"\n\t\t\t/>\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/useI18n';\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, DRAG_EVENT_DATA_KEY } 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, getAddedNodesAndConnections, 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 && actionData.value.key) {\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\tDRAG_EVENT_DATA_KEY,\n\t\t\tJSON.stringify(getAddedNodesAndConnections([{ type: actionData.value.key }])),\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) {\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, 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\tposition: relative;\n\n\t&:last-child {\n\t\tmargin-top: var(--spacing-s);\n\t\tpadding-top: var(--spacing-xs);\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tleft: var(--spacing-s);\n\t\t\tright: var(--spacing-s);\n\t\t\ttop: 0;\n\t\t\tmargin: auto;\n\t\t\tbottom: 0;\n\t\t\tborder-top: 1px solid var(--color-foreground-base);\n\t\t}\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\tcolor: var(--color-foreground-xdark);\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 { runExternalHook } from '@/utils/externalHooks';\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;\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', [actionData.key as string]);\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', 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', {\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 {\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tHTTP_REQUEST_NODE_TYPE,\n\tWEBHOOK_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tAI_NODE_CREATOR_VIEW,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n} 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, AIView, AINodesView } from '../viewsData';\nimport { transformNodeType } from '../utils';\nimport { useViewStacks } from '../composables/useViewStacks';\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 } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\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 { 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('nodeTypeSelected', nodeTypes);\n}\n\nfunction onSelected(item: INodeCreateElement) {\n\tif (item.type === 'subcategory') {\n\t\tconst subcategoryKey = camelCase(item.properties.title);\n\t\tconst title = i18n.baseText(`nodeCreator.subcategoryNames.${subcategoryKey}` as BaseTextKey);\n\n\t\tpushViewStack({\n\t\t\tsubcategory: item.key,\n\t\t\ttitle,\n\t\t\tmode: 'nodes',\n\t\t\t...(item.properties.icon\n\t\t\t\t? {\n\t\t\t\t\t\tnodeIcon: {\n\t\t\t\t\t\t\ticon: item.properties.icon,\n\t\t\t\t\t\t\ticonType: 'icon',\n\t\t\t\t\t\t},\n\t\t\t\t }\n\t\t\t\t: {}),\n\t\t\t...(item.properties.panelClass ? { panelClass: item.properties.panelClass } : {}),\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 views = {\n\t\t\t[TRIGGER_NODE_CREATOR_VIEW]: TriggerView,\n\t\t\t[REGULAR_NODE_CREATOR_VIEW]: RegularView,\n\t\t\t[AI_NODE_CREATOR_VIEW]: AIView,\n\t\t\t[AI_OTHERS_NODE_CREATOR_VIEW]: AINodesView,\n\t\t};\n\n\t\tconst itemKey = item.key as keyof typeof views;\n\t\tconst matchedView = views[itemKey];\n\n\t\tif (!matchedView) {\n\t\t\tconsole.warn(`No view found for ${itemKey}`);\n\t\t\treturn;\n\t\t}\n\t\tconst view = matchedView(mergedNodes);\n\n\t\tpushViewStack({\n\t\t\ttitle: view.title,\n\t\t\tsubtitle: view?.subtitle ?? '',\n\t\t\tinfo: view?.info ?? '',\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);\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 {\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tAI_NODE_CREATOR_VIEW,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRIGGER_NODE_CREATOR_VIEW,\n} from '@/constants';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport { TriggerView, RegularView, AIView, AINodesView } 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/useI18n';\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 views = {\n\t\t\t[TRIGGER_NODE_CREATOR_VIEW]: TriggerView,\n\t\t\t[REGULAR_NODE_CREATOR_VIEW]: RegularView,\n\t\t\t[AI_NODE_CREATOR_VIEW]: AIView,\n\t\t\t[AI_OTHERS_NODE_CREATOR_VIEW]: AINodesView,\n\t\t};\n\n\t\tconst itemKey = selectedView;\n\t\tconst matchedView = views[itemKey];\n\n\t\tif (!matchedView) {\n\t\t\tconsole.warn(`No view found for ${itemKey}`);\n\t\t\treturn;\n\t\t}\n\t\tconst view = matchedView(mergedNodes);\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\tinfo: view.info,\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\n\t\t\t:class=\"[$style.nodesListPanel, activeViewStack.panelClass]\"\n\t\t\t@keydown.capture.stop\n\t\t\t:key=\"`${activeViewStack.uuid}`\"\n\t\t>\n\t\t\t<header\n\t\t\t\t:class=\"{\n\t\t\t\t\t[$style.header]: true,\n\t\t\t\t\t[$style.hasBg]: !activeViewStack.subtitle,\n\t\t\t\t\t'nodes-list-panel-header': true,\n\t\t\t\t}\"\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\n\t\t\t\t\t\t:class=\"$style.backButton\"\n\t\t\t\t\t\t@click=\"onBackButton\"\n\t\t\t\t\t\tv-if=\"viewStacks.length > 1 && !activeViewStack.preventBack\"\n\t\t\t\t\t>\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=\"20\"\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<n8n-notice\n\t\t\t\t\tv-if=\"activeViewStack.info && !activeViewStack.search\"\n\t\t\t\t\t:class=\"$style.info\"\n\t\t\t\t\t:content=\"activeViewStack.info\"\n\t\t\t\t\ttheme=\"warning\"\n\t\t\t\t/>\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.info {\n\tmargin: var(--spacing-2xs) var(--spacing-s);\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: 20px;\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\t--color-background-node-icon-badge: var(--color-background-xlight);\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\n<style lang=\"scss\">\n@each $node-type in $supplemental-node-types {\n\t.nodes-list-panel-#{$node-type} .nodes-list-panel-header {\n\t\t.n8n-node-icon svg {\n\t\t\tcolor: var(--node-type-#{$node-type}-color);\n\t\t}\n\t}\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 { useCredentialsStore } from '@/stores/credentials.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { DRAG_EVENT_DATA_KEY } from '@/constants';\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 dragData = event.dataTransfer.getData(DRAG_EVENT_DATA_KEY);\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\tdragData &&\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) {\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() => ({\n\t\thttpOnlyCredentials: useCredentialsStore().httpOnlyCredentialTypes,\n\t\tnodeTypes: useNodeTypesStore().visibleNodeTypes,\n\t}),\n\t({ nodeTypes, httpOnlyCredentials }) => {\n\t\tconst { actions, mergedNodes } = generateMergedNodesAndActions(nodeTypes, httpOnlyCredentials);\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-dialog-overlay-background);\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":["_sfc_main$f","defineComponent","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createBlock","_Transition","_withCtx","PLACEHOLDER_RECOMMENDED_ACTION_KEY","translate","args","i18n","cachedBaseText","memoize","customNodeActionsParsers","matchedProperty","nodeTypeDescription","collection","_a","_c","_b","categoryItem","getNodeTypeBase","startCase","label","isTrigger","category","operationsCategory","property","items","item","triggersCategory","matchingKeys","filteredOutItems","resourceCategories","transformedNodes","option","CUSTOM_API_CALL_KEY","resourceOption","i","options","isSingleResource","operations","operation","isOperation","isMatchingResource","operationVersions","_e","_d","nodeTypeVersions","isMatchingVersion","version","operationOption","displayName","displayOptions","useActionsGenerator","generateNodeActions","node","filterActions","actions","action","arr","isPlaceholderTriggerAction","getSimplifiedNodeType","defaults","description","name","group","icon","iconUrl","badgeIconUrl","outputs","codex","generateMergedNodesAndActions","nodeTypes","httpOnlyCredentials","visibleNodeTypes","mergedNodes","app","appActions","HTTP_REQUEST_NODE_TYPE","credentialOnlyNodes","credentialType","getCredentialOnlyNodeType","trigger","normalizedName","triggerActions","mergedActions","state","reactive","externalHooks","useExternalHooks","focus","onInput","event","input","emit","clear","onMounted","onBeforeUnmount","inputRef","toRefs","__expose","useI18n","telemetry","useTelemetry","useNodeCreatorStore","getAddedNodesAndConnections","useActions","dragging","ref","draggablePosition","draggableDataTransfer","computed","props","DEFAULT_SUBCATEGORY","CREDENTIAL_ONLY_NODE_PREFIX","shortNodeType","showActionArrow","hasActions","dataTestId","nodeActions","draggableStyle","isCommunityNode","isCommunityPackageName","isSubNode","outputTypes","NodeHelpers.getConnectionTypes","output","NodeConnectionType","onDragStart","onDragOver","x","y","DRAG_EVENT_DATA_KEY","getNewNodePosition","NODE_SIZE","onDragEnd","onCommunityNodeTooltipClick","subcategoryName","camelCase","instance","getCurrentInstance","getActionData","setAddedNodeActionParameters","activeViewStack","useViewStacks","actionData","isTriggerAction","WEBHOOK_NODE_TYPE","LAZY_LOAD_THRESHOLD","LAZY_LOAD_ITEMS_PER_TICK","renderedItems","renderAnimationRequest","activeItemId","useKeyboardNavigation","renderItems","wrappedEmit","element","$e","beforeEnter","el","enter","beforeLeave","leave","onUnmounted","watch","categoryName","itemsCount","popViewStack","registerKeyHook","workflowId","useWorkflowsStore","actionCount","type","expanded","toggleExpanded","setExpanded","isExpanded","arrowRight","arrowLeft","userActivated","useUsersStore","updateCurrentViewStack","getNodeTypesWithManualTrigger","getPlaceholderTriggerActions","parseCategoryActions","actionsCategoryLocales","parsedTriggerActions","parseActions","parsedActionActions","search","parsedTriggerActionsBaseline","parsedActionActionsBaseline","triggerCategoryName","placeholderTriggerActions","p","subcategory","rootView","hasNoTriggerActions","containsAPIAction","isTriggerRootView","TRIGGER_NODE_CREATOR_VIEW","onKeySelect","base","locale","withLabels","activeAction","a","onSelected","actionCreateElement","actionNode","trackActionsView","trigger_action_count","trackingPayload","runExternalHook","resetSearch","addHttpNode","updateData","app_identifier","OrderSwitcher","slots","h","REGULAR_NODE_CREATOR_VIEW","_hoisted_1","_hoisted_4","baseUrl","useRootStore","pushViewStack","globalSearchItemsDiff","selectNodeType","subcategoryKey","title","baseSubcategoriesFilter","subcategoriesMapper","transformedActions","transformNodeType","views","TriggerView","RegularView","AI_NODE_CREATOR_VIEW","AIView","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","itemKey","matchedView","view","hasTriggerGroup","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","viewStacks","isActionsMode","searchPlaceholder","nodeCreatorView","onSearch","value","onTransitionEnd","newStackIndex","selectedView","onBackButton","resetViewStacks","uiStore","useUIStore","setShowScrim","setActions","setMergeNodes","showScrim","viewStacksLength","nodeCreatorInlineStyle","onMouseUpOutside","clickEvent","unBindOnMouseUpOutside","onMouseUp","onMouseDown","onDrop","dragData","nodeCreatorBoundingRect","isActive","useCredentialsStore","useNodeTypesStore","nodeCreator"],"mappings":"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"}
|