@atom8n/n8n-editor-ui 2.2.0

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 (310) hide show
  1. package/.stylelintcache +1 -0
  2. package/README.md +59 -0
  3. package/biome.jsonc +8 -0
  4. package/build.log +55 -0
  5. package/data/node-popularity.json +3998 -0
  6. package/dist/assets/AddDataTableModal-UINkk54_.js +1555 -0
  7. package/dist/assets/AgentEditorModal-CVww87TJ.js +358 -0
  8. package/dist/assets/Alert-Dy86dyOr.js +102 -0
  9. package/dist/assets/AnimatedSpinner-DmPN4poP.js +15 -0
  10. package/dist/assets/AnnotationTagsDropdown.ee-BJ7N9lek.js +71 -0
  11. package/dist/assets/AuthView-D2LWHrMp.js +106 -0
  12. package/dist/assets/BottomMenu-CIQiK_dJ.js +532 -0
  13. package/dist/assets/CalendarDate-DgQUMbNo.js +875 -0
  14. package/dist/assets/ChangePasswordView-Z6tUkw0u.js +133 -0
  15. package/dist/assets/ChatAgentAvatar-50YBnv3N.js +67 -0
  16. package/dist/assets/ChatFile-xZxmc2nV.js +146 -0
  17. package/dist/assets/ChatLayout-CTE_5SiM.js +96 -0
  18. package/dist/assets/ChatPersonalAgentsView-BGpHk03K.js +149 -0
  19. package/dist/assets/ChatSidebar-BkVwIypC.js +528 -0
  20. package/dist/assets/ChatView-BbbdeU9x.js +1559 -0
  21. package/dist/assets/ChatWorkflowAgentsView-BtunOxlC.js +116 -0
  22. package/dist/assets/CollectionParameter-BdcPG1lu.js +52 -0
  23. package/dist/assets/CommitMonoVariable-ytizKI8U.woff2 +0 -0
  24. package/dist/assets/CommunityNodeUpdateInfo-C37kca4W.js +273 -0
  25. package/dist/assets/CopyInput-DDZVu2iU.js +74 -0
  26. package/dist/assets/CredentialIcon-8YdTTFZ1.js +80 -0
  27. package/dist/assets/CredentialPicker-DWtj314o.js +293 -0
  28. package/dist/assets/CredentialSelectorModal-DTW2fKh0.js +138 -0
  29. package/dist/assets/CredentialsView-BjUchcCu.js +480 -0
  30. package/dist/assets/DataTableActions-DpAkoxg_.js +95 -0
  31. package/dist/assets/DataTableDetailsView-Coq7zdW5.js +41922 -0
  32. package/dist/assets/DataTableView-Cs-BIkzw.js +293 -0
  33. package/dist/assets/DemoFooter-Cga3jvi-.js +65 -0
  34. package/dist/assets/Draggable-vfvXl9Sp.js +105 -0
  35. package/dist/assets/EmptySharedSectionActionBox-DOXZtTCv.js +36 -0
  36. package/dist/assets/EnterpriseEdition.ee-D_rCFexM.js +15 -0
  37. package/dist/assets/EntityNotFound-3dhTRWsE.js +85 -0
  38. package/dist/assets/EntityUnAuthorised-ChJYZakE.js +66 -0
  39. package/dist/assets/ErrorView-zT9cX76a.js +61 -0
  40. package/dist/assets/EvaluationsRootView-C-OVWYnY.js +523 -0
  41. package/dist/assets/EvaluationsView-CJwJTruc.js +469 -0
  42. package/dist/assets/ExecutionsTime-DEQiyozR.js +573 -0
  43. package/dist/assets/ExecutionsView-Bd5Oh8TH.js +791 -0
  44. package/dist/assets/ExternalSecretsProviderConnectionSwitch.ee-C7Ih-uRo.js +191 -0
  45. package/dist/assets/FixedCollectionParameter-CYuTDW9t.js +496 -0
  46. package/dist/assets/ForgotMyPasswordView-Bs_L9P27.js +102 -0
  47. package/dist/assets/InsightsChartAverageRuntime-Bp3VA8_7.js +62 -0
  48. package/dist/assets/InsightsChartFailed-KPaNWoEr.js +52 -0
  49. package/dist/assets/InsightsChartFailureRate-DE6kE3FM.js +54 -0
  50. package/dist/assets/InsightsChartTimeSaved-auABNZlc.js +68 -0
  51. package/dist/assets/InsightsChartTotal-BKzYRKE7.js +56 -0
  52. package/dist/assets/InsightsDashboard-JWx4W6Db.js +473 -0
  53. package/dist/assets/InsightsPaywall-C8zLLKe8.js +63 -0
  54. package/dist/assets/InsightsSummary-cmN1lHDm.js +210 -0
  55. package/dist/assets/InsightsTableWorkflows-CqcC3IbQ.js +203 -0
  56. package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  57. package/dist/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
  58. package/dist/assets/ItemsRenderer-DC8WVyMv.js +922 -0
  59. package/dist/assets/KeyboardShortcutTooltip-D8PAK5JP.js +31 -0
  60. package/dist/assets/LogsPanel-BR06u9RK.js +52 -0
  61. package/dist/assets/LogsPanel-C-_acMHp.js +2325 -0
  62. package/dist/assets/MCPConnectWorkflowsModal-3g8_iUa4.js +303 -0
  63. package/dist/assets/MainHeader-DiQc1edn.js +2153 -0
  64. package/dist/assets/MainSidebar-CoPGG5Ea.js +804 -0
  65. package/dist/assets/MigrationRuleDetail-BAxk1Pvl.js +295 -0
  66. package/dist/assets/MigrationRules-IW9lZMpE.js +285 -0
  67. package/dist/assets/Modal-CIzXlZdZ.js +204 -0
  68. package/dist/assets/ModelByIdSelectorModal-DLvBjzJO.js +115 -0
  69. package/dist/assets/NDVEmptyState-33UoX00I.js +19743 -0
  70. package/dist/assets/NodeCreation-BNzbSWSB.js +240 -0
  71. package/dist/assets/NodeCreator-BftgCKx7.js +1288 -0
  72. package/dist/assets/NodeDetailsView-CsoQCpcF.js +1075 -0
  73. package/dist/assets/NodeDetailsViewV2-C_wNQR_3.js +981 -0
  74. package/dist/assets/NodeIcon-B9VW6tX6.js +87 -0
  75. package/dist/assets/NodeSettings-ZwVip6VR.js +1872 -0
  76. package/dist/assets/NodeView-D4WUEvLB.js +2452 -0
  77. package/dist/assets/OAuthConsentView-DlrUqZbT.js +230 -0
  78. package/dist/assets/PageViewLayout-NT1KPFgy.js +12 -0
  79. package/dist/assets/ParameterInputList-sG2nz-Jo.js +38091 -0
  80. package/dist/assets/PrebuiltAgentTemplatesView-Csi5U8dc.js +154 -0
  81. package/dist/assets/ProjectBreadcrumb-C_XiY7sc.js +98 -0
  82. package/dist/assets/ProjectCardBadge-t_hs7vzx.js +209 -0
  83. package/dist/assets/ProjectHeader-Dq5Ihb26.js +549 -0
  84. package/dist/assets/ProjectIcon-DY8gGuHX.js +64 -0
  85. package/dist/assets/ProjectRoleView-Du-KTrAC.js +435 -0
  86. package/dist/assets/ProjectRolesView-DjxM_y4u.js +239 -0
  87. package/dist/assets/ProjectSettings-C6kWuV21.js +966 -0
  88. package/dist/assets/ProjectSharing-CVUgNWAY.js +262 -0
  89. package/dist/assets/ProjectVariables-CJlAo3dv.js +467 -0
  90. package/dist/assets/ProviderSettingsModal-BUFC2ZLv.js +307 -0
  91. package/dist/assets/PushConnectionTracker-DPBnGV0v.js +27 -0
  92. package/dist/assets/ResolversView-3BdkvvYA.js +209 -0
  93. package/dist/assets/ResourceFiltersDropdown-dgyXpcEX.js +159 -0
  94. package/dist/assets/ResourcesListLayout-qBLtomK6.js +631 -0
  95. package/dist/assets/RunDataHtml-BrW0OQra.js +7 -0
  96. package/dist/assets/RunDataHtml-Cleia4Cj.js +40 -0
  97. package/dist/assets/RunDataJson-uxkrhYRK.js +227 -0
  98. package/dist/assets/RunDataJsonActions-DkPk7E8d.js +5007 -0
  99. package/dist/assets/RunDataParsedAiContent-CtPRjig-.js +26 -0
  100. package/dist/assets/RunDataParsedAiContent-WAuqLQ5M.js +192 -0
  101. package/dist/assets/RunDataSearch-YBWUr93C.js +141 -0
  102. package/dist/assets/RunDataTable-DcXaBynW.js +631 -0
  103. package/dist/assets/SamlOnboarding-BTdQ_hr3.js +78 -0
  104. package/dist/assets/SaveButton-D5sQSxIk.js +89 -0
  105. package/dist/assets/SelectedItemsInfo-BHZ-NvF5.js +58 -0
  106. package/dist/assets/SettingsApiView-IfZTMXx1.js +313 -0
  107. package/dist/assets/SettingsChatHubView-gWh2X6vX.js +285 -0
  108. package/dist/assets/SettingsCommunityNodesView-D8VQtpGY.js +349 -0
  109. package/dist/assets/SettingsExternalSecrets-CpMc7mkW.js +233 -0
  110. package/dist/assets/SettingsLdapView-CU5a2MAy.js +2553 -0
  111. package/dist/assets/SettingsLogStreamingView-uojTe-oX.js +375 -0
  112. package/dist/assets/SettingsMCPView-B5Swp1C_.js +1214 -0
  113. package/dist/assets/SettingsPersonalView-Cr3aGood.js +402 -0
  114. package/dist/assets/SettingsSourceControl-DXOvFDEY.js +547 -0
  115. package/dist/assets/SettingsSso-27MfU1HV.js +1032 -0
  116. package/dist/assets/SettingsUsageAndPlan-DqIO-G46.js +419 -0
  117. package/dist/assets/SettingsUsersView-DfHB4_Kh.js +833 -0
  118. package/dist/assets/SettingsView-C4sA7Uny.js +90 -0
  119. package/dist/assets/SetupTemplateFormStep-BmiSzZin.js +258 -0
  120. package/dist/assets/SetupView-VORZ-L_u.js +112 -0
  121. package/dist/assets/SetupWorkflowCredentialsButton-DTmkOAW5.js +73 -0
  122. package/dist/assets/SetupWorkflowFromTemplateView-B9NupdJE.js +286 -0
  123. package/dist/assets/SeverityTag-CX1qTTNA.js +45 -0
  124. package/dist/assets/SigninView-D9_Pm16j.js +358 -0
  125. package/dist/assets/SignoutView-BFsjEAGz.js +19 -0
  126. package/dist/assets/SignupView-Am4ot0QZ.js +137 -0
  127. package/dist/assets/SkeletonAgentCard-C5TL-h8F.js +191 -0
  128. package/dist/assets/TagsDropdown-Bvx_Hd6Q.js +230 -0
  129. package/dist/assets/TemplateCard-CyQ1GuVz.js +105 -0
  130. package/dist/assets/TemplateDetails-CZRusTxE.js +124 -0
  131. package/dist/assets/TemplateList-DKvbwuiY.js +333 -0
  132. package/dist/assets/TemplatesCollectionView-D8dxU8By.js +184 -0
  133. package/dist/assets/TemplatesSearchView-CebC_GLs.js +1230 -0
  134. package/dist/assets/TemplatesView-025CcmIY.js +57 -0
  135. package/dist/assets/TemplatesWorkflowView-C2JfwJAn.js +170 -0
  136. package/dist/assets/TestRunDetailView-Ck78TTWO.js +395 -0
  137. package/dist/assets/TextWithHighlights-BxumwGnv.js +57 -0
  138. package/dist/assets/TimeAgo-C6EN4lCs.js +123 -0
  139. package/dist/assets/ToolsSelectorModal-8QJoUvRL.js +368 -0
  140. package/dist/assets/TriggerPanel-B6pacLkk.js +1225 -0
  141. package/dist/assets/VirtualSchema-B3zGe_8b.js +2402 -0
  142. package/dist/assets/VirtualSchema-Dkh0Cu5z.js +37 -0
  143. package/dist/assets/VueMarkdown-CQqJL9vK.js +28 -0
  144. package/dist/assets/WorkerView-Caznsljo.js +563 -0
  145. package/dist/assets/WorkflowActivationErrorMessage-CGrfPi9O.js +17 -0
  146. package/dist/assets/WorkflowActivator-BINnz0f7.js +362 -0
  147. package/dist/assets/WorkflowExecutionsInfoAccordion-Dg37yEfT.js +166 -0
  148. package/dist/assets/WorkflowExecutionsLandingPage-V2wdubhK.js +93 -0
  149. package/dist/assets/WorkflowExecutionsPreview-DdJaqYV6.js +616 -0
  150. package/dist/assets/WorkflowExecutionsView-DV8ySTfn.js +808 -0
  151. package/dist/assets/WorkflowHistory-GtaBMzIM.js +973 -0
  152. package/dist/assets/WorkflowLocation-CQ9Sq-2y.js +164 -0
  153. package/dist/assets/WorkflowOnboardingView-C49gt0Jr.js +61 -0
  154. package/dist/assets/WorkflowPreview-CXdvv4Nq.js +186 -0
  155. package/dist/assets/WorkflowTagsDropdown-QwbICWjN.js +71 -0
  156. package/dist/assets/WorkflowsView-B-MWIECO.js +3253 -0
  157. package/dist/assets/_MapCache-CcdIl4Ae.js +363 -0
  158. package/dist/assets/_baseOrderBy-N8Be_6z6.js +2989 -0
  159. package/dist/assets/_initCloneObject-viQQyT6o.js +80 -0
  160. package/dist/assets/_plugin-vue_export-helper-BwBpWJRZ.js +6 -0
  161. package/dist/assets/aiTemplatesStarterCollection.store-nL9nePkK.js +656 -0
  162. package/dist/assets/apiKeys.store-BhOFmP2j.js +51 -0
  163. package/dist/assets/assistant.store-CNywgN4S.js +518 -0
  164. package/dist/assets/auth.eventBus-CWXS0Qp7.js +5 -0
  165. package/dist/assets/banners.store-CGEcBTDn.js +195 -0
  166. package/dist/assets/builder.store-Czk2ipDE.js +31417 -0
  167. package/dist/assets/buttons.esm-yintpW2E.js +364 -0
  168. package/dist/assets/chart-CNvyywtJ.js +10958 -0
  169. package/dist/assets/chartjs.utils-BAE52Cv9.js +155 -0
  170. package/dist/assets/chat.store-290YeyrQ.js +865 -0
  171. package/dist/assets/chatPanel.store-NDaawEZL.js +118 -0
  172. package/dist/assets/chunk-6z4oVpB-.js +36 -0
  173. package/dist/assets/col-Cmt4cmuS.js +158 -0
  174. package/dist/assets/constants-C8OH4tTq.js +106256 -0
  175. package/dist/assets/constants-DMrsrpD7.js +32 -0
  176. package/dist/assets/core-B9gt_4yk.js +4 -0
  177. package/dist/assets/core-CP5FY4aX.js +1202 -0
  178. package/dist/assets/core-CRbPymLT.js +9741 -0
  179. package/dist/assets/dataTable.store-DmipQsol.js +207 -0
  180. package/dist/assets/date-picker-2IDsBs2n.js +4115 -0
  181. package/dist/assets/dateFormatter-ik4-9_9r.js +33 -0
  182. package/dist/assets/dateformat-hG8NERse.js +181 -0
  183. package/dist/assets/dialog-lMho1TD8.js +425 -0
  184. package/dist/assets/dist-Cw46Is-h.js +151 -0
  185. package/dist/assets/doppler-B__k0MeW.webp +0 -0
  186. package/dist/assets/element-icons-B-tDfklg.woff +0 -0
  187. package/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
  188. package/dist/assets/empty-BuGRxzl4.js +2210 -0
  189. package/dist/assets/en-CF30SCh2.js +95 -0
  190. package/dist/assets/en-DyO2pPiC.js +2 -0
  191. package/dist/assets/es-BkUFJVtD.js +43338 -0
  192. package/dist/assets/evaluation.constants-GYAwmJnh.js +284 -0
  193. package/dist/assets/executions.store-B9uRYwgv.js +205 -0
  194. package/dist/assets/exports-Crx_gvt_.js +1799 -0
  195. package/dist/assets/externalSecrets.ee.store-BJh4a_6G.js +118 -0
  196. package/dist/assets/fileUtils-CRWqOQje.js +20 -0
  197. package/dist/assets/folders.store-yAFj-5Vl.js +235 -0
  198. package/dist/assets/get-BcEmeOxn.js +2781 -0
  199. package/dist/assets/index-SL8542zQ.js +28372 -0
  200. package/dist/assets/insights.constants-BkJCYJTL.js +55 -0
  201. package/dist/assets/insights.store-BFc3kDUo.js +61 -0
  202. package/dist/assets/insights.utils-CcLXdrrz.js +77 -0
  203. package/dist/assets/isEmpty-C3XXoHqJ.js +35216 -0
  204. package/dist/assets/languageModules-9LyndCqU.js +13862 -0
  205. package/dist/assets/logStreaming.store-IZhWe_VK.js +190 -0
  206. package/dist/assets/mcp.constants-_Jcn7fPq.js +10 -0
  207. package/dist/assets/mcp.store-B9yfcAN9.js +116 -0
  208. package/dist/assets/merge-DhuTk1HM.js +564 -0
  209. package/dist/assets/nodeCreator.store-Bpnrwp2l.js +5444 -0
  210. package/dist/assets/nodeIcon-D6X-ENYt.js +102 -0
  211. package/dist/assets/nodeTransforms-RzcOM0v2.js +42 -0
  212. package/dist/assets/orderBy-Cu9F9DU_.js +15 -0
  213. package/dist/assets/path-browserify-RUt2u7iT.js +328 -0
  214. package/dist/assets/personalizedTemplatesV3.store-BGYp0YBN.js +334 -0
  215. package/dist/assets/pickBy-UI0Jt4wC.js +18 -0
  216. package/dist/assets/preload-helper-dyVz7ck7.js +59 -0
  217. package/dist/assets/radio-CSce3UT0.js +262 -0
  218. package/dist/assets/readyToRun.store-YEMvPUqo.js +626 -0
  219. package/dist/assets/readyToRunWorkflows.store-G3srgIze.js +1319 -0
  220. package/dist/assets/retry-BgHaYzbB.js +23 -0
  221. package/dist/assets/roles.store-CRf_zJTb.js +51 -0
  222. package/dist/assets/router-DNpzz3GH.js +2631 -0
  223. package/dist/assets/sanitize-html-CbW56HUN.js +10758 -0
  224. package/dist/assets/schemaPreview.store-DUgN1yVE.js +113 -0
  225. package/dist/assets/semver-Bk6DGseV.js +1306 -0
  226. package/dist/assets/smartDecimal-DAZl4HKA.js +6 -0
  227. package/dist/assets/sortByProperty-Cn7iGKYu.js +8 -0
  228. package/dist/assets/sourceControl.eventBus-D47xXSc_.js +3 -0
  229. package/dist/assets/sqlite3-DBpDb1lf.wasm +0 -0
  230. package/dist/assets/sqlite3-opfs-async-proxy-vVtmDGHX.js +461 -0
  231. package/dist/assets/sqlite3-worker1-bundler-friendly-DLarOZDL.js +9405 -0
  232. package/dist/assets/src-jviYSG25.js +55454 -0
  233. package/dist/assets/sso.store-DyApJwhx.js +139 -0
  234. package/dist/assets/style-E3CrYFV8.css +111829 -0
  235. package/dist/assets/table-we1DjFMV.js +3944 -0
  236. package/dist/assets/templateActions-bEDSARw2.js +65 -0
  237. package/dist/assets/templateTransforms-BHWiRbtR.js +43 -0
  238. package/dist/assets/truncate-C0KYt7i3.js +4176 -0
  239. package/dist/assets/typescript.worker-CYqLvLHh.js +152048 -0
  240. package/dist/assets/uniqBy-xDyuCRP0.js +10 -0
  241. package/dist/assets/usage.store-CU5J_nGm.js +100 -0
  242. package/dist/assets/useActions-B1JckIRj.js +255 -0
  243. package/dist/assets/useBeforeUnload-DiDkvI8p.js +40 -0
  244. package/dist/assets/useCanvasMapping-BXT7rGhC.js +12570 -0
  245. package/dist/assets/useCanvasOperations-8ULLtMkY.js +1765 -0
  246. package/dist/assets/useClipboard-DvjhVHqJ.js +39 -0
  247. package/dist/assets/useCommandBar-C4tLJbKt.js +2425 -0
  248. package/dist/assets/useCredentialResolvers-BKeFGJnY.js +78 -0
  249. package/dist/assets/useCustomAgent-DpILEt5e.js +471 -0
  250. package/dist/assets/useDebounce-Br5_1ug-.js +147 -0
  251. package/dist/assets/useExecutionData-M5iKsX6z.js +23 -0
  252. package/dist/assets/useExecutionDebugging-8azMzbnd.js +191 -0
  253. package/dist/assets/useExecutionHelpers-BgRRhpBM.js +91 -0
  254. package/dist/assets/useImportCurlCommand-CKiEmX5P.js +8891 -0
  255. package/dist/assets/useIntersectionObserver-BWMwOueh.js +33 -0
  256. package/dist/assets/useKeybindings-B2jfN6rd.js +62 -0
  257. package/dist/assets/useLogsTreeExpand-sZViUfdM.js +843 -0
  258. package/dist/assets/useMcp-DoMOIfqT.js +27 -0
  259. package/dist/assets/usePageRedirectionHelper-DjkznpX6.js +51 -0
  260. package/dist/assets/usePinnedData-BhZkqttf.js +203 -0
  261. package/dist/assets/usePushConnection-DMS-F_IW.js +513 -0
  262. package/dist/assets/useRecentResources-BVORr7eM.js +118 -0
  263. package/dist/assets/useRunWorkflow-LO7ffLp9.js +950 -0
  264. package/dist/assets/useSettingsItems-BhZXwMZn.js +144 -0
  265. package/dist/assets/useTelemetryContext-V6bv4YRq.js +34 -0
  266. package/dist/assets/useWorkflowActivate-DeSmDXjI.js +152 -0
  267. package/dist/assets/useWorkflowsCache-DtcEEAIR.js +179 -0
  268. package/dist/assets/userRoleProvisioning.store-kkSIdeTo.js +33 -0
  269. package/dist/assets/utils-DI7dLldp.js +54 -0
  270. package/dist/assets/versions.store-B1z2OrLE.js +191 -0
  271. package/dist/assets/vue-CydWIhxN.js +4378 -0
  272. package/dist/assets/vue-json-pretty-CsGX66mG.js +1130 -0
  273. package/dist/assets/vue.runtime.esm-bundler-tP5dCd7J.js +7325 -0
  274. package/dist/assets/xml-B_oj6Mle.js +2060 -0
  275. package/dist/favicon.ico +0 -0
  276. package/dist/index.html +157 -0
  277. package/dist/static/base-path.js +1 -0
  278. package/dist/static/community_package_tooltip_img.png +0 -0
  279. package/dist/static/data-mapping-gif.gif +0 -0
  280. package/dist/static/form-grey.svg +1 -0
  281. package/dist/static/google-auth/disabled.dark.png +0 -0
  282. package/dist/static/google-auth/disabled.png +0 -0
  283. package/dist/static/google-auth/focus.dark.png +0 -0
  284. package/dist/static/google-auth/focus.png +0 -0
  285. package/dist/static/google-auth/normal.dark.png +0 -0
  286. package/dist/static/google-auth/normal.png +0 -0
  287. package/dist/static/google-auth/pressed.dark.png +0 -0
  288. package/dist/static/google-auth/pressed.png +0 -0
  289. package/dist/static/n8n-logo.png +0 -0
  290. package/dist/static/og_image.png +0 -0
  291. package/dist/static/open-ai.svg +1 -0
  292. package/dist/static/openChat.png +0 -0
  293. package/dist/static/posthog.init.js +41 -0
  294. package/dist/static/prefers-color-scheme.css +5 -0
  295. package/dist/static/webhook-icon.svg +1 -0
  296. package/dist/tree-sitter-bash.wasm +0 -0
  297. package/dist/tree-sitter.wasm +0 -0
  298. package/eslint.config.mjs +59 -0
  299. package/index.html +45 -0
  300. package/index.js +0 -0
  301. package/package.json +147 -0
  302. package/postcss.config.cjs +6 -0
  303. package/scripts/fetch-node-popularity.mjs +102 -0
  304. package/stylelint.config.mjs +9 -0
  305. package/tailwind.config.js +8 -0
  306. package/tsconfig.json +36 -0
  307. package/vite/i18n-locales-hmr-helpers.ts +19 -0
  308. package/vite/source-map-js-shim.ts +1 -0
  309. package/vite/vite-plugin-node-popularity.mts +32 -0
  310. package/vite.config.mts +304 -0
