n8n-editor-ui 1.47.1 → 1.47.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/.turbo/turbo-build.log +76 -76
  2. package/dist/assets/{AuthView-CMxdNKZJ.js → AuthView-B_jZMnGj.js} +2 -2
  3. package/dist/assets/{AuthView-CMxdNKZJ.js.map → AuthView-B_jZMnGj.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-3FMjwMqA.js → CanvasControls-ns1B0A0j.js} +2 -2
  5. package/dist/assets/{CanvasControls-3FMjwMqA.js.map → CanvasControls-ns1B0A0j.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-_NkkcUVb.js → ChangePasswordView-BDsuHv0B.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-_NkkcUVb.js.map → ChangePasswordView-BDsuHv0B.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-BXMOfisf.js → CollectionParameter-Br-xtutZ.js} +2 -2
  9. package/dist/assets/CollectionParameter-Br-xtutZ.js.map +1 -0
  10. package/dist/assets/{CredentialsView-B2UF3tK_.js → CredentialsView-DnJ_jhDo.js} +2 -2
  11. package/dist/assets/{CredentialsView-B2UF3tK_.js.map → CredentialsView-DnJ_jhDo.js.map} +1 -1
  12. package/dist/assets/{ErrorView-B_lpOlen.js → ErrorView-BfV5e5ko.js} +2 -2
  13. package/dist/assets/{ErrorView-B_lpOlen.js.map → ErrorView-BfV5e5ko.js.map} +1 -1
  14. package/dist/assets/{ExecutionsFilter-dNFZor7l.js → ExecutionsFilter-0XcXH83H.js} +2 -2
  15. package/dist/assets/{ExecutionsFilter-dNFZor7l.js.map → ExecutionsFilter-0XcXH83H.js.map} +1 -1
  16. package/dist/assets/{ExecutionsView-BYe-KERG.js → ExecutionsView-aFiZuLVt.js} +2 -2
  17. package/dist/assets/{ExecutionsView-BYe-KERG.js.map → ExecutionsView-aFiZuLVt.js.map} +1 -1
  18. package/dist/assets/{ForgotMyPasswordView-D97J06wc.js → ForgotMyPasswordView-64X9tXq4.js} +2 -2
  19. package/dist/assets/{ForgotMyPasswordView-D97J06wc.js.map → ForgotMyPasswordView-64X9tXq4.js.map} +1 -1
  20. package/dist/assets/{MainHeader-CT4nF2mY.js → MainHeader-Ch0Iz_7s.js} +2 -2
  21. package/dist/assets/{MainHeader-CT4nF2mY.js.map → MainHeader-Ch0Iz_7s.js.map} +1 -1
  22. package/dist/assets/{MainSidebar-CTg5wPzP.js → MainSidebar-3ee-tTgz.js} +2 -2
  23. package/dist/assets/{MainSidebar-CTg5wPzP.js.map → MainSidebar-3ee-tTgz.js.map} +1 -1
  24. package/dist/assets/{NodeCreation-BF_L2-99.js → NodeCreation-PrQGENrl.js} +3 -3
  25. package/dist/assets/{NodeCreation-BF_L2-99.js.map → NodeCreation-PrQGENrl.js.map} +1 -1
  26. package/dist/assets/{NodeCreator-B_yCtSu6.js → NodeCreator-DlK1669m.js} +2 -2
  27. package/dist/assets/{NodeCreator-B_yCtSu6.js.map → NodeCreator-DlK1669m.js.map} +1 -1
  28. package/dist/assets/{NodeDetailsView-ggolOsHM.js → NodeDetailsView-DcV7LI-g.js} +4 -4
  29. package/dist/assets/{NodeDetailsView-ggolOsHM.js.map → NodeDetailsView-DcV7LI-g.js.map} +1 -1
  30. package/dist/assets/{NodeView-B2MlTl6g.js → NodeView-D_kbUfVN.js} +3 -3
  31. package/dist/assets/{NodeView-B2MlTl6g.js.map → NodeView-D_kbUfVN.js.map} +1 -1
  32. package/dist/assets/{NodeView.v2-D_CKj9CS.js → NodeView.v2-D_Wbnl01.js} +3 -3
  33. package/dist/assets/{NodeView.v2-D_CKj9CS.js.map → NodeView.v2-D_Wbnl01.js.map} +1 -1
  34. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js} +2 -2
  35. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js.map} +1 -1
  36. package/dist/assets/{ProjectSettings-DpJesEZX.js → ProjectSettings-CfcplqBX.js} +2 -2
  37. package/dist/assets/{ProjectSettings-DpJesEZX.js.map → ProjectSettings-CfcplqBX.js.map} +1 -1
  38. package/dist/assets/{ProjectTabs-D7nNxtFO.js → ProjectTabs-5ZO9YR8J.js} +2 -2
  39. package/dist/assets/{ProjectTabs-D7nNxtFO.js.map → ProjectTabs-5ZO9YR8J.js.map} +1 -1
  40. package/dist/assets/{PushConnectionTracker-YJuy57g2.js → PushConnectionTracker-Bp-RjnYr.js} +2 -2
  41. package/dist/assets/{PushConnectionTracker-YJuy57g2.js.map → PushConnectionTracker-Bp-RjnYr.js.map} +1 -1
  42. package/dist/assets/{ResourcesListLayout-mZ4ijKRB.js → ResourcesListLayout-B4W1PSHT.js} +2 -2
  43. package/dist/assets/{ResourcesListLayout-mZ4ijKRB.js.map → ResourcesListLayout-B4W1PSHT.js.map} +1 -1
  44. package/dist/assets/{RunDataAi-D0m0Vg_p.js → RunDataAi-C3XiqNZa.js} +2 -2
  45. package/dist/assets/{RunDataAi-D0m0Vg_p.js.map → RunDataAi-C3XiqNZa.js.map} +1 -1
  46. package/dist/assets/{RunDataJson-DkHNIqVj.js → RunDataJson-CMcOD-78.js} +3 -3
  47. package/dist/assets/{RunDataJson-DkHNIqVj.js.map → RunDataJson-CMcOD-78.js.map} +1 -1
  48. package/dist/assets/{RunDataJsonActions-Cgxcpw8t.js → RunDataJsonActions-BQBpmtOi.js} +2 -2
  49. package/dist/assets/{RunDataJsonActions-Cgxcpw8t.js.map → RunDataJsonActions-BQBpmtOi.js.map} +1 -1
  50. package/dist/assets/{RunDataSchema-C6aZoC0a.js → RunDataSchema-CF4YH-8y.js} +2 -2
  51. package/dist/assets/{RunDataSchema-C6aZoC0a.js.map → RunDataSchema-CF4YH-8y.js.map} +1 -1
  52. package/dist/assets/{RunDataSearch-D2CDg21N.js → RunDataSearch-DwB8g_cE.js} +2 -2
  53. package/dist/assets/{RunDataSearch-D2CDg21N.js.map → RunDataSearch-DwB8g_cE.js.map} +1 -1
  54. package/dist/assets/{RunDataTable-D597NRFD.js → RunDataTable-BVAuNDP9.js} +2 -2
  55. package/dist/assets/{RunDataTable-D597NRFD.js.map → RunDataTable-BVAuNDP9.js.map} +1 -1
  56. package/dist/assets/{SamlOnboarding-Me669myi.js → SamlOnboarding-Csd8l-7T.js} +2 -2
  57. package/dist/assets/{SamlOnboarding-Me669myi.js.map → SamlOnboarding-Csd8l-7T.js.map} +1 -1
  58. package/dist/assets/{SettingsApiView-DV8pIHDw.js → SettingsApiView-DnvdV7dx.js} +2 -2
  59. package/dist/assets/{SettingsApiView-DV8pIHDw.js.map → SettingsApiView-DnvdV7dx.js.map} +1 -1
  60. package/dist/assets/{SettingsCommunityNodesView-D_gtSdk3.js → SettingsCommunityNodesView-C11a_Ybs.js} +2 -2
  61. package/dist/assets/{SettingsCommunityNodesView-D_gtSdk3.js.map → SettingsCommunityNodesView-C11a_Ybs.js.map} +1 -1
  62. package/dist/assets/{SettingsExternalSecrets-xprYKjAW.js → SettingsExternalSecrets-IIReUcRG.js} +2 -2
  63. package/dist/assets/{SettingsExternalSecrets-xprYKjAW.js.map → SettingsExternalSecrets-IIReUcRG.js.map} +1 -1
  64. package/dist/assets/{SettingsFakeDoorView-CKaSOYh5.js → SettingsFakeDoorView-BOUfBJS8.js} +2 -2
  65. package/dist/assets/{SettingsFakeDoorView-CKaSOYh5.js.map → SettingsFakeDoorView-BOUfBJS8.js.map} +1 -1
  66. package/dist/assets/{SettingsLdapView-BBCv2tmk.js → SettingsLdapView-BaSjQ4cy.js} +2 -2
  67. package/dist/assets/{SettingsLdapView-BBCv2tmk.js.map → SettingsLdapView-BaSjQ4cy.js.map} +1 -1
  68. package/dist/assets/{SettingsLogStreamingView-HRIp8kyL.js → SettingsLogStreamingView-COGhA1hN.js} +2 -2
  69. package/dist/assets/{SettingsLogStreamingView-HRIp8kyL.js.map → SettingsLogStreamingView-COGhA1hN.js.map} +1 -1
  70. package/dist/assets/{SettingsPersonalView-CsUb3SvK.js → SettingsPersonalView-BJGgPTwa.js} +2 -2
  71. package/dist/assets/{SettingsPersonalView-CsUb3SvK.js.map → SettingsPersonalView-BJGgPTwa.js.map} +1 -1
  72. package/dist/assets/{SettingsSourceControl-BkPpVGsk.js → SettingsSourceControl-DkdSLuvp.js} +2 -2
  73. package/dist/assets/{SettingsSourceControl-BkPpVGsk.js.map → SettingsSourceControl-DkdSLuvp.js.map} +1 -1
  74. package/dist/assets/{SettingsSso-BueUV3RH.js → SettingsSso-DA9AOKH5.js} +2 -2
  75. package/dist/assets/{SettingsSso-BueUV3RH.js.map → SettingsSso-DA9AOKH5.js.map} +1 -1
  76. package/dist/assets/{SettingsUsageAndPlan-DzDC9m54.js → SettingsUsageAndPlan-BVPtlthH.js} +2 -2
  77. package/dist/assets/{SettingsUsageAndPlan-DzDC9m54.js.map → SettingsUsageAndPlan-BVPtlthH.js.map} +1 -1
  78. package/dist/assets/{SettingsUsersView-CTd5MQLw.js → SettingsUsersView-BuKt4ZDO.js} +2 -2
  79. package/dist/assets/{SettingsUsersView-CTd5MQLw.js.map → SettingsUsersView-BuKt4ZDO.js.map} +1 -1
  80. package/dist/assets/{SettingsView-DMxqsNh0.js → SettingsView-DJ78VuiY.js} +2 -2
  81. package/dist/assets/{SettingsView-DMxqsNh0.js.map → SettingsView-DJ78VuiY.js.map} +1 -1
  82. package/dist/assets/{SetupView-tkyttChl.js → SetupView-C70Dkfed.js} +2 -2
  83. package/dist/assets/{SetupView-tkyttChl.js.map → SetupView-C70Dkfed.js.map} +1 -1
  84. package/dist/assets/{SetupWorkflowCredentialsButton-B3HZvKQp.js → SetupWorkflowCredentialsButton-CEQ1LrFl.js} +2 -2
  85. package/dist/assets/{SetupWorkflowCredentialsButton-B3HZvKQp.js.map → SetupWorkflowCredentialsButton-CEQ1LrFl.js.map} +1 -1
  86. package/dist/assets/{SetupWorkflowFromTemplateView-DL3b-TZS.js → SetupWorkflowFromTemplateView-BUzzXtBr.js} +2 -2
  87. package/dist/assets/{SetupWorkflowFromTemplateView-DL3b-TZS.js.map → SetupWorkflowFromTemplateView-BUzzXtBr.js.map} +1 -1
  88. package/dist/assets/{SigninView-BPLGsvzz.js → SigninView-B3CNL-yp.js} +2 -2
  89. package/dist/assets/{SigninView-BPLGsvzz.js.map → SigninView-B3CNL-yp.js.map} +1 -1
  90. package/dist/assets/{SignoutView-BySf9D7k.js → SignoutView-svcLavkC.js} +2 -2
  91. package/dist/assets/{SignoutView-BySf9D7k.js.map → SignoutView-svcLavkC.js.map} +1 -1
  92. package/dist/assets/{SignupView-EU3JWt4T.js → SignupView-DJWRTPKF.js} +2 -2
  93. package/dist/assets/{SignupView-EU3JWt4T.js.map → SignupView-DJWRTPKF.js.map} +1 -1
  94. package/dist/assets/{TemplateDetails-Cemx-ozB.js → TemplateDetails-BnbiWxo-.js} +2 -2
  95. package/dist/assets/{TemplateDetails-Cemx-ozB.js.map → TemplateDetails-BnbiWxo-.js.map} +1 -1
  96. package/dist/assets/{TemplateList-h3b91b7e.js → TemplateList-By-t2s0M.js} +2 -2
  97. package/dist/assets/{TemplateList-h3b91b7e.js.map → TemplateList-By-t2s0M.js.map} +1 -1
  98. package/dist/assets/{TemplatesCollectionView-aBX3f7Pp.js → TemplatesCollectionView-D2L1fmSc.js} +2 -2
  99. package/dist/assets/{TemplatesCollectionView-aBX3f7Pp.js.map → TemplatesCollectionView-D2L1fmSc.js.map} +1 -1
  100. package/dist/assets/{TemplatesSearchView-DyoC9WUR.js → TemplatesSearchView-Bmr6Nd6g.js} +2 -2
  101. package/dist/assets/{TemplatesSearchView-DyoC9WUR.js.map → TemplatesSearchView-Bmr6Nd6g.js.map} +1 -1
  102. package/dist/assets/{TemplatesView-GQmC_sY8.js → TemplatesView-BbunSn-s.js} +2 -2
  103. package/dist/assets/{TemplatesView-GQmC_sY8.js.map → TemplatesView-BbunSn-s.js.map} +1 -1
  104. package/dist/assets/{TemplatesWorkflowView-C-0pXdDh.js → TemplatesWorkflowView-XxBIlMWY.js} +2 -2
  105. package/dist/assets/{TemplatesWorkflowView-C-0pXdDh.js.map → TemplatesWorkflowView-XxBIlMWY.js.map} +1 -1
  106. package/dist/assets/{VariablesView-BO5fdkwt.js → VariablesView-ZY5xLmKI.js} +2 -2
  107. package/dist/assets/{VariablesView-BO5fdkwt.js.map → VariablesView-ZY5xLmKI.js.map} +1 -1
  108. package/dist/assets/{WorkerView-C3Rdbsfq.js → WorkerView-DV19-i1-.js} +2 -2
  109. package/dist/assets/{WorkerView-C3Rdbsfq.js.map → WorkerView-DV19-i1-.js.map} +1 -1
  110. package/dist/assets/{WorkflowActivator-DQXSsw0V.js → WorkflowActivator-BXWURYao.js} +2 -2
  111. package/dist/assets/{WorkflowActivator-DQXSsw0V.js.map → WorkflowActivator-BXWURYao.js.map} +1 -1
  112. package/dist/assets/{WorkflowExecutionsInfoAccordion-DJPF47om.js → WorkflowExecutionsInfoAccordion-aldNazgt.js} +2 -2
  113. package/dist/assets/{WorkflowExecutionsInfoAccordion-DJPF47om.js.map → WorkflowExecutionsInfoAccordion-aldNazgt.js.map} +1 -1
  114. package/dist/assets/{WorkflowExecutionsLandingPage-DoSsHWxH.js → WorkflowExecutionsLandingPage-CaAameTk.js} +2 -2
  115. package/dist/assets/{WorkflowExecutionsLandingPage-DoSsHWxH.js.map → WorkflowExecutionsLandingPage-CaAameTk.js.map} +1 -1
  116. package/dist/assets/{WorkflowExecutionsPreview-Dt23N5A4.js → WorkflowExecutionsPreview-Bb-wJtr-.js} +2 -2
  117. package/dist/assets/{WorkflowExecutionsPreview-Dt23N5A4.js.map → WorkflowExecutionsPreview-Bb-wJtr-.js.map} +1 -1
  118. package/dist/assets/{WorkflowExecutionsView-CpAIVxYQ.js → WorkflowExecutionsView-D7nlOP1-.js} +2 -2
  119. package/dist/assets/{WorkflowExecutionsView-CpAIVxYQ.js.map → WorkflowExecutionsView-D7nlOP1-.js.map} +1 -1
  120. package/dist/assets/{WorkflowHistory-D1-E_J_s.js → WorkflowHistory-C6zCGFoY.js} +2 -2
  121. package/dist/assets/{WorkflowHistory-D1-E_J_s.js.map → WorkflowHistory-C6zCGFoY.js.map} +1 -1
  122. package/dist/assets/{WorkflowOnboardingView-fzAZuVh5.js → WorkflowOnboardingView-Bu_Oqtr7.js} +2 -2
  123. package/dist/assets/{WorkflowOnboardingView-fzAZuVh5.js.map → WorkflowOnboardingView-Bu_Oqtr7.js.map} +1 -1
  124. package/dist/assets/{WorkflowPreview-BkL2jDRm.js → WorkflowPreview-CVwpKdpj.js} +2 -2
  125. package/dist/assets/{WorkflowPreview-BkL2jDRm.js.map → WorkflowPreview-CVwpKdpj.js.map} +1 -1
  126. package/dist/assets/{WorkflowsView-rbygROmM.js → WorkflowsView-DVeAZ2zW.js} +2 -2
  127. package/dist/assets/{WorkflowsView-rbygROmM.js.map → WorkflowsView-DVeAZ2zW.js.map} +1 -1
  128. package/dist/assets/{cloud-B90x0-JC.js → cloud-BRhZDk2r.js} +2 -2
  129. package/dist/assets/{cloud-B90x0-JC.js.map → cloud-BRhZDk2r.js.map} +1 -1
  130. package/dist/assets/{collaboration.store-ElxCV91F.js → collaboration.store-Ol7bcCFc.js} +2 -2
  131. package/dist/assets/{collaboration.store-ElxCV91F.js.map → collaboration.store-Ol7bcCFc.js.map} +1 -1
  132. package/dist/assets/{index-BE0Xl-jy.js → index-1OxaEeO3.js} +4 -4
  133. package/dist/assets/{index-BE0Xl-jy.js.map → index-1OxaEeO3.js.map} +1 -1
  134. package/dist/assets/{nodeCreator.store-Q1T99YCl.js → nodeCreator.store-FIsc3SCx.js} +2 -2
  135. package/dist/assets/{nodeCreator.store-Q1T99YCl.js.map → nodeCreator.store-FIsc3SCx.js.map} +1 -1
  136. package/dist/assets/{templateActions-B7R6qRak.js → templateActions-w_1vSarr.js} +2 -2
  137. package/dist/assets/{templateActions-B7R6qRak.js.map → templateActions-w_1vSarr.js.map} +1 -1
  138. package/dist/assets/{useExecutionDebugging-BJ0CgMh8.js → useExecutionDebugging-EHinBq_u.js} +2 -2
  139. package/dist/assets/{useExecutionDebugging-BJ0CgMh8.js.map → useExecutionDebugging-EHinBq_u.js.map} +1 -1
  140. package/dist/assets/{useExecutionHelpers-D3294Pbg.js → useExecutionHelpers-LeKoU_T-.js} +2 -2
  141. package/dist/assets/{useExecutionHelpers-D3294Pbg.js.map → useExecutionHelpers-LeKoU_T-.js.map} +1 -1
  142. package/dist/assets/{usePushConnection-CsYeEXN4.js → usePushConnection-PQgFeT_8.js} +2 -2
  143. package/dist/assets/{usePushConnection-CsYeEXN4.js.map → usePushConnection-PQgFeT_8.js.map} +1 -1
  144. package/dist/assets/{useUserHelpers-CzNhI0vP.js → useUserHelpers-DZtbUAMm.js} +2 -2
  145. package/dist/assets/{useUserHelpers-CzNhI0vP.js.map → useUserHelpers-DZtbUAMm.js.map} +1 -1
  146. package/dist/assets/{useWorkflowActivate-D8iK20ua.js → useWorkflowActivate-npf1npdP.js} +2 -2
  147. package/dist/assets/{useWorkflowActivate-D8iK20ua.js.map → useWorkflowActivate-npf1npdP.js.map} +1 -1
  148. package/dist/index.html +1 -1
  149. package/package.json +1 -1
  150. package/dist/assets/CollectionParameter-BXMOfisf.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NodeCreator-B_yCtSu6.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(\n\t\t\t\t\t\t\t\t(version) => typeof version === 'number' && nodeTypeVersions.includes(version),\n\t\t\t\t\t\t\t)\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\ticonColor,\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\ticonColor,\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\tconst credsOnlyNode = getCredentialOnlyNodeType(app, credentialType);\n\t\t\t\t\t\tif (credsOnlyNode) return getSimplifiedNodeType(credsOnlyNode);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\n\t\t\t\t\tconst filteredNodes = credentialOnlyNodes.filter(\n\t\t\t\t\t\t(node): node is SimplifiedNodeType => node !== null,\n\t\t\t\t\t);\n\n\t\t\t\t\tmergedNodes.push(...filteredNodes);\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: transparent;\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:tag=\"nodeType.tag\"\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\tsubcategory: undefined,\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\treturn actions[props.nodeType.name] || [];\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 trimmedDisplayName = props.nodeType.displayName.trimEnd();\n\n\treturn i18n.headerText({\n\t\tkey: `headers.${shortNodeType.value}.displayName`,\n\t\tfallback: hasActions.value ? trimmedDisplayName.replace('Trigger', '') : trimmedDisplayName,\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(): 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}` as BaseTextKey)\"\n\t\t:is-trigger=\"false\"\n\t\t:description=\"\n\t\t\ti18n.baseText(`nodeCreator.subcategoryDescriptions.${subcategoryName}` as BaseTextKey)\n\t\t\"\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';\nimport type { BaseTextKey } from '@/plugins/i18n';\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 } 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';\nimport { useTelemetry } from '@/composables/useTelemetry';\n\nexport interface Props {\n\tnodeType: SimplifiedNodeType;\n\taction: ActionTypeDescription;\n}\n\nconst props = defineProps<Props>();\nconst telemetry = useTelemetry();\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(): 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 } 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';\nimport { useTelemetry } from '@/composables/useTelemetry';\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 telemetry = useTelemetry();\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\ttelemetry.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 LinkItem from '../ItemTypes/LinkItem.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\tselected: [element: INodeCreateElement, $e?: Event];\n\tdragstart: [element: INodeCreateElement, $e: Event];\n\tdragend: [element: INodeCreateElement, $e: Event];\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\tswitch (event) {\n\t\tcase 'dragstart':\n\t\t\tif ($e) {\n\t\t\t\temit('dragstart', element, $e);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 'dragend':\n\t\t\tif ($e) {\n\t\t\t\temit('dragend', element, $e);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 'selected':\n\t\t\temit('selected', element, $e);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\temit(event, element, $e);\n\t}\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\t// Borderless is only applied to views\n\t\t\t\t\t\t[$style.borderless]: item.type === 'view' && item.properties.borderless === 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\n\t\t\t\t\t<LinkItem\n\t\t\t\t\t\tv-else-if=\"item.type === 'link'\"\n\t\t\t\t\t\t:link=\"item.properties\"\n\t\t\t\t\t\t:class=\"$style.linkItem\"\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\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\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.link {\n\tposition: relative;\n\n\t&:last-child {\n\t\tmargin-bottom: var(--spacing-s);\n\t\tpadding-bottom: var(--spacing-xs);\n\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-bottom: 1px solid var(--color-foreground-base);\n\t\t}\n\t}\n}\n\n.borderless {\n\t&:last-child {\n\t\tmargin-top: 0;\n\t\tpadding-top: 0;\n\n\t\t&:after {\n\t\t\tcontent: none;\n\t\t}\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, defineComponent, h } from 'vue';\nimport type { PropType } from 'vue';\nimport type {\n\tINodeCreateElement,\n\tNodeFilterType,\n\tIUpdateInformation,\n\tActionCreateElement,\n\tNodeCreateElement,\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';\nimport { useTelemetry } from '@/composables/useTelemetry';\n\nconst emit = defineEmits({\n\tnodeTypeSelected: (_nodeTypes: string[]) => true,\n});\nconst telemetry = useTelemetry();\n\nconst { userActivated } = useUsersStore();\nconst { popViewStack, updateCurrentViewStack } = useViewStacks();\nconst { registerKeyHook } = useKeyboardNavigation();\nconst {\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 is NodeCreateElement => a.uuid === activeItemId);\n\n\tif (activeAction) onSelected(activeAction);\n}\n\nfunction onSelected(actionCreateElement: INodeCreateElement) {\n\tif (actionCreateElement.type !== 'action') return;\n\n\tconst actionData = getActionData(actionCreateElement.properties);\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\t\tif (actionNode) emit('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\tif (!app_identifier) return;\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\trequired: true,\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 v-if=\"rootView\" :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/root.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';\nimport { getNodeIcon, getNodeIconColor, getNodeIconUrl } from '@/utils/nodeTypesUtils';\nimport { useUIStore } from '@/stores/ui.store';\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();\nconst uiStore = useUIStore();\nconst rootStore = useRootStore();\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\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 iconUrl = getNodeIconUrl(item.properties, uiStore.appliedTheme);\n\t\tconst icon = iconUrl\n\t\t\t? rootStore.baseUrl + iconUrl\n\t\t\t: getNodeIcon(item.properties, uiStore.appliedTheme)?.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: getNodeIconColor(item.properties),\n\t\t\t\ticon,\n\t\t\t\ticonType: 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\tif (item.type === 'link') {\n\t\twindow.open(item.properties.url, '_blank');\n\t\ttelemetry.trackNodesPanel('nodeCreateList.onLinkSelected', {\n\t\t\tlink: item.properties.url,\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', 'link', 'view'].includes(type),\n\thandler: onKeySelect,\n});\n\nregisterKeyHook('MainViewArrowLeft', {\n\tkeyboardKeys: ['ArrowLeft'],\n\tcondition: (type) => ['subcategory', 'node', 'link', '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@add-webhook-node=\"selectNodeType([WEBHOOK_NODE_TYPE])\"\n\t\t\t\t\t@add-http-node=\"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\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@after-leave=\"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:model-value=\"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\n\t\t\t:class=\"{\n\t\t\t\t[$style.nodeCreatorScrim]: true,\n\t\t\t\t[$style.active]: showScrim,\n\t\t\t}\"\n\t\t/>\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]: true, [$style.chatOpened]: chatSidebarOpen }\"\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 @node-type-selected=\"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 { useAIStore } from '@/stores/ai.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();\nconst aiStore = useAIStore();\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 chatSidebarOpen = computed(() => aiStore.assistantChatOpen);\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\t&.chatOpened {\n\t\tright: $chat-width;\n\t}\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$g","defineComponent","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createBlock","_Transition","_withCtx","_renderSlot","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","iconColor","badgeIconUrl","outputs","codex","generateMergedNodesAndActions","nodeTypes","httpOnlyCredentials","visibleNodeTypes","mergedNodes","app","appActions","HTTP_REQUEST_NODE_TYPE","filteredNodes","credentialType","credsOnlyNode","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","trimmedDisplayName","onDragStart","onDragOver","x","y","DRAG_EVENT_DATA_KEY","getNewNodePosition","NODE_SIZE","onDragEnd","onCommunityNodeTooltipClick","subcategoryName","camelCase","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","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","uiStore","useUIStore","rootStore","useRootStore","pushViewStack","globalSearchItemsDiff","selectNodeType","subcategoryKey","title","baseSubcategoriesFilter","subcategoriesMapper","getNodeIconUrl","getNodeIcon","transformedActions","transformNodeType","getNodeIconColor","views","TriggerView","RegularView","AI_NODE_CREATOR_VIEW","AIView","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","itemKey","matchedView","view","hasTriggerGroup","flattenCreateElements","i","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","viewStacks","isActionsMode","searchPlaceholder","nodeCreatorView","getDefaultActiveIndex","onSearch","value","onTransitionEnd","selectedView","onBackButton","resetViewStacks","aiStore","useAIStore","setShowScrim","setActions","setMergeNodes","showScrim","viewStacksLength","chatSidebarOpen","nodeCreatorInlineStyle","onMouseUpOutside","clickEvent","unBindOnMouseUpOutside","onMouseUp","onMouseDown","onDrop","dragData","nodeCreatorBoundingRect","isActive","useCredentialsStore","useNodeTypesStore","nodeCreator"],"mappings":"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"}
