n8n-editor-ui 1.107.3 → 1.109.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 (124) hide show
  1. package/dist/assets/{AddDataStoreModal-BWJ9lPXD.js → AddDataStoreModal-DQSrUeGv.js} +27 -10
  2. package/dist/assets/{AnimatedSpinner-DNlzAAjE.js → AnimatedSpinner-DG0OJkY1.js} +1 -1
  3. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-CNykFw3C.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-DL7yrAdr.js} +1 -1
  4. package/dist/assets/{AuthView-CBZF2tp7.js → AuthView-BjsoW1-5.js} +2 -2
  5. package/dist/assets/{ChangePasswordView-BNZ4Lec-.js → ChangePasswordView-wL-Pegb8.js} +3 -3
  6. package/dist/assets/CollectionParameter-CGRCLW5F.js +4 -0
  7. package/dist/assets/{ConsumedTokensDetails.vue_vue_type_script_setup_true_lang-CWb4OBYA.js → ConsumedTokensDetails.vue_vue_type_script_setup_true_lang-Y9jgPwUm.js} +1 -1
  8. package/dist/assets/{CredentialsView-CsNObRPu.js → CredentialsView-Cp-dKa-6.js} +8 -8
  9. package/dist/assets/DataStoreActions.vue_vue_type_script_setup_true_lang-jUSBJd47.js +89 -0
  10. package/dist/assets/{WorkflowActivator-22RW64G2.css → DataStoreDetailsView-BxDmY87S.css} +268 -200
  11. package/dist/assets/DataStoreDetailsView-D9YNa5HC.js +41178 -0
  12. package/dist/assets/{DataStoreView-BNXibrgV.js → DataStoreView-Bs-qcZ8z.js} +63 -155
  13. package/dist/assets/{DataStoreView-D-Wmcgs5.css → DataStoreView-bZrewhaR.css} +10 -15
  14. package/dist/assets/{DemoFooter-DN__rQTx.js → DemoFooter-DPTKA9IL.js} +6 -6
  15. package/dist/assets/{EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-BLs3shin.js → EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-DiIUOGo1.js} +1 -1
  16. package/dist/assets/{EntityNotFound-DwzIV-IA.js → EntityNotFound-7GWizCKV.js} +1 -1
  17. package/dist/assets/{EntityUnAuthorised-Uk7UofGI.js → EntityUnAuthorised-BGNR4Y6R.js} +1 -1
  18. package/dist/assets/{ErrorView-2aaHp4mm.js → ErrorView-Dbc4jM8G.js} +1 -1
  19. package/dist/assets/{EvaluationsRootView-DajOMNNe.js → EvaluationsRootView-bKi3SFkK.js} +1 -1
  20. package/dist/assets/{EvaluationsView-D9B7p6ca.js → EvaluationsView-URJMmngS.js} +4 -4
  21. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-xG0FUKDV.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-C8GA5YsR.js} +4 -4
  22. package/dist/assets/{ExecutionsView-CcstUltt.js → ExecutionsView-C32NF_Mi.js} +11 -11
  23. package/dist/assets/{FixedCollectionParameter-B0MexyJU.js → FixedCollectionParameter-C32o7Xw1.js} +1 -1
  24. package/dist/assets/{ForgotMyPasswordView-Bah9hI_a.js → ForgotMyPasswordView-BIGcjM0k.js} +3 -3
  25. package/dist/assets/{InfoAccordion-BL8J1chC.js → InfoAccordion-DVdDpADr.js} +2 -2
  26. package/dist/assets/{InsightsChartAverageRuntime-PuDIJUWO.js → InsightsChartAverageRuntime-CjOAk50Z.js} +4 -4
  27. package/dist/assets/{InsightsChartFailed-e8gNXvOD.js → InsightsChartFailed-DCQYezXm.js} +4 -4
  28. package/dist/assets/{InsightsChartFailureRate-CTHQ0RyF.js → InsightsChartFailureRate-L674yUIQ.js} +4 -4
  29. package/dist/assets/{InsightsChartTimeSaved-DnvNXWyi.js → InsightsChartTimeSaved-B6a4bv2j.js} +4 -4
  30. package/dist/assets/{InsightsChartTotal-DD_g0FlT.js → InsightsChartTotal-BGmz_E44.js} +4 -4
  31. package/dist/assets/{InsightsDashboard-Dd6ng80b.js → InsightsDashboard-CbtPLqME.js} +10 -10
  32. package/dist/assets/{InsightsPaywall-CMRBFk7F.js → InsightsPaywall-iTfZzLCq.js} +1 -1
  33. package/dist/assets/{InsightsSummary-od7C9keP.js → InsightsSummary-D0XZxoWu.js} +2 -2
  34. package/dist/assets/{InsightsTableWorkflows-bDP7Feik.js → InsightsTableWorkflows-DYL5sIeL.js} +15 -13
  35. package/dist/assets/{Logo-DccSZavS.js → Logo-BF6xE_TK.js} +1 -1
  36. package/dist/assets/{LogsPanel-B-Tmod-K.css → LogsPanel-BinqqXXh.css} +14 -17
  37. package/dist/assets/{LogsPanel-CgRsN0f1.js → LogsPanel-DhSbCRI8.js} +193 -141
  38. package/dist/assets/{MainHeader-C7eM_NQZ.css → MainHeader-BofAi8wS.css} +42 -42
  39. package/dist/assets/{MainHeader-BuQIia5G.js → MainHeader-C992btCf.js} +488 -481
  40. package/dist/assets/{MainSidebar-DmJW5X0O.js → MainSidebar-CfBkhJuz.js} +47 -66
  41. package/dist/assets/{NodeCreation-BWPpAKFI.js → NodeCreation-C4-JrWkw.js} +4 -4
  42. package/dist/assets/{NodeCreator-CcJ3ERxm.js → NodeCreator-BHFu5J3H.js} +19 -17
  43. package/dist/assets/{NodeCreator-COgNP4W1.css → NodeCreator-vQ-Sfr_5.css} +8 -9
  44. package/dist/assets/{NodeDetailsView-CCLWHias.js → NodeDetailsView-DucQbxES.js} +14 -14
  45. package/dist/assets/{NodeDetailsViewV2-dXQZWfaF.js → NodeDetailsViewV2-By7jano3.js} +25 -25
  46. package/dist/assets/{NodeDetailsViewV2-Bn1PbAPe.css → NodeDetailsViewV2-J_3cfdea.css} +15 -15
  47. package/dist/assets/{NodeView-DXfRa5dq.js → NodeView-Bi4OfDJp.js} +15 -11
  48. package/dist/assets/ProjectBreadcrumb-B1Hnf5da.css +445 -0
  49. package/dist/assets/ProjectBreadcrumb-l5PnV6Jp.js +381 -0
  50. package/dist/assets/{ProjectHeader-B9EjwT8u.js → ProjectHeader-D1veUs2f.js} +27 -30
  51. package/dist/assets/{ProjectSettings-DxChDPJp.js → ProjectSettings-CiMu32JB.js} +6 -6
  52. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-CAcI_6zc.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-Cl5RoRJK.js} +2 -2
  53. package/dist/assets/{ResourcesListLayout-BXykiIem.js → ResourcesListLayout-V2ovJZd-.js} +3 -3
  54. package/dist/assets/{RunDataJson-DQ-wEydT.js → RunDataJson--o61ywP4.js} +3 -3
  55. package/dist/assets/{RunDataJsonActions-DkwJw6g0.js → RunDataJsonActions-BuTnnCdp.js} +14 -14
  56. package/dist/assets/{RunDataParsedAiContent-pthnU6es.js → RunDataParsedAiContent-Dv43fJJj.js} +2 -2
  57. package/dist/assets/{RunDataSearch-Dz5_0Sop.js → RunDataSearch-DhhRomuh.js} +1 -1
  58. package/dist/assets/{RunDataTable-DlwkWBoU.js → RunDataTable-BRNjCbjf.js} +6 -6
  59. package/dist/assets/{SamlOnboarding-BfiycZyp.js → SamlOnboarding-ChVfS2ix.js} +3 -3
  60. package/dist/assets/{SettingsApiView-D6E5CVxl.js → SettingsApiView-EJcHWxis.js} +1 -1
  61. package/dist/assets/{SettingsCommunityNodesView-CQV4UbKm.js → SettingsCommunityNodesView-BCGKGJGl.js} +5 -5
  62. package/dist/assets/{SettingsExternalSecrets-nYlsTral.js → SettingsExternalSecrets-DQ6GuwI_.js} +1 -1
  63. package/dist/assets/{SettingsLdapView-C35iJN3N.js → SettingsLdapView-YMEEL5g4.js} +1 -1
  64. package/dist/assets/{SettingsLogStreamingView-DF2IVwuv.js → SettingsLogStreamingView-CMRM9qEX.js} +1 -1
  65. package/dist/assets/{SettingsPersonalView-DvTBCV7u.js → SettingsPersonalView-CQ3j6jFh.js} +2 -2
  66. package/dist/assets/{SettingsSourceControl-Bp7kBNsF.js → SettingsSourceControl-W3xQHBQs.js} +2 -2
  67. package/dist/assets/{SettingsSso-D3MsGwAG.js → SettingsSso-B-RJISS8.js} +8 -6
  68. package/dist/assets/{SettingsUsageAndPlan-BvSyV6eq.js → SettingsUsageAndPlan-BI4z3ArV.js} +2 -2
  69. package/dist/assets/{SettingsUsersView-BKx9xQmw.js → SettingsUsersView-FdTxfP_9.js} +3 -3
  70. package/dist/assets/{SettingsView-N1braOIS.js → SettingsView-enVRJi4X.js} +1 -1
  71. package/dist/assets/{SetupView-DB325RA-.js → SetupView-DhQVRFto.js} +3 -3
  72. package/dist/assets/{SetupWorkflowCredentialsButton-Bv6XJXPb.js → SetupWorkflowCredentialsButton-o-0v9TC0.js} +1 -1
  73. package/dist/assets/{SetupWorkflowFromTemplateView-DvJ9hJNk.js → SetupWorkflowFromTemplateView-t24Wf8j0.js} +4 -4
  74. package/dist/assets/{SigninView-Do_ZE4PN.js → SigninView-CqnnxcHH.js} +3 -3
  75. package/dist/assets/{SignoutView-RMWoU9ka.js → SignoutView-BYkRErR0.js} +1 -1
  76. package/dist/assets/{SignupView-DaSOlcHH.js → SignupView-CZ5xz8Ej.js} +3 -3
  77. package/dist/assets/{TableBase-DEfTMdd5.js → TableBase-DZ3KHAaq.js} +1 -1
  78. package/dist/assets/{Tag-Bpg7pWwM.js → Tag-BZXOdJeY.js} +1 -1
  79. package/dist/assets/{Tags-BOko1qXh.js → Tags-BGrNA-zc.js} +2 -2
  80. package/dist/assets/{TemplateDetails-DKT_t-A1.js → TemplateDetails-CGeXTU0J.js} +2 -2
  81. package/dist/assets/{TemplateList-CKb1zA2_.js → TemplateList-BUJPQKR1.js} +1 -1
  82. package/dist/assets/{TemplatesCollectionView-D47Zvruw.js → TemplatesCollectionView-CDz25qgN.js} +7 -7
  83. package/dist/assets/{TemplatesSearchView-C1Drn--8.js → TemplatesSearchView-l-Ueq6ha.js} +3 -3
  84. package/dist/assets/{TemplatesView-DLGApF1u.js → TemplatesView-CbzVhmOD.js} +1 -1
  85. package/dist/assets/{TemplatesWorkflowView-BU_v7Vg5.js → TemplatesWorkflowView-D2fR5qLE.js} +7 -7
  86. package/dist/assets/{TriggerPanel-DmVMaaLr.css → TriggerPanel-BFPMKijE.css} +4 -4
  87. package/dist/assets/{TriggerPanel-BEWhhdtu.js → TriggerPanel-BNb8Fkp3.js} +23 -12
  88. package/dist/assets/{VariablesView-CvBjaoev.js → VariablesView-ZO4oTir0.js} +9 -9
  89. package/dist/assets/{WorkerView-cFswonAF.js → WorkerView-DjYjCGEz.js} +6 -6
  90. package/dist/assets/{WorkflowActivator-mjgVWRcp.js → WorkflowActivator-CFrLXTxM.js} +13 -389
  91. package/dist/assets/WorkflowActivator-jI4sUqXL.css +391 -0
  92. package/dist/assets/{WorkflowExecutionsInfoAccordion-CZwCkYjJ.js → WorkflowExecutionsInfoAccordion-C8Tc4Mno.js} +3 -3
  93. package/dist/assets/{WorkflowExecutionsLandingPage-C5AsTUva.js → WorkflowExecutionsLandingPage-BiuuJ3ll.js} +3 -3
  94. package/dist/assets/{WorkflowExecutionsPreview-1HvxolBT.js → WorkflowExecutionsPreview-CYoDxL8E.js} +4 -4
  95. package/dist/assets/{WorkflowExecutionsView-YiB3L6cC.js → WorkflowExecutionsView-C78loZuv.js} +8 -8
  96. package/dist/assets/{WorkflowHistory-DMhEstvs.js → WorkflowHistory-CqoFF8_8.js} +4 -4
  97. package/dist/assets/{WorkflowOnboardingView-Dnm-Rnp-.js → WorkflowOnboardingView-dpvpoau1.js} +1 -1
  98. package/dist/assets/{WorkflowPreview-Dy8KQCnA.js → WorkflowPreview-83_iB67I.js} +1 -1
  99. package/dist/assets/{WorkflowsView-Cv689d2r.js → WorkflowsView-Bhr5Vfcw.js} +24 -23
  100. package/dist/assets/{WorkflowsView-eYGsq80b.css → WorkflowsView-BuvoAeDm.css} +18 -17
  101. package/dist/assets/{canvas-DBxg3FGB.js → canvas-Kg89rGSt.js} +1 -1
  102. package/dist/assets/{chartjs.utils-ziIypBRK.js → chartjs.utils-6nSeP00a.js} +2 -2
  103. package/dist/assets/{core-BQX74yIJ.js → core-BiQ8TPaF.js} +9 -8
  104. package/dist/assets/dataStore.store-Bru4R38e.js +268 -0
  105. package/dist/assets/{en-CdefH_p-.js → en-CZDXhi4W.js} +50 -27
  106. package/dist/assets/{global-link-actions-BgqtAMjH.js → global-link-actions-BfwrTt1h.js} +1 -1
  107. package/dist/assets/{index-BFyMw9-0.css → index-Am8RmnT4.css} +233 -241
  108. package/dist/assets/{index-D4wn1X5v.js → index-CZxO9Y7t.js} +1 -1
  109. package/dist/assets/{index-eiGMGof4.js → index-V25MIkzH.js} +6310 -5682
  110. package/dist/assets/{pickBy-D-ZGPPK6.js → pickBy-CInoejW7.js} +1 -1
  111. package/dist/assets/{polyfills-eMEFRc79.js → polyfills-BhZQ1FDI.js} +44 -0
  112. package/dist/assets/{readyToRunWorkflows.store-BAFBPhWS.js → readyToRunWorkflows.store-D8qADh9A.js} +1 -1
  113. package/dist/assets/{templateActions-BI7pkM1w.js → templateActions-CytValxU.js} +1 -1
  114. package/dist/assets/{typescript.worker-ku8s_Oaf.js → typescript.worker-BcoVIdo9.js} +8 -8
  115. package/dist/assets/{useBeforeUnload-BjekgFaf.js → useBeforeUnload-yQFY1z_s.js} +1 -1
  116. package/dist/assets/{useExecutionDebugging-B38snoEK.js → useExecutionDebugging-DiCw9NpL.js} +1 -1
  117. package/dist/assets/{useImportCurlCommand-Cm4bDewX.js → useImportCurlCommand-UhCp_Hxn.js} +44 -37
  118. package/dist/assets/{useProjectPages-ALKmwRBA.js → useProjectPages-DNuz01tw.js} +1 -1
  119. package/dist/assets/{usePushConnection-CEXhOxd5.js → usePushConnection-BOddel3U.js} +3 -3
  120. package/dist/assets/{useWorkflowActivate-B8jSp35O.js → useWorkflowActivate-DKZ9PzgK.js} +1 -1
  121. package/dist/index.html +3 -3
  122. package/package.json +1 -1
  123. package/dist/assets/CollectionParameter-BNLFCXfs.js +0 -4
  124. package/dist/assets/dataStore.store-BPclFpMe.js +0 -98