@@ -0,0 +1,3253 @@
1
+ import { o as __toESM } from "./chunk-6z4oVpB-.js";
2
+ import { C as computed, Cn as toDisplayString, D as createElementBlock, E as createCommentVNode, Gt as unref, It as ref, J as onBeforeUnmount, M as createVNode, Nt as onScopeDispose, P as defineComponent, T as createBlock, Z as onMounted, _ as Fragment, _t as watch, at as renderSlot, bt as withCtx, et as openBlock, h as withModifiers, it as renderList, j as createTextVNode, k as createSlots, mt as useTemplateRef, ot as resolveComponent, p as vShow, vn as normalizeClass, w as createBaseVNode, xt as withDirectives } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
3
+ import { rt as useI18n } from "./core-CRbPymLT.js";
4
+ import { $ as N8nInputLabel_default, Cn as N8nIcon_default, Ct as N8nActionBox_default, J as N8nSelect_default, Q as N8nCheckbox_default, R as N8nInfoTip_default, Sn as N8nSpinner_default, Y as N8nOption_default, at as N8nLoading_default, bn as N8nText_default, c as N8nInlineTextEdit_default, d as N8nBreadcrumbs_default, et as N8nCard_default, ht as N8nTooltip_default, it as N8nActionToggle_default, lt as N8nBadge_default, mt as N8nLink_default, v as N8nTags_default, vn as N8nHeading_default, xn as N8nButton_default, yn as N8nCallout_default } from "./src-jviYSG25.js";
5
+ import "./en-CF30SCh2.js";
6
+ import "./preload-helper-dyVz7ck7.js";
7
+ import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
8
+ import { s as createEventBus } from "./truncate-C0KYt7i3.js";
9
+ import { $n as ProjectTypes, Ca as FOLDER_NAME_ONLY_DOTS_REGEX, Er as useUsersStore, Hn as useTagsStore, M as usePostHog, P as useWorkflowsStore, Pt as useNodeTypesStore, Qn as useSourceControlStore, Sa as FOLDER_NAME_MAX_LENGTH, Xn as useDocumentTitle, Zn as useProjectsStore, aa as useUIStore, ba as FOLDER_LIST_ITEM_ACTIONS, ci as ResourceType, ga as PROJECT_MOVE_RESOURCE_MODAL, h as useMessage, k as useTelemetry, l as useTemplatesStore, m as useCloudPlanStore, ms as useSettingsStore, nn as getEasyAiWorkflowJson, p as useTemplatesDataQualityStore, ps as useStorage, ts as COMMUNITY_PLUS_ENROLLMENT_MODAL, wa as ILLEGAL_FOLDER_CHARACTERS, wc as STORES, xa as FOLDER_NAME_ILLEGAL_CHARACTERS_REGEX, y as useToast } from "./builder.store-Czk2ipDE.js";
10
+ import "./empty-BuGRxzl4.js";
11
+ import { _ as useRoute, v as useRouter } from "./get-BcEmeOxn.js";
12
+ import "./sanitize-html-CbW56HUN.js";
13
+ import "./CalendarDate-DgQUMbNo.js";
14
+ import "./path-browserify-RUt2u7iT.js";
15
+ import "./_MapCache-CcdIl4Ae.js";
16
+ import { Da as jsonParse, Go as DUPLICATE_MODAL_KEY, Jo as EXPERIMENT_TEMPLATE_RECO_V3_KEY, Oo as getResourcePermissions, Os as LOCAL_STORAGE_EXPERIMENTAL_DISMISSED_SUGGESTED_WORKFLOWS, Ro as VIEWS, Ss as WORKFLOW_SHARE_MODAL_KEY, a as IS_DRAFT_PUBLISH_ENABLED, hc as TEMPLATE_ONBOARDING_EXPERIMENT, lo as PROJECT_ROOT, qo as EXPERIMENT_TEMPLATE_RECO_V2_KEY, r as DEFAULT_WORKFLOW_PAGE_SIZE, rs as MODAL_CONFIRM, yc as EnterpriseEditionFeature } from "./constants-C8OH4tTq.js";
17
+ import "./merge-DhuTk1HM.js";
18
+ import { A as storeToRefs, k as defineStore } from "./_baseOrderBy-N8Be_6z6.js";
19
+ import { t as require_dateformat } from "./dateformat-hG8NERse.js";
20
+ import { n as require_debounce, t as useDebounce } from "./useDebounce-Br5_1ug-.js";
21
+ import { _ as useCalloutHelpers } from "./nodeCreator.store-Bpnrwp2l.js";
22
+ import "./nodeIcon-D6X-ENYt.js";
23
+ import { t as useFoldersStore } from "./folders.store-yAFj-5Vl.js";
24
+ import { t as NodeIcon_default } from "./NodeIcon-B9VW6tX6.js";
25
+ import "./ProjectIcon-DY8gGuHX.js";
26
+ import { t as ProjectCardBadge_default } from "./ProjectCardBadge-t_hs7vzx.js";
27
+ import { t as useUsageStore } from "./usage.store-CU5J_nGm.js";
28
+ import { t as Draggable_default } from "./Draggable-vfvXl9Sp.js";
29
+ import "./EnterpriseEdition.ee-D_rCFexM.js";
30
+ import { t as TimeAgo_default } from "./TimeAgo-C6EN4lCs.js";
31
+ import "./orderBy-Cu9F9DU_.js";
32
+ import "./ProjectSharing-CVUgNWAY.js";
33
+ import "./TagsDropdown-Bvx_Hd6Q.js";
34
+ import { t as WorkflowTagsDropdown_default } from "./WorkflowTagsDropdown-QwbICWjN.js";
35
+ import { t as useInsightsStore } from "./insights.store-BFc3kDUo.js";
36
+ import "./insights.constants-BkJCYJTL.js";
37
+ import "./insights.utils-CcLXdrrz.js";
38
+ import "./mcp.constants-_Jcn7fPq.js";
39
+ import { t as useMcp } from "./useMcp-DoMOIfqT.js";
40
+ import { n as usePersonalizedTemplatesV2Store, t as usePersonalizedTemplatesV3Store } from "./personalizedTemplatesV3.store-BGYp0YBN.js";
41
+ import { t as TemplateCard_default } from "./TemplateCard-CyQ1GuVz.js";
42
+ import "./useWorkflowActivate-DeSmDXjI.js";
43
+ import "./WorkflowActivationErrorMessage-CGrfPi9O.js";
44
+ import "./ProjectBreadcrumb-C_XiY7sc.js";
45
+ import { n as FolderBreadcrumbs_default, t as WorkflowActivator_default } from "./WorkflowActivator-BINnz0f7.js";
46
+ import { t as useAITemplatesStarterCollectionStore } from "./aiTemplatesStarterCollection.store-nL9nePkK.js";
47
+ import { n as useProjectPages, t as useReadyToRunStore } from "./readyToRun.store-YEMvPUqo.js";
48
+ import { t as useReadyToRunWorkflowsStore } from "./readyToRunWorkflows.store-G3srgIze.js";
49
+ import "./PageViewLayout-NT1KPFgy.js";
50
+ import { t as EmptySharedSectionActionBox_default } from "./EmptySharedSectionActionBox-DOXZtTCv.js";
51
+ import { t as ResourcesListLayout_default } from "./ResourcesListLayout-qBLtomK6.js";
52
+ import "./ResourceFiltersDropdown-dgyXpcEX.js";
53
+ import { t as ProjectHeader_default } from "./ProjectHeader-Dq5Ihb26.js";
54
+ import { t as useMCPStore } from "./mcp.store-B9yfcAN9.js";
55
+ import "./smartDecimal-DAZl4HKA.js";
56
+ import { t as InsightsSummary_default } from "./InsightsSummary-cmN1lHDm.js";
57
+ var _hoisted_1$5 = { "data-test-id": "folder-card" };
58
+ var _hoisted_2$1 = { key: 0 };
59
+ var FolderCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
60
+ __name: "FolderCard",
61
+ props: {
62
+ data: {},
63
+ personalProject: {},
64
+ actions: { default: () => [] },
65
+ readOnly: {
66
+ type: Boolean,
67
+ default: true
68
+ },
69
+ showOwnershipBadge: {
70
+ type: Boolean,
71
+ default: false
72
+ }
73
+ },
74
+ emits: ["action", "folderOpened"],
75
+ setup(__props, { emit: __emit }) {
76
+ const props = __props;
77
+ const i18n = useI18n();
78
+ const route = useRoute();
79
+ const router = useRouter();
80
+ const foldersStore = useFoldersStore();
81
+ const emit = __emit;
82
+ const hiddenBreadcrumbsItemsAsync = ref(new Promise(() => {}));
83
+ const cachedHiddenBreadcrumbsItems = ref([]);
84
+ const resourceTypeLabel = computed(() => i18n.baseText("generic.folder").toLowerCase());
85
+ const cardUrl = computed(() => {
86
+ return getFolderUrl(props.data.id);
87
+ });
88
+ const projectName = computed(() => {
89
+ if (props.data.homeProject?.type === ProjectTypes.Personal) return i18n.baseText("projects.menu.personal");
90
+ return props.data.homeProject?.name;
91
+ });
92
+ const cardBreadcrumbs = computed(() => {
93
+ if (props.data.parentFolder) return [{
94
+ id: props.data.parentFolder.id,
95
+ name: props.data.parentFolder.name,
96
+ label: props.data.parentFolder.name,
97
+ href: router.resolve({
98
+ name: VIEWS.PROJECTS_FOLDERS,
99
+ params: {
100
+ projectId: props.data.homeProject?.id,
101
+ folderId: props.data.parentFolder.id
102
+ }
103
+ }).href
104
+ }];
105
+ return [];
106
+ });
107
+ const showCardBreadcrumbs = computed(() => {
108
+ return props.showOwnershipBadge && cardBreadcrumbs.value.length;
109
+ });
110
+ const getFolderUrl = (folderId) => {
111
+ return router.resolve({
112
+ name: VIEWS.PROJECTS_FOLDERS,
113
+ params: {
114
+ projectId: route.params.projectId,
115
+ folderId
116
+ },
117
+ query: route.query
118
+ }).href;
119
+ };
120
+ const onAction = async (action) => {
121
+ if (action === FOLDER_LIST_ITEM_ACTIONS.OPEN) {
122
+ emit("folderOpened", { folder: props.data });
123
+ await router.push(cardUrl.value);
124
+ return;
125
+ }
126
+ emit("action", {
127
+ action,
128
+ folderId: props.data.id
129
+ });
130
+ };
131
+ const fetchHiddenBreadCrumbsItems = async () => {
132
+ if (!props.data.homeProject?.id || !projectName.value || !props.data.parentFolder) hiddenBreadcrumbsItemsAsync.value = Promise.resolve([]);
133
+ else {
134
+ if (cachedHiddenBreadcrumbsItems.value.length) {
135
+ hiddenBreadcrumbsItemsAsync.value = Promise.resolve(cachedHiddenBreadcrumbsItems.value);
136
+ return;
137
+ }
138
+ const loadedItem = foldersStore.getHiddenBreadcrumbsItems({
139
+ id: props.data.homeProject.id,
140
+ name: projectName.value
141
+ }, props.data.parentFolder.id);
142
+ hiddenBreadcrumbsItemsAsync.value = loadedItem;
143
+ cachedHiddenBreadcrumbsItems.value = await loadedItem;
144
+ }
145
+ };
146
+ const onBreadcrumbItemClick = async (item) => {
147
+ if (item.href) await router.push(item.href);
148
+ };
149
+ return (_ctx, _cache) => {
150
+ const _component_RouterLink = resolveComponent("RouterLink");
151
+ return openBlock(), createElementBlock("div", _hoisted_1$5, [createVNode(_component_RouterLink, {
152
+ to: cardUrl.value,
153
+ onClick: _cache[1] || (_cache[1] = () => emit("folderOpened", { folder: props.data }))
154
+ }, {
155
+ default: withCtx(() => [createVNode(unref(N8nCard_default), { class: normalizeClass(_ctx.$style.card) }, {
156
+ prepend: withCtx(() => [createVNode(unref(N8nIcon_default), {
157
+ "data-test-id": "folder-card-icon",
158
+ class: normalizeClass(_ctx.$style["folder-icon"]),
159
+ icon: "folder",
160
+ size: "xlarge",
161
+ "stroke-width": 1
162
+ }, null, 8, ["class"])]),
163
+ header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["card-header"]) }, [createVNode(unref(N8nHeading_default), {
164
+ tag: "h2",
165
+ bold: "",
166
+ size: "small",
167
+ "data-test-id": "folder-card-name"
168
+ }, {
169
+ default: withCtx(() => [createTextVNode(toDisplayString(_ctx.data.name), 1)]),
170
+ _: 1
171
+ }), _ctx.readOnly ? (openBlock(), createBlock(unref(N8nBadge_default), {
172
+ key: 0,
173
+ class: "ml-3xs",
174
+ theme: "tertiary",
175
+ bold: ""
176
+ }, {
177
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.item.readonly")), 1)]),
178
+ _: 1
179
+ })) : createCommentVNode("", true)], 2)]),
180
+ footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["card-footer"]) }, [
181
+ _ctx.data.workflowCount > 0 ? (openBlock(), createBlock(unref(N8nText_default), {
182
+ key: 0,
183
+ size: "small",
184
+ color: "text-light",
185
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--workflow-count"]]),
186
+ "data-test-id": "folder-card-folder-count"
187
+ }, {
188
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.workflow", { interpolate: { count: _ctx.data.workflowCount } })), 1)]),
189
+ _: 1
190
+ }, 8, ["class"])) : createCommentVNode("", true),
191
+ _ctx.data.subFolderCount > 0 ? (openBlock(), createBlock(unref(N8nText_default), {
192
+ key: 1,
193
+ size: "small",
194
+ color: "text-light",
195
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--workflow-count"]]),
196
+ "data-test-id": "folder-card-workflow-count"
197
+ }, {
198
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.folderCount", { interpolate: { count: _ctx.data.subFolderCount } })), 1)]),
199
+ _: 1
200
+ }, 8, ["class"])) : createCommentVNode("", true),
201
+ createVNode(unref(N8nText_default), {
202
+ size: "small",
203
+ color: "text-light",
204
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--updated"]]),
205
+ "data-test-id": "folder-card-last-updated"
206
+ }, {
207
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workerList.item.lastUpdated")) + " ", 1), createVNode(TimeAgo_default, { date: String(_ctx.data.updatedAt) }, null, 8, ["date"])]),
208
+ _: 1
209
+ }, 8, ["class"]),
210
+ createVNode(unref(N8nText_default), {
211
+ size: "small",
212
+ color: "text-light",
213
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--created"]]),
214
+ "data-test-id": "folder-card-created"
215
+ }, {
216
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.item.created")) + " ", 1), createVNode(TimeAgo_default, { date: String(_ctx.data.createdAt) }, null, 8, ["date"])]),
217
+ _: 1
218
+ }, 8, ["class"])
219
+ ], 2)]),
220
+ append: withCtx(() => [createBaseVNode("div", {
221
+ class: normalizeClass(_ctx.$style["card-actions"]),
222
+ onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"]))
223
+ }, [_ctx.data.homeProject && _ctx.showOwnershipBadge ? (openBlock(), createElementBlock("div", _hoisted_2$1, [createVNode(ProjectCardBadge_default, {
224
+ class: normalizeClass({
225
+ [_ctx.$style.cardBadge]: true,
226
+ [_ctx.$style["with-breadcrumbs"]]: showCardBreadcrumbs.value
227
+ }),
228
+ resource: _ctx.data,
229
+ "resource-type": unref(ResourceType).Workflow,
230
+ "resource-type-label": resourceTypeLabel.value,
231
+ "personal-project": _ctx.personalProject,
232
+ "show-badge-border": false
233
+ }, {
234
+ default: withCtx(() => [showCardBreadcrumbs.value ? (openBlock(), createElementBlock("div", {
235
+ key: 0,
236
+ class: normalizeClass(_ctx.$style.breadcrumbs)
237
+ }, [createVNode(unref(N8nBreadcrumbs_default), {
238
+ items: cardBreadcrumbs.value,
239
+ "hidden-items": _ctx.data.parentFolder?.parentFolderId !== null ? hiddenBreadcrumbsItemsAsync.value : void 0,
240
+ "path-truncated": _ctx.data.parentFolder?.parentFolderId !== null,
241
+ "highlight-last-item": false,
242
+ "hidden-items-trigger": "hover",
243
+ theme: "small",
244
+ "data-test-id": "folder-card-breadcrumbs",
245
+ onTooltipOpened: fetchHiddenBreadCrumbsItems,
246
+ onItemSelected: onBreadcrumbItemClick
247
+ }, {
248
+ prepend: withCtx(() => _cache[2] || (_cache[2] = [])),
249
+ _: 1
250
+ }, 8, [
251
+ "items",
252
+ "hidden-items",
253
+ "path-truncated"
254
+ ])], 2)) : createCommentVNode("", true)]),
255
+ _: 1
256
+ }, 8, [
257
+ "class",
258
+ "resource",
259
+ "resource-type",
260
+ "resource-type-label",
261
+ "personal-project"
262
+ ])])) : createCommentVNode("", true), _ctx.actions.length ? (openBlock(), createBlock(unref(N8nActionToggle_default), {
263
+ key: 1,
264
+ actions: _ctx.actions,
265
+ theme: "dark",
266
+ "data-test-id": "folder-card-actions",
267
+ onAction
268
+ }, null, 8, ["actions"])) : createCommentVNode("", true)], 2)]),
269
+ _: 1
270
+ }, 8, ["class"])]),
271
+ _: 1
272
+ }, 8, ["to"])]);
273
+ };
274
+ }
275
+ });
276
+ const card = "_card_19ska_123";
277
+ const cardBadge$1 = "_cardBadge_19ska_157";
278
+ var FolderCard_vue_vue_type_style_index_0_lang_module_default = {
279
+ card,
280
+ "folder-icon": "_folder-icon_19ska_131",
281
+ "card-header": "_card-header_19ska_140",
282
+ "card-footer": "_card-footer_19ska_148",
283
+ "info-cell": "_info-cell_19ska_152",
284
+ cardBadge: cardBadge$1,
285
+ "with-breadcrumbs": "_with-breadcrumbs_19ska_157",
286
+ "card-actions": "_card-actions_19ska_164",
287
+ "info-cell--created": "_info-cell--created_19ska_182"
288
+ };
289
+ var FolderCard_default = /* @__PURE__ */ __plugin_vue_export_helper_default(FolderCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": FolderCard_vue_vue_type_style_index_0_lang_module_default }]]);
290
+ var import_dateformat = /* @__PURE__ */ __toESM(require_dateformat());
291
+ var _hoisted_1$4 = { key: 0 };
292
+ var WorkflowCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
293
+ __name: "WorkflowCard",
294
+ props: {
295
+ data: {},
296
+ readOnly: {
297
+ type: Boolean,
298
+ default: false
299
+ },
300
+ workflowListEventBus: { default: void 0 },
301
+ showOwnershipBadge: {
302
+ type: Boolean,
303
+ default: false
304
+ },
305
+ areTagsEnabled: {
306
+ type: Boolean,
307
+ default: true
308
+ },
309
+ isMcpEnabled: {
310
+ type: Boolean,
311
+ default: false
312
+ },
313
+ areFoldersEnabled: {
314
+ type: Boolean,
315
+ default: false
316
+ }
317
+ },
318
+ emits: [
319
+ "expand:tags",
320
+ "click:tag",
321
+ "workflow:deleted",
322
+ "workflow:archived",
323
+ "workflow:unarchived",
324
+ "workflow:active-toggle",
325
+ "action:move-to-folder"
326
+ ],
327
+ setup(__props, { emit: __emit }) {
328
+ const WORKFLOW_LIST_ITEM_ACTIONS = {
329
+ OPEN: "open",
330
+ SHARE: "share",
331
+ DUPLICATE: "duplicate",
332
+ DELETE: "delete",
333
+ ARCHIVE: "archive",
334
+ UNARCHIVE: "unarchive",
335
+ MOVE: "move",
336
+ MOVE_TO_FOLDER: "moveToFolder",
337
+ ENABLE_MCP_ACCESS: "enableMCPAccess",
338
+ REMOVE_MCP_ACCESS: "removeMCPAccess"
339
+ };
340
+ const props = __props;
341
+ const emit = __emit;
342
+ const toast = useToast();
343
+ const message = useMessage();
344
+ const locale = useI18n();
345
+ const router = useRouter();
346
+ const route = useRoute();
347
+ const telemetry = useTelemetry();
348
+ const mcp = useMcp();
349
+ const uiStore = useUIStore();
350
+ const usersStore = useUsersStore();
351
+ const workflowsStore = useWorkflowsStore();
352
+ const projectsStore = useProjectsStore();
353
+ const foldersStore = useFoldersStore();
354
+ const mcpStore = useMCPStore();
355
+ const hiddenBreadcrumbsItemsAsync = ref(new Promise(() => {}));
356
+ const cachedHiddenBreadcrumbsItems = ref([]);
357
+ const mcpToggleStatus = ref(null);
358
+ const resourceTypeLabel = computed(() => locale.baseText("generic.workflow").toLowerCase());
359
+ const currentUser = computed(() => usersStore.currentUser ?? {});
360
+ const workflowPermissions = computed(() => getResourcePermissions(props.data.scopes).workflow);
361
+ const globalPermissions = computed(() => getResourcePermissions(usersStore.currentUser?.globalScopes).workflow);
362
+ const projectPermissions = computed(() => getResourcePermissions(projectsStore.myProjects?.find((p) => props.data.homeProject?.id === p.id)?.scopes).workflow);
363
+ const canCreateWorkflow = computed(() => globalPermissions.value.create ?? projectPermissions.value.create);
364
+ const showCardBreadcrumbs = computed(() => {
365
+ return props.showOwnershipBadge && !isSomeoneElsesWorkflow.value && cardBreadcrumbs.value.length;
366
+ });
367
+ const projectName = computed(() => {
368
+ if (props.data.homeProject?.type === ProjectTypes.Personal) return locale.baseText("projects.menu.personal");
369
+ return props.data.homeProject?.name;
370
+ });
371
+ const cardBreadcrumbs = computed(() => {
372
+ if (props.data.parentFolder) return [{
373
+ id: props.data.parentFolder.id,
374
+ name: props.data.parentFolder.name,
375
+ label: props.data.parentFolder.name,
376
+ href: router.resolve({
377
+ name: VIEWS.PROJECTS_FOLDERS,
378
+ params: {
379
+ projectId: props.data.homeProject?.id,
380
+ folderId: props.data.parentFolder.id
381
+ }
382
+ }).href
383
+ }];
384
+ return [];
385
+ });
386
+ const actions = computed(() => {
387
+ const items = [{
388
+ label: locale.baseText("workflows.item.open"),
389
+ value: WORKFLOW_LIST_ITEM_ACTIONS.OPEN
390
+ }, {
391
+ label: locale.baseText("workflows.item.share"),
392
+ value: WORKFLOW_LIST_ITEM_ACTIONS.SHARE
393
+ }];
394
+ if (workflowPermissions.value.read && canCreateWorkflow.value && !props.readOnly && !props.data.isArchived) items.push({
395
+ label: locale.baseText("workflows.item.duplicate"),
396
+ value: WORKFLOW_LIST_ITEM_ACTIONS.DUPLICATE
397
+ });
398
+ if (!props.readOnly && props.areFoldersEnabled && (workflowPermissions.value.update || workflowPermissions.value.move && projectsStore.isTeamProjectFeatureEnabled) && route.name !== VIEWS.SHARED_WORKFLOWS) items.push({
399
+ label: locale.baseText("folders.actions.moveToFolder"),
400
+ value: WORKFLOW_LIST_ITEM_ACTIONS.MOVE_TO_FOLDER
401
+ });
402
+ if (workflowPermissions.value.delete && !props.readOnly) if (!props.data.isArchived) items.push({
403
+ label: locale.baseText("workflows.item.archive"),
404
+ value: WORKFLOW_LIST_ITEM_ACTIONS.ARCHIVE
405
+ });
406
+ else {
407
+ items.push({
408
+ label: locale.baseText("workflows.item.delete"),
409
+ value: WORKFLOW_LIST_ITEM_ACTIONS.DELETE
410
+ });
411
+ items.push({
412
+ label: locale.baseText("workflows.item.unarchive"),
413
+ value: WORKFLOW_LIST_ITEM_ACTIONS.UNARCHIVE
414
+ });
415
+ }
416
+ if (props.isMcpEnabled && workflowPermissions.value.update && !props.readOnly && !props.data.isArchived) if (isAvailableInMCP.value) items.push({
417
+ label: locale.baseText("workflows.item.disableMCPAccess"),
418
+ value: WORKFLOW_LIST_ITEM_ACTIONS.REMOVE_MCP_ACCESS,
419
+ disabled: !props.data.active
420
+ });
421
+ else items.push({
422
+ label: locale.baseText("workflows.item.enableMCPAccess"),
423
+ value: WORKFLOW_LIST_ITEM_ACTIONS.ENABLE_MCP_ACCESS,
424
+ disabled: !props.data.active
425
+ });
426
+ return items;
427
+ });
428
+ const formattedCreatedAtDate = computed(() => {
429
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear().toString();
430
+ return (0, import_dateformat.default)(props.data.createdAt, `d mmmm${String(props.data.createdAt).startsWith(currentYear) ? "" : ", yyyy"}`);
431
+ });
432
+ const isAvailableInMCP = computed(() => {
433
+ if (mcpToggleStatus.value === null) return props.data.settings?.availableInMCP ?? false;
434
+ return mcpToggleStatus.value;
435
+ });
436
+ const isSomeoneElsesWorkflow = computed(() => props.data.homeProject?.type !== ProjectTypes.Team && props.data.homeProject?.id !== projectsStore.personalProject?.id);
437
+ const isDraftPublishEnabled = true;
438
+ const isWorkflowPublished = computed(() => {
439
+ return props.data.activeVersionId !== null;
440
+ });
441
+ async function onClick(event) {
442
+ if (event?.ctrlKey || event?.metaKey) {
443
+ const route$1 = router.resolve({
444
+ name: VIEWS.WORKFLOW,
445
+ params: { name: props.data.id }
446
+ });
447
+ window.open(route$1.href, "_blank");
448
+ return;
449
+ }
450
+ await router.push({
451
+ name: VIEWS.WORKFLOW,
452
+ params: { name: props.data.id }
453
+ });
454
+ }
455
+ function onClickTag(tagId, event) {
456
+ event.stopPropagation();
457
+ emit("click:tag", tagId, event);
458
+ }
459
+ function onExpandTags() {
460
+ emit("expand:tags");
461
+ }
462
+ async function onAction(action) {
463
+ switch (action) {
464
+ case WORKFLOW_LIST_ITEM_ACTIONS.OPEN:
465
+ await onClick();
466
+ break;
467
+ case WORKFLOW_LIST_ITEM_ACTIONS.DUPLICATE:
468
+ uiStore.openModalWithData({
469
+ name: DUPLICATE_MODAL_KEY,
470
+ data: {
471
+ id: props.data.id,
472
+ name: props.data.name,
473
+ tags: (props.data.tags ?? []).map((tag) => typeof tag !== "string" && "id" in tag ? tag.id : tag),
474
+ externalEventBus: props.workflowListEventBus,
475
+ parentFolderId: props.data.parentFolder?.id
476
+ }
477
+ });
478
+ break;
479
+ case WORKFLOW_LIST_ITEM_ACTIONS.SHARE:
480
+ uiStore.openModalWithData({
481
+ name: WORKFLOW_SHARE_MODAL_KEY,
482
+ data: { id: props.data.id }
483
+ });
484
+ telemetry.track("User opened sharing modal", {
485
+ workflow_id: props.data.id,
486
+ user_id_sharer: currentUser.value.id,
487
+ sub_view: "Workflows listing"
488
+ });
489
+ break;
490
+ case WORKFLOW_LIST_ITEM_ACTIONS.DELETE:
491
+ await deleteWorkflow();
492
+ break;
493
+ case WORKFLOW_LIST_ITEM_ACTIONS.ARCHIVE:
494
+ await archiveWorkflow();
495
+ break;
496
+ case WORKFLOW_LIST_ITEM_ACTIONS.UNARCHIVE:
497
+ await unarchiveWorkflow();
498
+ break;
499
+ case WORKFLOW_LIST_ITEM_ACTIONS.MOVE:
500
+ moveResource();
501
+ break;
502
+ case WORKFLOW_LIST_ITEM_ACTIONS.MOVE_TO_FOLDER:
503
+ emit("action:move-to-folder", {
504
+ id: props.data.id,
505
+ name: props.data.name,
506
+ parentFolderId: props.data.parentFolder?.id,
507
+ sharedWithProjects: props.data.sharedWithProjects,
508
+ homeProjectId: props.data.homeProject?.id
509
+ });
510
+ break;
511
+ case WORKFLOW_LIST_ITEM_ACTIONS.ENABLE_MCP_ACCESS:
512
+ await toggleMCPAccess(true);
513
+ break;
514
+ case WORKFLOW_LIST_ITEM_ACTIONS.REMOVE_MCP_ACCESS:
515
+ await toggleMCPAccess(false);
516
+ break;
517
+ }
518
+ }
519
+ async function toggleMCPAccess(enabled) {
520
+ try {
521
+ await mcpStore.toggleWorkflowMcpAccess(props.data.id, enabled);
522
+ mcpToggleStatus.value = enabled;
523
+ mcp.trackMcpAccessEnabledForWorkflow(props.data.id);
524
+ } catch (error) {
525
+ toast.showError(error, locale.baseText("workflowSettings.toggleMCP.error.title"));
526
+ return;
527
+ }
528
+ }
529
+ async function deleteWorkflow() {
530
+ if (await message.confirm(locale.baseText("mainSidebar.confirmMessage.workflowDelete.message", { interpolate: { workflowName: props.data.name } }), locale.baseText("mainSidebar.confirmMessage.workflowDelete.headline"), {
531
+ type: "warning",
532
+ confirmButtonText: locale.baseText("mainSidebar.confirmMessage.workflowDelete.confirmButtonText"),
533
+ cancelButtonText: locale.baseText("mainSidebar.confirmMessage.workflowDelete.cancelButtonText")
534
+ }) !== "confirm") return;
535
+ try {
536
+ await workflowsStore.deleteWorkflow(props.data.id);
537
+ } catch (error) {
538
+ toast.showError(error, locale.baseText("generic.deleteWorkflowError"));
539
+ return;
540
+ }
541
+ toast.showMessage({
542
+ title: locale.baseText("mainSidebar.showMessage.handleSelect1.title", { interpolate: { workflowName: props.data.name } }),
543
+ type: "success"
544
+ });
545
+ emit("workflow:deleted");
546
+ }
547
+ async function archiveWorkflow() {
548
+ if (props.data.active) {
549
+ if (await message.confirm(locale.baseText("mainSidebar.confirmMessage.workflowArchive.message", { interpolate: { workflowName: props.data.name } }), locale.baseText("mainSidebar.confirmMessage.workflowArchive.headline"), {
550
+ type: "warning",
551
+ confirmButtonText: locale.baseText("mainSidebar.confirmMessage.workflowArchive.confirmButtonText"),
552
+ cancelButtonText: locale.baseText("mainSidebar.confirmMessage.workflowArchive.cancelButtonText")
553
+ }) !== "confirm") return;
554
+ }
555
+ try {
556
+ await workflowsStore.archiveWorkflow(props.data.id);
557
+ } catch (error) {
558
+ toast.showError(error, locale.baseText("generic.archiveWorkflowError"));
559
+ return;
560
+ }
561
+ toast.showMessage({
562
+ title: locale.baseText("mainSidebar.showMessage.handleArchive.title", { interpolate: { workflowName: props.data.name } }),
563
+ type: "success"
564
+ });
565
+ emit("workflow:archived");
566
+ }
567
+ async function unarchiveWorkflow() {
568
+ try {
569
+ await workflowsStore.unarchiveWorkflow(props.data.id);
570
+ } catch (error) {
571
+ toast.showError(error, locale.baseText("generic.unarchiveWorkflowError"));
572
+ return;
573
+ }
574
+ toast.showMessage({
575
+ title: locale.baseText("mainSidebar.showMessage.handleUnarchive.title", { interpolate: { workflowName: props.data.name } }),
576
+ type: "success"
577
+ });
578
+ emit("workflow:unarchived");
579
+ }
580
+ const fetchHiddenBreadCrumbsItems = async () => {
581
+ if (!props.data.homeProject?.id || !projectName.value || !props.data.parentFolder) hiddenBreadcrumbsItemsAsync.value = Promise.resolve([]);
582
+ else {
583
+ if (cachedHiddenBreadcrumbsItems.value.length) {
584
+ hiddenBreadcrumbsItemsAsync.value = Promise.resolve(cachedHiddenBreadcrumbsItems.value);
585
+ return;
586
+ }
587
+ const loadedItem = foldersStore.getHiddenBreadcrumbsItems({
588
+ id: props.data.homeProject.id,
589
+ name: projectName.value
590
+ }, props.data.parentFolder.id);
591
+ hiddenBreadcrumbsItemsAsync.value = loadedItem;
592
+ cachedHiddenBreadcrumbsItems.value = await loadedItem;
593
+ }
594
+ };
595
+ function moveResource() {
596
+ uiStore.openModalWithData({
597
+ name: PROJECT_MOVE_RESOURCE_MODAL,
598
+ data: {
599
+ resource: props.data,
600
+ resourceType: ResourceType.Workflow,
601
+ resourceTypeLabel: resourceTypeLabel.value,
602
+ eventBus: props.workflowListEventBus
603
+ }
604
+ });
605
+ }
606
+ const onWorkflowActiveToggle = async (value) => {
607
+ emit("workflow:active-toggle", value);
608
+ if (!value.active && props.isMcpEnabled && isAvailableInMCP.value) {
609
+ mcpToggleStatus.value = null;
610
+ toast.showToast({
611
+ title: locale.baseText("mcp.workflowDeactivated.title"),
612
+ message: locale.baseText("mcp.workflowDeactivated.message"),
613
+ type: "info"
614
+ });
615
+ }
616
+ };
617
+ const onBreadcrumbItemClick = async (item) => {
618
+ if (item.href) await router.push(item.href);
619
+ };
620
+ const tags = computed(() => props.data.tags?.map((tag) => typeof tag === "string" ? {
621
+ id: tag,
622
+ name: tag
623
+ } : tag) ?? []);
624
+ return (_ctx, _cache) => {
625
+ return openBlock(), createBlock(unref(N8nCard_default), {
626
+ class: normalizeClass({
627
+ [_ctx.$style.cardLink]: true,
628
+ [_ctx.$style.cardArchived]: _ctx.data.isArchived
629
+ }),
630
+ "data-test-id": "workflow-card",
631
+ onClick
632
+ }, {
633
+ header: withCtx(() => [createVNode(unref(N8nText_default), {
634
+ tag: "h2",
635
+ bold: "",
636
+ class: normalizeClass({
637
+ [_ctx.$style.cardHeading]: true,
638
+ [_ctx.$style.cardHeadingArchived]: _ctx.data.isArchived
639
+ }),
640
+ "data-test-id": "workflow-card-name"
641
+ }, {
642
+ default: withCtx(() => [createTextVNode(toDisplayString(_ctx.data.name) + " ", 1), !workflowPermissions.value.update ? (openBlock(), createBlock(unref(N8nBadge_default), {
643
+ key: 0,
644
+ class: "ml-3xs",
645
+ theme: "tertiary",
646
+ bold: ""
647
+ }, {
648
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.item.readonly")), 1)]),
649
+ _: 1
650
+ })) : createCommentVNode("", true)]),
651
+ _: 1
652
+ }, 8, ["class"])]),
653
+ append: withCtx(() => [createBaseVNode("div", {
654
+ class: normalizeClass(_ctx.$style.cardActions),
655
+ onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
656
+ }, [
657
+ _ctx.showOwnershipBadge ? (openBlock(), createBlock(ProjectCardBadge_default, {
658
+ key: 0,
659
+ class: normalizeClass({
660
+ [_ctx.$style.cardBadge]: true,
661
+ [_ctx.$style["with-breadcrumbs"]]: showCardBreadcrumbs.value
662
+ }),
663
+ resource: _ctx.data,
664
+ "resource-type": unref(ResourceType).Workflow,
665
+ "resource-type-label": resourceTypeLabel.value,
666
+ "personal-project": unref(projectsStore).personalProject,
667
+ "show-badge-border": false
668
+ }, {
669
+ default: withCtx(() => [showCardBreadcrumbs.value ? (openBlock(), createElementBlock("div", {
670
+ key: 0,
671
+ class: normalizeClass(_ctx.$style.breadcrumbs)
672
+ }, [createVNode(unref(N8nBreadcrumbs_default), {
673
+ items: cardBreadcrumbs.value,
674
+ "hidden-items": _ctx.data.parentFolder?.parentFolderId !== null ? hiddenBreadcrumbsItemsAsync.value : void 0,
675
+ "path-truncated": _ctx.data.parentFolder?.parentFolderId !== null,
676
+ "highlight-last-item": false,
677
+ "hidden-items-trigger": "hover",
678
+ theme: "small",
679
+ "data-test-id": "workflow-card-breadcrumbs",
680
+ onTooltipOpened: fetchHiddenBreadCrumbsItems,
681
+ onItemSelected: onBreadcrumbItemClick
682
+ }, {
683
+ prepend: withCtx(() => _cache[2] || (_cache[2] = [])),
684
+ _: 1
685
+ }, 8, [
686
+ "items",
687
+ "hidden-items",
688
+ "path-truncated"
689
+ ])], 2)) : createCommentVNode("", true)]),
690
+ _: 1
691
+ }, 8, [
692
+ "class",
693
+ "resource",
694
+ "resource-type",
695
+ "resource-type-label",
696
+ "personal-project"
697
+ ])) : createCommentVNode("", true),
698
+ _ctx.data.isArchived ? (openBlock(), createBlock(unref(N8nText_default), {
699
+ key: 1,
700
+ color: "text-light",
701
+ size: "small",
702
+ bold: "",
703
+ class: "ml-s mr-s",
704
+ "data-test-id": "workflow-card-archived"
705
+ }, {
706
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.item.archived")), 1)]),
707
+ _: 1
708
+ })) : !unref(isDraftPublishEnabled) ? (openBlock(), createBlock(WorkflowActivator_default, {
709
+ key: 2,
710
+ class: "mr-s",
711
+ "is-archived": _ctx.data.isArchived,
712
+ "workflow-active": _ctx.data.active,
713
+ "workflow-id": _ctx.data.id,
714
+ "workflow-permissions": workflowPermissions.value,
715
+ "data-test-id": "workflow-card-activator",
716
+ "onUpdate:workflowActive": onWorkflowActiveToggle
717
+ }, null, 8, [
718
+ "is-archived",
719
+ "workflow-active",
720
+ "workflow-id",
721
+ "workflow-permissions"
722
+ ])) : createCommentVNode("", true),
723
+ unref(isDraftPublishEnabled) && !_ctx.data.isArchived ? (openBlock(), createElementBlock("div", {
724
+ key: 3,
725
+ class: normalizeClass(_ctx.$style.publishIndicator),
726
+ "data-test-id": "workflow-card-publish-indicator"
727
+ }, [createVNode(unref(N8nTooltip_default), { content: isWorkflowPublished.value ? unref(locale).baseText("generic.published") : unref(locale).baseText("generic.notPublished") }, {
728
+ default: withCtx(() => [isWorkflowPublished.value ? (openBlock(), createBlock(unref(N8nIcon_default), {
729
+ key: 0,
730
+ icon: "circle-check",
731
+ size: "large",
732
+ class: normalizeClass(_ctx.$style.publishIndicatorColor)
733
+ }, null, 8, ["class"])) : (openBlock(), createBlock(unref(N8nIcon_default), {
734
+ key: 1,
735
+ icon: "circle-minus",
736
+ size: "large",
737
+ class: normalizeClass(_ctx.$style.notPublishedIndicatorColor)
738
+ }, null, 8, ["class"]))]),
739
+ _: 1
740
+ }, 8, ["content"])], 2)) : createCommentVNode("", true),
741
+ createVNode(unref(N8nActionToggle_default), {
742
+ actions: actions.value,
743
+ theme: "dark",
744
+ "data-test-id": "workflow-card-actions",
745
+ onAction
746
+ }, null, 8, ["actions"])
747
+ ], 2)]),
748
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.cardDescription) }, [
749
+ withDirectives(createBaseVNode("span", null, [
750
+ createTextVNode(toDisplayString(unref(locale).baseText("workflows.item.updated")) + " ", 1),
751
+ createVNode(TimeAgo_default, { date: String(_ctx.data.updatedAt) }, null, 8, ["date"]),
752
+ _cache[1] || (_cache[1] = createTextVNode(" | "))
753
+ ], 512), [[vShow, _ctx.data]]),
754
+ withDirectives(createBaseVNode("span", null, [createTextVNode(toDisplayString(unref(locale).baseText("workflows.item.created")) + " " + toDisplayString(formattedCreatedAtDate.value) + " ", 1), props.isMcpEnabled && isAvailableInMCP.value ? (openBlock(), createElementBlock("span", _hoisted_1$4, "|")) : createCommentVNode("", true)], 512), [[vShow, _ctx.data]]),
755
+ withDirectives(createBaseVNode("span", {
756
+ class: normalizeClass([_ctx.$style["description-cell"], _ctx.$style["description-cell--mcp"]]),
757
+ "data-test-id": "workflow-card-mcp"
758
+ }, [createVNode(unref(N8nTooltip_default), {
759
+ placement: "right",
760
+ content: unref(locale).baseText("workflows.item.availableInMCP"),
761
+ "data-test-id": "workflow-card-mcp-tooltip"
762
+ }, {
763
+ default: withCtx(() => [createVNode(unref(N8nIcon_default), {
764
+ icon: "mcp",
765
+ size: "medium"
766
+ })]),
767
+ _: 1
768
+ }, 8, ["content"])], 2), [[vShow, props.isMcpEnabled && isAvailableInMCP.value]]),
769
+ props.areTagsEnabled && _ctx.data.tags && _ctx.data.tags.length > 0 ? withDirectives((openBlock(), createElementBlock("span", {
770
+ key: 0,
771
+ class: normalizeClass(_ctx.$style.cardTags)
772
+ }, [createVNode(unref(N8nTags_default), {
773
+ tags: tags.value,
774
+ "truncate-at": 3,
775
+ truncate: "",
776
+ "data-test-id": "workflow-card-tags",
777
+ "onClick:tag": onClickTag,
778
+ onExpand: onExpandTags
779
+ }, null, 8, ["tags"])], 2)), [[vShow, _ctx.data]]) : createCommentVNode("", true)
780
+ ], 2)]),
781
+ _: 1
782
+ }, 8, ["class"]);
783
+ };
784
+ }
785
+ });
786
+ const cardLink = "_cardLink_rvyuk_123";
787
+ const cardHeading = "_cardHeading_rvyuk_133";
788
+ const cardHeadingArchived = "_cardHeadingArchived_rvyuk_142";
789
+ const cardDescription = "_cardDescription_rvyuk_150";
790
+ const cardTags = "_cardTags_rvyuk_160";
791
+ const cardActions = "_cardActions_rvyuk_165";
792
+ const cardBadge = "_cardBadge_rvyuk_176";
793
+ const cardArchived = "_cardArchived_rvyuk_187";
794
+ const publishIndicator = "_publishIndicator_rvyuk_201";
795
+ const publishIndicatorColor = "_publishIndicatorColor_rvyuk_208";
796
+ const notPublishedIndicatorColor = "_notPublishedIndicatorColor_rvyuk_220";
797
+ const breadcrumbs = "_breadcrumbs_rvyuk_244";
798
+ var WorkflowCard_vue_vue_type_style_index_0_lang_module_default = {
799
+ cardLink,
800
+ cardHeading,
801
+ cardHeadingArchived,
802
+ "description-popper": "_description-popper_rvyuk_146",
803
+ cardDescription,
804
+ cardTags,
805
+ cardActions,
806
+ cardBadge,
807
+ "with-breadcrumbs": "_with-breadcrumbs_rvyuk_180",
808
+ cardArchived,
809
+ "description-cell--mcp": "_description-cell--mcp_rvyuk_193",
810
+ publishIndicator,
811
+ publishIndicatorColor,
812
+ notPublishedIndicatorColor,
813
+ breadcrumbs
814
+ };
815
+ var WorkflowCard_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowCard_vue_vue_type_style_index_0_lang_module_default }]]);
816
+ var DEFAULT_EDGE = 80;
817
+ var DEFAULT_MAX_SPEED = 20;
818
+ function useAutoScrollOnDrag(options) {
819
+ let frameId;
820
+ let scrollStep = 0;
821
+ const edgeSize = options.edgeSize ?? DEFAULT_EDGE;
822
+ const maxSpeed = options.maxSpeed ?? DEFAULT_MAX_SPEED;
823
+ const stopScrolling = () => {
824
+ scrollStep = 0;
825
+ if (frameId !== void 0) {
826
+ cancelAnimationFrame(frameId);
827
+ frameId = void 0;
828
+ }
829
+ };
830
+ const step = () => {
831
+ const container$1 = options.container.value;
832
+ if (!container$1 || scrollStep === 0) {
833
+ frameId = void 0;
834
+ return;
835
+ }
836
+ container$1.scrollBy({ top: scrollStep });
837
+ frameId = requestAnimationFrame(step);
838
+ };
839
+ const startScrolling = (delta) => {
840
+ scrollStep = delta;
841
+ frameId ??= requestAnimationFrame(step);
842
+ };
843
+ const handlePointerMove = (event) => {
844
+ const container$1 = options.container.value;
845
+ if (!container$1) {
846
+ stopScrolling();
847
+ return;
848
+ }
849
+ const { scrollHeight, clientHeight } = container$1;
850
+ if (scrollHeight <= clientHeight) {
851
+ stopScrolling();
852
+ return;
853
+ }
854
+ const rect = container$1.getBoundingClientRect();
855
+ const pointerY = event.clientY;
856
+ let direction = 0;
857
+ let distanceIntoEdge = 0;
858
+ if (pointerY < rect.top) {
859
+ direction = -1;
860
+ distanceIntoEdge = edgeSize;
861
+ } else if (pointerY > rect.bottom) {
862
+ direction = 1;
863
+ distanceIntoEdge = edgeSize;
864
+ } else {
865
+ const distanceToTop = pointerY - rect.top;
866
+ const distanceToBottom = rect.bottom - pointerY;
867
+ const isNearTop = distanceToTop < edgeSize;
868
+ const isNearBottom = distanceToBottom < edgeSize;
869
+ if (isNearTop || isNearBottom) if (!isNearBottom || distanceToTop <= distanceToBottom) {
870
+ direction = -1;
871
+ distanceIntoEdge = edgeSize - Math.min(distanceToTop, edgeSize);
872
+ } else {
873
+ direction = 1;
874
+ distanceIntoEdge = edgeSize - Math.min(distanceToBottom, edgeSize);
875
+ }
876
+ }
877
+ if (direction === 0) {
878
+ stopScrolling();
879
+ return;
880
+ }
881
+ const intensity = Math.min(distanceIntoEdge / edgeSize, 1);
882
+ startScrolling(direction * Math.max(2, intensity * maxSpeed));
883
+ };
884
+ const addListeners = () => {
885
+ window.addEventListener("mousemove", handlePointerMove);
886
+ };
887
+ const removeListeners = () => {
888
+ window.removeEventListener("mousemove", handlePointerMove);
889
+ };
890
+ watch([options.isActive, options.container], ([isActive, container$1], _prev, onCleanup) => {
891
+ removeListeners();
892
+ stopScrolling();
893
+ if (isActive && container$1) addListeners();
894
+ onCleanup(() => {
895
+ removeListeners();
896
+ stopScrolling();
897
+ });
898
+ }, { immediate: true });
899
+ onScopeDispose(() => {
900
+ removeListeners();
901
+ stopScrolling();
902
+ });
903
+ }
904
+ function isDropTarget(target) {
905
+ return target.type === "folder" || target.type === "project";
906
+ }
907
+ function isValidResourceType(value) {
908
+ return [
909
+ "folder",
910
+ "workflow",
911
+ "project"
912
+ ].includes(value);
913
+ }
914
+ function useFolders() {
915
+ const i18n = useI18n();
916
+ const foldersStore = useFoldersStore();
917
+ const isDragging = computed(() => {
918
+ return foldersStore.draggedElement !== null;
919
+ });
920
+ function validateFolderName(folderName) {
921
+ if (FOLDER_NAME_ILLEGAL_CHARACTERS_REGEX.test(folderName)) return i18n.baseText("folders.invalidName.invalidCharacters.message", { interpolate: { illegalChars: ILLEGAL_FOLDER_CHARACTERS.join(" ") } });
922
+ if (FOLDER_NAME_ONLY_DOTS_REGEX.test(folderName)) return i18n.baseText("folders.invalidName.only.dots.message");
923
+ if (folderName.startsWith(".")) return i18n.baseText("folders.invalidName.starts.with.dot..message");
924
+ if (folderName.trim() === "") return i18n.baseText("folders.invalidName.empty.message");
925
+ if (folderName.length > 128) return i18n.baseText("folders.invalidName.tooLong.message", { interpolate: { maxLength: 128 } });
926
+ return true;
927
+ }
928
+ function onDragStart(el) {
929
+ const eventTarget = el.closest("[data-target]");
930
+ if (!eventTarget) return;
931
+ const dragTarget = getDragAndDropTarget(eventTarget);
932
+ if (!dragTarget) return;
933
+ if (dragTarget.type === "folder" || dragTarget.type === "workflow") foldersStore.draggedElement = {
934
+ type: dragTarget.type,
935
+ id: dragTarget.id,
936
+ name: dragTarget.name
937
+ };
938
+ }
939
+ function onDragEnd() {
940
+ foldersStore.draggedElement = null;
941
+ foldersStore.activeDropTarget = null;
942
+ }
943
+ function onDragEnter(event) {
944
+ const eventTarget = event.target;
945
+ if (!eventTarget || !isDragging.value) return;
946
+ event.preventDefault();
947
+ event.stopPropagation();
948
+ const dragTarget = getDragAndDropTarget(eventTarget);
949
+ if (!dragTarget || dragTarget.type !== "folder") return;
950
+ foldersStore.activeDropTarget = {
951
+ type: dragTarget.type,
952
+ id: dragTarget.id,
953
+ name: dragTarget.name
954
+ };
955
+ }
956
+ function resetDropTarget() {
957
+ foldersStore.activeDropTarget = null;
958
+ }
959
+ function getDragAndDropTarget(el) {
960
+ const dragTarget = el.closest("[data-target]");
961
+ if (!dragTarget) return null;
962
+ const targetResource = dragTarget.dataset.target;
963
+ const targetId = dragTarget.dataset.resourceid;
964
+ const targetName = dragTarget.dataset.resourcename;
965
+ if (!targetResource || !targetId || !targetName || !isValidResourceType(targetResource)) return null;
966
+ return {
967
+ type: targetResource,
968
+ id: targetId,
969
+ name: targetName
970
+ };
971
+ }
972
+ function handleDrop(event) {
973
+ const eventTarget = event.target;
974
+ if (!eventTarget || !isDragging.value) return {};
975
+ event.preventDefault();
976
+ const draggedResourceId = foldersStore.draggedElement?.id;
977
+ const draggedResourceType = foldersStore.draggedElement?.type;
978
+ const draggedResourceName = foldersStore.draggedElement?.name;
979
+ if (!draggedResourceId || !draggedResourceType || !draggedResourceName) return {};
980
+ onDragEnd();
981
+ const dropTarget = getDragAndDropTarget(eventTarget);
982
+ if (!dropTarget || !isDropTarget(dropTarget)) return {};
983
+ return {
984
+ draggedResource: {
985
+ type: draggedResourceType,
986
+ id: draggedResourceId,
987
+ name: draggedResourceName
988
+ },
989
+ dropTarget: {
990
+ type: dropTarget.type,
991
+ id: dropTarget.id,
992
+ name: dropTarget.name
993
+ }
994
+ };
995
+ }
996
+ return {
997
+ validateFolderName,
998
+ onDragStart,
999
+ onDragEnd,
1000
+ onDragEnter,
1001
+ resetDropTarget,
1002
+ handleDrop
1003
+ };
1004
+ }
1005
+ var SIMPLE_TEMPLATES = [
1006
+ 6270,
1007
+ 5271,
1008
+ 2178
1009
+ ];
1010
+ var PREDEFINED_TEMPLATES_BY_NODE = {
1011
+ "n8n-nodes-base.gmail": [
1012
+ 5678,
1013
+ 4722,
1014
+ 5694
1015
+ ],
1016
+ "n8n-nodes-base.googleSheets": [
1017
+ 5694,
1018
+ 5690,
1019
+ 5906
1020
+ ],
1021
+ "n8n-nodes-base.telegram": [
1022
+ 5626,
1023
+ 2114,
1024
+ 4875
1025
+ ],
1026
+ "@n8n/n8n-nodes-langchain.openAi": [
1027
+ 2462,
1028
+ 2722,
1029
+ 2178
1030
+ ],
1031
+ "@n8n/n8n-nodes-langchain.googleGemini": [
1032
+ 5993,
1033
+ 6270,
1034
+ 5677
1035
+ ],
1036
+ "n8n-nodes-base.googleCalendar": [
1037
+ 2328,
1038
+ 3393,
1039
+ 2110
1040
+ ],
1041
+ "n8n-nodes-base.youTube": [
1042
+ 3188,
1043
+ 4846,
1044
+ 4506
1045
+ ],
1046
+ "n8n-nodes-base.airtable": [
1047
+ 3053,
1048
+ 2700,
1049
+ 2579
1050
+ ]
1051
+ };
1052
+ function getPredefinedFromSelected(selectedApps) {
1053
+ return Object.keys(PREDEFINED_TEMPLATES_BY_NODE).filter((node) => selectedApps.includes(node)).reduce((acc, app) => [...acc, ...PREDEFINED_TEMPLATES_BY_NODE[app]], []);
1054
+ }
1055
+ function getSuggestedTemplatesForLowCodingSkill(selectedApps) {
1056
+ if (selectedApps.length === 0) return SIMPLE_TEMPLATES;
1057
+ const predefinedSelected = getPredefinedFromSelected(selectedApps);
1058
+ if (predefinedSelected.length > 0) return predefinedSelected;
1059
+ return [];
1060
+ }
1061
+ function keepTop3Templates(templates) {
1062
+ if (templates.length <= 3) return templates;
1063
+ return Array.from(new Map(templates.map((t) => [t.id, t])).values()).sort((a, b) => b.totalViews - a.totalViews).slice(0, 3);
1064
+ }
1065
+ const usePersonalizedTemplatesStore = defineStore(STORES.PERSONALIZED_TEMPLATES, () => {
1066
+ const telemetry = useTelemetry();
1067
+ const posthogStore = usePostHog();
1068
+ const cloudPlanStore = useCloudPlanStore();
1069
+ const templatesStore = useTemplatesStore();
1070
+ const allSuggestedWorkflows = ref([]);
1071
+ const dismissedSuggestedWorkflowsStorage = useStorage(LOCAL_STORAGE_EXPERIMENTAL_DISMISSED_SUGGESTED_WORKFLOWS);
1072
+ const dismissedSuggestedWorkflows = computed(() => {
1073
+ return dismissedSuggestedWorkflowsStorage.value ? jsonParse(dismissedSuggestedWorkflowsStorage.value, { fallbackValue: [] }) : [];
1074
+ });
1075
+ const suggestedWorkflows = computed(() => allSuggestedWorkflows.value.filter(({ id }) => !dismissedSuggestedWorkflows.value.includes(id)));
1076
+ const dismissSuggestedWorkflow = (id) => {
1077
+ dismissedSuggestedWorkflowsStorage.value = JSON.stringify([...dismissedSuggestedWorkflows.value ?? [], id]);
1078
+ };
1079
+ const isFeatureEnabled = () => {
1080
+ return posthogStore.getVariant(TEMPLATE_ONBOARDING_EXPERIMENT.name) === TEMPLATE_ONBOARDING_EXPERIMENT.variantSuggestedTemplates && cloudPlanStore.userIsTrialing;
1081
+ };
1082
+ const trackUserWasRecommendedTemplates = (templateIds) => {
1083
+ telemetry.track("User was recommended personalized templates", { templateIds });
1084
+ };
1085
+ const trackUserClickedOnPersonalizedTemplate = (templateId) => {
1086
+ telemetry.track("User clicked on personalized template callout", { templateId });
1087
+ };
1088
+ const trackUserDismissedCallout = (templateId) => {
1089
+ telemetry.track("User dismissed personalized template callout", { templateId });
1090
+ };
1091
+ const fetchSuggestedWorkflows = async (codingSkill, selectedApps) => {
1092
+ if (!isFeatureEnabled()) return;
1093
+ try {
1094
+ if (codingSkill === 1) {
1095
+ const predefinedSelected = getSuggestedTemplatesForLowCodingSkill(selectedApps);
1096
+ if (predefinedSelected.length > 0) {
1097
+ const suggestedWorkflowsPromises$1 = predefinedSelected.map(async (id) => await templatesStore.fetchTemplateById(id.toString()));
1098
+ const top3Templates$1 = keepTop3Templates(await Promise.all(suggestedWorkflowsPromises$1));
1099
+ allSuggestedWorkflows.value = top3Templates$1;
1100
+ trackUserWasRecommendedTemplates(top3Templates$1.map((t) => t.id));
1101
+ return;
1102
+ }
1103
+ }
1104
+ const suggestedWorkflowsPromises = (await templatesStore.getWorkflows({
1105
+ categories: [],
1106
+ search: "",
1107
+ sort: "rank:desc",
1108
+ nodes: selectedApps.length > 0 ? selectedApps : void 0,
1109
+ combineWith: "or"
1110
+ })).slice(0, 3).map((workflow) => workflow.id).map(async (id) => await templatesStore.fetchTemplateById(id.toString()));
1111
+ const top3Templates = keepTop3Templates(await Promise.all(suggestedWorkflowsPromises));
1112
+ allSuggestedWorkflows.value = top3Templates;
1113
+ trackUserWasRecommendedTemplates(top3Templates.map((t) => t.id));
1114
+ } catch (error) {}
1115
+ };
1116
+ const getTemplateRoute = (id) => {
1117
+ return {
1118
+ name: VIEWS.TEMPLATE,
1119
+ params: { id }
1120
+ };
1121
+ };
1122
+ watch(() => cloudPlanStore.currentUserCloudInfo, async (userInfo) => {
1123
+ if (!userInfo) return;
1124
+ const codingSkill = cloudPlanStore.codingSkill;
1125
+ await fetchSuggestedWorkflows(codingSkill, cloudPlanStore.selectedApps ?? []);
1126
+ });
1127
+ return {
1128
+ isFeatureEnabled,
1129
+ suggestedWorkflows,
1130
+ dismissSuggestedWorkflow,
1131
+ trackUserClickedOnPersonalizedTemplate,
1132
+ trackUserDismissedCallout,
1133
+ getTemplateRoute
1134
+ };
1135
+ });
1136
+ var SuggestedWorkflowCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1137
+ __name: "SuggestedWorkflowCard",
1138
+ props: { data: {} },
1139
+ setup(__props) {
1140
+ const { data } = __props;
1141
+ const { dismissSuggestedWorkflow, getTemplateRoute, trackUserClickedOnPersonalizedTemplate, trackUserDismissedCallout } = usePersonalizedTemplatesStore();
1142
+ const locale = useI18n();
1143
+ const onDismissCallout = () => {
1144
+ trackUserDismissedCallout(data.id);
1145
+ dismissSuggestedWorkflow(data.id);
1146
+ };
1147
+ const onTryTemplate = () => {
1148
+ trackUserClickedOnPersonalizedTemplate(data.id);
1149
+ dismissSuggestedWorkflow(data.id);
1150
+ };
1151
+ return (_ctx, _cache) => {
1152
+ return openBlock(), createBlock(unref(N8nCallout_default), {
1153
+ theme: "secondary",
1154
+ iconless: true,
1155
+ class: normalizeClass(_ctx.$style["suggested-workflow-callout"]),
1156
+ slim: true
1157
+ }, {
1158
+ trailingContent: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["callout-trailing-content"]) }, [createVNode(unref(N8nLink_default), {
1159
+ "data-test-id": "suggested-workflow-button",
1160
+ size: "small",
1161
+ to: unref(getTemplateRoute)(unref(data).id),
1162
+ onClick: onTryTemplate
1163
+ }, {
1164
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.itemSuggestion.try")), 1)]),
1165
+ _: 1
1166
+ }, 8, ["to"]), createVNode(unref(N8nIcon_default), {
1167
+ size: "small",
1168
+ icon: "x",
1169
+ title: unref(locale).baseText("generic.dismiss"),
1170
+ class: "clickable",
1171
+ onClick: onDismissCallout
1172
+ }, null, 8, ["title"])], 2)]),
1173
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["callout-content"]) }, toDisplayString(unref(data).name), 3)]),
1174
+ _: 1
1175
+ }, 8, ["class"]);
1176
+ };
1177
+ }
1178
+ });
1179
+ var SuggestedWorkflowCard_vue_vue_type_style_index_0_lang_module_default = {
1180
+ "suggested-workflow-callout": "_suggested-workflow-callout_19l89_123",
1181
+ "callout-content": "_callout-content_19l89_129",
1182
+ "callout-trailing-content": "_callout-trailing-content_19l89_133"
1183
+ };
1184
+ var SuggestedWorkflowCard_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SuggestedWorkflowCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SuggestedWorkflowCard_vue_vue_type_style_index_0_lang_module_default }]]);
1185
+ var SuggestedWorkflows_vue_vue_type_style_index_0_lang_module_default = { "suggested-workflows": "_suggested-workflows_dbm58_123" };
1186
+ var _sfc_main = {};
1187
+ var _hoisted_1$3 = {
1188
+ class: "suggested-workflows",
1189
+ "data-test-id": "suggested-workflows"
1190
+ };
1191
+ function _sfc_render(_ctx, _cache) {
1192
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [renderSlot(_ctx.$slots, "default")]);
1193
+ }
1194
+ var SuggestedWorkflows_default = /* @__PURE__ */ __plugin_vue_export_helper_default(_sfc_main, [["render", _sfc_render], ["__cssModules", { "$style": SuggestedWorkflows_vue_vue_type_style_index_0_lang_module_default }]]);
1195
+ var NodeRecommendationCard_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ defineComponent({
1196
+ __name: "NodeRecommendationCard",
1197
+ props: { nodeName: {} },
1198
+ setup(__props) {
1199
+ const props = __props;
1200
+ const uiStore = useUIStore();
1201
+ const nodeTypesStore = useNodeTypesStore();
1202
+ const { trackMinicardClick } = usePersonalizedTemplatesV2Store();
1203
+ const nodeType = computed(() => nodeTypesStore.getNodeType(props.nodeName));
1204
+ const openModal = () => {
1205
+ trackMinicardClick(nodeType.value?.displayName ?? props.nodeName);
1206
+ uiStore.openModalWithData({
1207
+ name: EXPERIMENT_TEMPLATE_RECO_V2_KEY,
1208
+ data: { nodeName: props.nodeName }
1209
+ });
1210
+ };
1211
+ onMounted(async () => {
1212
+ await nodeTypesStore.loadNodeTypesIfNotLoaded();
1213
+ });
1214
+ return (_ctx, _cache) => {
1215
+ return openBlock(), createElementBlock("div", null, [createVNode(unref(N8nCard_default), {
1216
+ class: normalizeClass(_ctx.$style.nodeCard),
1217
+ hoverable: "",
1218
+ onClick: openModal
1219
+ }, {
1220
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.emptyStateCardContent) }, [createVNode(NodeIcon_default, {
1221
+ "node-type": nodeType.value,
1222
+ class: normalizeClass(_ctx.$style.nodeIcon),
1223
+ "stroke-width": 1.5
1224
+ }, null, 8, ["node-type", "class"]), createVNode(unref(N8nText_default), {
1225
+ size: "xsmall",
1226
+ class: "mt-xs pl-2xs pr-2xs",
1227
+ bold: true
1228
+ }, {
1229
+ default: withCtx(() => [createTextVNode(toDisplayString(nodeType.value?.displayName), 1)]),
1230
+ _: 1
1231
+ })], 2)]),
1232
+ _: 1
1233
+ }, 8, ["class"])]);
1234
+ };
1235
+ }
1236
+ });
1237
+ var NodeRecommendationCard_vue_vue_type_style_index_0_lang_module_default$1 = {
1238
+ nodeCard: "_nodeCard_urxa7_123",
1239
+ nodeIcon: "_nodeIcon_urxa7_133",
1240
+ emptyStateCardContent: "_emptyStateCardContent_urxa7_137"
1241
+ };
1242
+ var NodeRecommendationCard_default$1 = /* @__PURE__ */ __plugin_vue_export_helper_default(NodeRecommendationCard_vue_vue_type_script_setup_true_lang_default$1, [["__cssModules", { "$style": NodeRecommendationCard_vue_vue_type_style_index_0_lang_module_default$1 }]]);
1243
+ var _hoisted_1$2 = {
1244
+ key: 0,
1245
+ class: "text-center mt-3xl",
1246
+ "data-test-id": "list-empty-state"
1247
+ };
1248
+ var TemplateRecommendationV2_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1249
+ __name: "TemplateRecommendationV2",
1250
+ setup(__props) {
1251
+ const templateRecoV2Store = usePersonalizedTemplatesV2Store();
1252
+ const locale = useI18n();
1253
+ return (_ctx, _cache) => {
1254
+ return unref(templateRecoV2Store).nodes.length ? (openBlock(), createElementBlock("div", _hoisted_1$2, [createVNode(unref(N8nHeading_default), {
1255
+ tag: "h2",
1256
+ size: "medium",
1257
+ class: "mb-2xs",
1258
+ color: "text-light"
1259
+ }, {
1260
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.exploreTemplates")), 1)]),
1261
+ _: 1
1262
+ }), createBaseVNode("div", { class: normalizeClass(_ctx.$style.nodeCardsContainer) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(templateRecoV2Store).nodes, (node) => {
1263
+ return openBlock(), createBlock(NodeRecommendationCard_default$1, {
1264
+ key: node,
1265
+ "node-name": node
1266
+ }, null, 8, ["node-name"]);
1267
+ }), 128))], 2)])) : createCommentVNode("", true);
1268
+ };
1269
+ }
1270
+ });
1271
+ var TemplateRecommendationV2_vue_vue_type_style_index_0_lang_module_default = { nodeCardsContainer: "_nodeCardsContainer_ufnvi_123" };
1272
+ var TemplateRecommendationV2_default = /* @__PURE__ */ __plugin_vue_export_helper_default(TemplateRecommendationV2_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": TemplateRecommendationV2_vue_vue_type_style_index_0_lang_module_default }]]);
1273
+ var NodeRecommendationCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1274
+ __name: "NodeRecommendationCard",
1275
+ props: { nodeName: {} },
1276
+ setup(__props) {
1277
+ const props = __props;
1278
+ const uiStore = useUIStore();
1279
+ const nodeTypesStore = useNodeTypesStore();
1280
+ const { trackPersonalizationCardClick, markTemplateRecommendationInteraction } = usePersonalizedTemplatesV3Store();
1281
+ const nodeType = computed(() => nodeTypesStore.getNodeType(props.nodeName));
1282
+ const openModal = () => {
1283
+ trackPersonalizationCardClick();
1284
+ markTemplateRecommendationInteraction();
1285
+ uiStore.openModalWithData({
1286
+ name: EXPERIMENT_TEMPLATE_RECO_V3_KEY,
1287
+ data: { nodeName: props.nodeName }
1288
+ });
1289
+ };
1290
+ onMounted(async () => {
1291
+ await nodeTypesStore.loadNodeTypesIfNotLoaded();
1292
+ });
1293
+ return (_ctx, _cache) => {
1294
+ return openBlock(), createElementBlock("div", null, [createVNode(unref(N8nCard_default), {
1295
+ class: normalizeClass(_ctx.$style.nodeCard),
1296
+ hoverable: "",
1297
+ onClick: openModal
1298
+ }, {
1299
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.emptyStateCardContent) }, [createVNode(NodeIcon_default, {
1300
+ "node-type": nodeType.value,
1301
+ class: normalizeClass(_ctx.$style.nodeIcon),
1302
+ "stroke-width": 1.5
1303
+ }, null, 8, ["node-type", "class"]), createVNode(unref(N8nText_default), {
1304
+ size: "xsmall",
1305
+ class: "mt-xs pl-2xs pr-2xs",
1306
+ bold: true
1307
+ }, {
1308
+ default: withCtx(() => [createTextVNode(toDisplayString(nodeType.value?.displayName), 1)]),
1309
+ _: 1
1310
+ })], 2)]),
1311
+ _: 1
1312
+ }, 8, ["class"])]);
1313
+ };
1314
+ }
1315
+ });
1316
+ var NodeRecommendationCard_vue_vue_type_style_index_0_lang_module_default = {
1317
+ nodeCard: "_nodeCard_urxa7_123",
1318
+ nodeIcon: "_nodeIcon_urxa7_133",
1319
+ emptyStateCardContent: "_emptyStateCardContent_urxa7_137"
1320
+ };
1321
+ var NodeRecommendationCard_default = /* @__PURE__ */ __plugin_vue_export_helper_default(NodeRecommendationCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": NodeRecommendationCard_vue_vue_type_style_index_0_lang_module_default }]]);
1322
+ var _hoisted_1$1 = {
1323
+ key: 0,
1324
+ class: "text-center mt-3xl",
1325
+ "data-test-id": "list-empty-state"
1326
+ };
1327
+ var TemplateRecommendationV3_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1328
+ __name: "TemplateRecommendationV3",
1329
+ setup(__props) {
1330
+ const personalizedTemplateStore = usePersonalizedTemplatesV3Store();
1331
+ const locale = useI18n();
1332
+ return (_ctx, _cache) => {
1333
+ return unref(personalizedTemplateStore).hasChosenHubSpot ? (openBlock(), createElementBlock("div", _hoisted_1$1, [createVNode(unref(N8nHeading_default), {
1334
+ tag: "h2",
1335
+ size: "medium",
1336
+ class: "mb-2xs",
1337
+ color: "text-light"
1338
+ }, {
1339
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("experiments.personalizedTemplatesV3.exploreTemplates")), 1)]),
1340
+ _: 1
1341
+ }), createBaseVNode("div", { class: normalizeClass(_ctx.$style.nodeCardsContainer) }, [createVNode(NodeRecommendationCard_default, { "node-name": "n8n-nodes-base.hubspot" })], 2)])) : createCommentVNode("", true);
1342
+ };
1343
+ }
1344
+ });
1345
+ var TemplateRecommendationV3_vue_vue_type_style_index_0_lang_module_default = { nodeCardsContainer: "_nodeCardsContainer_ufnvi_123" };
1346
+ var TemplateRecommendationV3_default = /* @__PURE__ */ __plugin_vue_export_helper_default(TemplateRecommendationV3_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": TemplateRecommendationV3_vue_vue_type_style_index_0_lang_module_default }]]);
1347
+ var TemplatesDataQualityInlineSection_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1348
+ __name: "TemplatesDataQualityInlineSection",
1349
+ setup(__props) {
1350
+ const locale = useI18n();
1351
+ const templatesStore = useTemplatesDataQualityStore();
1352
+ const { websiteTemplateRepositoryURL } = storeToRefs(useTemplatesStore());
1353
+ const templates = ref([]);
1354
+ const isLoadingTemplates = ref(false);
1355
+ onMounted(async () => {
1356
+ isLoadingTemplates.value = true;
1357
+ try {
1358
+ templates.value = await templatesStore.loadExperimentTemplates();
1359
+ } finally {
1360
+ isLoadingTemplates.value = false;
1361
+ }
1362
+ });
1363
+ return (_ctx, _cache) => {
1364
+ return openBlock(), createElementBlock("section", {
1365
+ class: normalizeClass(_ctx.$style.container),
1366
+ "data-test-id": "templates-data-quality-inline"
1367
+ }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createVNode(unref(N8nText_default), {
1368
+ tag: "h2",
1369
+ size: "large",
1370
+ bold: true
1371
+ }, {
1372
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.empty.startWithTemplate")), 1)]),
1373
+ _: 1
1374
+ }), createVNode(unref(N8nLink_default), {
1375
+ href: unref(websiteTemplateRepositoryURL),
1376
+ class: normalizeClass(_ctx.$style.allTemplatesLink)
1377
+ }, {
1378
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templatesDataQuality.seeMoreTemplates")), 1)]),
1379
+ _: 1
1380
+ }, 8, ["href", "class"])], 2), isLoadingTemplates.value ? (openBlock(), createElementBlock("div", {
1381
+ key: 0,
1382
+ class: normalizeClass(_ctx.$style.loading)
1383
+ }, [createVNode(unref(N8nSpinner_default), { size: "small" }), createVNode(unref(N8nText_default), { size: "small" }, {
1384
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templatesDataQuality.loadingTemplates")), 1)]),
1385
+ _: 1
1386
+ })], 2)) : (openBlock(), createElementBlock("div", {
1387
+ key: 1,
1388
+ class: normalizeClass(_ctx.$style.suggestions)
1389
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(templates.value, (template, index) => {
1390
+ return openBlock(), createBlock(TemplateCard_default, {
1391
+ key: template.id,
1392
+ template,
1393
+ "tile-number": index + 1
1394
+ }, null, 8, ["template", "tile-number"]);
1395
+ }), 128))], 2))], 2);
1396
+ };
1397
+ }
1398
+ });
1399
+ var TemplatesDataQualityInlineSection_vue_vue_type_style_index_0_lang_module_default = {
1400
+ container: "_container_sgzkf_123",
1401
+ header: "_header_sgzkf_140",
1402
+ allTemplatesLink: "_allTemplatesLink_sgzkf_156",
1403
+ suggestions: "_suggestions_sgzkf_160",
1404
+ loading: "_loading_sgzkf_179"
1405
+ };
1406
+ var TemplatesDataQualityInlineSection_default = /* @__PURE__ */ __plugin_vue_export_helper_default(TemplatesDataQualityInlineSection_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": TemplatesDataQualityInlineSection_vue_vue_type_style_index_0_lang_module_default }]]);
1407
+ var EmptyStateLayout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1408
+ __name: "EmptyStateLayout",
1409
+ emits: ["click:add"],
1410
+ setup(__props, { emit: __emit }) {
1411
+ const emit = __emit;
1412
+ const route = useRoute();
1413
+ const i18n = useI18n();
1414
+ const toast = useToast();
1415
+ const usersStore = useUsersStore();
1416
+ const projectsStore = useProjectsStore();
1417
+ const sourceControlStore = useSourceControlStore();
1418
+ const projectPages = useProjectPages();
1419
+ const readyToRunStore = useReadyToRunStore();
1420
+ const templatesDataQualityStore = useTemplatesDataQualityStore();
1421
+ const isLoadingReadyToRun = ref(false);
1422
+ const currentUser = computed(() => usersStore.currentUser ?? {});
1423
+ const personalProject = computed(() => projectsStore.personalProject);
1424
+ const readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);
1425
+ const projectPermissions = computed(() => {
1426
+ return getResourcePermissions(projectsStore.currentProject?.scopes ?? personalProject.value?.scopes);
1427
+ });
1428
+ const emptyListDescription = computed(() => {
1429
+ if (readOnlyEnv.value) return i18n.baseText("workflows.empty.description.readOnlyEnv");
1430
+ else if (!projectPermissions.value.workflow.create) return i18n.baseText("workflows.empty.description.noPermission");
1431
+ else return i18n.baseText("workflows.empty.description");
1432
+ });
1433
+ const showReadyToRunCard = computed(() => {
1434
+ return isLoadingReadyToRun.value || readyToRunStore.getCardVisibility(projectPermissions.value.workflow.create, readOnlyEnv.value);
1435
+ });
1436
+ const showTemplatesDataQualityInline = computed(() => {
1437
+ return templatesDataQualityStore.isFeatureEnabled() && !readOnlyEnv.value && projectPermissions.value.workflow.create;
1438
+ });
1439
+ const handleReadyToRunClick = async () => {
1440
+ if (isLoadingReadyToRun.value) return;
1441
+ isLoadingReadyToRun.value = true;
1442
+ const projectId = projectPages.isOverviewSubPage ? personalProject.value?.id : route.params.projectId;
1443
+ try {
1444
+ await readyToRunStore.claimCreditsAndOpenWorkflow("card", route.params.folderId, projectId);
1445
+ } catch (error) {
1446
+ isLoadingReadyToRun.value = false;
1447
+ toast.showError(error, i18n.baseText("generic.error"));
1448
+ }
1449
+ };
1450
+ const addWorkflow = () => {
1451
+ emit("click:add");
1452
+ };
1453
+ return (_ctx, _cache) => {
1454
+ return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.emptyStateLayout) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [
1455
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.welcome) }, [createVNode(unref(N8nHeading_default), {
1456
+ tag: "h1",
1457
+ size: "2xlarge",
1458
+ class: normalizeClass(_ctx.$style.welcomeTitle)
1459
+ }, {
1460
+ default: withCtx(() => [createTextVNode(toDisplayString(currentUser.value.firstName ? unref(i18n).baseText("workflows.empty.heading", { interpolate: { name: currentUser.value.firstName } }) : unref(i18n).baseText("workflows.empty.heading.userNotSetup")), 1)]),
1461
+ _: 1
1462
+ }, 8, ["class"]), createVNode(unref(N8nText_default), {
1463
+ size: "large",
1464
+ color: "text-base",
1465
+ class: normalizeClass(_ctx.$style.welcomeDescription)
1466
+ }, {
1467
+ default: withCtx(() => [createTextVNode(toDisplayString(emptyListDescription.value), 1)]),
1468
+ _: 1
1469
+ }, 8, ["class"])], 2),
1470
+ !readOnlyEnv.value && projectPermissions.value.workflow.create ? (openBlock(), createElementBlock("div", {
1471
+ key: 0,
1472
+ class: normalizeClass(_ctx.$style.actionsContainer)
1473
+ }, [showReadyToRunCard.value ? (openBlock(), createBlock(unref(N8nCard_default), {
1474
+ key: 0,
1475
+ class: normalizeClass([_ctx.$style.actionCard, { [_ctx.$style.loading]: isLoadingReadyToRun.value }]),
1476
+ hoverable: !isLoadingReadyToRun.value,
1477
+ "data-test-id": "ready-to-run-card",
1478
+ onClick: handleReadyToRunClick
1479
+ }, {
1480
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.cardContent) }, [createVNode(unref(N8nIcon_default), {
1481
+ class: normalizeClass(_ctx.$style.cardIcon),
1482
+ icon: isLoadingReadyToRun.value ? "spinner" : "sparkles",
1483
+ color: "foreground-dark",
1484
+ "stroke-width": 1.5,
1485
+ spin: isLoadingReadyToRun.value
1486
+ }, null, 8, [
1487
+ "class",
1488
+ "icon",
1489
+ "spin"
1490
+ ]), createVNode(unref(N8nText_default), {
1491
+ size: "large",
1492
+ class: "mt-xs"
1493
+ }, {
1494
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.empty.readyToRun")), 1)]),
1495
+ _: 1
1496
+ })], 2)]),
1497
+ _: 1
1498
+ }, 8, ["class", "hoverable"])) : createCommentVNode("", true), createVNode(unref(N8nCard_default), {
1499
+ class: normalizeClass(_ctx.$style.actionCard),
1500
+ hoverable: "",
1501
+ "data-test-id": "new-workflow-card",
1502
+ onClick: addWorkflow
1503
+ }, {
1504
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.cardContent) }, [createVNode(unref(N8nIcon_default), {
1505
+ class: normalizeClass(_ctx.$style.cardIcon),
1506
+ icon: "file",
1507
+ color: "foreground-dark",
1508
+ "stroke-width": 1.5
1509
+ }, null, 8, ["class"]), createVNode(unref(N8nText_default), {
1510
+ size: "large",
1511
+ class: "mt-xs"
1512
+ }, {
1513
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.empty.startFromScratch")), 1)]),
1514
+ _: 1
1515
+ })], 2)]),
1516
+ _: 1
1517
+ }, 8, ["class"])], 2)) : createCommentVNode("", true),
1518
+ showTemplatesDataQualityInline.value ? (openBlock(), createElementBlock("div", {
1519
+ key: 1,
1520
+ class: normalizeClass(_ctx.$style.templatesSection)
1521
+ }, [createVNode(TemplatesDataQualityInlineSection_default)], 2)) : createCommentVNode("", true)
1522
+ ], 2)], 2);
1523
+ };
1524
+ }
1525
+ });
1526
+ var EmptyStateLayout_vue_vue_type_style_index_0_lang_module_default = {
1527
+ emptyStateLayout: "_emptyStateLayout_53uc9_123",
1528
+ content: "_content_53uc9_132",
1529
+ welcome: "_welcome_53uc9_140",
1530
+ welcomeTitle: "_welcomeTitle_53uc9_144",
1531
+ welcomeDescription: "_welcomeDescription_53uc9_148",
1532
+ actionsContainer: "_actionsContainer_53uc9_152",
1533
+ actionCard: "_actionCard_53uc9_159",
1534
+ cardIcon: "_cardIcon_53uc9_172",
1535
+ loading: "_loading_53uc9_175",
1536
+ cardContent: "_cardContent_53uc9_180",
1537
+ templatesSection: "_templatesSection_53uc9_196"
1538
+ };
1539
+ var EmptyStateLayout_default = /* @__PURE__ */ __plugin_vue_export_helper_default(EmptyStateLayout_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": EmptyStateLayout_vue_vue_type_style_index_0_lang_module_default }]]);
1540
+ var import_debounce = /* @__PURE__ */ __toESM(require_debounce());
1541
+ var _hoisted_1 = { key: 0 };
1542
+ var _hoisted_2 = { key: 0 };
1543
+ var _hoisted_3 = { key: 1 };
1544
+ var _hoisted_4 = { key: 1 };
1545
+ var _hoisted_5 = { key: 1 };
1546
+ var _hoisted_6 = {
1547
+ class: "text-center mt-s",
1548
+ "data-test-id": "list-empty-state"
1549
+ };
1550
+ var _hoisted_7 = {
1551
+ key: 0,
1552
+ class: "mb-s"
1553
+ };
1554
+ var _hoisted_8 = { class: "mb-s" };
1555
+ var _hoisted_9 = { class: "mb-s" };
1556
+ var SEARCH_DEBOUNCE_TIME = 300;
1557
+ var FILTERS_DEBOUNCE_TIME = 100;
1558
+ var WorkflowsView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1559
+ __name: "WorkflowsView",
1560
+ setup(__props) {
1561
+ const StatusFilter = {
1562
+ ALL: "",
1563
+ ACTIVE: "active",
1564
+ DEACTIVATED: "deactivated"
1565
+ };
1566
+ const WORKFLOWS_SORT_MAP = {
1567
+ lastUpdated: "updatedAt:desc",
1568
+ lastCreated: "createdAt:desc",
1569
+ nameAsc: "name:asc",
1570
+ nameDesc: "name:desc"
1571
+ };
1572
+ const i18n = useI18n();
1573
+ const route = useRoute();
1574
+ const router = useRouter();
1575
+ const message = useMessage();
1576
+ const toast = useToast();
1577
+ const folderHelpers = useFolders();
1578
+ const calloutHelpers = useCalloutHelpers();
1579
+ const sourceControlStore = useSourceControlStore();
1580
+ const usersStore = useUsersStore();
1581
+ const workflowsStore = useWorkflowsStore();
1582
+ const settingsStore = useSettingsStore();
1583
+ const projectsStore = useProjectsStore();
1584
+ const telemetry = useTelemetry();
1585
+ const uiStore = useUIStore();
1586
+ const tagsStore = useTagsStore();
1587
+ const foldersStore = useFoldersStore();
1588
+ const usageStore = useUsageStore();
1589
+ const insightsStore = useInsightsStore();
1590
+ const aiStarterTemplatesStore = useAITemplatesStarterCollectionStore();
1591
+ const personalizedTemplatesStore = usePersonalizedTemplatesStore();
1592
+ const readyToRunWorkflowsStore = useReadyToRunWorkflowsStore();
1593
+ const personalizedTemplatesV2Store = usePersonalizedTemplatesV2Store();
1594
+ const personalizedTemplatesV3Store = usePersonalizedTemplatesV3Store();
1595
+ const readyToRunStore = useReadyToRunStore();
1596
+ const templatesDataQualityStore = useTemplatesDataQualityStore();
1597
+ const documentTitle = useDocumentTitle();
1598
+ const { callDebounced } = useDebounce();
1599
+ const projectPages = useProjectPages();
1600
+ const loading$2 = ref(true);
1601
+ const breadcrumbsLoading = ref(false);
1602
+ const filters = ref({
1603
+ search: "",
1604
+ homeProject: "",
1605
+ status: StatusFilter.ALL,
1606
+ showArchived: false,
1607
+ tags: []
1608
+ });
1609
+ const workflowListEventBus = createEventBus();
1610
+ const resourcesListLayoutRef = useTemplateRef("resourcesListLayout");
1611
+ const workflowsAndFolders = ref([]);
1612
+ const easyAICalloutVisible = ref(true);
1613
+ const currentPage = ref(1);
1614
+ const pageSize = ref(50);
1615
+ const currentSort = ref("updatedAt:desc");
1616
+ const currentFolderId = ref(null);
1617
+ const showCardsBadge = ref(false);
1618
+ const folderActions = computed(() => [
1619
+ {
1620
+ label: i18n.baseText("generic.open"),
1621
+ value: FOLDER_LIST_ITEM_ACTIONS.OPEN,
1622
+ disabled: false,
1623
+ onlyAvailableOn: "card"
1624
+ },
1625
+ {
1626
+ label: i18n.baseText("folders.actions.create"),
1627
+ value: FOLDER_LIST_ITEM_ACTIONS.CREATE,
1628
+ disabled: readOnlyEnv.value || !hasPermissionToCreateFolders.value
1629
+ },
1630
+ {
1631
+ label: i18n.baseText("folders.actions.create.workflow"),
1632
+ value: FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW,
1633
+ disabled: readOnlyEnv.value || !hasPermissionToCreateWorkflows.value
1634
+ },
1635
+ {
1636
+ label: i18n.baseText("generic.rename"),
1637
+ value: FOLDER_LIST_ITEM_ACTIONS.RENAME,
1638
+ disabled: readOnlyEnv.value || !hasPermissionToUpdateFolders.value
1639
+ },
1640
+ {
1641
+ label: i18n.baseText("folders.actions.moveToFolder"),
1642
+ value: FOLDER_LIST_ITEM_ACTIONS.MOVE,
1643
+ disabled: readOnlyEnv.value || !hasPermissionToUpdateFolders.value
1644
+ },
1645
+ {
1646
+ label: i18n.baseText("generic.delete"),
1647
+ value: FOLDER_LIST_ITEM_ACTIONS.DELETE,
1648
+ disabled: readOnlyEnv.value || !hasPermissionToDeleteFolders.value
1649
+ }
1650
+ ]);
1651
+ const folderCardActions = computed(() => folderActions.value.filter((action) => !action.onlyAvailableOn || action.onlyAvailableOn === "card"));
1652
+ const mainBreadcrumbsActions = computed(() => folderActions.value.filter((action) => !action.onlyAvailableOn || action.onlyAvailableOn === "mainBreadcrumbs"));
1653
+ const readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);
1654
+ const currentUser = computed(() => usersStore.currentUser ?? {});
1655
+ const isShareable = computed(() => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]);
1656
+ const foldersEnabled = computed(() => {
1657
+ return settingsStore.isFoldersFeatureEnabled;
1658
+ });
1659
+ const teamProjectsEnabled = computed(() => {
1660
+ return projectsStore.isTeamProjectFeatureEnabled;
1661
+ });
1662
+ const mcpEnabled = computed(() => {
1663
+ return settingsStore.isModuleActive("mcp") && settingsStore.moduleSettings.mcp?.mcpAccessEnabled;
1664
+ });
1665
+ const showFolders = computed(() => {
1666
+ return foldersEnabled.value && !projectPages.isOverviewSubPage && !projectPages.isSharedSubPage;
1667
+ });
1668
+ const currentFolder = computed(() => {
1669
+ return currentFolderId.value ? foldersStore.breadcrumbsCache[currentFolderId.value] : null;
1670
+ });
1671
+ const currentFolderParent = computed(() => {
1672
+ return currentFolder.value?.parentFolder ? foldersStore.breadcrumbsCache[currentFolder.value.parentFolder] : null;
1673
+ });
1674
+ const isDragging = computed(() => {
1675
+ return foldersStore.draggedElement !== null;
1676
+ });
1677
+ const isDragNDropEnabled = computed(() => {
1678
+ return !readOnlyEnv.value && hasPermissionToUpdateFolders.value;
1679
+ });
1680
+ const listScrollContainer = computed(() => {
1681
+ return resourcesListLayoutRef.value?.getScrollContainer?.() ?? null;
1682
+ });
1683
+ useAutoScrollOnDrag({
1684
+ isActive: computed(() => isDragging.value && isDragNDropEnabled.value),
1685
+ container: listScrollContainer
1686
+ });
1687
+ const hasPermissionToCreateFolders = computed(() => {
1688
+ if (!currentProject.value) return false;
1689
+ return getResourcePermissions(currentProject.value.scopes).folder.create === true;
1690
+ });
1691
+ const hasPermissionToUpdateFolders = computed(() => {
1692
+ if (!currentProject.value) return false;
1693
+ return getResourcePermissions(currentProject.value.scopes).folder.update === true;
1694
+ });
1695
+ const hasPermissionToDeleteFolders = computed(() => {
1696
+ if (!currentProject.value) return false;
1697
+ return getResourcePermissions(currentProject.value.scopes).folder.delete === true;
1698
+ });
1699
+ const hasPermissionToCreateWorkflows = computed(() => {
1700
+ if (!currentProject.value) return false;
1701
+ return getResourcePermissions(currentProject.value.scopes).workflow.create === true;
1702
+ });
1703
+ const currentProject = computed(() => projectsStore.currentProject);
1704
+ const projectName = computed(() => {
1705
+ if (currentProject.value?.type === ProjectTypes.Personal) return i18n.baseText("projects.menu.personal");
1706
+ return currentProject.value?.name;
1707
+ });
1708
+ const currentParentName = computed(() => {
1709
+ if (currentFolder.value) return currentFolder.value.name;
1710
+ return projectName.value;
1711
+ });
1712
+ const personalProject = computed(() => {
1713
+ return projectsStore.personalProject;
1714
+ });
1715
+ const workflowListResources = computed(() => {
1716
+ return (workflowsAndFolders.value || []).map((resource) => {
1717
+ if (resource.resource === "folder") return {
1718
+ resourceType: "folder",
1719
+ id: resource.id,
1720
+ name: resource.name,
1721
+ createdAt: resource.createdAt.toString(),
1722
+ updatedAt: resource.updatedAt.toString(),
1723
+ homeProject: resource.homeProject,
1724
+ workflowCount: resource.workflowCount,
1725
+ subFolderCount: resource.subFolderCount,
1726
+ parentFolder: resource.parentFolder
1727
+ };
1728
+ else return {
1729
+ resourceType: "workflow",
1730
+ id: resource.id,
1731
+ name: resource.name,
1732
+ description: resource.description,
1733
+ active: resource.active ?? false,
1734
+ activeVersionId: resource.activeVersionId,
1735
+ isArchived: resource.isArchived,
1736
+ updatedAt: resource.updatedAt.toString(),
1737
+ createdAt: resource.createdAt.toString(),
1738
+ homeProject: resource.homeProject,
1739
+ scopes: resource.scopes,
1740
+ sharedWithProjects: resource.sharedWithProjects,
1741
+ readOnly: !getResourcePermissions(resource.scopes).workflow.update,
1742
+ tags: resource.tags,
1743
+ parentFolder: resource.parentFolder,
1744
+ settings: resource.settings
1745
+ };
1746
+ });
1747
+ });
1748
+ const statusFilterOptions = computed(() => [
1749
+ {
1750
+ label: i18n.baseText("workflows.filters.status.all"),
1751
+ value: StatusFilter.ALL
1752
+ },
1753
+ {
1754
+ label: i18n.baseText("workflows.filters.status.active"),
1755
+ value: StatusFilter.ACTIVE
1756
+ },
1757
+ {
1758
+ label: i18n.baseText("workflows.filters.status.deactivated"),
1759
+ value: StatusFilter.DEACTIVATED
1760
+ }
1761
+ ]);
1762
+ const showEasyAIWorkflowCallout = computed(() => {
1763
+ return !usersStore.isEasyAIWorkflowOnboardingDone;
1764
+ });
1765
+ const projectPermissions = computed(() => {
1766
+ return getResourcePermissions(projectsStore.currentProject?.scopes ?? personalProject.value?.scopes);
1767
+ });
1768
+ const showTemplatesDataQualityInline = computed(() => {
1769
+ return templatesDataQualityStore.isFeatureEnabled() && !readOnlyEnv.value && projectPermissions.value.workflow.create;
1770
+ });
1771
+ const showReadyToRunWorkflowsCallout = computed(() => {
1772
+ const isEnabled = readyToRunWorkflowsStore.isFeatureEnabled;
1773
+ const isDismissed = readyToRunWorkflowsStore.isCalloutDismissed;
1774
+ return isEnabled && !isDismissed && !loading$2.value && !readOnlyEnv.value && (projectPages.isOverviewSubPage || hasPermissionToCreateFolders.value && hasPermissionToCreateWorkflows.value);
1775
+ });
1776
+ const emptyListDescription = computed(() => {
1777
+ if (readOnlyEnv.value) return i18n.baseText("workflows.empty.description.readOnlyEnv");
1778
+ else if (!projectPermissions.value.workflow.create) return i18n.baseText("workflows.empty.description.noPermission");
1779
+ else return i18n.baseText("workflows.empty.description");
1780
+ });
1781
+ const hasFilters = computed(() => {
1782
+ return !!(filters.value.search || filters.value.status !== StatusFilter.ALL || filters.value.showArchived || filters.value.tags.length);
1783
+ });
1784
+ const showArchivedOnlyHint = computed(() => {
1785
+ return workflowsAndFolders.value.length === 0 && !hasFilters.value && !filters.value.showArchived && foldersStore.totalWorkflowCount > 0;
1786
+ });
1787
+ const isSelfHostedDeployment = computed(() => settingsStore.deploymentType === "default");
1788
+ const canUserRegisterCommunityPlus = computed(() => getResourcePermissions(usersStore.currentUser?.globalScopes).community.register);
1789
+ const showRegisteredCommunityCTA = computed(() => isSelfHostedDeployment.value && !foldersEnabled.value && canUserRegisterCommunityPlus.value);
1790
+ const showAIStarterCollectionCallout = computed(() => {
1791
+ return !loading$2.value && aiStarterTemplatesStore.isFeatureEnabled && !aiStarterTemplatesStore.calloutDismissed && !readOnlyEnv.value && (projectPages.isOverviewSubPage || hasPermissionToCreateFolders.value && hasPermissionToCreateWorkflows.value);
1792
+ });
1793
+ const showPrebuiltAgentsCallout = computed(() => {
1794
+ return !loading$2.value && calloutHelpers.isPreBuiltAgentsCalloutVisible.value && !calloutHelpers.isCalloutDismissed("preBuiltAgentsModalCallout") && !readOnlyEnv.value && (projectPages.isOverviewSubPage || hasPermissionToCreateFolders.value && hasPermissionToCreateWorkflows.value);
1795
+ });
1796
+ const showPersonalizedTemplates = computed(() => !loading$2.value && personalizedTemplatesStore.isFeatureEnabled());
1797
+ const shouldUseSimplifiedLayout = computed(() => {
1798
+ return !loading$2.value && readyToRunStore.getSimplifiedLayoutVisibility(route);
1799
+ });
1800
+ const hasActiveCallouts = computed(() => {
1801
+ return showPrebuiltAgentsCallout.value || showAIStarterCollectionCallout.value || showPersonalizedTemplates.value || showReadyToRunWorkflowsCallout.value;
1802
+ });
1803
+ watch([() => route.params?.projectId, () => route.name], async () => {
1804
+ loading$2.value = true;
1805
+ });
1806
+ watch(() => route.params?.folderId, async (newVal) => {
1807
+ currentFolderId.value = newVal;
1808
+ filters.value.search = "";
1809
+ saveFiltersOnQueryString();
1810
+ await Promise.all([fetchWorkflows(), foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId, currentFolderId.value ?? void 0)]);
1811
+ });
1812
+ sourceControlStore.$onAction(({ name: name$1, after }) => {
1813
+ if (name$1 !== "pullWorkfolder") return;
1814
+ after(async () => await initialize());
1815
+ });
1816
+ const refreshWorkflows = async () => {
1817
+ await Promise.all([fetchWorkflows(), foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId, currentFolderId.value ?? void 0)]);
1818
+ };
1819
+ const onFolderDeleted = async (payload) => {
1820
+ const folderInfo = foldersStore.getCachedFolder(payload.folderId);
1821
+ foldersStore.deleteFoldersFromCache([payload.folderId, folderInfo?.parentFolder ?? ""]);
1822
+ const nextFolderId = currentFolderId.value === payload.folderId ? folderInfo?.parentFolder ?? null : currentFolderId.value;
1823
+ await foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId, nextFolderId ?? void 0);
1824
+ if (currentFolderId.value === payload.folderId) router.push({
1825
+ name: VIEWS.PROJECTS_FOLDERS,
1826
+ params: {
1827
+ projectId: route.params.projectId,
1828
+ folderId: folderInfo?.parentFolder ?? ""
1829
+ }
1830
+ });
1831
+ else await fetchWorkflows();
1832
+ telemetry.track("User deleted folder", {
1833
+ folder_id: payload.folderId,
1834
+ deleted_sub_folders: payload.folderCount,
1835
+ deleted_sub_workflows: payload.workflowCount
1836
+ });
1837
+ };
1838
+ const showInsights = computed(() => {
1839
+ return projectPages.isOverviewSubPage && insightsStore.isSummaryEnabled && (workflowListResources.value.length > 0 || !personalizedTemplatesV2Store.isFeatureEnabled() && !personalizedTemplatesV3Store.isFeatureEnabled());
1840
+ });
1841
+ const showTemplateRecommendationV2 = computed(() => {
1842
+ return personalizedTemplatesV2Store.isFeatureEnabled() && !loading$2.value;
1843
+ });
1844
+ const showTemplateRecommendationV3 = computed(() => {
1845
+ return personalizedTemplatesV3Store.isFeatureEnabled() && !loading$2.value;
1846
+ });
1847
+ onMounted(async () => {
1848
+ documentTitle.set(i18n.baseText("workflows.heading"));
1849
+ usersStore.showPersonalizationSurvey();
1850
+ workflowListEventBus.on("resource-moved", fetchWorkflows);
1851
+ workflowListEventBus.on("workflow-duplicated", fetchWorkflows);
1852
+ workflowListEventBus.on("folder-deleted", onFolderDeleted);
1853
+ workflowListEventBus.on("folder-moved", moveFolder);
1854
+ workflowListEventBus.on("folder-transferred", onFolderTransferred);
1855
+ workflowListEventBus.on("workflow-moved", onWorkflowMoved);
1856
+ workflowListEventBus.on("workflow-transferred", onWorkflowTransferred);
1857
+ });
1858
+ onBeforeUnmount(() => {
1859
+ workflowListEventBus.off("resource-moved", fetchWorkflows);
1860
+ workflowListEventBus.off("workflow-duplicated", fetchWorkflows);
1861
+ workflowListEventBus.off("folder-deleted", onFolderDeleted);
1862
+ workflowListEventBus.off("folder-moved", moveFolder);
1863
+ workflowListEventBus.off("folder-transferred", onFolderTransferred);
1864
+ workflowListEventBus.off("workflow-moved", onWorkflowMoved);
1865
+ workflowListEventBus.off("workflow-transferred", onWorkflowTransferred);
1866
+ });
1867
+ const initialize = async () => {
1868
+ loading$2.value = true;
1869
+ await setFiltersFromQueryString();
1870
+ currentFolderId.value = route.params.folderId;
1871
+ const [, resourcesPage] = await Promise.all([
1872
+ usersStore.fetchUsers(),
1873
+ fetchWorkflows(),
1874
+ workflowsStore.fetchActiveWorkflows(),
1875
+ usageStore.getLicenseInfo(),
1876
+ foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId, currentFolderId.value ?? void 0)
1877
+ ]);
1878
+ breadcrumbsLoading.value = false;
1879
+ workflowsAndFolders.value = resourcesPage;
1880
+ loading$2.value = false;
1881
+ };
1882
+ const fetchWorkflows = async () => {
1883
+ const delayedLoading = (0, import_debounce.default)(() => {
1884
+ loading$2.value = true;
1885
+ }, 300);
1886
+ const routeProjectId = route.params?.projectId;
1887
+ const homeProjectFilter = filters.value.homeProject || void 0;
1888
+ const parentFolder = route.params?.folderId || void 0;
1889
+ const tags = filters.value.tags.length ? filters.value.tags.map((tagId) => tagsStore.tagsById[tagId]?.name) : [];
1890
+ const activeFilter = filters.value.status === StatusFilter.ALL ? void 0 : filters.value.status === StatusFilter.ACTIVE;
1891
+ const archivedFilter = filters.value.showArchived ? void 0 : false;
1892
+ const fetchFolders = showFolders.value && !tags.length && activeFilter === void 0;
1893
+ try {
1894
+ const fetchedResources = await workflowsStore.fetchWorkflowsPage(routeProjectId ?? homeProjectFilter, currentPage.value, pageSize.value, currentSort.value, {
1895
+ query: filters.value.search || void 0,
1896
+ active: activeFilter,
1897
+ isArchived: archivedFilter,
1898
+ tags: tags.length ? tags : void 0,
1899
+ parentFolderId: getParentFolderId(parentFolder)
1900
+ }, fetchFolders, projectPages.isSharedSubPage);
1901
+ foldersStore.cacheFolders(fetchedResources.filter((resource) => resource.resource === "folder").map((r) => ({
1902
+ id: r.id,
1903
+ name: r.name,
1904
+ parentFolder: r.parentFolder?.id
1905
+ })));
1906
+ const isCurrentFolderCached = foldersStore.breadcrumbsCache[parentFolder ?? ""] !== void 0;
1907
+ if (parentFolder && !isCurrentFolderCached && routeProjectId) {
1908
+ breadcrumbsLoading.value = true;
1909
+ await foldersStore.getFolderPath(routeProjectId, parentFolder);
1910
+ breadcrumbsLoading.value = false;
1911
+ }
1912
+ workflowsAndFolders.value = fetchedResources;
1913
+ showCardsBadge.value = projectPages.isOverviewSubPage || projectPages.isSharedSubPage || filters.value.search !== "";
1914
+ return fetchedResources;
1915
+ } catch (error) {
1916
+ toast.showError(error, i18n.baseText("workflows.list.error.fetching"));
1917
+ router.push({
1918
+ name: VIEWS.PROJECTS_FOLDERS,
1919
+ params: { projectId: routeProjectId }
1920
+ });
1921
+ return [];
1922
+ } finally {
1923
+ delayedLoading.cancel();
1924
+ loading$2.value = false;
1925
+ if (breadcrumbsLoading.value) breadcrumbsLoading.value = false;
1926
+ }
1927
+ };
1928
+ const getParentFolderId = (routeId) => {
1929
+ if (routeId !== null && routeId !== void 0) return routeId;
1930
+ if (projectPages.isOverviewSubPage || projectPages.isSharedSubPage || filters?.value.search) return;
1931
+ return "0";
1932
+ };
1933
+ const onFiltersUpdated = async () => {
1934
+ currentPage.value = 1;
1935
+ saveFiltersOnQueryString();
1936
+ if (!loading$2.value) await callDebounced(fetchWorkflows, {
1937
+ debounceTime: FILTERS_DEBOUNCE_TIME,
1938
+ trailing: true
1939
+ });
1940
+ };
1941
+ const onSearchUpdated = async (search) => {
1942
+ currentPage.value = 1;
1943
+ saveFiltersOnQueryString();
1944
+ if (search) await callDebounced(fetchWorkflows, {
1945
+ debounceTime: SEARCH_DEBOUNCE_TIME,
1946
+ trailing: true
1947
+ });
1948
+ else await fetchWorkflows();
1949
+ };
1950
+ const setPaginationAndSort = async (payload) => {
1951
+ if (payload.page) currentPage.value = payload.page;
1952
+ if (payload.pageSize) pageSize.value = payload.pageSize;
1953
+ if (payload.sort) currentSort.value = WORKFLOWS_SORT_MAP[payload.sort] ?? "updatedAt:desc";
1954
+ if (!loading$2.value) await callDebounced(fetchWorkflows, {
1955
+ debounceTime: FILTERS_DEBOUNCE_TIME,
1956
+ trailing: true
1957
+ });
1958
+ };
1959
+ const onClickTag = async (tagId) => {
1960
+ if (!filters.value.tags.includes(tagId)) {
1961
+ filters.value.tags.push(tagId);
1962
+ currentPage.value = 1;
1963
+ saveFiltersOnQueryString();
1964
+ await fetchWorkflows();
1965
+ }
1966
+ };
1967
+ const saveFiltersOnQueryString = () => {
1968
+ const currentQuery = { ...route.query };
1969
+ if (filters.value.search) currentQuery.search = filters.value.search;
1970
+ else delete currentQuery.search;
1971
+ if (filters.value.status !== StatusFilter.ALL) currentQuery.status = (filters.value.status === StatusFilter.ACTIVE).toString();
1972
+ else delete currentQuery.status;
1973
+ if (filters.value.showArchived) currentQuery.showArchived = "true";
1974
+ else delete currentQuery.showArchived;
1975
+ if (filters.value.tags.length) currentQuery.tags = filters.value.tags.join(",");
1976
+ else delete currentQuery.tags;
1977
+ if (filters.value.homeProject) currentQuery.homeProject = filters.value.homeProject;
1978
+ else delete currentQuery.homeProject;
1979
+ router.replace({ query: Object.keys(currentQuery).length ? currentQuery : void 0 });
1980
+ };
1981
+ const setFiltersFromQueryString = async () => {
1982
+ const newQuery = { ...route.query };
1983
+ const { tags, status, search, homeProject, sort, showArchived } = route.query ?? {};
1984
+ const isValidString = (value) => typeof value === "string" && value.trim().length > 0;
1985
+ if (isValidString(homeProject)) {
1986
+ await projectsStore.getAvailableProjects();
1987
+ if (isValidProjectId(homeProject)) {
1988
+ newQuery.homeProject = homeProject;
1989
+ filters.value.homeProject = homeProject;
1990
+ } else delete newQuery.homeProject;
1991
+ } else delete newQuery.homeProject;
1992
+ if (isValidString(search)) {
1993
+ newQuery.search = search;
1994
+ filters.value.search = search;
1995
+ } else delete newQuery.search;
1996
+ if (isValidString(tags)) {
1997
+ await tagsStore.fetchAll();
1998
+ const validTags = tags.split(",").filter((tag) => tagsStore.allTags.map((t) => t.id).includes(tag));
1999
+ if (validTags.length) {
2000
+ newQuery.tags = validTags.join(",");
2001
+ filters.value.tags = validTags;
2002
+ } else delete newQuery.tags;
2003
+ } else delete newQuery.tags;
2004
+ if (isValidString(status)) {
2005
+ newQuery.status = status;
2006
+ filters.value.status = status === "true" ? StatusFilter.ACTIVE : StatusFilter.DEACTIVATED;
2007
+ } else delete newQuery.status;
2008
+ if (isValidString(sort)) {
2009
+ const newSort = WORKFLOWS_SORT_MAP[sort] ?? "updatedAt:desc";
2010
+ newQuery.sort = sort;
2011
+ currentSort.value = newSort;
2012
+ } else delete newQuery.sort;
2013
+ if (isValidString(showArchived)) {
2014
+ newQuery.showArchived = showArchived;
2015
+ filters.value.showArchived = showArchived === "true";
2016
+ } else {
2017
+ delete newQuery.showArchived;
2018
+ filters.value.showArchived = false;
2019
+ }
2020
+ router.replace({ query: newQuery });
2021
+ };
2022
+ const addWorkflow = () => {
2023
+ uiStore.nodeViewInitialized = false;
2024
+ router.push({
2025
+ name: VIEWS.NEW_WORKFLOW,
2026
+ query: {
2027
+ projectId: route.params?.projectId,
2028
+ parentFolderId: route.params?.folderId
2029
+ }
2030
+ });
2031
+ telemetry.track("User clicked add workflow button", { source: "Workflows list" });
2032
+ trackEmptyCardClick("blank");
2033
+ };
2034
+ const trackEmptyCardClick = (option) => {
2035
+ telemetry.track("User clicked empty page option", { option });
2036
+ };
2037
+ function isValidProjectId(projectId) {
2038
+ return projectsStore.availableProjects.some((project) => project.id === projectId);
2039
+ }
2040
+ const createAIStarterWorkflows = async (source) => {
2041
+ try {
2042
+ const projectId = projectPages.isOverviewSubPage ? personalProject.value?.id : route.params.projectId;
2043
+ if (typeof projectId !== "string") {
2044
+ toast.showError(/* @__PURE__ */ new Error(), i18n.baseText("workflows.ai.starter.collection.error"));
2045
+ return;
2046
+ }
2047
+ const newFolder = await aiStarterTemplatesStore.createStarterWorkflows(projectId, currentFolderId.value ?? void 0);
2048
+ if (projectPages.isOverviewSubPage) await router.push({
2049
+ name: VIEWS.PROJECTS_FOLDERS,
2050
+ params: {
2051
+ projectId,
2052
+ folderId: newFolder.id
2053
+ }
2054
+ });
2055
+ else workflowsAndFolders.value.unshift({
2056
+ id: newFolder.id,
2057
+ name: newFolder.name,
2058
+ resource: "folder",
2059
+ createdAt: newFolder.createdAt,
2060
+ updatedAt: newFolder.updatedAt,
2061
+ subFolderCount: 0,
2062
+ workflowCount: 3,
2063
+ parentFolder: newFolder.parentFolder
2064
+ });
2065
+ aiStarterTemplatesStore.trackUserCreatedStarterCollection(source);
2066
+ } catch (error) {
2067
+ toast.showError(error, i18n.baseText("workflows.ai.starter.collection.error"));
2068
+ return;
2069
+ }
2070
+ };
2071
+ const openPrebuiltAgentsModal = (source) => {
2072
+ calloutHelpers.openPreBuiltAgentsModal(source);
2073
+ };
2074
+ const handleCreateReadyToRunWorkflows = async (source) => {
2075
+ try {
2076
+ const projectId = projectPages.isOverviewSubPage ? personalProject.value?.id : route.params.projectId;
2077
+ if (typeof projectId !== "string") {
2078
+ toast.showError(/* @__PURE__ */ new Error(), i18n.baseText("workflows.readyToRunWorkflows.error"));
2079
+ return;
2080
+ }
2081
+ const newFolder = await readyToRunWorkflowsStore.createWorkflows(projectId, currentFolderId.value ?? void 0);
2082
+ readyToRunWorkflowsStore.trackCreateWorkflows(source);
2083
+ if (projectPages.isOverviewSubPage) await router.push({
2084
+ name: VIEWS.PROJECTS_FOLDERS,
2085
+ params: {
2086
+ projectId,
2087
+ folderId: newFolder.id
2088
+ }
2089
+ });
2090
+ else workflowsAndFolders.value.unshift({
2091
+ id: newFolder.id,
2092
+ name: newFolder.name,
2093
+ resource: "folder",
2094
+ createdAt: newFolder.createdAt,
2095
+ updatedAt: newFolder.updatedAt,
2096
+ subFolderCount: 0,
2097
+ workflowCount: 4,
2098
+ parentFolder: newFolder.parentFolder
2099
+ });
2100
+ } catch (error) {
2101
+ toast.showError(error, i18n.baseText("workflows.readyToRunWorkflows.error"));
2102
+ return;
2103
+ }
2104
+ };
2105
+ const dismissStarterCollectionCallout = () => {
2106
+ aiStarterTemplatesStore.dismissCallout();
2107
+ aiStarterTemplatesStore.trackUserDismissedCallout();
2108
+ };
2109
+ const dismissEasyAICallout = () => {
2110
+ easyAICalloutVisible.value = false;
2111
+ };
2112
+ const dismissPreBuiltAgentsCallout = () => {
2113
+ calloutHelpers.dismissCallout("preBuiltAgentsModalCallout");
2114
+ };
2115
+ const openAIWorkflow = async (source) => {
2116
+ dismissEasyAICallout();
2117
+ telemetry.track("User clicked test AI workflow", { source });
2118
+ const easyAiWorkflowJson = getEasyAiWorkflowJson();
2119
+ await router.push({
2120
+ name: VIEWS.TEMPLATE_IMPORT,
2121
+ params: { id: easyAiWorkflowJson.meta.templateId },
2122
+ query: {
2123
+ fromJson: "true",
2124
+ parentFolderId: route.params.folderId
2125
+ }
2126
+ });
2127
+ };
2128
+ const onShowArchived = async () => {
2129
+ filters.value.showArchived = true;
2130
+ await onFiltersUpdated();
2131
+ };
2132
+ const handleDismissReadyToRunCallout = () => {
2133
+ readyToRunWorkflowsStore.dismissCallout();
2134
+ readyToRunWorkflowsStore.trackDismissCallout();
2135
+ };
2136
+ const onWorkflowActiveToggle = async (data) => {
2137
+ const workflow = workflowsAndFolders.value.find((w) => w.id === data.id);
2138
+ if (!workflow) return;
2139
+ workflow.active = data.active;
2140
+ workflow.activeVersionId = data.active ? workflow.versionId : null;
2141
+ try {
2142
+ const updatedWorkflow = await workflowsStore.fetchWorkflow(data.id);
2143
+ if (updatedWorkflow.settings) workflow.settings = updatedWorkflow.settings;
2144
+ } catch (error) {
2145
+ toast.showError(error, i18n.baseText("workflows.list.error.fetching.one"));
2146
+ }
2147
+ };
2148
+ const getFolderListItem = (folderId) => {
2149
+ return workflowsAndFolders.value.find((resource) => resource.resource === "folder" && resource.id === folderId);
2150
+ };
2151
+ const getFolderContent = async (folderId) => {
2152
+ const folderListItem = getFolderListItem(folderId);
2153
+ if (folderListItem) return {
2154
+ workflowCount: folderListItem.workflowCount,
2155
+ subFolderCount: folderListItem.subFolderCount
2156
+ };
2157
+ try {
2158
+ const content$1 = await foldersStore.fetchFolderContent(currentProject.value?.id ?? "", folderId);
2159
+ return {
2160
+ workflowCount: content$1.totalWorkflows,
2161
+ subFolderCount: content$1.totalSubFolders
2162
+ };
2163
+ } catch (error) {
2164
+ toast.showMessage({
2165
+ title: i18n.baseText("folders.delete.error.message"),
2166
+ message: i18n.baseText("folders.not.found.message"),
2167
+ type: "error"
2168
+ });
2169
+ return {
2170
+ workflowCount: 0,
2171
+ subFolderCount: 0
2172
+ };
2173
+ }
2174
+ };
2175
+ const onFolderCardDrop = async (event) => {
2176
+ const { draggedResource, dropTarget } = folderHelpers.handleDrop(event);
2177
+ if (!draggedResource || !dropTarget) return;
2178
+ await moveResourceOnDrop(draggedResource, dropTarget);
2179
+ };
2180
+ const onBreadCrumbsItemDrop = async (item) => {
2181
+ if (!foldersStore.draggedElement) return;
2182
+ await moveResourceOnDrop({
2183
+ id: foldersStore.draggedElement.id,
2184
+ type: foldersStore.draggedElement.type,
2185
+ name: foldersStore.draggedElement.name
2186
+ }, {
2187
+ id: item.id,
2188
+ type: "folder",
2189
+ name: item.label
2190
+ });
2191
+ folderHelpers.onDragEnd();
2192
+ };
2193
+ const moveFolderToProjectRoot = async (id, name$1) => {
2194
+ if (!foldersStore.draggedElement) return;
2195
+ await moveResourceOnDrop({
2196
+ id: foldersStore.draggedElement.id,
2197
+ type: foldersStore.draggedElement.type,
2198
+ name: foldersStore.draggedElement.name
2199
+ }, {
2200
+ id,
2201
+ type: "project",
2202
+ name: name$1
2203
+ });
2204
+ folderHelpers.onDragEnd();
2205
+ };
2206
+ const moveResourceOnDrop = async (draggedResource, dropTarget) => {
2207
+ if (draggedResource.type === "folder") {
2208
+ await moveFolder({
2209
+ folder: {
2210
+ id: draggedResource.id,
2211
+ name: draggedResource.name
2212
+ },
2213
+ newParent: {
2214
+ id: dropTarget.id,
2215
+ name: dropTarget.name,
2216
+ type: dropTarget.type
2217
+ },
2218
+ options: {
2219
+ skipFetch: true,
2220
+ skipNavigation: true
2221
+ }
2222
+ });
2223
+ workflowsAndFolders.value = workflowsAndFolders.value.filter((folder) => folder.id !== draggedResource.id);
2224
+ const targetFolder = getFolderListItem(dropTarget.id);
2225
+ if (targetFolder) targetFolder.subFolderCount += 1;
2226
+ } else if (draggedResource.type === "workflow") {
2227
+ await onWorkflowMoved({
2228
+ workflow: {
2229
+ id: draggedResource.id,
2230
+ name: draggedResource.name,
2231
+ oldParentId: currentFolderId.value ?? ""
2232
+ },
2233
+ newParent: {
2234
+ id: dropTarget.id,
2235
+ name: dropTarget.name,
2236
+ type: dropTarget.type
2237
+ },
2238
+ options: { skipFetch: true }
2239
+ });
2240
+ workflowsAndFolders.value = workflowsAndFolders.value.filter((workflow) => workflow.id !== draggedResource.id);
2241
+ const targetFolder = getFolderListItem(dropTarget.id);
2242
+ if (targetFolder) targetFolder.workflowCount += 1;
2243
+ }
2244
+ };
2245
+ const onBreadcrumbItemClick = (item) => {
2246
+ if (item.href) {
2247
+ loading$2.value = true;
2248
+ router.push(item.href).then(() => {
2249
+ currentFolderId.value = item.id;
2250
+ loading$2.value = false;
2251
+ }).catch((error) => {
2252
+ toast.showError(error, i18n.baseText("folders.open.error.title"));
2253
+ });
2254
+ }
2255
+ };
2256
+ const onBreadCrumbsAction = async (action) => {
2257
+ switch (action) {
2258
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE:
2259
+ if (!route.params.projectId) return;
2260
+ const currentParent = currentFolder.value?.name || projectName.value;
2261
+ if (!currentParent) return;
2262
+ await createFolder({
2263
+ id: route.params.folderId ?? "-1",
2264
+ name: currentParent,
2265
+ type: currentFolder.value ? "folder" : "project"
2266
+ });
2267
+ break;
2268
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW:
2269
+ addWorkflow();
2270
+ break;
2271
+ case FOLDER_LIST_ITEM_ACTIONS.DELETE:
2272
+ if (!route.params.folderId) return;
2273
+ const content$1 = await getFolderContent(route.params.folderId);
2274
+ await deleteFolder(route.params.folderId, content$1.workflowCount, content$1.subFolderCount);
2275
+ break;
2276
+ case FOLDER_LIST_ITEM_ACTIONS.RENAME:
2277
+ onNameToggle();
2278
+ break;
2279
+ case FOLDER_LIST_ITEM_ACTIONS.MOVE:
2280
+ if (!currentFolder.value) return;
2281
+ uiStore.openMoveToFolderModal("folder", {
2282
+ id: currentFolder.value?.id,
2283
+ name: currentFolder.value?.name,
2284
+ parentFolderId: currentFolder.value?.parentFolder
2285
+ }, workflowListEventBus);
2286
+ break;
2287
+ default: break;
2288
+ }
2289
+ };
2290
+ const onFolderCardAction = async (payload) => {
2291
+ const clickedFolder = foldersStore.getCachedFolder(payload.folderId);
2292
+ if (!clickedFolder) return;
2293
+ switch (payload.action) {
2294
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE:
2295
+ await createFolder({
2296
+ id: clickedFolder.id,
2297
+ name: clickedFolder.name,
2298
+ type: "folder"
2299
+ }, { openAfterCreate: true });
2300
+ break;
2301
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW:
2302
+ currentFolderId.value = clickedFolder.id;
2303
+ router.push({
2304
+ name: VIEWS.NEW_WORKFLOW,
2305
+ query: {
2306
+ projectId: route.params?.projectId,
2307
+ parentFolderId: clickedFolder.id
2308
+ }
2309
+ });
2310
+ break;
2311
+ case FOLDER_LIST_ITEM_ACTIONS.DELETE: {
2312
+ const content$1 = await getFolderContent(clickedFolder.id);
2313
+ await deleteFolder(clickedFolder.id, content$1.workflowCount, content$1.subFolderCount);
2314
+ break;
2315
+ }
2316
+ case FOLDER_LIST_ITEM_ACTIONS.RENAME:
2317
+ await renameFolder(clickedFolder.id);
2318
+ break;
2319
+ case FOLDER_LIST_ITEM_ACTIONS.MOVE:
2320
+ uiStore.openMoveToFolderModal("folder", {
2321
+ id: clickedFolder.id,
2322
+ name: clickedFolder.name,
2323
+ parentFolderId: clickedFolder.parentFolder
2324
+ }, workflowListEventBus);
2325
+ break;
2326
+ default: break;
2327
+ }
2328
+ };
2329
+ const createFolder = async (parent, options = { openAfterCreate: false }) => {
2330
+ const promptResponse = await message.prompt(i18n.baseText("folders.add.to.parent.message", { interpolate: { parent: parent.name } }), {
2331
+ confirmButtonText: i18n.baseText("generic.create"),
2332
+ cancelButtonText: i18n.baseText("generic.cancel"),
2333
+ inputValidator: folderHelpers.validateFolderName,
2334
+ customClass: "add-folder-modal"
2335
+ });
2336
+ if (promptResponse.action === "confirm") {
2337
+ const folderName = promptResponse.value;
2338
+ try {
2339
+ const newFolder = await foldersStore.createFolder(folderName, route.params.projectId, parent.type === "folder" ? parent.id : void 0);
2340
+ const newFolderURL = router.resolve({
2341
+ name: VIEWS.PROJECTS_FOLDERS,
2342
+ params: {
2343
+ projectId: route.params.projectId,
2344
+ folderId: newFolder.id
2345
+ }
2346
+ }).href;
2347
+ toast.showToast({
2348
+ title: i18n.baseText("folders.add.success.title"),
2349
+ message: i18n.baseText("folders.add.success.message", { interpolate: {
2350
+ link: newFolderURL,
2351
+ folderName: newFolder.name
2352
+ } }),
2353
+ onClick: (event) => {
2354
+ if (event?.target instanceof HTMLAnchorElement) {
2355
+ event.preventDefault();
2356
+ router.push(newFolderURL);
2357
+ }
2358
+ },
2359
+ type: "success"
2360
+ });
2361
+ telemetry.track("User created folder", { folder_id: newFolder.id });
2362
+ if (options.openAfterCreate) await router.push({
2363
+ name: VIEWS.PROJECTS_FOLDERS,
2364
+ params: {
2365
+ projectId: route.params.projectId,
2366
+ folderId: parent.id
2367
+ }
2368
+ });
2369
+ else if (!workflowsAndFolders.value.length) {
2370
+ workflowsAndFolders.value = [{
2371
+ id: newFolder.id,
2372
+ name: newFolder.name,
2373
+ resource: "folder",
2374
+ createdAt: newFolder.createdAt,
2375
+ updatedAt: newFolder.updatedAt,
2376
+ homeProject: projectsStore.currentProject,
2377
+ workflowCount: 0,
2378
+ subFolderCount: 0
2379
+ }];
2380
+ foldersStore.cacheFolders([{
2381
+ id: newFolder.id,
2382
+ name: newFolder.name,
2383
+ parentFolder: currentFolder.value?.id
2384
+ }]);
2385
+ } else await fetchWorkflows();
2386
+ } catch (error) {
2387
+ toast.showError(error, i18n.baseText("folders.create.error.title"));
2388
+ }
2389
+ }
2390
+ };
2391
+ const renameFolder = async (folderId) => {
2392
+ const folder = foldersStore.getCachedFolder(folderId);
2393
+ if (!folder || !currentProject.value) return;
2394
+ const promptResponse = await message.prompt(i18n.baseText("folders.rename.message", { interpolate: { folderName: folder.name } }), {
2395
+ confirmButtonText: i18n.baseText("generic.rename"),
2396
+ cancelButtonText: i18n.baseText("generic.cancel"),
2397
+ inputValue: folder.name,
2398
+ customClass: "rename-folder-modal",
2399
+ inputValidator: folderHelpers.validateFolderName
2400
+ });
2401
+ if (promptResponse.action === "confirm") {
2402
+ const newFolderName = promptResponse.value;
2403
+ try {
2404
+ await foldersStore.renameFolder(currentProject.value?.id, folderId, newFolderName);
2405
+ foldersStore.breadcrumbsCache[folderId].name = newFolderName;
2406
+ toast.showMessage({
2407
+ title: i18n.baseText("folders.rename.success.message", { interpolate: { folderName: newFolderName } }),
2408
+ type: "success"
2409
+ });
2410
+ await fetchWorkflows();
2411
+ telemetry.track("User renamed folder", { folder_id: folderId });
2412
+ } catch (error) {
2413
+ toast.showError(error, i18n.baseText("folders.rename.error.title"));
2414
+ }
2415
+ }
2416
+ };
2417
+ const createFolderInCurrent = async () => {
2418
+ if (showRegisteredCommunityCTA.value) {
2419
+ uiStore.openModalWithData({
2420
+ name: COMMUNITY_PLUS_ENROLLMENT_MODAL,
2421
+ data: { customHeading: i18n.baseText("folders.registeredCommunity.cta.heading") }
2422
+ });
2423
+ return;
2424
+ }
2425
+ if (!route.params.projectId) return;
2426
+ const currentParent = currentFolder.value?.name || projectName.value;
2427
+ if (!currentParent) return;
2428
+ await createFolder({
2429
+ id: route.params.folderId ?? "-1",
2430
+ name: currentParent,
2431
+ type: currentFolder.value ? "folder" : "project"
2432
+ });
2433
+ };
2434
+ const deleteFolder = async (folderId, workflowCount, subFolderCount) => {
2435
+ if (subFolderCount || workflowCount) uiStore.openDeleteFolderModal(folderId, workflowListEventBus, {
2436
+ workflowCount,
2437
+ subFolderCount
2438
+ });
2439
+ else {
2440
+ await foldersStore.deleteFolder(route.params.projectId, folderId);
2441
+ toast.showMessage({
2442
+ title: i18n.baseText("folders.delete.success.message"),
2443
+ type: "success"
2444
+ });
2445
+ await onFolderDeleted({
2446
+ folderId,
2447
+ workflowCount,
2448
+ folderCount: subFolderCount
2449
+ });
2450
+ }
2451
+ };
2452
+ const moveFolder = async (payload) => {
2453
+ if (!route.params.projectId) return;
2454
+ try {
2455
+ await foldersStore.moveFolder(route.params.projectId, payload.folder.id, payload.newParent.type === "folder" ? payload.newParent.id : "0");
2456
+ const isCurrentFolder = currentFolderId.value === payload.folder.id;
2457
+ const newFolderURL = router.resolve({
2458
+ name: VIEWS.PROJECTS_FOLDERS,
2459
+ params: {
2460
+ projectId: route.params.projectId,
2461
+ folderId: payload.newParent.type === "folder" ? payload.newParent.id : void 0
2462
+ }
2463
+ }).href;
2464
+ if (isCurrentFolder && !payload.options?.skipNavigation) {
2465
+ router.push(newFolderURL);
2466
+ toast.showMessage({
2467
+ title: i18n.baseText("folders.move.success.title"),
2468
+ message: i18n.baseText("folders.move.success.messageNoAccess", { interpolate: {
2469
+ folderName: payload.folder.name,
2470
+ newFolderName: payload.newParent.name
2471
+ } }),
2472
+ type: "success"
2473
+ });
2474
+ } else {
2475
+ toast.showToast({
2476
+ title: i18n.baseText("folders.move.success.title"),
2477
+ message: i18n.baseText("folders.move.success.message", { interpolate: {
2478
+ folderName: payload.folder.name,
2479
+ newFolderName: payload.newParent.name
2480
+ } }),
2481
+ onClick: (event) => {
2482
+ if (event?.target instanceof HTMLAnchorElement) {
2483
+ event.preventDefault();
2484
+ router.push(newFolderURL);
2485
+ }
2486
+ },
2487
+ type: "success"
2488
+ });
2489
+ if (!payload.options?.skipFetch) await fetchWorkflows();
2490
+ }
2491
+ } catch (error) {
2492
+ toast.showError(error, i18n.baseText("folders.move.error.title"));
2493
+ }
2494
+ };
2495
+ const onFolderTransferred = async (payload) => {
2496
+ try {
2497
+ await foldersStore.moveFolderToProject(payload.source.projectId, payload.source.folder.id, payload.destination.projectId, payload.destination.parentFolder.id, payload.shareCredentials);
2498
+ const isCurrentFolder = currentFolderId.value === payload.source.folder.id;
2499
+ const newFolderURL = router.resolve({
2500
+ name: VIEWS.PROJECTS_FOLDERS,
2501
+ params: {
2502
+ projectId: payload.destination.canAccess ? payload.destination.projectId : payload.source.projectId,
2503
+ folderId: payload.destination.canAccess ? payload.source.folder.id : void 0
2504
+ }
2505
+ }).href;
2506
+ if (isCurrentFolder) if (payload.destination.canAccess) router.push(newFolderURL);
2507
+ else router.push({
2508
+ name: VIEWS.PROJECTS_WORKFLOWS,
2509
+ params: { projectId: payload.source.projectId }
2510
+ });
2511
+ else {
2512
+ await refreshWorkflows();
2513
+ if (payload.destination.canAccess) toast.showToast({
2514
+ title: i18n.baseText("folders.move.success.title"),
2515
+ message: i18n.baseText("folders.move.success.message", { interpolate: {
2516
+ folderName: payload.source.folder.name,
2517
+ newFolderName: payload.destination.parentFolder.name
2518
+ } }),
2519
+ onClick: (event) => {
2520
+ if (event?.target instanceof HTMLAnchorElement) {
2521
+ event.preventDefault();
2522
+ router.push(newFolderURL);
2523
+ }
2524
+ },
2525
+ type: "success"
2526
+ });
2527
+ else toast.showToast({
2528
+ title: i18n.baseText("folders.move.success.title"),
2529
+ message: i18n.baseText("folders.move.success.messageNoAccess", { interpolate: {
2530
+ folderName: payload.source.folder.name,
2531
+ newFolderName: payload.destination.parentFolder.name
2532
+ } }),
2533
+ type: "success"
2534
+ });
2535
+ }
2536
+ } catch (error) {
2537
+ toast.showError(error, i18n.baseText("folders.move.error.title"));
2538
+ }
2539
+ };
2540
+ const moveWorkflowToFolder = async (payload) => {
2541
+ if (showRegisteredCommunityCTA.value) {
2542
+ uiStore.openModalWithData({
2543
+ name: COMMUNITY_PLUS_ENROLLMENT_MODAL,
2544
+ data: { customHeading: i18n.baseText("folders.registeredCommunity.cta.heading") }
2545
+ });
2546
+ return;
2547
+ }
2548
+ uiStore.openMoveToFolderModal("workflow", {
2549
+ id: payload.id,
2550
+ name: payload.name,
2551
+ parentFolderId: payload.parentFolderId,
2552
+ sharedWithProjects: payload.sharedWithProjects,
2553
+ homeProjectId: payload.homeProjectId
2554
+ }, workflowListEventBus);
2555
+ };
2556
+ const onWorkflowTransferred = async (payload) => {
2557
+ try {
2558
+ await projectsStore.moveResourceToProject("workflow", payload.source.workflow.id, payload.destination.projectId, payload.destination.parentFolder.id, payload.shareCredentials);
2559
+ await refreshWorkflows();
2560
+ if (payload.destination.canAccess) toast.showToast({
2561
+ title: i18n.baseText("folders.move.workflow.success.title"),
2562
+ message: i18n.baseText("folders.move.workflow.success.message", { interpolate: {
2563
+ workflowName: payload.source.workflow.name,
2564
+ newFolderName: payload.destination.parentFolder.name
2565
+ } }),
2566
+ onClick: (event) => {
2567
+ if (event?.target instanceof HTMLAnchorElement) {
2568
+ event.preventDefault();
2569
+ router.push({
2570
+ name: VIEWS.PROJECTS_FOLDERS,
2571
+ params: {
2572
+ projectId: payload.destination.projectId,
2573
+ folderId: payload.destination.parentFolder.id
2574
+ }
2575
+ });
2576
+ }
2577
+ },
2578
+ type: "success"
2579
+ });
2580
+ else toast.showToast({
2581
+ title: i18n.baseText("folders.move.workflow.success.title"),
2582
+ message: i18n.baseText("folders.move.workflow.success.messageNoAccess", { interpolate: {
2583
+ workflowName: payload.source.workflow.name,
2584
+ newFolderName: payload.destination.parentFolder.name
2585
+ } }),
2586
+ type: "success"
2587
+ });
2588
+ } catch (error) {
2589
+ toast.showError(error, i18n.baseText("folders.move.workflow.error.title"));
2590
+ }
2591
+ };
2592
+ const onWorkflowMoved = async (payload) => {
2593
+ if (!route.params.projectId) return;
2594
+ try {
2595
+ const newFolderURL = router.resolve({
2596
+ name: VIEWS.PROJECTS_FOLDERS,
2597
+ params: {
2598
+ projectId: route.params.projectId,
2599
+ folderId: payload.newParent.type === "folder" ? payload.newParent.id : void 0
2600
+ }
2601
+ }).href;
2602
+ const workflowResource = workflowsAndFolders.value.find((resource) => resource.id === payload.workflow.id);
2603
+ await workflowsStore.updateWorkflow(payload.workflow.id, {
2604
+ parentFolderId: payload.newParent.type === "folder" ? payload.newParent.id : "0",
2605
+ versionId: workflowResource?.versionId
2606
+ });
2607
+ if (!payload.options?.skipFetch) await fetchWorkflows();
2608
+ toast.showToast({
2609
+ title: i18n.baseText("folders.move.workflow.success.title"),
2610
+ message: i18n.baseText("folders.move.workflow.success.message", { interpolate: {
2611
+ workflowName: payload.workflow.name,
2612
+ newFolderName: payload.newParent.name
2613
+ } }),
2614
+ onClick: (event) => {
2615
+ if (event?.target instanceof HTMLAnchorElement) {
2616
+ event.preventDefault();
2617
+ router.push(newFolderURL);
2618
+ }
2619
+ },
2620
+ type: "success"
2621
+ });
2622
+ telemetry.track("User moved content", {
2623
+ workflow_id: payload.workflow.id,
2624
+ source_folder_id: payload.workflow.oldParentId,
2625
+ destination_folder_id: payload.newParent.id
2626
+ });
2627
+ } catch (error) {
2628
+ toast.showError(error, i18n.baseText("folders.move.workflow.error.title"));
2629
+ }
2630
+ };
2631
+ const onCreateWorkflowClick = () => {
2632
+ router.push({
2633
+ name: VIEWS.NEW_WORKFLOW,
2634
+ query: {
2635
+ projectId: currentProject.value?.id,
2636
+ parentFolderId: route.params.folderId
2637
+ }
2638
+ });
2639
+ };
2640
+ const renameInput = useTemplateRef("renameInput");
2641
+ function onNameToggle() {
2642
+ setTimeout(() => {
2643
+ if (renameInput.value?.forceFocus) renameInput.value.forceFocus();
2644
+ }, 0);
2645
+ }
2646
+ const onNameSubmit = async (name$1) => {
2647
+ if (!currentFolder.value || !currentProject.value) return;
2648
+ const newName = name$1.trim();
2649
+ if (!newName) {
2650
+ toast.showMessage({
2651
+ title: i18n.baseText("renameAction.emptyName.title"),
2652
+ message: i18n.baseText("renameAction.emptyName.message"),
2653
+ type: "error"
2654
+ });
2655
+ return;
2656
+ }
2657
+ if (newName === currentFolder.value.name) {
2658
+ renameInput.value?.forceCancel();
2659
+ return;
2660
+ }
2661
+ const validationResult = folderHelpers.validateFolderName(newName);
2662
+ if (typeof validationResult === "string") {
2663
+ toast.showMessage({
2664
+ title: i18n.baseText("renameAction.invalidName.title"),
2665
+ message: validationResult,
2666
+ type: "error"
2667
+ });
2668
+ renameInput.value?.forceCancel();
2669
+ return;
2670
+ } else try {
2671
+ await foldersStore.renameFolder(currentProject.value?.id, currentFolder.value.id, newName);
2672
+ foldersStore.breadcrumbsCache[currentFolder.value.id].name = newName;
2673
+ toast.showMessage({
2674
+ title: i18n.baseText("folders.rename.success.message", { interpolate: { folderName: newName } }),
2675
+ type: "success"
2676
+ });
2677
+ telemetry.track("User renamed folder", { folder_id: currentFolder.value.id });
2678
+ } catch (error) {
2679
+ toast.showError(error, i18n.baseText("folders.rename.error.title"));
2680
+ renameInput.value?.forceCancel();
2681
+ }
2682
+ };
2683
+ return (_ctx, _cache) => {
2684
+ return shouldUseSimplifiedLayout.value ? (openBlock(), createBlock(EmptyStateLayout_default, {
2685
+ key: 0,
2686
+ "onClick:add": addWorkflow
2687
+ })) : (openBlock(), createBlock(ResourcesListLayout_default, {
2688
+ key: 1,
2689
+ ref: "resourcesListLayout",
2690
+ filters: filters.value,
2691
+ "onUpdate:filters": [_cache[9] || (_cache[9] = ($event) => filters.value = $event), onFiltersUpdated],
2692
+ "resource-key": "workflows",
2693
+ type: "list-paginated",
2694
+ resources: workflowListResources.value,
2695
+ "type-props": { itemSize: 80 },
2696
+ shareable: isShareable.value,
2697
+ initialize,
2698
+ disabled: readOnlyEnv.value || !projectPermissions.value.workflow.create,
2699
+ loading: false,
2700
+ "resources-refreshing": loading$2.value,
2701
+ "custom-page-size": unref(50),
2702
+ "total-items": unref(workflowsStore).totalWorkflowCount,
2703
+ "dont-perform-sorting-and-filtering": true,
2704
+ "has-empty-state": unref(foldersStore).totalWorkflowCount === 0 && !currentFolderId.value,
2705
+ "onClick:add": addWorkflow,
2706
+ "onUpdate:search": onSearchUpdated,
2707
+ "onUpdate:paginationAndSort": setPaginationAndSort,
2708
+ onMouseleave: unref(folderHelpers).resetDropTarget
2709
+ }, createSlots({
2710
+ header: withCtx(() => [createVNode(ProjectHeader_default, {
2711
+ "has-active-callouts": hasActiveCallouts.value,
2712
+ onCreateFolder: createFolderInCurrent
2713
+ }, {
2714
+ default: withCtx(() => [showInsights.value ? (openBlock(), createBlock(InsightsSummary_default, {
2715
+ key: 0,
2716
+ loading: unref(insightsStore).weeklySummary.isLoading,
2717
+ summary: unref(insightsStore).weeklySummary.state,
2718
+ "time-range": "week"
2719
+ }, null, 8, ["loading", "summary"])) : createCommentVNode("", true)]),
2720
+ _: 1
2721
+ }, 8, ["has-active-callouts"])]),
2722
+ callout: withCtx(() => [showPrebuiltAgentsCallout.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
2723
+ key: 0,
2724
+ theme: "secondary",
2725
+ icon: "bot",
2726
+ "icon-size": "large",
2727
+ class: normalizeClass(_ctx.$style["easy-ai-workflow-callout"])
2728
+ }, {
2729
+ trailingContent: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["callout-trailing-content"]) }, [createVNode(unref(N8nIcon_default), {
2730
+ size: "small",
2731
+ icon: "x",
2732
+ title: unref(i18n).baseText("generic.dismiss"),
2733
+ class: "clickable",
2734
+ onClick: _cache[1] || (_cache[1] = ($event) => dismissPreBuiltAgentsCallout())
2735
+ }, null, 8, ["title"])], 2)]),
2736
+ default: withCtx(() => [createVNode(unref(N8nText_default), { size: "small" }, {
2737
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.preBuiltAgents.callout")) + " " + toDisplayString(" ") + " ", 1), createVNode(unref(N8nLink_default), {
2738
+ theme: "secondary",
2739
+ size: "small",
2740
+ bold: true,
2741
+ underline: true,
2742
+ onClick: _cache[0] || (_cache[0] = ($event) => openPrebuiltAgentsModal("workflowsEmptyState"))
2743
+ }, {
2744
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.preBuiltAgents.linkText")), 1)]),
2745
+ _: 1
2746
+ })]),
2747
+ _: 1
2748
+ })]),
2749
+ _: 1
2750
+ }, 8, ["class"])) : showAIStarterCollectionCallout.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
2751
+ key: 1,
2752
+ theme: "secondary",
2753
+ icon: "gift",
2754
+ class: normalizeClass(_ctx.$style["easy-ai-workflow-callout"])
2755
+ }, {
2756
+ trailingContent: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["callout-trailing-content"]) }, [createVNode(unref(N8nButton_default), {
2757
+ "data-test-id": "easy-ai-button",
2758
+ size: "small",
2759
+ type: "secondary",
2760
+ onClick: _cache[2] || (_cache[2] = ($event) => createAIStarterWorkflows("callout"))
2761
+ }, {
2762
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.startNow")), 1)]),
2763
+ _: 1
2764
+ }), createVNode(unref(N8nIcon_default), {
2765
+ size: "small",
2766
+ icon: "x",
2767
+ title: unref(i18n).baseText("generic.dismiss"),
2768
+ class: "clickable",
2769
+ onClick: dismissStarterCollectionCallout
2770
+ }, null, 8, ["title"])], 2)]),
2771
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.ai.starter.collection.callout")) + " ", 1)]),
2772
+ _: 1
2773
+ }, 8, ["class"])) : showPersonalizedTemplates.value ? (openBlock(), createBlock(SuggestedWorkflows_default, { key: 2 }, {
2774
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(personalizedTemplatesStore).suggestedWorkflows, (workflow) => {
2775
+ return openBlock(), createBlock(SuggestedWorkflowCard_default, {
2776
+ key: workflow.id,
2777
+ "data-test-id": "resource-list-item-suggested-workflow",
2778
+ data: {
2779
+ id: workflow.id,
2780
+ name: workflow.name
2781
+ }
2782
+ }, null, 8, ["data"]);
2783
+ }), 128))]),
2784
+ _: 1
2785
+ })) : createCommentVNode("", true), showReadyToRunWorkflowsCallout.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
2786
+ key: 3,
2787
+ theme: "secondary",
2788
+ icon: "bolt-filled",
2789
+ class: normalizeClass(_ctx.$style["easy-ai-workflow-callout"])
2790
+ }, {
2791
+ trailingContent: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["callout-trailing-content"]) }, [createVNode(unref(N8nButton_default), {
2792
+ "data-test-id": "easy-ai-button",
2793
+ size: "small",
2794
+ type: "secondary",
2795
+ onClick: _cache[3] || (_cache[3] = ($event) => handleCreateReadyToRunWorkflows("callout"))
2796
+ }, {
2797
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.startNow")), 1)]),
2798
+ _: 1
2799
+ }), createVNode(unref(N8nIcon_default), {
2800
+ size: "small",
2801
+ icon: "x",
2802
+ title: unref(i18n).baseText("generic.dismiss"),
2803
+ class: "clickable",
2804
+ onClick: handleDismissReadyToRunCallout
2805
+ }, null, 8, ["title"])], 2)]),
2806
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(readyToRunWorkflowsStore).getCalloutText()) + " ", 1)]),
2807
+ _: 1
2808
+ }, 8, ["class"])) : createCommentVNode("", true)]),
2809
+ breadcrumbs: withCtx(() => [breadcrumbsLoading.value ? (openBlock(), createElementBlock("div", {
2810
+ key: 0,
2811
+ class: normalizeClass(_ctx.$style["breadcrumbs-loading"])
2812
+ }, [createVNode(unref(N8nLoading_default), {
2813
+ loading: breadcrumbsLoading.value,
2814
+ rows: 1,
2815
+ variant: "p"
2816
+ }, null, 8, ["loading"])], 2)) : showFolders.value && currentFolder.value ? (openBlock(), createElementBlock("div", {
2817
+ key: 1,
2818
+ class: normalizeClass(_ctx.$style["breadcrumbs-container"]),
2819
+ "data-test-id": "main-breadcrumbs"
2820
+ }, [createVNode(FolderBreadcrumbs_default, {
2821
+ "current-folder": currentFolderParent.value,
2822
+ actions: mainBreadcrumbsActions.value,
2823
+ "hidden-items-trigger": isDragging.value ? "hover" : "click",
2824
+ "current-folder-as-link": true,
2825
+ onItemSelected: onBreadcrumbItemClick,
2826
+ onAction: onBreadCrumbsAction,
2827
+ onItemDrop: onBreadCrumbsItemDrop,
2828
+ onProjectDrop: moveFolderToProjectRoot
2829
+ }, {
2830
+ append: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style["path-separator"]) }, "/", 2), (openBlock(), createBlock(unref(N8nInlineTextEdit_default), {
2831
+ ref_key: "renameInput",
2832
+ ref: renameInput,
2833
+ key: currentFolder.value?.id,
2834
+ "data-test-id": "breadcrumbs-item-current",
2835
+ placeholder: unref(i18n).baseText("folders.rename.placeholder"),
2836
+ "model-value": currentFolder.value.name,
2837
+ "max-length": 30,
2838
+ "read-only": readOnlyEnv.value || !hasPermissionToUpdateFolders.value,
2839
+ class: normalizeClass({
2840
+ [_ctx.$style.name]: true,
2841
+ [_ctx.$style["pointer-disabled"]]: isDragging.value
2842
+ }),
2843
+ "onUpdate:modelValue": onNameSubmit
2844
+ }, null, 8, [
2845
+ "placeholder",
2846
+ "model-value",
2847
+ "read-only",
2848
+ "class"
2849
+ ]))]),
2850
+ _: 1
2851
+ }, 8, [
2852
+ "current-folder",
2853
+ "actions",
2854
+ "hidden-items-trigger"
2855
+ ])], 2)) : createCommentVNode("", true)]),
2856
+ item: withCtx(({ item: data, index }) => [data.resourceType === "folder" ? (openBlock(), createBlock(Draggable_default, {
2857
+ key: `folder-${index}`,
2858
+ disabled: !isDragNDropEnabled.value,
2859
+ type: "move",
2860
+ "target-data-key": "folder",
2861
+ onDragstart: unref(folderHelpers).onDragStart,
2862
+ onDragend: unref(folderHelpers).onDragEnd
2863
+ }, {
2864
+ preview: withCtx(() => [createVNode(unref(N8nCard_default), null, {
2865
+ default: withCtx(() => [createVNode(unref(N8nText_default), {
2866
+ tag: "h2",
2867
+ bold: ""
2868
+ }, {
2869
+ default: withCtx(() => [createTextVNode(toDisplayString(data.name), 1)]),
2870
+ _: 2
2871
+ }, 1024)]),
2872
+ _: 2
2873
+ }, 1024)]),
2874
+ default: withCtx(() => [createVNode(FolderCard_default, {
2875
+ data,
2876
+ actions: folderCardActions.value,
2877
+ "read-only": readOnlyEnv.value || !hasPermissionToDeleteFolders.value && !hasPermissionToCreateFolders.value,
2878
+ "personal-project": personalProject.value,
2879
+ "data-resourceid": data.id,
2880
+ "data-resourcename": data.name,
2881
+ class: normalizeClass([{
2882
+ ["mb-2xs"]: true,
2883
+ [_ctx.$style["drag-active"]]: isDragging.value,
2884
+ [_ctx.$style.dragging]: unref(foldersStore).draggedElement?.type === "folder" && unref(foldersStore).draggedElement?.id === data.id,
2885
+ [_ctx.$style["drop-active"]]: unref(foldersStore).activeDropTarget?.id === data.id
2886
+ }, "mb-2xs"]),
2887
+ "show-ownership-badge": showCardsBadge.value,
2888
+ "data-target": "folder",
2889
+ onAction: onFolderCardAction,
2890
+ onMouseenter: unref(folderHelpers).onDragEnter,
2891
+ onMouseup: onFolderCardDrop
2892
+ }, null, 8, [
2893
+ "data",
2894
+ "actions",
2895
+ "read-only",
2896
+ "personal-project",
2897
+ "data-resourceid",
2898
+ "data-resourcename",
2899
+ "class",
2900
+ "show-ownership-badge",
2901
+ "onMouseenter"
2902
+ ])]),
2903
+ _: 2
2904
+ }, 1032, [
2905
+ "disabled",
2906
+ "onDragstart",
2907
+ "onDragend"
2908
+ ])) : (openBlock(), createBlock(Draggable_default, {
2909
+ key: `workflow-${index}`,
2910
+ disabled: !isDragNDropEnabled.value,
2911
+ type: "move",
2912
+ "target-data-key": "workflow",
2913
+ onDragstart: unref(folderHelpers).onDragStart,
2914
+ onDragend: unref(folderHelpers).onDragEnd
2915
+ }, {
2916
+ preview: withCtx(() => [createVNode(unref(N8nCard_default), null, {
2917
+ default: withCtx(() => [createVNode(unref(N8nText_default), {
2918
+ tag: "h2",
2919
+ bold: ""
2920
+ }, {
2921
+ default: withCtx(() => [createTextVNode(toDisplayString(data.name), 1)]),
2922
+ _: 2
2923
+ }, 1024)]),
2924
+ _: 2
2925
+ }, 1024)]),
2926
+ default: withCtx(() => [createVNode(WorkflowCard_default, {
2927
+ "data-test-id": "resources-list-item-workflow",
2928
+ "data-target": "workflow",
2929
+ class: normalizeClass({
2930
+ ["mb-2xs"]: true,
2931
+ [_ctx.$style["drag-active"]]: isDragging.value,
2932
+ [_ctx.$style.dragging]: unref(foldersStore).draggedElement?.type === "workflow" && unref(foldersStore).draggedElement?.id === data.id
2933
+ }),
2934
+ data,
2935
+ "workflow-list-event-bus": unref(workflowListEventBus),
2936
+ "read-only": readOnlyEnv.value,
2937
+ "data-resourceid": data.id,
2938
+ "data-resourcename": data.name,
2939
+ "show-ownership-badge": showCardsBadge.value,
2940
+ "are-folders-enabled": unref(settingsStore).isFoldersFeatureEnabled,
2941
+ "are-tags-enabled": unref(settingsStore).areTagsEnabled,
2942
+ "is-mcp-enabled": mcpEnabled.value,
2943
+ "onClick:tag": onClickTag,
2944
+ "onWorkflow:deleted": refreshWorkflows,
2945
+ "onWorkflow:archived": refreshWorkflows,
2946
+ "onWorkflow:unarchived": refreshWorkflows,
2947
+ "onWorkflow:moved": fetchWorkflows,
2948
+ "onWorkflow:duplicated": fetchWorkflows,
2949
+ "onWorkflow:activeToggle": onWorkflowActiveToggle,
2950
+ "onAction:moveToFolder": moveWorkflowToFolder,
2951
+ onMouseenter: _cache[4] || (_cache[4] = ($event) => isDragging.value ? unref(folderHelpers).resetDropTarget() : {})
2952
+ }, null, 8, [
2953
+ "class",
2954
+ "data",
2955
+ "workflow-list-event-bus",
2956
+ "read-only",
2957
+ "data-resourceid",
2958
+ "data-resourcename",
2959
+ "show-ownership-badge",
2960
+ "are-folders-enabled",
2961
+ "are-tags-enabled",
2962
+ "is-mcp-enabled"
2963
+ ])]),
2964
+ _: 2
2965
+ }, 1032, [
2966
+ "disabled",
2967
+ "onDragstart",
2968
+ "onDragend"
2969
+ ]))]),
2970
+ empty: withCtx(() => [unref(projectPages).isSharedSubPage && personalProject.value ? (openBlock(), createBlock(EmptySharedSectionActionBox_default, {
2971
+ key: 0,
2972
+ "personal-project": personalProject.value,
2973
+ "resource-type": "workflows"
2974
+ }, null, 8, ["personal-project"])) : (openBlock(), createElementBlock("div", _hoisted_5, [
2975
+ createBaseVNode("div", _hoisted_6, [createVNode(unref(N8nHeading_default), {
2976
+ tag: "h2",
2977
+ size: "xlarge",
2978
+ class: "mb-2xs"
2979
+ }, {
2980
+ default: withCtx(() => [createTextVNode(toDisplayString(currentUser.value.firstName ? unref(i18n).baseText("workflows.empty.heading", { interpolate: { name: currentUser.value.firstName } }) : unref(i18n).baseText("workflows.empty.heading.userNotSetup")), 1)]),
2981
+ _: 1
2982
+ }), createVNode(unref(N8nText_default), {
2983
+ size: "large",
2984
+ color: "text-base"
2985
+ }, {
2986
+ default: withCtx(() => [createTextVNode(toDisplayString(emptyListDescription.value), 1)]),
2987
+ _: 1
2988
+ })]),
2989
+ !readOnlyEnv.value && projectPermissions.value.workflow.create ? (openBlock(), createElementBlock("div", {
2990
+ key: 0,
2991
+ class: normalizeClass([
2992
+ "text-center",
2993
+ "mt-2xl",
2994
+ _ctx.$style.actionsContainer
2995
+ ])
2996
+ }, [
2997
+ createVNode(unref(N8nCard_default), {
2998
+ class: normalizeClass(_ctx.$style.emptyStateCard),
2999
+ hoverable: "",
3000
+ "data-test-id": "new-workflow-card",
3001
+ onClick: addWorkflow
3002
+ }, {
3003
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.emptyStateCardContent) }, [createVNode(unref(N8nIcon_default), {
3004
+ class: normalizeClass(_ctx.$style.emptyStateCardIcon),
3005
+ icon: "file",
3006
+ color: "foreground-dark",
3007
+ "stroke-width": 1.5
3008
+ }, null, 8, ["class"]), createVNode(unref(N8nText_default), {
3009
+ size: "large",
3010
+ class: "mt-xs"
3011
+ }, {
3012
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.empty.startFromScratch")), 1)]),
3013
+ _: 1
3014
+ })], 2)]),
3015
+ _: 1
3016
+ }, 8, ["class"]),
3017
+ showPrebuiltAgentsCallout.value ? (openBlock(), createBlock(unref(N8nCard_default), {
3018
+ key: 0,
3019
+ class: normalizeClass(_ctx.$style.emptyStateCard),
3020
+ hoverable: "",
3021
+ "data-test-id": "prebuilt-agents-card",
3022
+ onClick: _cache[5] || (_cache[5] = ($event) => openPrebuiltAgentsModal("workflowsList"))
3023
+ }, {
3024
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.emptyStateCardContent) }, [createVNode(unref(N8nIcon_default), {
3025
+ class: normalizeClass(_ctx.$style.emptyStateCardIcon),
3026
+ "stroke-width": 1.5,
3027
+ icon: "bot",
3028
+ color: "foreground-dark"
3029
+ }, null, 8, ["class"]), createVNode(unref(N8nText_default), {
3030
+ size: "large",
3031
+ class: "mt-xs pl-2xs pr-2xs"
3032
+ }, {
3033
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.empty.preBuiltAgents")), 1)]),
3034
+ _: 1
3035
+ })], 2)]),
3036
+ _: 1
3037
+ }, 8, ["class"])) : showAIStarterCollectionCallout.value ? (openBlock(), createBlock(unref(N8nCard_default), {
3038
+ key: 1,
3039
+ class: normalizeClass(_ctx.$style.emptyStateCard),
3040
+ hoverable: "",
3041
+ "data-test-id": "easy-ai-workflow-card",
3042
+ onClick: _cache[6] || (_cache[6] = ($event) => createAIStarterWorkflows("card"))
3043
+ }, {
3044
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.emptyStateCardContent) }, [createVNode(unref(N8nIcon_default), {
3045
+ class: normalizeClass(_ctx.$style.emptyStateCardIcon),
3046
+ "stroke-width": 1.5,
3047
+ icon: "gift",
3048
+ color: "foreground-dark"
3049
+ }, null, 8, ["class"]), createVNode(unref(N8nText_default), {
3050
+ size: "large",
3051
+ class: "mt-xs pl-2xs pr-2xs"
3052
+ }, {
3053
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.ai.starter.collection.card")), 1)]),
3054
+ _: 1
3055
+ })], 2)]),
3056
+ _: 1
3057
+ }, 8, ["class"])) : showEasyAIWorkflowCallout.value ? (openBlock(), createBlock(unref(N8nCard_default), {
3058
+ key: 2,
3059
+ class: normalizeClass(_ctx.$style.emptyStateCard),
3060
+ hoverable: "",
3061
+ "data-test-id": "easy-ai-workflow-card",
3062
+ onClick: _cache[7] || (_cache[7] = ($event) => openAIWorkflow("empty"))
3063
+ }, {
3064
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.emptyStateCardContent) }, [createVNode(unref(N8nIcon_default), {
3065
+ class: normalizeClass(_ctx.$style.emptyStateCardIcon),
3066
+ "stroke-width": 1.5,
3067
+ icon: "bot",
3068
+ color: "foreground-dark"
3069
+ }, null, 8, ["class"]), createVNode(unref(N8nText_default), {
3070
+ size: "large",
3071
+ class: "mt-xs pl-2xs pr-2xs"
3072
+ }, {
3073
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.empty.easyAI")), 1)]),
3074
+ _: 1
3075
+ })], 2)]),
3076
+ _: 1
3077
+ }, 8, ["class"])) : createCommentVNode("", true),
3078
+ showReadyToRunWorkflowsCallout.value ? (openBlock(), createBlock(unref(N8nCard_default), {
3079
+ key: 3,
3080
+ class: normalizeClass(_ctx.$style.emptyStateCard),
3081
+ hoverable: "",
3082
+ "data-test-id": "ready-to-run-workflows-card",
3083
+ onClick: _cache[8] || (_cache[8] = ($event) => handleCreateReadyToRunWorkflows("card"))
3084
+ }, {
3085
+ default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.emptyStateCardContent) }, [createVNode(unref(N8nIcon_default), {
3086
+ class: normalizeClass(_ctx.$style.emptyStateCardIcon),
3087
+ "stroke-width": 1.5,
3088
+ icon: "package-open",
3089
+ color: "foreground-dark"
3090
+ }, null, 8, ["class"]), createVNode(unref(N8nText_default), {
3091
+ size: "large",
3092
+ class: "mt-xs pl-2xs pr-2xs"
3093
+ }, {
3094
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(readyToRunWorkflowsStore).getCardText()), 1)]),
3095
+ _: 1
3096
+ })], 2)]),
3097
+ _: 1
3098
+ }, 8, ["class"])) : createCommentVNode("", true)
3099
+ ], 2)) : createCommentVNode("", true),
3100
+ showTemplatesDataQualityInline.value ? (openBlock(), createElementBlock("div", {
3101
+ key: 1,
3102
+ class: normalizeClass(_ctx.$style.templatesContainer)
3103
+ }, [createVNode(TemplatesDataQualityInlineSection_default)], 2)) : createCommentVNode("", true),
3104
+ showTemplateRecommendationV3.value ? (openBlock(), createBlock(TemplateRecommendationV3_default, { key: 2 })) : showTemplateRecommendationV2.value ? (openBlock(), createBlock(TemplateRecommendationV2_default, { key: 3 })) : createCommentVNode("", true)
3105
+ ]))]),
3106
+ filters: withCtx(({ setKeyValue }) => [
3107
+ unref(settingsStore).areTagsEnabled ? (openBlock(), createElementBlock("div", _hoisted_7, [createVNode(unref(N8nInputLabel_default), {
3108
+ label: unref(i18n).baseText("workflows.filters.tags"),
3109
+ bold: false,
3110
+ size: "small",
3111
+ color: "text-base",
3112
+ class: "mb-3xs"
3113
+ }, null, 8, ["label"]), createVNode(WorkflowTagsDropdown_default, {
3114
+ placeholder: unref(i18n).baseText("workflowOpen.filterWorkflows"),
3115
+ "model-value": filters.value.tags,
3116
+ "create-enabled": false,
3117
+ "onUpdate:modelValue": ($event) => setKeyValue("tags", $event)
3118
+ }, null, 8, [
3119
+ "placeholder",
3120
+ "model-value",
3121
+ "onUpdate:modelValue"
3122
+ ])])) : createCommentVNode("", true),
3123
+ createBaseVNode("div", _hoisted_8, [createVNode(unref(N8nInputLabel_default), {
3124
+ label: unref(i18n).baseText("workflows.filters.status"),
3125
+ bold: false,
3126
+ size: "small",
3127
+ color: "text-base",
3128
+ class: "mb-3xs"
3129
+ }, null, 8, ["label"]), createVNode(unref(N8nSelect_default), {
3130
+ "data-test-id": "status-dropdown",
3131
+ "model-value": filters.value.status,
3132
+ "onUpdate:modelValue": ($event) => setKeyValue("status", $event)
3133
+ }, {
3134
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(statusFilterOptions.value, (option) => {
3135
+ return openBlock(), createBlock(unref(N8nOption_default), {
3136
+ key: option.label,
3137
+ label: option.label,
3138
+ value: option.value,
3139
+ "data-test-id": "status"
3140
+ }, null, 8, ["label", "value"]);
3141
+ }), 128))]),
3142
+ _: 2
3143
+ }, 1032, ["model-value", "onUpdate:modelValue"])]),
3144
+ createBaseVNode("div", _hoisted_9, [createVNode(unref(N8nCheckbox_default), {
3145
+ label: unref(i18n).baseText("workflows.filters.showArchived"),
3146
+ "model-value": filters.value.showArchived || false,
3147
+ "data-test-id": "show-archived-checkbox",
3148
+ "onUpdate:modelValue": ($event) => setKeyValue("showArchived", $event)
3149
+ }, null, 8, [
3150
+ "label",
3151
+ "model-value",
3152
+ "onUpdate:modelValue"
3153
+ ])])
3154
+ ]),
3155
+ postamble: withCtx(() => [workflowsAndFolders.value.length === 0 && !hasFilters.value ? (openBlock(), createElementBlock("div", {
3156
+ key: 0,
3157
+ class: normalizeClass(_ctx.$style["empty-folder-container"]),
3158
+ "data-test-id": "empty-folder-container"
3159
+ }, [showArchivedOnlyHint.value ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
3160
+ key: 0,
3161
+ bold: false
3162
+ }, {
3163
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.archivedOnly.hint")) + " ", 1), createVNode(unref(N8nLink_default), {
3164
+ size: "small",
3165
+ "data-test-id": "show-archived-link",
3166
+ onClick: onShowArchived
3167
+ }, {
3168
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("workflows.archivedOnly.hint.link")), 1)]),
3169
+ _: 1
3170
+ })]),
3171
+ _: 1
3172
+ })) : createCommentVNode("", true), unref(projectPages).isSharedSubPage && personalProject.value ? (openBlock(), createBlock(EmptySharedSectionActionBox_default, {
3173
+ key: 1,
3174
+ "personal-project": personalProject.value,
3175
+ "resource-type": "workflows"
3176
+ }, null, 8, ["personal-project"])) : currentFolder.value ? (openBlock(), createBlock(unref(N8nActionBox_default), {
3177
+ key: 2,
3178
+ "data-test-id": "empty-folder-action-box",
3179
+ heading: unref(i18n).baseText("folders.empty.actionbox.title", { interpolate: { folderName: currentFolder.value.name } }),
3180
+ "button-text": unref(i18n).baseText("generic.create.workflow"),
3181
+ "button-type": "secondary",
3182
+ "button-disabled": readOnlyEnv.value || !projectPermissions.value.workflow.create,
3183
+ "onClick:button": onCreateWorkflowClick
3184
+ }, {
3185
+ disabledButtonTooltip: withCtx(() => [createTextVNode(toDisplayString(readOnlyEnv.value ? unref(i18n).baseText("readOnlyEnv.cantAdd.workflow") : unref(i18n).baseText("generic.missing.permissions")), 1)]),
3186
+ _: 1
3187
+ }, 8, [
3188
+ "heading",
3189
+ "button-text",
3190
+ "button-disabled"
3191
+ ])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)]),
3192
+ _: 2
3193
+ }, [foldersEnabled.value || showRegisteredCommunityCTA.value ? {
3194
+ name: "add-button",
3195
+ fn: withCtx(() => [createVNode(unref(N8nTooltip_default), {
3196
+ placement: "top",
3197
+ disabled: !(unref(projectPages).isOverviewSubPage || unref(projectPages).isSharedSubPage || !readOnlyEnv.value && hasPermissionToCreateFolders.value)
3198
+ }, {
3199
+ content: withCtx(() => [(unref(projectPages).isOverviewSubPage || unref(projectPages).isSharedSubPage) && !showRegisteredCommunityCTA.value ? (openBlock(), createElementBlock("span", _hoisted_1, [teamProjectsEnabled.value ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(unref(i18n).baseText("folders.add.overview.withProjects.message")), 1)) : (openBlock(), createElementBlock("span", _hoisted_3, toDisplayString(unref(i18n).baseText("folders.add.overview.community.message")), 1))])) : (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(currentParentName.value ? unref(i18n).baseText("folders.add.to.parent.message", { interpolate: { parent: currentParentName.value } }) : unref(i18n).baseText("folders.add.here.message")), 1))]),
3200
+ default: withCtx(() => [createVNode(unref(N8nButton_default), {
3201
+ size: "small",
3202
+ icon: "folder-plus",
3203
+ type: "tertiary",
3204
+ "data-test-id": "add-folder-button",
3205
+ class: normalizeClass(_ctx.$style["add-folder-button"]),
3206
+ disabled: !showRegisteredCommunityCTA.value && (readOnlyEnv.value || !hasPermissionToCreateFolders.value),
3207
+ onClick: createFolderInCurrent
3208
+ }, null, 8, ["class", "disabled"])]),
3209
+ _: 1
3210
+ }, 8, ["disabled"])]),
3211
+ key: "0"
3212
+ } : void 0]), 1032, [
3213
+ "filters",
3214
+ "resources",
3215
+ "shareable",
3216
+ "disabled",
3217
+ "resources-refreshing",
3218
+ "custom-page-size",
3219
+ "total-items",
3220
+ "has-empty-state",
3221
+ "onMouseleave"
3222
+ ]));
3223
+ };
3224
+ }
3225
+ });
3226
+ const actionsContainer = "_actionsContainer_16q3y_123";
3227
+ const templatesContainer = "_templatesContainer_16q3y_128";
3228
+ const emptyStateCard = "_emptyStateCard_16q3y_148";
3229
+ const emptyStateCardContent = "_emptyStateCardContent_16q3y_161";
3230
+ const emptyStateCardIcon = "_emptyStateCardIcon_16q3y_168";
3231
+ const dragging = "_dragging_16q3y_201";
3232
+ const name = "_name_16q3y_219";
3233
+ var WorkflowsView_vue_vue_type_style_index_0_lang_module_default = {
3234
+ actionsContainer,
3235
+ templatesContainer,
3236
+ "easy-ai-workflow-callout": "_easy-ai-workflow-callout_16q3y_137",
3237
+ "callout-trailing-content": "_callout-trailing-content_16q3y_142",
3238
+ emptyStateCard,
3239
+ emptyStateCardContent,
3240
+ emptyStateCardIcon,
3241
+ "add-folder-button": "_add-folder-button_16q3y_175",
3242
+ "breadcrumbs-container": "_breadcrumbs-container_16q3y_180",
3243
+ "breadcrumbs-loading": "_breadcrumbs-loading_16q3y_186",
3244
+ "empty-folder-container": "_empty-folder-container_16q3y_192",
3245
+ "drag-active": "_drag-active_16q3y_196",
3246
+ dragging,
3247
+ "drop-active": "_drop-active_16q3y_208",
3248
+ "path-separator": "_path-separator_16q3y_213",
3249
+ name,
3250
+ "pointer-disabled": "_pointer-disabled_16q3y_225"
3251
+ };
3252
+ var WorkflowsView_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowsView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowsView_vue_vue_type_style_index_0_lang_module_default }]]);
3253
+ export { WorkflowsView_default as default };