1
+ {"version":3,"file":"NodeCreator-DlK1669m.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(\n\t\t\t\t\t\t\t\t(version) => typeof version === 'number' && nodeTypeVersions.includes(version),\n\t\t\t\t\t\t\t)\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\ticonColor,\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\ticonColor,\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\tconst credsOnlyNode = getCredentialOnlyNodeType(app, credentialType);\n\t\t\t\t\t\tif (credsOnlyNode) return getSimplifiedNodeType(credsOnlyNode);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\n\t\t\t\t\tconst filteredNodes = credentialOnlyNodes.filter(\n\t\t\t\t\t\t(node): node is SimplifiedNodeType => node !== null,\n\t\t\t\t\t);\n\n\t\t\t\t\tmergedNodes.push(...filteredNodes);\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: transparent;\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:tag=\"nodeType.tag\"\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\tsubcategory: undefined,\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\treturn actions[props.nodeType.name] || [];\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 trimmedDisplayName = props.nodeType.displayName.trimEnd();\n\n\treturn i18n.headerText({\n\t\tkey: `headers.${shortNodeType.value}.displayName`,\n\t\tfallback: hasActions.value ? trimmedDisplayName.replace('Trigger', '') : trimmedDisplayName,\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(): 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}` as BaseTextKey)\"\n\t\t:is-trigger=\"false\"\n\t\t:description=\"\n\t\t\ti18n.baseText(`nodeCreator.subcategoryDescriptions.${subcategoryName}` as BaseTextKey)\n\t\t\"\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';\nimport type { BaseTextKey } from '@/plugins/i18n';\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 } 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';\nimport { useTelemetry } from '@/composables/useTelemetry';\n\nexport interface Props {\n\tnodeType: SimplifiedNodeType;\n\taction: ActionTypeDescription;\n}\n\nconst props = defineProps<Props>();\nconst telemetry = useTelemetry();\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(): 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 } 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';\nimport { useTelemetry } from '@/composables/useTelemetry';\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 telemetry = useTelemetry();\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\ttelemetry.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 LinkItem from '../ItemTypes/LinkItem.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\tselected: [element: INodeCreateElement, $e?: Event];\n\tdragstart: [element: INodeCreateElement, $e: Event];\n\tdragend: [element: INodeCreateElement, $e: Event];\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\tswitch (event) {\n\t\tcase 'dragstart':\n\t\t\tif ($e) {\n\t\t\t\temit('dragstart', element, $e);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 'dragend':\n\t\t\tif ($e) {\n\t\t\t\temit('dragend', element, $e);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 'selected':\n\t\t\temit('selected', element, $e);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\temit(event, element, $e);\n\t}\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\t// Borderless is only applied to views\n\t\t\t\t\t\t[$style.borderless]: item.type === 'view' && item.properties.borderless === 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\n\t\t\t\t\t<LinkItem\n\t\t\t\t\t\tv-else-if=\"item.type === 'link'\"\n\t\t\t\t\t\t:link=\"item.properties\"\n\t\t\t\t\t\t:class=\"$style.linkItem\"\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\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\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.link {\n\tposition: relative;\n\n\t&:last-child {\n\t\tmargin-bottom: var(--spacing-s);\n\t\tpadding-bottom: var(--spacing-xs);\n\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-bottom: 1px solid var(--color-foreground-base);\n\t\t}\n\t}\n}\n\n.borderless {\n\t&:last-child {\n\t\tmargin-top: 0;\n\t\tpadding-top: 0;\n\n\t\t&:after {\n\t\t\tcontent: none;\n\t\t}\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, defineComponent, h } from 'vue';\nimport type { PropType } from 'vue';\nimport type {\n\tINodeCreateElement,\n\tNodeFilterType,\n\tIUpdateInformation,\n\tActionCreateElement,\n\tNodeCreateElement,\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';\nimport { useTelemetry } from '@/composables/useTelemetry';\n\nconst emit = defineEmits({\n\tnodeTypeSelected: (_nodeTypes: string[]) => true,\n});\nconst telemetry = useTelemetry();\n\nconst { userActivated } = useUsersStore();\nconst { popViewStack, updateCurrentViewStack } = useViewStacks();\nconst { registerKeyHook } = useKeyboardNavigation();\nconst {\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 is NodeCreateElement => a.uuid === activeItemId);\n\n\tif (activeAction) onSelected(activeAction);\n}\n\nfunction onSelected(actionCreateElement: INodeCreateElement) {\n\tif (actionCreateElement.type !== 'action') return;\n\n\tconst actionData = getActionData(actionCreateElement.properties);\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\t\tif (actionNode) emit('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\tif (!app_identifier) return;\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\trequired: true,\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 v-if=\"rootView\" :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/root.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';\nimport { getNodeIcon, getNodeIconColor, getNodeIconUrl } from '@/utils/nodeTypesUtils';\nimport { useUIStore } from '@/stores/ui.store';\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();\nconst uiStore = useUIStore();\nconst rootStore = useRootStore();\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\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 iconUrl = getNodeIconUrl(item.properties, uiStore.appliedTheme);\n\t\tconst icon = iconUrl\n\t\t\t? rootStore.baseUrl + iconUrl\n\t\t\t: getNodeIcon(item.properties, uiStore.appliedTheme)?.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: getNodeIconColor(item.properties),\n\t\t\t\ticon,\n\t\t\t\ticonType: 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\tif (item.type === 'link') {\n\t\twindow.open(item.properties.url, '_blank');\n\t\ttelemetry.trackNodesPanel('nodeCreateList.onLinkSelected', {\n\t\t\tlink: item.properties.url,\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', 'link', 'view'].includes(type),\n\thandler: onKeySelect,\n});\n\nregisterKeyHook('MainViewArrowLeft', {\n\tkeyboardKeys: ['ArrowLeft'],\n\tcondition: (type) => ['subcategory', 'node', 'link', '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@add-webhook-node=\"selectNodeType([WEBHOOK_NODE_TYPE])\"\n\t\t\t\t\t@add-http-node=\"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\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@after-leave=\"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:model-value=\"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\n\t\t\t:class=\"{\n\t\t\t\t[$style.nodeCreatorScrim]: true,\n\t\t\t\t[$style.active]: showScrim,\n\t\t\t}\"\n\t\t/>\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]: true, [$style.chatOpened]: chatSidebarOpen }\"\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 @node-type-selected=\"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 { useAIStore } from '@/stores/ai.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();\nconst aiStore = useAIStore();\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 chatSidebarOpen = computed(() => aiStore.assistantChatOpen);\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\t&.chatOpened {\n\t\tright: $chat-width;\n\t}\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$g","defineComponent","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createBlock","_Transition","_withCtx","_renderSlot","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","iconColor","badgeIconUrl","outputs","codex","generateMergedNodesAndActions","nodeTypes","httpOnlyCredentials","visibleNodeTypes","mergedNodes","app","appActions","HTTP_REQUEST_NODE_TYPE","filteredNodes","credentialType","credsOnlyNode","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","trimmedDisplayName","onDragStart","onDragOver","x","y","DRAG_EVENT_DATA_KEY","getNewNodePosition","NODE_SIZE","onDragEnd","onCommunityNodeTooltipClick","subcategoryName","camelCase","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","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","uiStore","useUIStore","rootStore","useRootStore","pushViewStack","globalSearchItemsDiff","selectNodeType","subcategoryKey","title","baseSubcategoriesFilter","subcategoriesMapper","getNodeIconUrl","getNodeIcon","transformedActions","transformNodeType","getNodeIconColor","views","TriggerView","RegularView","AI_NODE_CREATOR_VIEW","AIView","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","itemKey","matchedView","view","hasTriggerGroup","flattenCreateElements","i","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","viewStacks","isActionsMode","searchPlaceholder","nodeCreatorView","getDefaultActiveIndex","onSearch","value","onTransitionEnd","selectedView","onBackButton","resetViewStacks","aiStore","useAIStore","setShowScrim","setActions","setMergeNodes","showScrim","viewStacksLength","chatSidebarOpen","nodeCreatorInlineStyle","onMouseUpOutside","clickEvent","unBindOnMouseUpOutside","onMouseUp","onMouseDown","onDrop","dragData","nodeCreatorBoundingRect","isActive","useCredentialsStore","useNodeTypesStore","nodeCreator"],"mappings":"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"}