@@ -1,12 +1,13 @@
1
- import { d as defineComponent, r as ref, x as computed, e as createBlock, f as createCommentVNode, g as openBlock, l as unref, y as N8nPopoverReka, w as withCtx, j as createBaseVNode, n as normalizeClass, i as createVNode, h as createElementBlock, m as N8nHeading, k as createTextVNode, t as toDisplayString, z as N8nCallout, F as Fragment, A as renderList, B as withModifiers, N as N8nIcon, p as N8nText, C as N8nLink, D as useI18n, _ as _export_sfc, E as ElDropdown, G as N8nAvatar, H as ElDropdownMenu, I as ElDropdownItem, J as N8nUserInfo, K as mergeProps, L as MAIN_HEADER_TABS, O as N8nRadioButtons, P as onBeforeUnmount, o as onMounted, Q as renderSlot, R as nextTick, S as debounce, T as resolveComponent, U as normalizeStyle, W as createEventBus, X as useTagsStore, Y as useDebounce, Z as useUIStore, $ as BREAKPOINT_SM, a0 as BREAKPOINT_XL, a1 as BREAKPOINT_LG, a2 as BREAKPOINT_MD, a3 as getBannerRowHeight, V as VIEWS, a4 as N8nTooltip, a5 as _sfc_main$d, c as useI18n$1, a6 as I18nT, a7 as defineStore, a8 as usePushConnectionStore, a9 as useWorkflowsStore, u as useUsersStore, aa as useRoute, ab as PLACEHOLDER_EMPTY_WORKFLOW_ID, ac as STORES, ad as TIME, ae as useDocumentVisibility, af as watch, b as useRouter, ag as useEvaluationStore, ah as useNodeTypesStore, ai as useWorkflowSettingsCache, aj as useSourceControlStore, ak as WORKFLOW_ACTIVE_MODAL_KEY, al as ERROR_WORKFLOW_DOCS_URL, am as EVALUATIONS_DOCS_URL, an as TIME_SAVED_DOCS_URL, ao as WORKFLOW_SETTINGS_MODAL_KEY, ap as useTelemetry, aq as useMessage, ar as MODAL_CONFIRM, as as useCssModule, at as useRootStore, au as useCanvasStore, v as useSettingsStore, av as useProjectsStore, aw as useFoldersStore, ax as useNpsSurveyStore, a as useToast, ay as useDocumentTitle, az as useWorkflowSaving, aA as useWorkflowHelpers, aB as usePageRedirectionHelper, aC as getResourcePermissions, aD as WORKFLOW_MENU_ACTIONS, aE as hasPermission, aF as EnterpriseEditionFeature, aG as ProjectTypes, aH as useTemplateRef, aI as InlineRename, aJ as MAX_WORKFLOW_NAME_LENGTH, aK as _sfc_main$e, aL as N8nBadge, q as N8nButton, aM as SaveButton, aN as N8nActionDropdown, aO as WORKFLOW_SHARE_MODAL_KEY, aP as nodeViewEventBus, aQ as SOURCE_CONTROL_PUSH_MODAL_KEY, aR as IMPORT_WORKFLOW_URL_MODAL_KEY, aS as FileSaver_minExports, aT as DUPLICATE_MODAL_KEY, aU as ResourceType, aV as PROJECT_MOVE_RESOURCE_MODAL, aW as __vitePreload, aX as hyphenate, aY as h, aZ as hasOwn, a_ as useNDVStore, a$ as useExecutionsStore, b0 as useLocalStorage, b1 as LOCAL_STORAGE_HIDE_GITHUB_STAR_BUTTON, b2 as STICKY_NODE_TYPE, b3 as onBeforeMount, b4 as withDirectives, b5 as vShow, b6 as N8N_MAIN_GITHUB_REPO_URL } from "./index-eiGMGof4.js";
2
- import { _ as __unplugin_components_0, W as WorkflowActivator } from "./WorkflowActivator-mjgVWRcp.js";
3
- import { _ as _sfc_main$f } from "./PushConnectionTracker.vue_vue_type_script_setup_true_lang-CAcI_6zc.js";
4
- import { u as useBeforeUnload } from "./useBeforeUnload-BjekgFaf.js";
5
- import { T as Tag } from "./Tag-Bpg7pWwM.js";
6
- import { u as usePushConnection } from "./usePushConnection-CEXhOxd5.js";
7
- import "./useWorkflowActivate-B8jSp35O.js";
8
- import "./global-link-actions-BgqtAMjH.js";
9
- import "./readyToRunWorkflows.store-BAFBPhWS.js";
1
+ import { d as defineComponent, r as ref, x as computed, e as createBlock, f as createCommentVNode, g as openBlock, l as unref, y as N8nPopoverReka, w as withCtx, j as createBaseVNode, n as normalizeClass, i as createVNode, h as createElementBlock, m as N8nHeading, k as createTextVNode, t as toDisplayString, z as N8nCallout, F as Fragment, A as renderList, B as withModifiers, N as N8nIcon, p as N8nText, C as N8nLink, D as useI18n, _ as _export_sfc, E as ElDropdown, G as N8nAvatar, H as ElDropdownMenu, I as ElDropdownItem, J as N8nUserInfo, K as mergeProps, L as MAIN_HEADER_TABS, O as N8nRadioButtons, P as useDebounce, Q as useUIStore, R as BREAKPOINT_SM, S as BREAKPOINT_XL, T as BREAKPOINT_LG, U as BREAKPOINT_MD, o as onMounted, W as onBeforeUnmount, X as renderSlot, Y as nextTick, Z as getBannerRowHeight, $ as defineStore, a0 as usePushConnectionStore, a1 as useWorkflowsStore, u as useUsersStore, a2 as useRoute, a3 as PLACEHOLDER_EMPTY_WORKFLOW_ID, a4 as STORES, a5 as TIME, a6 as useDocumentVisibility, a7 as watch, V as VIEWS, a8 as resolveComponent, a9 as Tooltip, aa as _sfc_main$d, c as useI18n$1, ab as I18nT, b as useRouter, ac as useEvaluationStore, ad as useNodeTypesStore, ae as useWorkflowSettingsCache, af as useSourceControlStore, ag as WORKFLOW_ACTIVE_MODAL_KEY, ah as ERROR_WORKFLOW_DOCS_URL, ai as EVALUATIONS_DOCS_URL, aj as TIME_SAVED_DOCS_URL, ak as WORKFLOW_SETTINGS_MODAL_KEY, al as useTelemetry, am as useMessage, an as MODAL_CONFIRM, ao as debounce, ap as normalizeStyle, aq as createEventBus, ar as useTagsStore, as as useCssModule, at as useRootStore, v as useSettingsStore, au as useProjectsStore, av as useFoldersStore, aw as useNpsSurveyStore, a as useToast, ax as useDocumentTitle, ay as useWorkflowSaving, az as useWorkflowHelpers, aA as usePageRedirectionHelper, aB as getResourcePermissions, aC as WORKFLOW_MENU_ACTIONS, aD as hasPermission, aE as EnterpriseEditionFeature, aF as ProjectTypes, aG as useTemplateRef, aH as InlineRename, aI as MAX_WORKFLOW_NAME_LENGTH, aJ as _sfc_main$e, aK as N8nBadge, q as N8nButton, aL as SaveButton, aM as N8nActionDropdown, aN as WORKFLOW_SHARE_MODAL_KEY, aO as nodeViewEventBus, aP as IMPORT_WORKFLOW_URL_MODAL_KEY, aQ as FileSaver_minExports, aR as DUPLICATE_MODAL_KEY, aS as ResourceType, aT as PROJECT_MOVE_RESOURCE_MODAL, aU as __vitePreload, aV as hyphenate, aW as h, aX as hasOwn, aY as useNDVStore, aZ as useExecutionsStore, a_ as useLocalStorage, a$ as LOCAL_STORAGE_HIDE_GITHUB_STAR_BUTTON, b0 as STICKY_NODE_TYPE, b1 as onBeforeMount, b2 as withDirectives, b3 as vShow, b4 as N8N_MAIN_GITHUB_REPO_URL } from "./index-V25MIkzH.js";
2
+ import { _ as __unplugin_components_0, W as WorkflowActivator } from "./WorkflowActivator-CFrLXTxM.js";
3
+ import { u as useBeforeUnload } from "./useBeforeUnload-yQFY1z_s.js";
4
+ import { _ as _sfc_main$f } from "./PushConnectionTracker.vue_vue_type_script_setup_true_lang-Cl5RoRJK.js";
5
+ import { T as Tag } from "./Tag-BZXOdJeY.js";
6
+ import { u as usePushConnection } from "./usePushConnection-BOddel3U.js";
7
+ import "./ProjectBreadcrumb-l5PnV6Jp.js";
8
+ import "./useWorkflowActivate-DKZ9PzgK.js";
9
+ import "./global-link-actions-BfwrTt1h.js";
10
+ import "./readyToRunWorkflows.store-D8qADh9A.js";
10
11
  const _hoisted_1$4 = ["data-action-id", "onClick"];
