n8n-editor-ui 1.32.0 → 1.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/.turbo/turbo-build.log +61 -61
  2. package/dist/assets/{AuthView-WS0zqkdS.js → AuthView-XJQTAppn.js} +2 -2
  3. package/dist/assets/{AuthView-WS0zqkdS.js.map → AuthView-XJQTAppn.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-tmVe2elM.js → CanvasControls-nkm_s3NJ.js} +2 -2
  5. package/dist/assets/{CanvasControls-tmVe2elM.js.map → CanvasControls-nkm_s3NJ.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-u6wexPI8.js → ChangePasswordView-LJP0GGhW.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-u6wexPI8.js.map → ChangePasswordView-LJP0GGhW.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-ix5yo0BD.js → CollectionParameter-WomdLuIg.js} +2 -2
  9. package/dist/assets/CollectionParameter-WomdLuIg.js.map +1 -0
  10. package/dist/assets/{CredentialsView-d-2fVzNy.js → CredentialsView-eWc7OhDm.js} +2 -2
  11. package/dist/assets/{CredentialsView-d-2fVzNy.js.map → CredentialsView-eWc7OhDm.js.map} +1 -1
  12. package/dist/assets/{ExecutionFilter-Kg4fhYje.js → ExecutionFilter-PMU0Na0k.js} +2 -2
  13. package/dist/assets/{ExecutionFilter-Kg4fhYje.js.map → ExecutionFilter-PMU0Na0k.js.map} +1 -1
  14. package/dist/assets/{ExecutionPreview-Z16KTdFl.js → ExecutionPreview-HbKLO92J.js} +2 -2
  15. package/dist/assets/{ExecutionPreview-Z16KTdFl.js.map → ExecutionPreview-HbKLO92J.js.map} +1 -1
  16. package/dist/assets/{ExecutionsInfoAccordion-UocBSgxb.js → ExecutionsInfoAccordion-bUnNtFv2.js} +2 -2
  17. package/dist/assets/{ExecutionsInfoAccordion-UocBSgxb.js.map → ExecutionsInfoAccordion-bUnNtFv2.js.map} +1 -1
  18. package/dist/assets/{ExecutionsLandingPage--EwoSMiA.js → ExecutionsLandingPage-T60dbSux.js} +2 -2
  19. package/dist/assets/{ExecutionsLandingPage--EwoSMiA.js.map → ExecutionsLandingPage-T60dbSux.js.map} +1 -1
  20. package/dist/assets/{ExecutionsList-9MEhhn56.js → ExecutionsList-XJRM7Cqr.js} +2 -2
  21. package/dist/assets/{ExecutionsList-9MEhhn56.js.map → ExecutionsList-XJRM7Cqr.js.map} +1 -1
  22. package/dist/assets/{ExecutionsView-dOO1b5pZ.js → ExecutionsView-1aQVikJo.js} +2 -2
  23. package/dist/assets/{ExecutionsView-dOO1b5pZ.js.map → ExecutionsView-1aQVikJo.js.map} +1 -1
  24. package/dist/assets/{ForgotMyPasswordView-P3MqS20s.js → ForgotMyPasswordView-7wj-yAwY.js} +2 -2
  25. package/dist/assets/{ForgotMyPasswordView-P3MqS20s.js.map → ForgotMyPasswordView-7wj-yAwY.js.map} +1 -1
  26. package/dist/assets/{MainHeader-A43lnXDH.js → MainHeader-DUYaLAFd.js} +2 -2
  27. package/dist/assets/{MainHeader-A43lnXDH.js.map → MainHeader-DUYaLAFd.js.map} +1 -1
  28. package/dist/assets/{MainSidebar-_TrEfGUX.js → MainSidebar-AwOXawEk.js} +2 -2
  29. package/dist/assets/{MainSidebar-_TrEfGUX.js.map → MainSidebar-AwOXawEk.js.map} +1 -1
  30. package/dist/assets/{NodeCreation-d5MgZecP.js → NodeCreation-KwIDuMQX.js} +3 -3
  31. package/dist/assets/{NodeCreation-d5MgZecP.js.map → NodeCreation-KwIDuMQX.js.map} +1 -1
  32. package/dist/assets/{NodeCreator-HX7vFQ36.js → NodeCreator-6iz29Jwh.js} +2 -2
  33. package/dist/assets/{NodeCreator-HX7vFQ36.js.map → NodeCreator-6iz29Jwh.js.map} +1 -1
  34. package/dist/assets/{NodeList-Av_5l31V.js → NodeList-oe8SSQ2g.js} +2 -2
  35. package/dist/assets/{NodeList-Av_5l31V.js.map → NodeList-oe8SSQ2g.js.map} +1 -1
  36. package/dist/assets/{NodeView-xSCHk5Gm.js → NodeView-JV8BP6TJ.js} +3 -3
  37. package/dist/assets/{NodeView-xSCHk5Gm.js.map → NodeView-JV8BP6TJ.js.map} +1 -1
  38. package/dist/assets/{RunDataAi-lf7VU0w1.js → RunDataAi--C9ACRTm.js} +2 -2
  39. package/dist/assets/{RunDataAi-lf7VU0w1.js.map → RunDataAi--C9ACRTm.js.map} +1 -1
  40. package/dist/assets/{RunDataJson-hLAWizOD.js → RunDataJson-hcKGDyJz.js} +3 -3
  41. package/dist/assets/{RunDataJson-hLAWizOD.js.map → RunDataJson-hcKGDyJz.js.map} +1 -1
  42. package/dist/assets/{RunDataJsonActions-GrJTnQ3y.js → RunDataJsonActions-pkATA7DE.js} +2 -2
  43. package/dist/assets/{RunDataJsonActions-GrJTnQ3y.js.map → RunDataJsonActions-pkATA7DE.js.map} +1 -1
  44. package/dist/assets/{RunDataSchema-ZI0MG5I5.js → RunDataSchema-fPAFgFi6.js} +2 -2
  45. package/dist/assets/{RunDataSchema-ZI0MG5I5.js.map → RunDataSchema-fPAFgFi6.js.map} +1 -1
  46. package/dist/assets/{RunDataTable-th0cgEkH.js → RunDataTable-Xbkzwy5h.js} +2 -2
  47. package/dist/assets/{RunDataTable-th0cgEkH.js.map → RunDataTable-Xbkzwy5h.js.map} +1 -1
  48. package/dist/assets/{SamlOnboarding-1z7rskrY.js → SamlOnboarding-tMxkYuyc.js} +2 -2
  49. package/dist/assets/{SamlOnboarding-1z7rskrY.js.map → SamlOnboarding-tMxkYuyc.js.map} +1 -1
  50. package/dist/assets/{SettingsApiView-y-RxfWUk.js → SettingsApiView-iLhcZ_Ad.js} +2 -2
  51. package/dist/assets/{SettingsApiView-y-RxfWUk.js.map → SettingsApiView-iLhcZ_Ad.js.map} +1 -1
  52. package/dist/assets/{SettingsCommunityNodesView-eB9yXqkR.js → SettingsCommunityNodesView-kCmnDZXU.js} +2 -2
  53. package/dist/assets/{SettingsCommunityNodesView-eB9yXqkR.js.map → SettingsCommunityNodesView-kCmnDZXU.js.map} +1 -1
  54. package/dist/assets/{SettingsExternalSecrets-F8cAkZ70.js → SettingsExternalSecrets-QTCx-DCR.js} +2 -2
  55. package/dist/assets/{SettingsExternalSecrets-F8cAkZ70.js.map → SettingsExternalSecrets-QTCx-DCR.js.map} +1 -1
  56. package/dist/assets/{SettingsFakeDoorView-vORcl2KE.js → SettingsFakeDoorView-3ZAyfMNZ.js} +2 -2
  57. package/dist/assets/{SettingsFakeDoorView-vORcl2KE.js.map → SettingsFakeDoorView-3ZAyfMNZ.js.map} +1 -1
  58. package/dist/assets/{SettingsLdapView-HLdSAg7l.js → SettingsLdapView-9EURrpDL.js} +2 -2
  59. package/dist/assets/{SettingsLdapView-HLdSAg7l.js.map → SettingsLdapView-9EURrpDL.js.map} +1 -1
  60. package/dist/assets/{SettingsLogStreamingView-k8W4YRkq.js → SettingsLogStreamingView-eE9RDUjN.js} +2 -2
  61. package/dist/assets/{SettingsLogStreamingView-k8W4YRkq.js.map → SettingsLogStreamingView-eE9RDUjN.js.map} +1 -1
  62. package/dist/assets/{SettingsSourceControl-zQ3hu1Xb.js → SettingsSourceControl-bMzlo6t4.js} +2 -2
  63. package/dist/assets/{SettingsSourceControl-zQ3hu1Xb.js.map → SettingsSourceControl-bMzlo6t4.js.map} +1 -1
  64. package/dist/assets/{SettingsSso-ZDaKZSAz.js → SettingsSso-f8qqkUbH.js} +2 -2
  65. package/dist/assets/{SettingsSso-ZDaKZSAz.js.map → SettingsSso-f8qqkUbH.js.map} +1 -1
  66. package/dist/assets/{SettingsUsageAndPlan-qhA0XufK.js → SettingsUsageAndPlan-Smr5GpEg.js} +2 -2
  67. package/dist/assets/{SettingsUsageAndPlan-qhA0XufK.js.map → SettingsUsageAndPlan-Smr5GpEg.js.map} +1 -1
  68. package/dist/assets/{SettingsUsersView-MpwADpXX.js → SettingsUsersView-VvvWispo.js} +2 -2
  69. package/dist/assets/{SettingsUsersView-MpwADpXX.js.map → SettingsUsersView-VvvWispo.js.map} +1 -1
  70. package/dist/assets/{SettingsView-0oD4eR43.js → SettingsView-rRURYQHa.js} +2 -2
  71. package/dist/assets/{SettingsView-0oD4eR43.js.map → SettingsView-rRURYQHa.js.map} +1 -1
  72. package/dist/assets/{SetupView-BgoIEBSe.js → SetupView-Pgc80gpk.js} +2 -2
  73. package/dist/assets/{SetupView-BgoIEBSe.js.map → SetupView-Pgc80gpk.js.map} +1 -1
  74. package/dist/assets/{SetupWorkflowCredentialsButton-lgz8EmNk.js → SetupWorkflowCredentialsButton-13o0FsxU.js} +2 -2
  75. package/dist/assets/{SetupWorkflowCredentialsButton-lgz8EmNk.js.map → SetupWorkflowCredentialsButton-13o0FsxU.js.map} +1 -1
  76. package/dist/assets/{SetupWorkflowFromTemplateView-oupB9su8.js → SetupWorkflowFromTemplateView-j2kVEUDy.js} +2 -2
  77. package/dist/assets/{SetupWorkflowFromTemplateView-oupB9su8.js.map → SetupWorkflowFromTemplateView-j2kVEUDy.js.map} +1 -1
  78. package/dist/assets/{SigninView-NkydbvAT.js → SigninView-uMLwylSB.js} +2 -2
  79. package/dist/assets/{SigninView-NkydbvAT.js.map → SigninView-uMLwylSB.js.map} +1 -1
  80. package/dist/assets/{SignupView-_1SYATx9.js → SignupView-D81TqUjs.js} +2 -2
  81. package/dist/assets/{SignupView-_1SYATx9.js.map → SignupView-D81TqUjs.js.map} +1 -1
  82. package/dist/assets/{TemplateDetails-1Snx23Yf.js → TemplateDetails-VIO9zkEg.js} +2 -2
  83. package/dist/assets/{TemplateDetails-1Snx23Yf.js.map → TemplateDetails-VIO9zkEg.js.map} +1 -1
  84. package/dist/assets/{TemplateList-EnEI8gDE.js → TemplateList-HB8hUr_8.js} +2 -2
  85. package/dist/assets/{TemplateList-EnEI8gDE.js.map → TemplateList-HB8hUr_8.js.map} +1 -1
  86. package/dist/assets/{TemplatesCollectionView-n34DkMyr.js → TemplatesCollectionView-NFkj_TcY.js} +2 -2
  87. package/dist/assets/{TemplatesCollectionView-n34DkMyr.js.map → TemplatesCollectionView-NFkj_TcY.js.map} +1 -1
  88. package/dist/assets/{TemplatesInfoCarousel-f6mATm4z.js → TemplatesInfoCarousel-d4FjKWjW.js} +2 -2
  89. package/dist/assets/{TemplatesInfoCarousel-f6mATm4z.js.map → TemplatesInfoCarousel-d4FjKWjW.js.map} +1 -1
  90. package/dist/assets/{TemplatesSearchView-Zux67gUG.js → TemplatesSearchView-W0D9cTjN.js} +2 -2
  91. package/dist/assets/{TemplatesSearchView-Zux67gUG.js.map → TemplatesSearchView-W0D9cTjN.js.map} +1 -1
  92. package/dist/assets/{TemplatesWorkflowView-dSvK0QBs.js → TemplatesWorkflowView-vHpI2Rpl.js} +2 -2
  93. package/dist/assets/{TemplatesWorkflowView-dSvK0QBs.js.map → TemplatesWorkflowView-vHpI2Rpl.js.map} +1 -1
  94. package/dist/assets/{VariablesView-BftXbT8z.js → VariablesView-nF0EArdS.js} +2 -2
  95. package/dist/assets/{VariablesView-BftXbT8z.js.map → VariablesView-nF0EArdS.js.map} +1 -1
  96. package/dist/assets/{WorkerView-7Ib0flYZ.js → WorkerView-GubNFvBv.js} +2 -2
  97. package/dist/assets/{WorkerView-7Ib0flYZ.js.map → WorkerView-GubNFvBv.js.map} +1 -1
  98. package/dist/assets/{WorkflowActivator-Pbw1i_AI.js → WorkflowActivator-ySuj7uJI.js} +2 -2
  99. package/dist/assets/{WorkflowActivator-Pbw1i_AI.js.map → WorkflowActivator-ySuj7uJI.js.map} +1 -1
  100. package/dist/assets/{WorkflowHistory-_c2_b4mu.js → WorkflowHistory-gufVg7PC.js} +2 -2
  101. package/dist/assets/{WorkflowHistory-_c2_b4mu.js.map → WorkflowHistory-gufVg7PC.js.map} +1 -1
  102. package/dist/assets/{WorkflowOnboardingView-IqgW-M7B.js → WorkflowOnboardingView-sWTN3TK2.js} +2 -2
  103. package/dist/assets/{WorkflowOnboardingView-IqgW-M7B.js.map → WorkflowOnboardingView-sWTN3TK2.js.map} +1 -1
  104. package/dist/assets/{WorkflowsView-K1vknxJ3.js → WorkflowsView-9qPyA8du.js} +2 -2
  105. package/dist/assets/{WorkflowsView-K1vknxJ3.js.map → WorkflowsView-9qPyA8du.js.map} +1 -1
  106. package/dist/assets/{cloud-39Y_KZne.js → cloud-mOwwKpjz.js} +2 -2
  107. package/dist/assets/{cloud-39Y_KZne.js.map → cloud-mOwwKpjz.js.map} +1 -1
  108. package/dist/assets/{index-lUr8MiJ2.js → index-9xnnd4cn.js} +66 -66
  109. package/dist/assets/index-9xnnd4cn.js.map +1 -0
  110. package/dist/assets/{index-wl9S8xQJ.css → index-ED3b68TP.css} +1 -1
  111. package/dist/assets/{pushConnection-9MR6fwUT.js → pushConnection-6aRCrIsi.js} +2 -2
  112. package/dist/assets/{pushConnection-9MR6fwUT.js.map → pushConnection-6aRCrIsi.js.map} +1 -1
  113. package/dist/assets/{templateActions-MTyOknNV.js → templateActions-MRmcczkP.js} +2 -2
  114. package/dist/assets/{templateActions-MTyOknNV.js.map → templateActions-MRmcczkP.js.map} +1 -1
  115. package/dist/assets/{useExecutionDebugging-rwa9vby_.js → useExecutionDebugging-Z2R2TujJ.js} +2 -2
  116. package/dist/assets/{useExecutionDebugging-rwa9vby_.js.map → useExecutionDebugging-Z2R2TujJ.js.map} +1 -1
  117. package/dist/assets/{workflowActivate-iOg_mrLc.js → workflowActivate-rRmpx9AQ.js} +2 -2
  118. package/dist/assets/{workflowActivate-iOg_mrLc.js.map → workflowActivate-rRmpx9AQ.js.map} +1 -1
  119. package/dist/index.html +2 -2
  120. package/package.json +1 -1
  121. package/dist/assets/CollectionParameter-ix5yo0BD.js.map +0 -1
  122. package/dist/assets/index-lUr8MiJ2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NodeCreator-HX7vFQ36.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/ItemTypes/CategoryItem.vue","../../src/components/Node/NodeCreator/Renderers/CategorizedItemsRenderer.vue","../../src/components/Node/NodeCreator/Renderers/ItemsRenderer.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\tref=\"inputRef\"\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\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 v-if=\"modelValue.length > 0\" :class=\"$style.suffix\" @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: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\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t>\n\t\t<template #icon>\n\t\t\t<div v-if=\"isSubNodeType\" :class=\"$style.subNodeBackground\"></div>\n\t\t\t<NodeIcon :class=\"$style.nodeIcon\" :node-type=\"nodeType\" />\n\t\t</template>\n\n\t\t<template v-if=\"isCommunityNode\" #tooltip>\n\t\t\t<p\n\t\t\t\t:class=\"$style.communityNodeIcon\"\n\t\t\t\t@click=\"onCommunityNodeTooltipClick\"\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/>\n\t\t</template>\n\t\t<template #dragContent>\n\t\t\t<div ref=\"draggableDataTransfer\" :class=\"$style.draggableDataTransfer\" />\n\t\t\t<div v-show=\"dragging\" :class=\"$style.draggable\" :style=\"draggableStyle\">\n\t\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\" :shrink=\"false\" @click.capture.stop />\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 { useNodeType } from '@/composables/useNodeType';\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();\nconst { isSubNodeType } = useNodeType({\n\tnodeType: props.nodeType,\n});\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 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:is-trigger=\"false\"\n\t\t:description=\"i18n.baseText(`nodeCreator.subcategoryDescriptions.${subcategoryName}`)\"\n\t\t:show-action-arrow=\"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:show-tooltip=\"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\tdraggable\n\t\t:class=\"$style.action\"\n\t\t:title=\"action.displayName\"\n\t\t:is-trigger=\"isTriggerAction(action)\"\n\t\tdata-keyboard-nav=\"true\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t>\n\t\t<template #dragContent>\n\t\t\t<div ref=\"draggableDataTransfer\" :class=\"$style.draggableDataTransfer\" />\n\t\t\t<div v-show=\"dragging\" :class=\"$style.draggable\" :style=\"draggableStyle\">\n\t\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\" :shrink=\"false\" @click.capture.stop />\n\t\t\t</div>\n\t\t</template>\n\t\t<template #icon>\n\t\t\t<NodeIcon :node-type=\"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 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 v-if=\"isTrigger\" icon=\"bolt\" 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 v-else :class=\"$style.arrow\" icon=\"chevron-up\" />\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:is-trigger=\"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 v-if=\"mouseOverTooltip\" :class=\"$style.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 v-if=\"expanded && actionCount > 0 && $slots.default\" :class=\"$style.contentSlot\">\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:is-trigger=\"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 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';\nimport CategorizedItemsRenderer from './CategorizedItemsRenderer.vue';\n\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 v-for=\"item in elements\" :key=\"item.uuid\">\n\t\t\t<div v-if=\"renderedItems.includes(item)\">\n\t\t\t\t<CategorizedItemsRenderer\n\t\t\t\t\tv-if=\"item.type === 'section'\"\n\t\t\t\t\t:elements=\"item.children\"\n\t\t\t\t\texpanded\n\t\t\t\t\t:category=\"item.title\"\n\t\t\t\t\t@selected=\"(child) => wrappedEmit('selected', child)\"\n\t\t\t\t>\n\t\t\t\t</CategorizedItemsRenderer>\n\n\t\t\t\t<div\n\t\t\t\t\tv-else\n\t\t\t\t\tref=\"iteratorItems\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\tclickable: !disabled,\n\t\t\t\t\t\t[$style.active]: activeItemId === item.uuid,\n\t\t\t\t\t\t[$style.iteratorItem]: true,\n\t\t\t\t\t\t[$style[item.type]]: true,\n\t\t\t\t\t}\"\n\t\t\t\t\tdata-test-id=\"item-iterator-item\"\n\t\t\t\t\t:data-keyboard-nav-type=\"item.type !== 'label' ? item.type : undefined\"\n\t\t\t\t\t:data-keyboard-nav-id=\"item.uuid\"\n\t\t\t\t\t@click=\"wrappedEmit('selected', item)\"\n\t\t\t\t>\n\t\t\t\t\t<LabelItem v-if=\"item.type === 'label'\" :item=\"item\" />\n\t\t\t\t\t<SubcategoryItem v-if=\"item.type === 'subcategory'\" :item=\"item.properties\" />\n\n\t\t\t\t\t<NodeItem\n\t\t\t\t\t\tv-if=\"item.type === 'node'\"\n\t\t\t\t\t\t:node-type=\"item.properties\"\n\t\t\t\t\t\t:active=\"true\"\n\t\t\t\t\t\t:subcategory=\"item.subcategory\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<ActionItem\n\t\t\t\t\t\tv-if=\"item.type === 'action'\"\n\t\t\t\t\t\t:node-type=\"item.properties\"\n\t\t\t\t\t\t:action=\"item.properties\"\n\t\t\t\t\t\t:active=\"true\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<ViewItem\n\t\t\t\t\t\tv-else-if=\"item.type === 'view'\"\n\t\t\t\t\t\t:view=\"item.properties\"\n\t\t\t\t\t\t:class=\"$style.viewItem\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<n8n-loading v-else :loading=\"true\" :rows=\"1\" variant=\"p\" :class=\"$style.itemSkeleton\" />\n\t\t</div>\n\t</div>\n\t<div v-else :class=\"$style.empty\">\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 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\tOPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE,\n\tOPEN_AI_NODE_TYPE,\n} from '@/constants';\n\nimport { useUsersStore } from '@/stores/users.store';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\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';\nimport type { IDataObject } from 'n8n-workflow';\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 if (\n\t\tactionData.key === OPEN_AI_NODE_TYPE &&\n\t\t(actionData?.value as IDataObject)?.resource === 'assistant' &&\n\t\t(actionData?.value as IDataObject)?.operation === 'message'\n\t) {\n\t\temit('nodeTypeSelected', [OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE]);\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 useExternalHooks().run('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 useExternalHooks().run('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 :root-view=\"rootView\">\n\t\t\t<template v-if=\"isTriggerRootView || parsedTriggerActionsBaseline.length !== 0\" #triggers>\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:mouse-over-tooltip=\"$locale.baseText('nodeCreator.actionsTooltip.triggersStartWorkflow')\"\n\t\t\t\t\tis-trigger-category\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 v-if=\"hasNoTriggerActions\" #empty>\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 :elements=\"placeholderTriggerActions\" @selected=\"onSelected\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else #empty>\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\t@click=\"resetSearch\"\n\t\t\t\t\t\t\tv-html=\"$locale.baseText('nodeCreator.actionsCategory.noMatchingTriggers')\"\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 v-if=\"!isTriggerRootView || parsedActionActionsBaseline.length !== 0\" #actions>\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:mouse-over-tooltip=\"$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\tv-if=\"!userActivated && isTriggerRootView\"\n\t\t\t\t\t\ttheme=\"info\"\n\t\t\t\t\t\ticonless\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 v-if=\"!search\" theme=\"info\" type=\"note\" :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\tdata-test-id=\"actions-panel-no-matching-actions\"\n\t\t\t\t\t\t\t@click=\"resetSearch\"\n\t\t\t\t\t\t\tv-html=\"$locale.baseText('nodeCreator.actionsCategory.noMatchingActions')\"\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 v-if=\"containsAPIAction\" :class=\"$style.apiHint\">\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\tid=\"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></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 { flattenCreateElements, 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\tsections: item.properties.sections,\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): boolean {\n\tif (item.type === 'section') return true;\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 = flattenCreateElements([\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\" :class=\"$style.items\" @selected=\"onSelected\">\n\t\t\t<template\n\t\t\t\tv-if=\"(activeViewStack.items || []).length === 0 && globalSearchItemsDiff.length === 0\"\n\t\t\t\t#empty\n\t\t\t>\n\t\t\t\t<NoResults\n\t\t\t\t\t:root-view=\"activeViewStack.rootView\"\n\t\t\t\t\tshow-icon\n\t\t\t\t\tshow-request\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 getDefaultActiveIndex(search: string = ''): number {\n\tif (activeViewStack.value.activeIndex) {\n\t\treturn activeViewStack.value.activeIndex;\n\t}\n\n\tif (activeViewStack.value.mode === 'actions') {\n\t\t// For actions, set the active focus to the first action, not category\n\t\treturn 1;\n\t} else if (activeViewStack.value.sections) {\n\t\t// For sections, set the active focus to the first node, not section (unless searching)\n\t\treturn search ? 0 : 1;\n\t}\n\n\treturn 0;\n}\n\nfunction onSearch(value: string) {\n\tif (activeViewStack.value.uuid) {\n\t\tupdateCurrentViewStack({ search: value });\n\t\tvoid setActiveItemIndex(getDefaultActiveIndex(value));\n\t}\n}\n\nfunction onTransitionEnd() {\n\tvoid setActiveItemIndex(getDefaultActiveIndex());\n}\n\nonMounted(() => {\n\tattachKeydownEvent();\n\tvoid setActiveItemIndex(getDefaultActiveIndex());\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:key=\"`${activeViewStack.uuid}`\"\n\t\t\t:class=\"[$style.nodesListPanel, activeViewStack.panelClass]\"\n\t\t\t@keydown.capture.stop\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\tv-if=\"viewStacks.length > 1 && !activeViewStack.preventBack\"\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>\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:show-tooltip=\"false\"\n\t\t\t\t\t\t:size=\"20\"\n\t\t\t\t\t/>\n\t\t\t\t\t<p v-if=\"activeViewStack.title\" :class=\"$style.title\" v-text=\"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<SearchBar\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:model-value=\"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 :root-view=\"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<SlideTransition>\n\t\t\t<div\n\t\t\t\tv-if=\"active\"\n\t\t\t\tref=\"nodeCreator\"\n\t\t\t\t:class=\"$style.nodeCreator\"\n\t\t\t\t:style=\"nodeCreatorInlineStyle\"\n\t\t\t\tdata-test-id=\"node-creator\"\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>\n\t\t\t\t<NodesListPanel @nodeTypeSelected=\"onNodeTypeSelected\" />\n\t\t\t</div>\n\t\t</SlideTransition>\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","emit","__emit","state","reactive","externalHooks","useExternalHooks","focus","onInput","event","input","clear","onMounted","onBeforeUnmount","inputRef","toRefs","__expose","props","__props","useI18n","telemetry","useTelemetry","useNodeCreatorStore","getAddedNodesAndConnections","useActions","isSubNodeType","useNodeType","dragging","ref","draggablePosition","draggableDataTransfer","computed","DEFAULT_SUBCATEGORY","CREDENTIAL_ONLY_NODE_PREFIX","shortNodeType","showActionArrow","hasActions","dataTestId","nodeActions","draggableStyle","isCommunityNode","isCommunityPackageName","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","categoryName","itemsCount","popViewStack","registerKeyHook","useKeyboardNavigation","workflowId","useWorkflowsStore","activeItemId","actionCount","type","expanded","toggleExpanded","setExpanded","isExpanded","arrowRight","arrowLeft","watch","LAZY_LOAD_THRESHOLD","LAZY_LOAD_ITEMS_PER_TICK","renderedItems","renderAnimationRequest","renderItems","wrappedEmit","element","$e","beforeEnter","el","enter","beforeLeave","leave","onUnmounted","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","OPEN_AI_NODE_TYPE","OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE","trackActionsView","trigger_action_count","trackingPayload","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","flattenCreateElements","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","viewStacks","isActionsMode","searchPlaceholder","nodeCreatorView","getDefaultActiveIndex","onSearch","value","onTransitionEnd","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-6iz29Jwh.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/ItemTypes/CategoryItem.vue","../../src/components/Node/NodeCreator/Renderers/CategorizedItemsRenderer.vue","../../src/components/Node/NodeCreator/Renderers/ItemsRenderer.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\tref=\"inputRef\"\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\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 v-if=\"modelValue.length > 0\" :class=\"$style.suffix\" @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: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\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t>\n\t\t<template #icon>\n\t\t\t<div v-if=\"isSubNodeType\" :class=\"$style.subNodeBackground\"></div>\n\t\t\t<NodeIcon :class=\"$style.nodeIcon\" :node-type=\"nodeType\" />\n\t\t</template>\n\n\t\t<template v-if=\"isCommunityNode\" #tooltip>\n\t\t\t<p\n\t\t\t\t:class=\"$style.communityNodeIcon\"\n\t\t\t\t@click=\"onCommunityNodeTooltipClick\"\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/>\n\t\t</template>\n\t\t<template #dragContent>\n\t\t\t<div ref=\"draggableDataTransfer\" :class=\"$style.draggableDataTransfer\" />\n\t\t\t<div v-show=\"dragging\" :class=\"$style.draggable\" :style=\"draggableStyle\">\n\t\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\" :shrink=\"false\" @click.capture.stop />\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 { useNodeType } from '@/composables/useNodeType';\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();\nconst { isSubNodeType } = useNodeType({\n\tnodeType: props.nodeType,\n});\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 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:is-trigger=\"false\"\n\t\t:description=\"i18n.baseText(`nodeCreator.subcategoryDescriptions.${subcategoryName}`)\"\n\t\t:show-action-arrow=\"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:show-tooltip=\"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\tdraggable\n\t\t:class=\"$style.action\"\n\t\t:title=\"action.displayName\"\n\t\t:is-trigger=\"isTriggerAction(action)\"\n\t\tdata-keyboard-nav=\"true\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t>\n\t\t<template #dragContent>\n\t\t\t<div ref=\"draggableDataTransfer\" :class=\"$style.draggableDataTransfer\" />\n\t\t\t<div v-show=\"dragging\" :class=\"$style.draggable\" :style=\"draggableStyle\">\n\t\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\" :shrink=\"false\" @click.capture.stop />\n\t\t\t</div>\n\t\t</template>\n\t\t<template #icon>\n\t\t\t<NodeIcon :node-type=\"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 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 v-if=\"isTrigger\" icon=\"bolt\" 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 v-else :class=\"$style.arrow\" icon=\"chevron-up\" />\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:is-trigger=\"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 v-if=\"mouseOverTooltip\" :class=\"$style.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 v-if=\"expanded && actionCount > 0 && $slots.default\" :class=\"$style.contentSlot\">\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:is-trigger=\"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 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';\nimport CategorizedItemsRenderer from './CategorizedItemsRenderer.vue';\n\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 v-for=\"item in elements\" :key=\"item.uuid\">\n\t\t\t<div v-if=\"renderedItems.includes(item)\">\n\t\t\t\t<CategorizedItemsRenderer\n\t\t\t\t\tv-if=\"item.type === 'section'\"\n\t\t\t\t\t:elements=\"item.children\"\n\t\t\t\t\texpanded\n\t\t\t\t\t:category=\"item.title\"\n\t\t\t\t\t@selected=\"(child) => wrappedEmit('selected', child)\"\n\t\t\t\t>\n\t\t\t\t</CategorizedItemsRenderer>\n\n\t\t\t\t<div\n\t\t\t\t\tv-else\n\t\t\t\t\tref=\"iteratorItems\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\tclickable: !disabled,\n\t\t\t\t\t\t[$style.active]: activeItemId === item.uuid,\n\t\t\t\t\t\t[$style.iteratorItem]: true,\n\t\t\t\t\t\t[$style[item.type]]: true,\n\t\t\t\t\t}\"\n\t\t\t\t\tdata-test-id=\"item-iterator-item\"\n\t\t\t\t\t:data-keyboard-nav-type=\"item.type !== 'label' ? item.type : undefined\"\n\t\t\t\t\t:data-keyboard-nav-id=\"item.uuid\"\n\t\t\t\t\t@click=\"wrappedEmit('selected', item)\"\n\t\t\t\t>\n\t\t\t\t\t<LabelItem v-if=\"item.type === 'label'\" :item=\"item\" />\n\t\t\t\t\t<SubcategoryItem v-if=\"item.type === 'subcategory'\" :item=\"item.properties\" />\n\n\t\t\t\t\t<NodeItem\n\t\t\t\t\t\tv-if=\"item.type === 'node'\"\n\t\t\t\t\t\t:node-type=\"item.properties\"\n\t\t\t\t\t\t:active=\"true\"\n\t\t\t\t\t\t:subcategory=\"item.subcategory\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<ActionItem\n\t\t\t\t\t\tv-if=\"item.type === 'action'\"\n\t\t\t\t\t\t:node-type=\"item.properties\"\n\t\t\t\t\t\t:action=\"item.properties\"\n\t\t\t\t\t\t:active=\"true\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<ViewItem\n\t\t\t\t\t\tv-else-if=\"item.type === 'view'\"\n\t\t\t\t\t\t:view=\"item.properties\"\n\t\t\t\t\t\t:class=\"$style.viewItem\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<n8n-loading v-else :loading=\"true\" :rows=\"1\" variant=\"p\" :class=\"$style.itemSkeleton\" />\n\t\t</div>\n\t</div>\n\t<div v-else :class=\"$style.empty\">\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 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\tOPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE,\n\tOPEN_AI_NODE_TYPE,\n} from '@/constants';\n\nimport { useUsersStore } from '@/stores/users.store';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\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';\nimport type { IDataObject } from 'n8n-workflow';\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 if (\n\t\tactionData.key === OPEN_AI_NODE_TYPE &&\n\t\t(actionData?.value as IDataObject)?.resource === 'assistant' &&\n\t\t(actionData?.value as IDataObject)?.operation === 'message'\n\t) {\n\t\temit('nodeTypeSelected', [OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE]);\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 useExternalHooks().run('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 useExternalHooks().run('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 :root-view=\"rootView\">\n\t\t\t<template v-if=\"isTriggerRootView || parsedTriggerActionsBaseline.length !== 0\" #triggers>\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:mouse-over-tooltip=\"$locale.baseText('nodeCreator.actionsTooltip.triggersStartWorkflow')\"\n\t\t\t\t\tis-trigger-category\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 v-if=\"hasNoTriggerActions\" #empty>\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 :elements=\"placeholderTriggerActions\" @selected=\"onSelected\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else #empty>\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\t@click=\"resetSearch\"\n\t\t\t\t\t\t\tv-html=\"$locale.baseText('nodeCreator.actionsCategory.noMatchingTriggers')\"\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 v-if=\"!isTriggerRootView || parsedActionActionsBaseline.length !== 0\" #actions>\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:mouse-over-tooltip=\"$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\tv-if=\"!userActivated && isTriggerRootView\"\n\t\t\t\t\t\ttheme=\"info\"\n\t\t\t\t\t\ticonless\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 v-if=\"!search\" theme=\"info\" type=\"note\" :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\tdata-test-id=\"actions-panel-no-matching-actions\"\n\t\t\t\t\t\t\t@click=\"resetSearch\"\n\t\t\t\t\t\t\tv-html=\"$locale.baseText('nodeCreator.actionsCategory.noMatchingActions')\"\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 v-if=\"containsAPIAction\" :class=\"$style.apiHint\">\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\tid=\"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></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 { flattenCreateElements, 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\tsections: item.properties.sections,\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): boolean {\n\tif (item.type === 'section') return true;\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 = flattenCreateElements([\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\" :class=\"$style.items\" @selected=\"onSelected\">\n\t\t\t<template\n\t\t\t\tv-if=\"(activeViewStack.items || []).length === 0 && globalSearchItemsDiff.length === 0\"\n\t\t\t\t#empty\n\t\t\t>\n\t\t\t\t<NoResults\n\t\t\t\t\t:root-view=\"activeViewStack.rootView\"\n\t\t\t\t\tshow-icon\n\t\t\t\t\tshow-request\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 getDefaultActiveIndex(search: string = ''): number {\n\tif (activeViewStack.value.activeIndex) {\n\t\treturn activeViewStack.value.activeIndex;\n\t}\n\n\tif (activeViewStack.value.mode === 'actions') {\n\t\t// For actions, set the active focus to the first action, not category\n\t\treturn 1;\n\t} else if (activeViewStack.value.sections) {\n\t\t// For sections, set the active focus to the first node, not section (unless searching)\n\t\treturn search ? 0 : 1;\n\t}\n\n\treturn 0;\n}\n\nfunction onSearch(value: string) {\n\tif (activeViewStack.value.uuid) {\n\t\tupdateCurrentViewStack({ search: value });\n\t\tvoid setActiveItemIndex(getDefaultActiveIndex(value));\n\t}\n}\n\nfunction onTransitionEnd() {\n\tvoid setActiveItemIndex(getDefaultActiveIndex());\n}\n\nonMounted(() => {\n\tattachKeydownEvent();\n\tvoid setActiveItemIndex(getDefaultActiveIndex());\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:key=\"`${activeViewStack.uuid}`\"\n\t\t\t:class=\"[$style.nodesListPanel, activeViewStack.panelClass]\"\n\t\t\t@keydown.capture.stop\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\tv-if=\"viewStacks.length > 1 && !activeViewStack.preventBack\"\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>\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:show-tooltip=\"false\"\n\t\t\t\t\t\t:size=\"20\"\n\t\t\t\t\t/>\n\t\t\t\t\t<p v-if=\"activeViewStack.title\" :class=\"$style.title\" v-text=\"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<SearchBar\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:model-value=\"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 :root-view=\"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<SlideTransition>\n\t\t\t<div\n\t\t\t\tv-if=\"active\"\n\t\t\t\tref=\"nodeCreator\"\n\t\t\t\t:class=\"$style.nodeCreator\"\n\t\t\t\t:style=\"nodeCreatorInlineStyle\"\n\t\t\t\tdata-test-id=\"node-creator\"\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>\n\t\t\t\t<NodesListPanel @nodeTypeSelected=\"onNodeTypeSelected\" />\n\t\t\t</div>\n\t\t</SlideTransition>\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","emit","__emit","state","reactive","externalHooks","useExternalHooks","focus","onInput","event","input","clear","onMounted","onBeforeUnmount","inputRef","toRefs","__expose","props","__props","useI18n","telemetry","useTelemetry","useNodeCreatorStore","getAddedNodesAndConnections","useActions","isSubNodeType","useNodeType","dragging","ref","draggablePosition","draggableDataTransfer","computed","DEFAULT_SUBCATEGORY","CREDENTIAL_ONLY_NODE_PREFIX","shortNodeType","showActionArrow","hasActions","dataTestId","nodeActions","draggableStyle","isCommunityNode","isCommunityPackageName","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","categoryName","itemsCount","popViewStack","registerKeyHook","useKeyboardNavigation","workflowId","useWorkflowsStore","activeItemId","actionCount","type","expanded","toggleExpanded","setExpanded","isExpanded","arrowRight","arrowLeft","watch","LAZY_LOAD_THRESHOLD","LAZY_LOAD_ITEMS_PER_TICK","renderedItems","renderAnimationRequest","renderItems","wrappedEmit","element","$e","beforeEnter","el","enter","beforeLeave","leave","onUnmounted","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","OPEN_AI_NODE_TYPE","OPEN_AI_NODE_MESSAGE_ASSISTANT_TYPE","trackActionsView","trigger_action_count","trackingPayload","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","flattenCreateElements","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","viewStacks","isActionsMode","searchPlaceholder","nodeCreatorView","getDefaultActiveIndex","onSearch","value","onTransitionEnd","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,2 +1,2 @@