11
12
  const _hoisted_2$3 = { key: 0 };
12
13
  const _sfc_main$c = /* @__PURE__ */ defineComponent({
@@ -393,271 +394,6 @@ const cssModules$3 = {
393
394
  };
394
395
  const TabBar = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$3]]);
395
396
  const _sfc_main$9 = /* @__PURE__ */ defineComponent({
396
- __name: "IntersectionObserver",
397
- props: {
398
- threshold: { default: 0 },
399
- enabled: { type: Boolean, default: false },
400
- eventBus: {}
401
- },
402
- emits: ["observed"],
403
- setup(__props, { emit: __emit }) {
404
- const props = __props;
405
- const emit = __emit;
406
- const observer = ref(null);
407
- const root = ref(null);
408
- onBeforeUnmount(() => {
409
- if (props.enabled && observer.value) {
410
- observer.value.disconnect();
411
- }
412
- });
413
- onMounted(() => {
414
- if (!props.enabled) {
415
- return;
416
- }
417
- const options = {
418
- root: root.value,
419
- rootMargin: "0px",
420
- threshold: props.threshold
421
- };
422
- const intersectionObserver = new IntersectionObserver((entries) => {
423
- entries.forEach(({ target, isIntersecting }) => {
424
- emit("observed", {
425
- el: target,
426
- isIntersecting
427
- });
428
- });
429
- }, options);
430
- observer.value = intersectionObserver;
431
- props.eventBus.on("observe", (observed) => {
432
- if (observed) {
433
- intersectionObserver.observe(observed);
434
- }
435
- });
436
- props.eventBus.on("unobserve", (observed) => {
437
- intersectionObserver.unobserve(observed);
438
- });
439
- });
440
- return (_ctx, _cache) => {
441
- return openBlock(), createElementBlock("div", {
442
- ref_key: "root",
443
- ref: root
444
- }, [
445
- renderSlot(_ctx.$slots, "default")
446
- ], 512);
447
- };
448
- }
449
- });
450
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
451
- __name: "IntersectionObserved",
452
- props: {
453
- enabled: { type: Boolean, default: false },
454
- eventBus: {}
455
- },
456
- setup(__props) {
457
- const props = __props;
458
- const observed = ref(null);
459
- onMounted(async () => {
460
- if (!props.enabled) {
461
- return;
462
- }
463
- await nextTick();
464
- props.eventBus.emit("observe", observed.value);
465
- });
466
- onBeforeUnmount(() => {
467
- if (props.enabled) {
468
- props.eventBus.emit("unobserve", observed.value);
469
- }
470
- });
471
- return (_ctx, _cache) => {
472
- return openBlock(), createElementBlock("span", {
473
- ref_key: "observed",
474
- ref: observed
475
- }, [
476
- renderSlot(_ctx.$slots, "default")
477
- ], 512);
478
- };
479
- }
480
- });
481
- const _hoisted_1$2 = { class: "tags" };
482
- const _hoisted_2$2 = ["onClick"];
483
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
484
- __name: "TagsContainer",
485
- props: {
486
- tagIds: {},
487
- tagsById: {},
488
- limit: { default: 20 },
489
- clickable: { type: Boolean, default: false },
490
- responsive: { type: Boolean, default: false },
491
- hoverable: { type: Boolean, default: false }
492
- },
493
- emits: ["click"],
494
- setup(__props, { emit: __emit }) {
495
- const props = __props;
496
- const emit = __emit;
497
- const maxWidth = ref(320);
498
- const intersectionEventBus = createEventBus();
499
- const visibility = ref({});
500
- const tagsContainer = ref();
501
- const style = computed(() => ({
502
- "max-width": `${maxWidth.value}px`
503
- }));
504
- const tags = computed(() => {
505
- const allTags = props.tagIds.map((tagId) => props.tagsById[tagId]).filter(Boolean);
506
- let toDisplay = props.limit ? allTags.slice(0, props.limit) : allTags;
507
- toDisplay = toDisplay.map((tag) => ({
508
- ...tag,
509
- hidden: props.responsive && !visibility.value[tag.id]
510
- }));
511
- let visibleCount = toDisplay.length;
512
- if (props.responsive) {
513
- visibleCount = Object.values(visibility.value).reduce(
514
- (accu, val) => val ? accu + 1 : accu,
515
- 0
516
- );
517
- }
518
- if (visibleCount < allTags.length) {
519
- const hidden = allTags.slice(visibleCount);
520
- const hiddenTitle = hidden.reduce(
521
- (accu, tag) => accu ? `${accu}, ${tag.name}` : tag.name,
522
- ""
523
- );
524
- const countTag = {
525
- id: "count",
526
- name: `+${hidden.length}`,
527
- title: hiddenTitle,
528
- isCount: true
529
- };
530
- toDisplay.splice(visibleCount, 0, countTag);
531
- }
532
- return toDisplay;
533
- });
534
- const setMaxWidth = () => {
535
- const container2 = tagsContainer.value?.$el;
536
- const parent = container2?.parentNode;
537
- if (parent) {
538
- maxWidth.value = 0;
539
- void nextTick(() => {
540
- maxWidth.value = parent.clientWidth;
541
- });
542
- }
543
- };
544
- const debouncedSetMaxWidth = debounce(setMaxWidth, 100);
545
- const onObserved = ({ el, isIntersecting }) => {
546
- if (el.dataset.id) {
547
- visibility.value = { ...visibility.value, [el.dataset.id]: isIntersecting };
548
- }
549
- };
550
- const onClick = (e, tag) => {
551
- if (props.clickable) {
552
- e.stopPropagation();
553
- }
554
- if (!tag.hidden) {
555
- emit("click", tag.id);
556
- }
557
- };
558
- onMounted(() => {
559
- setMaxWidth();
560
- window.addEventListener("resize", debouncedSetMaxWidth);
561
- });
562
- onBeforeUnmount(() => {
563
- window.removeEventListener("resize", debouncedSetMaxWidth);
564
- });
565
- return (_ctx, _cache) => {
566
- const _component_el_tag = resolveComponent("el-tag");
567
- return openBlock(), createBlock(_sfc_main$9, {
568
- ref_key: "tagsContainer",
569
- ref: tagsContainer,
570
- threshold: 1,
571
- class: "tags-container",
572
- style: normalizeStyle(style.value),
573
- enabled: _ctx.responsive,
574
- "event-bus": unref(intersectionEventBus),
575
- onObserved
576
- }, {
577
- default: withCtx(() => [
578
- createBaseVNode("span", _hoisted_1$2, [
579
- (openBlock(true), createElementBlock(Fragment, null, renderList(tags.value, (tag) => {
580
- return openBlock(), createElementBlock("span", {
581
- key: tag.id,
582
- class: normalizeClass({ clickable: !tag.hidden }),
583
- onClick: (e) => onClick(e, tag)
584
- }, [
585
- tag.isCount ? (openBlock(), createBlock(_component_el_tag, {
586
- key: 0,
587
- title: tag.title,
588
- type: "info",
589
- size: "small",
590
- class: "count-container",
591
- "disable-transitions": true
592
- }, {
593
- default: withCtx(() => [
594
- createTextVNode(toDisplayString(tag.name), 1)
595
- ]),
596
- _: 2
597
- }, 1032, ["title"])) : (openBlock(), createBlock(_sfc_main$8, {
598
- key: 1,
599
- class: normalizeClass({ hideTag: tag.hidden }),
600
- "data-id": tag.id,
601
- enabled: _ctx.responsive,
602
- "event-bus": unref(intersectionEventBus)
603
- }, {
604
- default: withCtx(() => [
605
- createVNode(_component_el_tag, {
606
- title: tag.name,
607
- type: "info",
608
- size: "mini",
609
- class: normalizeClass({ hoverable: _ctx.hoverable }),
610
- "disable-transitions": true
611
- }, {
612
- default: withCtx(() => [
613
- createTextVNode(toDisplayString(tag.name), 1)
614
- ]),
615
- _: 2
616
- }, 1032, ["title", "class"])
617
- ]),
618
- _: 2
619
- }, 1032, ["class", "data-id", "enabled", "event-bus"]))
620
- ], 10, _hoisted_2$2);
621
- }), 128))
622
- ])
623
- ]),
624
- _: 1
625
- }, 8, ["style", "enabled", "event-bus"]);
626
- };
627
- }
628
- });
629
- const TagsContainer = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-6bab2764"]]);
630
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
631
- __name: "WorkflowTagsContainer",
632
- props: {
633
- tagIds: {},
634
- limit: {},
635
- clickable: { type: Boolean },
636
- responsive: { type: Boolean },
637
- hoverable: { type: Boolean }
638
- },
639
- emits: ["click"],
640
- setup(__props, { emit: __emit }) {
641
- const emit = __emit;
642
- const annotationTagsStore = useTagsStore();
643
- const tagsById = computed(() => annotationTagsStore.tagsById);
644
- function onClick(tagId) {
645
- emit("click", tagId);
646
- }
647
- return (_ctx, _cache) => {
648
- return openBlock(), createBlock(TagsContainer, {
649
- "tag-ids": _ctx.tagIds,
650
- "tags-by-id": tagsById.value,
651
- limit: _ctx.limit,
652
- clickable: _ctx.clickable,
653
- responsive: _ctx.responsive,
654
- hoverable: _ctx.hoverable,
655
- onClick
656
- }, null, 8, ["tag-ids", "tags-by-id", "limit", "clickable", "responsive", "hoverable"]);
657
- };
658
- }
659
- });
660
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
661
397
  __name: "BreakpointsObserver",