1
- import{N as d}from"./index-lUr8MiJ2.js";import{fN as r,_ as l}from"./n8n-uKoDE8Qf.js";import{v as c,f as t,h as s,F as m,_ as a,y as o,I as u,H as p,a6 as N,K as _}from"./vendor-3VD3vVJy.js";const f=c({name:"NodeList",components:{NodeIcon:d},props:{nodes:{type:Array},limit:{type:Number,default:4},size:{type:String,default:"sm"}},computed:{filteredCoreNodes(){return r(this.nodes)},hiddenNodes(){return this.filteredCoreNodes.length-this.countNodesToBeSliced(this.filteredCoreNodes)},slicedNodes(){return this.filteredCoreNodes.slice(0,this.countNodesToBeSliced(this.filteredCoreNodes))}},methods:{countNodesToBeSliced(e){return e.length>this.limit?this.limit-1:this.limit}}}),h="_list_8cn7s_5",y="_container_8cn7s_13",b="_sm_8cn7s_18",$="_md_8cn7s_22",C="_button_8cn7s_26",S="_buttonSm_8cn7s_40",z="_buttonMd_8cn7s_47",g={list:h,container:y,sm:b,md:$,button:C,buttonSm:S,buttonMd:z};function M(e,B,k,I,T,L){const i=N("NodeIcon");return t(),s("div",{class:o(e.$style.list)},[(t(!0),s(m,null,a(e.slicedNodes,n=>(t(),s("div",{key:n.name,class:o([e.$style.container,e.$style[e.size]])},[_(i,{"node-type":n,size:e.size==="md"?24:18,"show-tooltip":!0},null,8,["node-type","size"])],2))),128)),e.filteredCoreNodes.length>e.limit+1?(t(),s("div",{key:0,class:o([e.$style.button,e.size==="md"?e.$style.buttonMd:e.$style.buttonSm])}," +"+u(e.hiddenNodes),3)):p("",!0)],2)}const v={$style:g},A=l(f,[["render",M],["__cssModules",v]]);export{A as N};
2
- //# sourceMappingURL=NodeList-Av_5l31V.js.map
1
+ import{N as d}from"./index-9xnnd4cn.js";import{fN as r,_ as l}from"./n8n-uKoDE8Qf.js";import{v as c,f as t,h as s,F as m,_ as a,y as o,I as u,H as p,a6 as N,K as _}from"./vendor-3VD3vVJy.js";const f=c({name:"NodeList",components:{NodeIcon:d},props:{nodes:{type:Array},limit:{type:Number,default:4},size:{type:String,default:"sm"}},computed:{filteredCoreNodes(){return r(this.nodes)},hiddenNodes(){return this.filteredCoreNodes.length-this.countNodesToBeSliced(this.filteredCoreNodes)},slicedNodes(){return this.filteredCoreNodes.slice(0,this.countNodesToBeSliced(this.filteredCoreNodes))}},methods:{countNodesToBeSliced(e){return e.length>this.limit?this.limit-1:this.limit}}}),h="_list_8cn7s_5",y="_container_8cn7s_13",b="_sm_8cn7s_18",$="_md_8cn7s_22",C="_button_8cn7s_26",S="_buttonSm_8cn7s_40",z="_buttonMd_8cn7s_47",g={list:h,container:y,sm:b,md:$,button:C,buttonSm:S,buttonMd:z};function M(e,B,k,I,T,L){const i=N("NodeIcon");return t(),s("div",{class:o(e.$style.list)},[(t(!0),s(m,null,a(e.slicedNodes,n=>(t(),s("div",{key:n.name,class:o([e.$style.container,e.$style[e.size]])},[_(i,{"node-type":n,size:e.size==="md"?24:18,"show-tooltip":!0},null,8,["node-type","size"])],2))),128)),e.filteredCoreNodes.length>e.limit+1?(t(),s("div",{key:0,class:o([e.$style.button,e.size==="md"?e.$style.buttonMd:e.$style.buttonSm])}," +"+u(e.hiddenNodes),3)):p("",!0)],2)}const v={$style:g},A=l(f,[["render",M],["__cssModules",v]]);export{A as N};
2
+ //# sourceMappingURL=NodeList-oe8SSQ2g.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeList-Av_5l31V.js","sources":["../../src/components/NodeList.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.list\">\n\t\t<div v-for=\"node in slicedNodes\" :key=\"node.name\" :class=\"[$style.container, $style[size]]\">\n\t\t\t<NodeIcon :node-type=\"node\" :size=\"size === 'md' ? 24 : 18\" :show-tooltip=\"true\" />\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"filteredCoreNodes.length > limit + 1\"\n\t\t\t:class=\"[$style.button, size === 'md' ? $style.buttonMd : $style.buttonSm]\"\n\t\t>\n\t\t\t+{{ hiddenNodes }}\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { ITemplatesNode } from '@/Interface';\nimport { filterTemplateNodes } from '@/utils/nodeTypesUtils';\n\nexport default defineComponent({\n\tname: 'NodeList',\n\tcomponents: {\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 4,\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t\tdefault: 'sm',\n\t\t},\n\t},\n\tcomputed: {\n\t\tfilteredCoreNodes() {\n\t\t\treturn filterTemplateNodes(this.nodes as ITemplatesNode[]);\n\t\t},\n\t\thiddenNodes(): number {\n\t\t\treturn this.filteredCoreNodes.length - this.countNodesToBeSliced(this.filteredCoreNodes);\n\t\t},\n\t\tslicedNodes(): ITemplatesNode[] {\n\t\t\treturn this.filteredCoreNodes.slice(0, this.countNodesToBeSliced(this.filteredCoreNodes));\n\t\t},\n\t},\n\tmethods: {\n\t\tcountNodesToBeSliced(nodes: ITemplatesNode[]): number {\n\t\t\tif (nodes.length > this.limit) {\n\t\t\t\treturn this.limit - 1;\n\t\t\t} else {\n\t\t\t\treturn this.limit;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.list {\n\tmax-width: 100px;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: flex-end;\n\talign-items: center;\n}\n.container {\n\tposition: relative;\n\tdisplay: block;\n}\n.sm {\n\tmargin-left: var(--spacing-2xs);\n}\n.md {\n\tmargin-left: var(--spacing-xs);\n}\n.button {\n\ttop: 0px;\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tbackground: var(--color-background-light);\n\tborder: 1px var(--color-foreground-base) solid;\n\tborder-radius: var(--border-radius-base);\n\tfont-size: 10px;\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-text-base);\n}\n.buttonSm {\n\tmargin-left: var(--spacing-2xs);\n\twidth: 20px;\n\tmin-width: 20px;\n\theight: 20px;\n}\n.buttonMd {\n\tmargin-left: var(--spacing-xs);\n\twidth: 24px;\n\tmin-width: 24px;\n\theight: 24px;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","NodeIcon","filterTemplateNodes","nodes","_resolveComponent","_ctx","_openBlock","_createElementBlock","_Fragment","_renderList","node","_normalizeClass","_component_NodeIcon"],"mappings":"+LAoBA,MAAAA,EAAeC,EAAgB,CAC9B,KAAM,WACN,WAAY,CACX,SAAAC,CACD,EACA,MAAO,CACN,MAAO,CACN,KAAM,KACP,EACA,MAAO,CACN,KAAM,OACN,QAAS,CACV,EACA,KAAM,CACL,KAAM,OACN,QAAS,IACV,CACD,EACA,SAAU,CACT,mBAAoB,CACZ,OAAAC,EAAoB,KAAK,KAAyB,CAC1D,EACA,aAAsB,CACrB,OAAO,KAAK,kBAAkB,OAAS,KAAK,qBAAqB,KAAK,iBAAiB,CACxF,EACA,aAAgC,CACxB,OAAA,KAAK,kBAAkB,MAAM,EAAG,KAAK,qBAAqB,KAAK,iBAAiB,CAAC,CACzF,CACD,EACA,QAAS,CACR,qBAAqBC,EAAiC,CACjD,OAAAA,EAAM,OAAS,KAAK,MAChB,KAAK,MAAQ,EAEb,KAAK,KAEd,CACD,CACD,CAAC,iPAzDAC,EAUM,UAAA,8BATLC,EAEM,OAAA,IAAA,CAAA,EAAA,EAFiCC,EAAA,EAAK,EAAIC,EAAAC,EAAA,KAAAC,EAAAJ,EAAA,YAAAK,IAAQJ,EAAA,EAAAC,EAAU,MAAW,CAAA,IAAAG,EAAA,KAC5E,MAAmFC,EAAA,CAAAN,EAAA,OAAA,UAAAA,EAAA,OAAAA,EAAA,IAAA,CAAA,CAAA,CAAA,EAAA,GAAhDO,EAAI,CAAsB,YAAAF,EAAA,KAAAL,EAAA,OAAA,KAAA,GAAA,kDAGvD,EAAA,CAAA,EAAA,EAAA,GAAA,GACAA,EAAA,kBAAA,OAAAA,EAAA,MAAA,GAAAC,EAAA,EAAAC,EAAG,MAAO,CAEf,IAAA,EAAA,MAAAI,EAAA,CAAAN,EAAA,OAAA,OAAAA,EAAA,OAAA,KAAAA,EAAA,OAAA,SAAAA,EAAA,OAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"NodeList-oe8SSQ2g.js","sources":["../../src/components/NodeList.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.list\">\n\t\t<div v-for=\"node in slicedNodes\" :key=\"node.name\" :class=\"[$style.container, $style[size]]\">\n\t\t\t<NodeIcon :node-type=\"node\" :size=\"size === 'md' ? 24 : 18\" :show-tooltip=\"true\" />\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"filteredCoreNodes.length > limit + 1\"\n\t\t\t:class=\"[$style.button, size === 'md' ? $style.buttonMd : $style.buttonSm]\"\n\t\t>\n\t\t\t+{{ hiddenNodes }}\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { ITemplatesNode } from '@/Interface';\nimport { filterTemplateNodes } from '@/utils/nodeTypesUtils';\n\nexport default defineComponent({\n\tname: 'NodeList',\n\tcomponents: {\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 4,\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t\tdefault: 'sm',\n\t\t},\n\t},\n\tcomputed: {\n\t\tfilteredCoreNodes() {\n\t\t\treturn filterTemplateNodes(this.nodes as ITemplatesNode[]);\n\t\t},\n\t\thiddenNodes(): number {\n\t\t\treturn this.filteredCoreNodes.length - this.countNodesToBeSliced(this.filteredCoreNodes);\n\t\t},\n\t\tslicedNodes(): ITemplatesNode[] {\n\t\t\treturn this.filteredCoreNodes.slice(0, this.countNodesToBeSliced(this.filteredCoreNodes));\n\t\t},\n\t},\n\tmethods: {\n\t\tcountNodesToBeSliced(nodes: ITemplatesNode[]): number {\n\t\t\tif (nodes.length > this.limit) {\n\t\t\t\treturn this.limit - 1;\n\t\t\t} else {\n\t\t\t\treturn this.limit;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.list {\n\tmax-width: 100px;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: flex-end;\n\talign-items: center;\n}\n.container {\n\tposition: relative;\n\tdisplay: block;\n}\n.sm {\n\tmargin-left: var(--spacing-2xs);\n}\n.md {\n\tmargin-left: var(--spacing-xs);\n}\n.button {\n\ttop: 0px;\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tbackground: var(--color-background-light);\n\tborder: 1px var(--color-foreground-base) solid;\n\tborder-radius: var(--border-radius-base);\n\tfont-size: 10px;\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-text-base);\n}\n.buttonSm {\n\tmargin-left: var(--spacing-2xs);\n\twidth: 20px;\n\tmin-width: 20px;\n\theight: 20px;\n}\n.buttonMd {\n\tmargin-left: var(--spacing-xs);\n\twidth: 24px;\n\tmin-width: 24px;\n\theight: 24px;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","NodeIcon","filterTemplateNodes","nodes","_resolveComponent","_ctx","_openBlock","_createElementBlock","_Fragment","_renderList","node","_normalizeClass","_component_NodeIcon"],"mappings":"+LAoBA,MAAAA,EAAeC,EAAgB,CAC9B,KAAM,WACN,WAAY,CACX,SAAAC,CACD,EACA,MAAO,CACN,MAAO,CACN,KAAM,KACP,EACA,MAAO,CACN,KAAM,OACN,QAAS,CACV,EACA,KAAM,CACL,KAAM,OACN,QAAS,IACV,CACD,EACA,SAAU,CACT,mBAAoB,CACZ,OAAAC,EAAoB,KAAK,KAAyB,CAC1D,EACA,aAAsB,CACrB,OAAO,KAAK,kBAAkB,OAAS,KAAK,qBAAqB,KAAK,iBAAiB,CACxF,EACA,aAAgC,CACxB,OAAA,KAAK,kBAAkB,MAAM,EAAG,KAAK,qBAAqB,KAAK,iBAAiB,CAAC,CACzF,CACD,EACA,QAAS,CACR,qBAAqBC,EAAiC,CACjD,OAAAA,EAAM,OAAS,KAAK,MAChB,KAAK,MAAQ,EAEb,KAAK,KAEd,CACD,CACD,CAAC,iPAzDAC,EAUM,UAAA,8BATLC,EAEM,OAAA,IAAA,CAAA,EAAA,EAFiCC,EAAA,EAAK,EAAIC,EAAAC,EAAA,KAAAC,EAAAJ,EAAA,YAAAK,IAAQJ,EAAA,EAAAC,EAAU,MAAW,CAAA,IAAAG,EAAA,KAC5E,MAAmFC,EAAA,CAAAN,EAAA,OAAA,UAAAA,EAAA,OAAAA,EAAA,IAAA,CAAA,CAAA,CAAA,EAAA,GAAhDO,EAAI,CAAsB,YAAAF,EAAA,KAAAL,EAAA,OAAA,KAAA,GAAA,kDAGvD,EAAA,CAAA,EAAA,EAAA,GAAA,GACAA,EAAA,kBAAA,OAAAA,EAAA,MAAA,GAAAC,EAAA,EAAAC,EAAG,MAAO,CAEf,IAAA,EAAA,MAAAI,EAAA,CAAAN,EAAA,OAAA,OAAAA,EAAA,OAAA,KAAAA,EAAA,OAAA,SAAAA,EAAA,OAAA,QAAA,CAAA"}