662
398
  props: {
663
399
  valueXS: {},
@@ -730,71 +466,6 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
730
466
  };
731
467
  }
732
468
  });
733
- const _hoisted_1$1 = { key: 0 };
734
- const _hoisted_2$1 = { key: 1 };
735
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
736
- __name: "WorkflowHistoryButton",
737
- props: {
738
- workflowId: {},
739
- isNewWorkflow: { type: Boolean },
740
- isFeatureEnabled: { type: Boolean }
741
- },
742
- emits: ["upgrade"],
743
- setup(__props, { emit: __emit }) {
744
- const locale = useI18n$1();
745
- const props = __props;
746
- const emit = __emit;
747
- const workflowHistoryRoute = computed(() => ({
748
- name: VIEWS.WORKFLOW_HISTORY,
749
- params: {
750
- workflowId: props.workflowId
751
- }
752
- }));
753
- return (_ctx, _cache) => {
754
- const _component_N8nIconButton = _sfc_main$d;
755
- const _component_RouterLink = resolveComponent("RouterLink");
756
- const _component_N8nLink = N8nLink;
757
- const _component_N8nTooltip = N8nTooltip;
758
- return openBlock(), createBlock(_component_N8nTooltip, { placement: "bottom" }, {
759
- content: withCtx(() => [
760
- _ctx.isFeatureEnabled && _ctx.isNewWorkflow ? (openBlock(), createElementBlock("span", _hoisted_1$1, toDisplayString(unref(locale).baseText("workflowHistory.button.tooltip.empty")), 1)) : _ctx.isFeatureEnabled ? (openBlock(), createElementBlock("span", _hoisted_2$1, toDisplayString(unref(locale).baseText("workflowHistory.button.tooltip.enabled")), 1)) : (openBlock(), createBlock(unref(I18nT), {
761
- key: 2,
762
- keypath: "workflowHistory.button.tooltip.disabled",
763
- scope: "global"
764
- }, {
765
- link: withCtx(() => [
766
- createVNode(_component_N8nLink, {
767
- size: "small",
768
- onClick: _cache[0] || (_cache[0] = ($event) => emit("upgrade"))
769
- }, {
770
- default: withCtx(() => [
771
- createTextVNode(toDisplayString(unref(locale).baseText("workflowHistory.button.tooltip.disabled.link")), 1)
772
- ]),
773
- _: 1
774
- })
775
- ]),
776
- _: 1
777
- }))
778
- ]),
779
- default: withCtx(() => [
780
- createVNode(_component_RouterLink, { to: workflowHistoryRoute.value }, {
781
- default: withCtx(() => [
782
- createVNode(_component_N8nIconButton, {
783
- disabled: _ctx.isNewWorkflow || !_ctx.isFeatureEnabled,
784
- "data-test-id": "workflow-history-button",
785
- type: "highlight",
786
- icon: "history",
787
- size: "medium"
788
- }, null, 8, ["disabled"])
789
- ]),
790
- _: 1
791
- }, 8, ["to"])
792
- ]),
793
- _: 1
794
- });
795
- };
796
- }
797
- });
798
469
  const HEARTBEAT_INTERVAL = 5 * TIME.MINUTE;
799
470
  const useCollaborationStore = defineStore(STORES.COLLABORATION, () => {
800
471
  const pushStore = usePushConnectionStore();
@@ -870,7 +541,7 @@ const useCollaborationStore = defineStore(STORES.COLLABORATION, () => {
870
541
  stopHeartbeat
871
542
  };
872
543
  });
873
- const _sfc_main$3 = /* @__PURE__ */ defineComponent({
544
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
874
545
  __name: "CollaborationPane",
875
546
  setup(__props) {
876
547
  const collaborationStore = useCollaborationStore();
@@ -913,15 +584,80 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
913
584
  };
914
585
  }
915
586
  });
916
- const container$2 = "_container_ame1i_123";
917
- const style0$1 = {
918
- container: container$2
919
- };
920
- const cssModules$2 = {
921
- "$style": style0$1
922
- };
923
- const CollaborationPane = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$2]]);
924
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
587
+ const container$2 = "_container_ame1i_123";
588
+ const style0$1 = {
589
+ container: container$2
590
+ };
591
+ const cssModules$2 = {
592
+ "$style": style0$1
593
+ };
594
+ const CollaborationPane = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$2]]);
595
+ const _hoisted_1$2 = { key: 0 };
596
+ const _hoisted_2$2 = { key: 1 };
597
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
598
+ __name: "WorkflowHistoryButton",
599
+ props: {
600
+ workflowId: {},
601
+ isNewWorkflow: { type: Boolean },
602
+ isFeatureEnabled: { type: Boolean }
603
+ },
604
+ emits: ["upgrade"],
605
+ setup(__props, { emit: __emit }) {
606
+ const locale = useI18n$1();
607
+ const props = __props;
608
+ const emit = __emit;
609
+ const workflowHistoryRoute = computed(() => ({
610
+ name: VIEWS.WORKFLOW_HISTORY,
611
+ params: {
612
+ workflowId: props.workflowId
613
+ }
614
+ }));
615
+ return (_ctx, _cache) => {
616
+ const _component_N8nIconButton = _sfc_main$d;
617
+ const _component_RouterLink = resolveComponent("RouterLink");
618
+ const _component_N8nLink = N8nLink;
619
+ const _component_N8nTooltip = Tooltip;
620
+ return openBlock(), createBlock(_component_N8nTooltip, { placement: "bottom" }, {
621
+ content: withCtx(() => [
622
+ _ctx.isFeatureEnabled && _ctx.isNewWorkflow ? (openBlock(), createElementBlock("span", _hoisted_1$2, toDisplayString(unref(locale).baseText("workflowHistory.button.tooltip.empty")), 1)) : _ctx.isFeatureEnabled ? (openBlock(), createElementBlock("span", _hoisted_2$2, toDisplayString(unref(locale).baseText("workflowHistory.button.tooltip.enabled")), 1)) : (openBlock(), createBlock(unref(I18nT), {
623
+ key: 2,
624
+ keypath: "workflowHistory.button.tooltip.disabled",
625
+ scope: "global"
626
+ }, {
627
+ link: withCtx(() => [
628
+ createVNode(_component_N8nLink, {
629
+ size: "small",
630
+ onClick: _cache[0] || (_cache[0] = ($event) => emit("upgrade"))
631
+ }, {
632
+ default: withCtx(() => [
633
+ createTextVNode(toDisplayString(unref(locale).baseText("workflowHistory.button.tooltip.disabled.link")), 1)
634
+ ]),
635
+ _: 1
636
+ })
637
+ ]),
638
+ _: 1
639
+ }))
640
+ ]),
641
+ default: withCtx(() => [
642
+ createVNode(_component_RouterLink, { to: workflowHistoryRoute.value }, {
643
+ default: withCtx(() => [
644
+ createVNode(_component_N8nIconButton, {
645
+ disabled: _ctx.isNewWorkflow || !_ctx.isFeatureEnabled,
646
+ "data-test-id": "workflow-history-button",
647
+ type: "highlight",
648
+ icon: "history",
649
+ size: "medium"
650
+ }, null, 8, ["disabled"])
651
+ ]),
652
+ _: 1
653
+ }, 8, ["to"])
654
+ ]),
655
+ _: 1
656
+ });
657
+ };
658
+ }
659
+ });
660
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
925
661
  __name: "WorkflowProductionChecklist",
926
662
  props: {
927
663
  workflow: {}
@@ -985,106 +721,371 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
985
721
  completed: hasEvaluationSetOutputsNode.value
986
722
  });
987
723
  }
988
- if (!suggestedActionSettings.timeSaved?.ignored) {
989
- actions.push({
990
- id: "timeSaved",
991
- title: i18n.baseText("workflowProductionChecklist.timeSaved.title"),
992
- description: i18n.baseText("workflowProductionChecklist.timeSaved.description"),
993
- moreInfoLink: TIME_SAVED_DOCS_URL,
994
- completed: hasTimeSaved.value
995
- });
724
+ if (!suggestedActionSettings.timeSaved?.ignored) {
725
+ actions.push({
726
+ id: "timeSaved",
727
+ title: i18n.baseText("workflowProductionChecklist.timeSaved.title"),
728
+ description: i18n.baseText("workflowProductionChecklist.timeSaved.description"),
729
+ moreInfoLink: TIME_SAVED_DOCS_URL,
730
+ completed: hasTimeSaved.value
731
+ });
732
+ }
733
+ return actions;
734
+ });
735
+ async function loadWorkflowSettings() {
736
+ if (props.workflow.id) {
737
+ cachedSettings.value = await workflowsCache.getMergedWorkflowSettings(props.workflow.id);
738
+ }
739
+ }
740
+ async function handleActionClick(actionId) {
741
+ if (actionId === "evaluations") {
742
+ await router.push({
743
+ name: VIEWS.EVALUATION_EDIT,
744
+ params: { name: props.workflow.id }
745
+ });
746
+ } else if (actionId === "errorWorkflow" || actionId === "timeSaved") {
747
+ uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);
748
+ }
749
+ isPopoverOpen.value = false;
750
+ }
751
+ function isValidAction(action) {
752
+ return ["evaluations", "errorWorkflow", "timeSaved"].includes(action);
753
+ }
754
+ async function handleIgnoreClick(actionId) {
755
+ if (!isValidAction(actionId)) {
756
+ return;
757
+ }
758
+ await workflowsCache.ignoreSuggestedAction(props.workflow.id, actionId);
759
+ await loadWorkflowSettings();
760
+ telemetry.track("user clicked ignore suggested action", {
761
+ actionId
762
+ });
763
+ }
764
+ async function handleIgnoreAll() {
765
+ const ignoreAllConfirmed = await message.confirm(
766
+ i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.description"),
767
+ i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.title"),
768
+ {
769
+ confirmButtonText: i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.confirm")
770
+ }
771
+ );
772
+ if (ignoreAllConfirmed === MODAL_CONFIRM) {
773
+ await workflowsCache.ignoreAllSuggestedActionsForAllWorkflows(
774
+ availableActions.value.map((action) => action.id)
775
+ );
776
+ await loadWorkflowSettings();
777
+ telemetry.track("user clicked ignore suggested actions for all workflows");
778
+ }
779
+ }
780
+ function openSuggestedActions() {
781
+ isPopoverOpen.value = true;
782
+ }
783
+ function onPopoverOpened() {
784
+ telemetry.track("user opened suggested actions checklist");
785
+ }
786
+ function handlePopoverOpenChange(open) {
787
+ if (open) {
788
+ isPopoverOpen.value = true;
789
+ onPopoverOpened();
790
+ } else if (!isActivationModalOpen.value) {
791
+ isPopoverOpen.value = false;
792
+ }
793
+ }
794
+ watch(
795
+ () => props.workflow.active,
796
+ async (isActive, wasActive) => {
797
+ if (isActive && !wasActive) {
798
+ if (!cachedSettings.value?.firstActivatedAt) {
799
+ setTimeout(() => {
800
+ openSuggestedActions();
801
+ }, 0);
802
+ }
803
+ await workflowsCache.updateFirstActivatedAt(props.workflow.id);
804
+ }
805
+ }
806
+ );
807
+ onMounted(async () => {
808
+ await loadWorkflowSettings();
809
+ });
810
+ return (_ctx, _cache) => {
811
+ return availableActions.value.length > 0 ? (openBlock(), createBlock(unref(N8nSuggestedActions), {
812
+ key: 0,
813
+ open: isPopoverOpen.value,
814
+ title: unref(i18n).baseText("workflowProductionChecklist.title"),
815
+ actions: availableActions.value,
816
+ "ignore-all-label": unref(i18n).baseText("workflowProductionChecklist.turnOffWorkflowSuggestions"),
817
+ notice: isProtectedEnvironment.value ? unref(i18n).baseText("workflowProductionChecklist.readOnlyNotice") : "",
818
+ "popover-alignment": "end",
819
+ onActionClick: handleActionClick,
820
+ onIgnoreClick: handleIgnoreClick,
821
+ onIgnoreAll: handleIgnoreAll,
822
+ "onUpdate:open": handlePopoverOpenChange
823
+ }, null, 8, ["open", "title", "actions", "ignore-all-label", "notice"])) : createCommentVNode("", true);
824
+ };
825
+ }
826
+ });
827
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
828
+ __name: "IntersectionObserver",
829
+ props: {
830
+ threshold: { default: 0 },
831
+ enabled: { type: Boolean, default: false },
832
+ eventBus: {}
833
+ },
834
+ emits: ["observed"],
835
+ setup(__props, { emit: __emit }) {
836
+ const props = __props;
837
+ const emit = __emit;
838
+ const observer = ref(null);
839
+ const root = ref(null);
840
+ onBeforeUnmount(() => {
841
+ if (props.enabled && observer.value) {
842
+ observer.value.disconnect();
843
+ }
844
+ });
845
+ onMounted(() => {
846
+ if (!props.enabled) {
847
+ return;
848
+ }
849
+ const options = {
850
+ root: root.value,
851
+ rootMargin: "0px",
852
+ threshold: props.threshold
853
+ };
854
+ const intersectionObserver = new IntersectionObserver((entries) => {
855
+ entries.forEach(({ target, isIntersecting }) => {
856
+ emit("observed", {
857
+ el: target,
858
+ isIntersecting
859
+ });
860
+ });
861
+ }, options);
862
+ observer.value = intersectionObserver;
863
+ props.eventBus.on("observe", (observed) => {
864
+ if (observed) {
865
+ intersectionObserver.observe(observed);
866
+ }
867
+ });
868
+ props.eventBus.on("unobserve", (observed) => {
869
+ intersectionObserver.unobserve(observed);
870
+ });
871
+ });
872
+ return (_ctx, _cache) => {
873
+ return openBlock(), createElementBlock("div", {
874
+ ref_key: "root",
875
+ ref: root
876
+ }, [
877
+ renderSlot(_ctx.$slots, "default")
878
+ ], 512);
879
+ };
880
+ }
881
+ });
882
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
883
+ __name: "IntersectionObserved",
884
+ props: {
885
+ enabled: { type: Boolean, default: false },
886
+ eventBus: {}
887
+ },
888
+ setup(__props) {
889
+ const props = __props;
890
+ const observed = ref(null);
891
+ onMounted(async () => {
892
+ if (!props.enabled) {
893
+ return;
894
+ }
895
+ await nextTick();
896
+ props.eventBus.emit("observe", observed.value);
897
+ });
898
+ onBeforeUnmount(() => {
899
+ if (props.enabled) {
900
+ props.eventBus.emit("unobserve", observed.value);
901
+ }
902
+ });
903
+ return (_ctx, _cache) => {
904
+ return openBlock(), createElementBlock("span", {
905
+ ref_key: "observed",
906
+ ref: observed
907
+ }, [
908
+ renderSlot(_ctx.$slots, "default")
909
+ ], 512);
910
+ };
911
+ }
912
+ });
913
+ const _hoisted_1$1 = { class: "tags" };
914
+ const _hoisted_2$1 = ["onClick"];
915
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
916
+ __name: "TagsContainer",
917
+ props: {
918
+ tagIds: {},
919
+ tagsById: {},
920
+ limit: { default: 20 },
921
+ clickable: { type: Boolean, default: false },
922
+ responsive: { type: Boolean, default: false },
923
+ hoverable: { type: Boolean, default: false }
924
+ },
925
+ emits: ["click"],
926
+ setup(__props, { emit: __emit }) {
927
+ const props = __props;
928
+ const emit = __emit;
929
+ const maxWidth = ref(320);
930
+ const intersectionEventBus = createEventBus();
931
+ const visibility = ref({});
932
+ const tagsContainer = ref();
933
+ const style = computed(() => ({
934
+ "max-width": `${maxWidth.value}px`
935
+ }));
936
+ const tags = computed(() => {
937
+ const allTags = props.tagIds.map((tagId) => props.tagsById[tagId]).filter(Boolean);
938
+ let toDisplay = props.limit ? allTags.slice(0, props.limit) : allTags;
939
+ toDisplay = toDisplay.map((tag) => ({
940
+ ...tag,
941
+ hidden: props.responsive && !visibility.value[tag.id]
942
+ }));
943
+ let visibleCount = toDisplay.length;
944
+ if (props.responsive) {
945
+ visibleCount = Object.values(visibility.value).reduce(
946
+ (accu, val) => val ? accu + 1 : accu,
947
+ 0
948
+ );
949
+ }
950
+ if (visibleCount < allTags.length) {
951
+ const hidden = allTags.slice(visibleCount);
952
+ const hiddenTitle = hidden.reduce(
953
+ (accu, tag) => accu ? `${accu}, ${tag.name}` : tag.name,
954
+ ""
955
+ );
956
+ const countTag = {
957
+ id: "count",
958
+ name: `+${hidden.length}`,
959
+ title: hiddenTitle,
960
+ isCount: true
961
+ };
962
+ toDisplay.splice(visibleCount, 0, countTag);
996
963
  }
997
- return actions;
964
+ return toDisplay;
998
965
  });
999
- async function loadWorkflowSettings() {
1000
- if (props.workflow.id) {
1001
- cachedSettings.value = await workflowsCache.getMergedWorkflowSettings(props.workflow.id);
1002
- }
1003
- }
1004
- async function handleActionClick(actionId) {
1005
- if (actionId === "evaluations") {
1006
- await router.push({
1007
- name: VIEWS.EVALUATION_EDIT,
1008
- params: { name: props.workflow.id }
966
+ const setMaxWidth = () => {
967
+ const container2 = tagsContainer.value?.$el;
968
+ const parent = container2?.parentNode;
969
+ if (parent) {
970
+ maxWidth.value = 0;
971
+ void nextTick(() => {
972
+ maxWidth.value = parent.clientWidth;
1009
973
  });
1010
- } else if (actionId === "errorWorkflow" || actionId === "timeSaved") {
1011
- uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);
1012
- }
1013
- isPopoverOpen.value = false;
1014
- }
1015
- function isValidAction(action) {
1016
- return ["evaluations", "errorWorkflow", "timeSaved"].includes(action);
1017
- }
1018
- async function handleIgnoreClick(actionId) {
1019
- if (!isValidAction(actionId)) {
1020
- return;
1021
974
  }
1022
- await workflowsCache.ignoreSuggestedAction(props.workflow.id, actionId);
1023
- await loadWorkflowSettings();
1024
- telemetry.track("user clicked ignore suggested action", {
1025
- actionId
1026
- });
1027
- }
1028
- async function handleIgnoreAll() {
1029
- const ignoreAllConfirmed = await message.confirm(
1030
- i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.description"),
1031
- i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.title"),
1032
- {
1033
- confirmButtonText: i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.confirm")
1034
- }
1035
- );
1036
- if (ignoreAllConfirmed === MODAL_CONFIRM) {
1037
- await workflowsCache.ignoreAllSuggestedActionsForAllWorkflows(
1038
- availableActions.value.map((action) => action.id)
1039
- );
1040
- await loadWorkflowSettings();
1041
- telemetry.track("user clicked ignore suggested actions for all workflows");
975
+ };
976
+ const debouncedSetMaxWidth = debounce(setMaxWidth, 100);
977
+ const onObserved = ({ el, isIntersecting }) => {
978
+ if (el.dataset.id) {
979
+ visibility.value = { ...visibility.value, [el.dataset.id]: isIntersecting };
1042
980
  }
1043
- }
1044
- function openSuggestedActions() {
1045
- isPopoverOpen.value = true;
1046
- }
1047
- function onPopoverOpened() {
1048
- telemetry.track("user opened suggested actions checklist");
1049
- }
1050
- function handlePopoverOpenChange(open) {
1051
- if (open) {
1052
- isPopoverOpen.value = true;
1053
- onPopoverOpened();
1054
- } else if (!isActivationModalOpen.value) {
1055
- isPopoverOpen.value = false;
981
+ };
982
+ const onClick = (e, tag) => {
983
+ if (props.clickable) {
984
+ e.stopPropagation();
1056
985
  }
1057
- }
1058
- watch(
1059
- () => props.workflow.active,
1060
- async (isActive, wasActive) => {
1061
- if (isActive && !wasActive) {
1062
- if (!cachedSettings.value?.firstActivatedAt) {
1063
- setTimeout(() => {
1064
- openSuggestedActions();
1065
- }, 0);
1066
- }
1067
- await workflowsCache.updateFirstActivatedAt(props.workflow.id);
1068
- }
986
+ if (!tag.hidden) {
987
+ emit("click", tag.id);
1069
988
  }
1070
- );
1071
- onMounted(async () => {
1072
- await loadWorkflowSettings();
989
+ };
990
+ onMounted(() => {
991
+ setMaxWidth();
992
+ window.addEventListener("resize", debouncedSetMaxWidth);
993
+ });
994
+ onBeforeUnmount(() => {
995
+ window.removeEventListener("resize", debouncedSetMaxWidth);
1073
996
  });
1074
997
  return (_ctx, _cache) => {
1075
- return availableActions.value.length > 0 ? (openBlock(), createBlock(unref(N8nSuggestedActions), {
1076
- key: 0,
1077
- open: isPopoverOpen.value,
1078
- title: unref(i18n).baseText("workflowProductionChecklist.title"),
1079
- actions: availableActions.value,
1080
- "ignore-all-label": unref(i18n).baseText("workflowProductionChecklist.turnOffWorkflowSuggestions"),
1081
- notice: isProtectedEnvironment.value ? unref(i18n).baseText("workflowProductionChecklist.readOnlyNotice") : "",
1082
- "popover-alignment": "end",
1083
- onActionClick: handleActionClick,
1084
- onIgnoreClick: handleIgnoreClick,
1085
- onIgnoreAll: handleIgnoreAll,
1086
- "onUpdate:open": handlePopoverOpenChange
1087
- }, null, 8, ["open", "title", "actions", "ignore-all-label", "notice"])) : createCommentVNode("", true);
998
+ const _component_el_tag = resolveComponent("el-tag");
999
+ return openBlock(), createBlock(_sfc_main$5, {
1000
+ ref_key: "tagsContainer",
1001
+ ref: tagsContainer,
1002
+ threshold: 1,
1003
+ class: "tags-container",
1004
+ style: normalizeStyle(style.value),
1005
+ enabled: _ctx.responsive,
1006
+ "event-bus": unref(intersectionEventBus),
1007
+ onObserved
1008
+ }, {
1009
+ default: withCtx(() => [
1010
+ createBaseVNode("span", _hoisted_1$1, [
1011
+ (openBlock(true), createElementBlock(Fragment, null, renderList(tags.value, (tag) => {
1012
+ return openBlock(), createElementBlock("span", {
1013
+ key: tag.id,
1014
+ class: normalizeClass({ clickable: !tag.hidden }),
1015
+ onClick: (e) => onClick(e, tag)
1016
+ }, [
1017
+ tag.isCount ? (openBlock(), createBlock(_component_el_tag, {
1018
+ key: 0,
1019
+ title: tag.title,
1020
+ type: "info",
1021
+ size: "small",
1022
+ class: "count-container",
1023
+ "disable-transitions": true
1024
+ }, {
1025
+ default: withCtx(() => [
1026
+ createTextVNode(toDisplayString(tag.name), 1)
1027
+ ]),
1028
+ _: 2
1029
+ }, 1032, ["title"])) : (openBlock(), createBlock(_sfc_main$4, {
1030
+ key: 1,
1031
+ class: normalizeClass({ hideTag: tag.hidden }),
1032
+ "data-id": tag.id,
1033
+ enabled: _ctx.responsive,
1034
+ "event-bus": unref(intersectionEventBus)
1035
+ }, {
1036
+ default: withCtx(() => [
1037
+ createVNode(_component_el_tag, {
1038
+ title: tag.name,
1039
+ type: "info",
1040
+ size: "mini",
1041
+ class: normalizeClass({ hoverable: _ctx.hoverable }),
1042
+ "disable-transitions": true
1043
+ }, {
1044
+ default: withCtx(() => [
1045
+ createTextVNode(toDisplayString(tag.name), 1)
1046
+ ]),
1047
+ _: 2
1048
+ }, 1032, ["title", "class"])
1049
+ ]),
1050
+ _: 2
1051
+ }, 1032, ["class", "data-id", "enabled", "event-bus"]))
1052
+ ], 10, _hoisted_2$1);
1053
+ }), 128))
1054
+ ])
1055
+ ]),
1056
+ _: 1
1057
+ }, 8, ["style", "enabled", "event-bus"]);
1058
+ };
1059
+ }
1060
+ });
1061
+ const TagsContainer = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-6bab2764"]]);
1062
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1063
+ __name: "WorkflowTagsContainer",
1064
+ props: {
1065
+ tagIds: {},
1066
+ limit: {},
1067
+ clickable: { type: Boolean },
1068
+ responsive: { type: Boolean },
1069
+ hoverable: { type: Boolean }
1070
+ },
1071
+ emits: ["click"],
1072
+ setup(__props, { emit: __emit }) {
1073
+ const emit = __emit;
1074
+ const annotationTagsStore = useTagsStore();
1075
+ const tagsById = computed(() => annotationTagsStore.tagsById);
1076
+ function onClick(tagId) {
1077
+ emit("click", tagId);
1078
+ }
1079
+ return (_ctx, _cache) => {
1080
+ return openBlock(), createBlock(TagsContainer, {
1081
+ "tag-ids": _ctx.tagIds,
1082
+ "tags-by-id": tagsById.value,
1083
+ limit: _ctx.limit,
1084
+ clickable: _ctx.clickable,
1085
+ responsive: _ctx.responsive,
1086
+ hoverable: _ctx.hoverable,
1087
+ onClick
1088
+ }, null, 8, ["tag-ids", "tags-by-id", "limit", "clickable", "responsive", "hoverable"]);
1088
1089
  };
1089
1090
  }
1090
1091
  });
@@ -1159,7 +1160,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1159
1160
  const props = __props;
1160
1161
  const $style = useCssModule();
1161
1162
  const rootStore = useRootStore();
1162
- const canvasStore = useCanvasStore();
1163
1163
  const settingsStore = useSettingsStore();
1164
1164
  const sourceControlStore = useSourceControlStore();
1165
1165
  const tagsStore = useTagsStore();
@@ -1185,7 +1185,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1185
1185
  const tagsSaving = ref(false);
1186
1186
  const importFileRef = ref();
1187
1187
  const tagsEventBus = createEventBus();
1188
- const sourceControlModalEventBus = createEventBus();
1189
1188
  const changeOwnerEventBus = createEventBus();
1190
1189
  const hasChanged = (prev, curr) => {
1191
1190
  if (prev.length !== curr.length) {
@@ -1500,13 +1499,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1500
1499
  break;
1501
1500
  }
1502
1501
  case WORKFLOW_MENU_ACTIONS.PUSH: {
1503
- canvasStore.startLoading();
1504
1502
  try {
1505
1503
  await onSaveButtonClick();
1506
- const status = await sourceControlStore.getAggregatedStatus();
1507
- uiStore.openModalWithData({
1508
- name: SOURCE_CONTROL_PUSH_MODAL_KEY,
1509
- data: { eventBus: sourceControlModalEventBus, status }
1504
+ void router.push({
1505
+ query: {
1506
+ ...route.query,
1507
+ sourceControl: "push"
1508
+ }
1510
1509
  });
1511
1510
  } catch (error) {
1512
1511
  switch (error.message) {
@@ -1520,8 +1519,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1520
1519
  default:
1521
1520
  toast.showError(error, locale.baseText("error"));
1522
1521
  }
1523
- } finally {
1524
- canvasStore.stopLoading();
1525
1522
  }
1526
1523
  break;
1527
1524
  }
@@ -1640,33 +1637,43 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1640
1637
  function goToWorkflowHistoryUpgrade() {
1641
1638
  void pageRedirectionHelper.goToUpgrade("workflow-history", "upgrade-workflow-history");
1642
1639
  }
1643
- function showCreateWorkflowSuccessToast(id) {
1644
- if (!id || ["new", PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(id)) {
1645
- let toastTitle = locale.baseText("workflows.create.personal.toast.title");
1646
- let toastText = locale.baseText("workflows.create.personal.toast.text");
1647
- if (projectsStore.currentProject) {
1648
- if (props.currentFolder) {
1649
- toastTitle = locale.baseText("workflows.create.folder.toast.title", {
1650
- interpolate: {
1651
- projectName: currentProjectName.value ?? "",
1652
- folderName: props.currentFolder.name ?? ""
1653
- }
1654
- });
1655
- } else if (projectsStore.currentProject.id !== projectsStore.personalProject?.id) {
1656
- toastTitle = locale.baseText("workflows.create.project.toast.title", {
1657
- interpolate: { projectName: currentProjectName.value ?? "" }
1658
- });
1659
- }
1660
- toastText = locale.baseText("workflows.create.project.toast.text", {
1661
- interpolate: { projectName: currentProjectName.value ?? "" }
1662
- });
1640
+ function getPersonalProjectToastContent() {
1641
+ const title = locale.baseText("workflows.create.personal.toast.title");
1642
+ if (!props.currentFolder) {
1643
+ return { title };
1644
+ }
1645
+ const toastMessage = locale.baseText("workflows.create.folder.toast.title", {
1646
+ interpolate: {
1647
+ projectName: "Personal",
1648
+ folderName: props.currentFolder.name
1663
1649
  }
1664
- toast.showMessage({
1665
- title: toastTitle,
1666
- message: toastText,
1667
- type: "success"
1668
- });
1669
- }
1650
+ });
1651
+ return { title, toastMessage };
1652
+ }
1653
+ function getToastContent() {
1654
+ const currentProject = projectsStore.currentProject;
1655
+ const isPersonalProject = !projectsStore.currentProject || currentProject?.id === projectsStore.personalProject?.id;
1656
+ const projectName = currentProjectName.value ?? "";
1657
+ if (isPersonalProject) {
1658
+ return getPersonalProjectToastContent();
1659
+ }
1660
+ const titleKey = props.currentFolder ? "workflows.create.folder.toast.title" : "workflows.create.project.toast.title";
1661
+ const interpolateData = props.currentFolder ? { projectName, folderName: props.currentFolder.name ?? "" } : { projectName };
1662
+ const title = locale.baseText(titleKey, { interpolate: interpolateData });
1663
+ const toastMessage = locale.baseText("workflows.create.project.toast.text", {
1664
+ interpolate: { projectName }
1665
+ });
1666
+ return { title, toastMessage };
1667
+ }
1668
+ function showCreateWorkflowSuccessToast(id) {
1669
+ const shouldShowToast = !id || ["new", PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(id);
1670
+ if (!shouldShowToast) return;
1671
+ const { title, toastMessage } = getToastContent();
1672
+ toast.showMessage({
1673
+ title,
1674
+ message: toastMessage,
1675
+ type: "success"
1676
+ });
1670
1677
  }
1671
1678
  const onBreadcrumbsItemSelected = (item) => {
1672
1679
  if (item.href) {
@@ -1679,13 +1686,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1679
1686
  const _component_FolderBreadcrumbs = __unplugin_components_0;
1680
1687
  const _component_N8nBadge = N8nBadge;
1681
1688
  const _component_N8nButton = N8nButton;
1682
- const _component_N8nTooltip = N8nTooltip;
1689
+ const _component_N8nTooltip = Tooltip;
1683
1690
  const _component_EnterpriseEdition = resolveComponent("EnterpriseEdition");
1684
1691
  const _component_N8nActionDropdown = N8nActionDropdown;
1685
1692
  return openBlock(), createElementBlock("div", {
1686
1693
  class: normalizeClass(unref($style).container)
1687
1694
  }, [
1688
- createVNode(_sfc_main$5, {
1695
+ createVNode(_sfc_main$9, {
1689
1696
  "value-x-s": 15,
1690
1697
  "value-s-m": 25,
1691
1698
  "value-m-d": 50,
@@ -1742,7 +1749,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1742
1749
  "data-test-id": "new-tag-link",
1743
1750
  onClick: onTagsEditEnable
1744
1751
  }, " + " + toDisplayString(unref(i18n).baseText("workflowDetails.addTag")), 1)
1745
- ])) : (openBlock(), createBlock(_sfc_main$6, {
1752
+ ])) : (openBlock(), createBlock(_sfc_main$2, {
1746
1753
  key: _ctx.id,
1747
1754
  "tag-ids": workflowTagIds.value,
1748
1755
  clickable: true,
@@ -1768,7 +1775,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1768
1775
  ]),
1769
1776
  createVNode(_sfc_main$f, { class: "actions" }, {
1770
1777
  default: withCtx(() => [
1771
- !isNewWorkflow.value ? (openBlock(), createBlock(_sfc_main$2, {
1778
+ !isNewWorkflow.value ? (openBlock(), createBlock(_sfc_main$6, {
1772
1779
  key: 0,
1773
1780
  workflow: unref(workflowsStore).workflow
1774
1781
  }, null, 8, ["workflow"])) : createCommentVNode("", true),
@@ -1847,7 +1854,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1847
1854
  "data-test-id": "workflow-save-button",
1848
1855
  onClick: onSaveButtonClick
1849
1856
  }, null, 8, ["saved", "disabled", "is-saving", "with-shortcut", "shortcut-tooltip"]),
1850
- createVNode(_sfc_main$4, {
1857
+ createVNode(_sfc_main$7, {
1851
1858
  "workflow-id": props.id,
1852
1859
  "is-feature-enabled": isWorkflowHistoryFeatureEnabled.value,
1853
1860
  "is-new-workflow": isNewWorkflow.value,
@@ -1896,7 +1903,7 @@ const style1 = {
1896
1903
  const cssModules$1 = {
1897
1904
  "$style": style1
1898
1905
  };
1899
- const WorkflowDetails = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1], ["__scopeId", "data-v-9c3251f0"]]);
1906
+ const WorkflowDetails = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1], ["__scopeId", "data-v-3cc77b55"]]);
1900
1907
  const GithubButton = defineComponent({
1901
1908
  name: "github-button",
1902
1909
  props: {