n8n-editor-ui 1.108.1 → 1.109.1-exp.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 (122) hide show
  1. package/dist/assets/{AddDataStoreModal-BduD-_3h.js → AddDataStoreModal-CMmqKpuZ.js} +27 -10
  2. package/dist/assets/{AnimatedSpinner-C6hUJocW.js → AnimatedSpinner-BQAVrRf4.js} +1 -1
  3. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-CPuMOvlw.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-C-e8Hf86.js} +1 -1
  4. package/dist/assets/{AuthView-C11JwvOE.js → AuthView-C-1QMeAi.js} +2 -2
  5. package/dist/assets/{ChangePasswordView-BB7axCnx.js → ChangePasswordView-CMm75HVn.js} +3 -3
  6. package/dist/assets/CollectionParameter-0KmNfK7e.js +4 -0
  7. package/dist/assets/{ConsumedTokensDetails.vue_vue_type_script_setup_true_lang-D-Jt6Gli.js → ConsumedTokensDetails.vue_vue_type_script_setup_true_lang-nE_il7-e.js} +1 -1
  8. package/dist/assets/{CredentialsView-CfQzHZs_.js → CredentialsView-DEiS_bGa.js} +9 -8
  9. package/dist/assets/{DataStoreActions.vue_vue_type_script_setup_true_lang-4xXQM9V0.js → DataStoreActions.vue_vue_type_script_setup_true_lang-Uy8kEcSJ.js} +20 -14
  10. package/dist/assets/{DataStoreDetailsView-B4_8Wywn.js → DataStoreDetailsView-1Yfp0U49.js} +5099 -65
  11. package/dist/assets/{DataStoreDetailsView-B0CKO8ZR.css → DataStoreDetailsView-BxDmY87S.css} +310 -25
  12. package/dist/assets/{DataStoreView-Ca7MkqMT.js → DataStoreView-B0rFOKrx.js} +56 -88
  13. package/dist/assets/{DataStoreView-D-Wmcgs5.css → DataStoreView-bZrewhaR.css} +10 -15
  14. package/dist/assets/{DemoFooter-mdcYI9V4.js → DemoFooter-COCwOlSE.js} +6 -6
  15. package/dist/assets/{EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-sIvwrfw-.js → EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-CsEyfmIK.js} +1 -1
  16. package/dist/assets/{EntityNotFound-Y2W4TM3k.js → EntityNotFound-DpLmv3ME.js} +1 -1
  17. package/dist/assets/{EntityUnAuthorised-DWipzXTF.js → EntityUnAuthorised-CR_6Y37T.js} +1 -1
  18. package/dist/assets/{ErrorView-hJzoyT_-.js → ErrorView-CIKSp6id.js} +1 -1
  19. package/dist/assets/{EvaluationsRootView-DYV7_RjO.js → EvaluationsRootView-U5uRCCja.js} +1 -1
  20. package/dist/assets/{EvaluationsView-CxpomFUt.js → EvaluationsView-DW2Oipdw.js} +3 -3
  21. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-cu2lzua8.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-DrLiE1HT.js} +2 -2
  22. package/dist/assets/{ExecutionsView-Cr_GKQZv.js → ExecutionsView-BYoQ6bA_.js} +8 -8
  23. package/dist/assets/{FixedCollectionParameter-7vnFpRXo.js → FixedCollectionParameter-BP6Hp-qk.js} +1 -1
  24. package/dist/assets/{ForgotMyPasswordView-n42XhNZS.js → ForgotMyPasswordView-c1wnd6O3.js} +3 -3
  25. package/dist/assets/{InfoAccordion-B8s_JAdp.js → InfoAccordion-DovNmWsC.js} +1 -1
  26. package/dist/assets/{InsightsChartAverageRuntime-DV_Ju7Zp.js → InsightsChartAverageRuntime-BW517tv0.js} +4 -4
  27. package/dist/assets/{InsightsChartFailed-n5LqWGkq.js → InsightsChartFailed-CpKGAn-q.js} +4 -4
  28. package/dist/assets/{InsightsChartFailureRate-DV991eOY.js → InsightsChartFailureRate-D6ty7UwQ.js} +4 -4
  29. package/dist/assets/{InsightsChartTimeSaved-BvwxGS1S.js → InsightsChartTimeSaved-BXLf4z0O.js} +4 -4
  30. package/dist/assets/{InsightsChartTotal-BOWuHwMh.js → InsightsChartTotal-BIjDUiy9.js} +4 -4
  31. package/dist/assets/{InsightsDashboard-Bj79r2Dt.js → InsightsDashboard-NTagdefb.js} +10 -10
  32. package/dist/assets/{InsightsPaywall-BMm5-uje.js → InsightsPaywall-CoFrKj_G.js} +1 -1
  33. package/dist/assets/{InsightsSummary-CpUOsQoR.js → InsightsSummary-BwAXblg3.js} +1 -1
  34. package/dist/assets/{InsightsTableWorkflows-BAqDod9M.js → InsightsTableWorkflows-DX86KpbA.js} +13 -11
  35. package/dist/assets/{Logo-Bk-9Gwmg.js → Logo-CTdxpXL9.js} +1 -1
  36. package/dist/assets/{LogsPanel-BnH3S-xQ.js → LogsPanel-ClZ6L19W.js} +5 -5
  37. package/dist/assets/{MainHeader-lQ8AnThi.js → MainHeader-BZ-UXtjK.js} +482 -472
  38. package/dist/assets/{MainHeader-fMUCh_vG.css → MainHeader-BofAi8wS.css} +42 -42
  39. package/dist/assets/{MainSidebar-Df5Lmhlu.js → MainSidebar-DjxdwIl_.js} +19 -6
  40. package/dist/assets/{NodeCreation-Cx5MUGEE.js → NodeCreation-jcmpUiwP.js} +3 -3
  41. package/dist/assets/NodeCreator-COTYfPaK.css +1637 -0
  42. package/dist/assets/{NodeCreator-DHfJ_cC7.js → NodeCreator-DPZTIfnb.js} +28 -1225
  43. package/dist/assets/{NodeDetailsView-Bb6YAUqN.js → NodeDetailsView-CU60UMMm.js} +13 -13
  44. package/dist/assets/{NodeDetailsViewV2-uFzp-aaB.js → NodeDetailsViewV2-BfUlqsae.js} +13 -13
  45. package/dist/assets/{NodeView-kIkCm9Kt.js → NodeView-g29_WXte.js} +15 -11
  46. package/dist/assets/PageViewLayout-CJlzbuVj.css +141 -0
  47. package/dist/assets/PageViewLayout-DfWGehvM.js +27 -0
  48. package/dist/assets/PrebuiltAgentTemplatesView-BOcmbn6B.js +196 -0
  49. package/dist/assets/PrebuiltAgentTemplatesView-COxu7Iih.css +166 -0
  50. package/dist/assets/{ProjectBreadcrumb-CzeQoSDB.js → ProjectBreadcrumb-CWq8ubCf.js} +1 -1
  51. package/dist/assets/{ProjectHeader-Br8yvqkf.js → ProjectHeader-RvcbYSCb.js} +16 -19
  52. package/dist/assets/{ProjectSettings-Dc1-Sv7W.js → ProjectSettings-COFuN2-R.js} +3 -3
  53. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-CC7YLT_t.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-CO-M5R89.js} +1 -1
  54. package/dist/assets/{ResourcesListLayout-ozILtp5g.js → ResourcesListLayout-CL3ardp2.js} +14 -36
  55. package/dist/assets/{ResourcesListLayout-C1JgyGhX.css → ResourcesListLayout-CVKyKkt9.css} +0 -140
  56. package/dist/assets/{RunDataJson-CRFhfhsN.js → RunDataJson-CiZmogYm.js} +3 -3
  57. package/dist/assets/{RunDataJsonActions-rXu_dfcA.js → RunDataJsonActions-xYBJCH8-.js} +1 -1
  58. package/dist/assets/{RunDataParsedAiContent-CkUxt-9z.js → RunDataParsedAiContent-BbwMZ2cf.js} +2 -2
  59. package/dist/assets/{RunDataSearch-DYe-cpkq.js → RunDataSearch-7nGkMeXI.js} +1 -1
  60. package/dist/assets/{RunDataTable-Bt4rcVnP.js → RunDataTable-b6xDbVuB.js} +1 -1
  61. package/dist/assets/{SamlOnboarding-DoCTEauY.js → SamlOnboarding-TBQugaMs.js} +3 -3
  62. package/dist/assets/{SettingsApiView-DpQfNJql.js → SettingsApiView-CcUQJaIT.js} +1 -1
  63. package/dist/assets/{SettingsCommunityNodesView-D_XkgBdt.js → SettingsCommunityNodesView-B315yNJi.js} +4 -4
  64. package/dist/assets/{SettingsExternalSecrets-LhOGgphB.js → SettingsExternalSecrets-SZcVtzZ_.js} +1 -1
  65. package/dist/assets/{SettingsLdapView-XcnXdARP.js → SettingsLdapView-rNCQ7v3o.js} +1 -1
  66. package/dist/assets/{SettingsLogStreamingView-BONkwVIB.js → SettingsLogStreamingView-RDx9A9tb.js} +1 -1
  67. package/dist/assets/{SettingsPersonalView-2XpKuDxm.js → SettingsPersonalView-9ndK4DTC.js} +1 -1
  68. package/dist/assets/{SettingsSourceControl-DXyfgX21.js → SettingsSourceControl-BwfXpwbQ.js} +1 -1
  69. package/dist/assets/{SettingsSso-DBPl52gz.js → SettingsSso-Dme0tqgI.js} +7 -5
  70. package/dist/assets/{SettingsUsageAndPlan-CRRW-luY.js → SettingsUsageAndPlan-HFRQcbGO.js} +1 -1
  71. package/dist/assets/{SettingsUsersView-3nNUeWJF.js → SettingsUsersView-WQaWa1Xg.js} +1 -1
  72. package/dist/assets/{SettingsView-D_E-tbUh.js → SettingsView-BOFF8MIt.js} +1 -1
  73. package/dist/assets/{SetupView-Dawd6Tdz.js → SetupView-D4ma4QqQ.js} +3 -3
  74. package/dist/assets/{SetupWorkflowCredentialsButton-HjpsC5yu.js → SetupWorkflowCredentialsButton-qBefMaeP.js} +1 -1
  75. package/dist/assets/{SetupWorkflowFromTemplateView-BUjd1MTh.js → SetupWorkflowFromTemplateView-eThiBMJr.js} +3 -3
  76. package/dist/assets/{SigninView-REbhOdEi.js → SigninView-Dyy4AWIv.js} +3 -3
  77. package/dist/assets/{SignoutView-DNWe1_WW.js → SignoutView-4fiMBT_O.js} +1 -1
  78. package/dist/assets/{SignupView-DvAKWSMp.js → SignupView-D8EgeExw.js} +3 -3
  79. package/dist/assets/{TableBase-DpxvhaiM.js → TableBase-OkNFnxMN.js} +1 -1
  80. package/dist/assets/{Tag-BU_1pCk_.js → Tag-DU_lYKFb.js} +1 -1
  81. package/dist/assets/{Tags-BVRt8Mzw.js → Tags-DwGsPbMq.js} +2 -2
  82. package/dist/assets/{TemplateDetails-BzUhHza5.js → TemplateDetails-ClayPQIC.js} +2 -2
  83. package/dist/assets/{TemplateList-CsrMALsz.js → TemplateList-BmhAYtqD.js} +1 -1
  84. package/dist/assets/{TemplatesCollectionView-DyEPNFhT.js → TemplatesCollectionView-C_XvnuSE.js} +7 -7
  85. package/dist/assets/{TemplatesSearchView-DDGn2iPF.js → TemplatesSearchView-C45ew-79.js} +3 -3
  86. package/dist/assets/{TemplatesView-Q-Ygp-l3.js → TemplatesView-BUhBCzDh.js} +1 -1
  87. package/dist/assets/{TemplatesWorkflowView-Ba-myyYc.js → TemplatesWorkflowView-Cqx0LH2x.js} +7 -7
  88. package/dist/assets/{TriggerPanel-DmVMaaLr.css → TriggerPanel-BFPMKijE.css} +4 -4
  89. package/dist/assets/{TriggerPanel-DWnvpkRN.js → TriggerPanel-CPRAkoxG.js} +20 -9
  90. package/dist/assets/{VariablesView-D1C7kn8G.js → VariablesView-Dx2OtCEI.js} +6 -5
  91. package/dist/assets/{WorkerView-7idQWzAy.js → WorkerView-P8T10YwW.js} +6 -6
  92. package/dist/assets/{WorkflowActivator-5rkOtBNg.js → WorkflowActivator-_e923o0y.js} +3 -3
  93. package/dist/assets/{WorkflowExecutionsInfoAccordion-CACMIZmQ.js → WorkflowExecutionsInfoAccordion-DJpH9yyI.js} +2 -2
  94. package/dist/assets/{WorkflowExecutionsLandingPage-Bx1tyNO5.js → WorkflowExecutionsLandingPage-BYSAKviI.js} +3 -3
  95. package/dist/assets/{WorkflowExecutionsPreview-D7casZ5n.js → WorkflowExecutionsPreview-CEsBtvmn.js} +4 -4
  96. package/dist/assets/{WorkflowExecutionsView-CEt2aAxh.js → WorkflowExecutionsView-B0a-jegq.js} +7 -7
  97. package/dist/assets/{WorkflowHistory-Ca1cITF8.js → WorkflowHistory-BTMuD-Rw.js} +3 -3
  98. package/dist/assets/{WorkflowOnboardingView-Dj5r1TEe.js → WorkflowOnboardingView-yyOF5Tfj.js} +1 -1
  99. package/dist/assets/{WorkflowPreview-BM8KajvD.js → WorkflowPreview-FLb0vqTZ.js} +1 -1
  100. package/dist/assets/{WorkflowsView-CtEZYf3I.js → WorkflowsView-E-TpCSK5.js} +113 -30
  101. package/dist/assets/{canvas-D0IR7_I9.js → canvas-DVwUwHyq.js} +1 -1
  102. package/dist/assets/{chartjs.utils-Cl3MP1kj.js → chartjs.utils-TbG5rKwD.js} +2 -2
  103. package/dist/assets/{core-ChTWffJl.js → core-xJ_ye7-C.js} +1 -1
  104. package/dist/assets/{dataStore.store-TYb453Ex.js → dataStore.store-_vnx0W6W.js} +123 -4
  105. package/dist/assets/{en-BGDurvS-.js → en-Dky7DMCM.js} +36 -23
  106. package/dist/assets/{global-link-actions-DVZ42e62.js → global-link-actions-B6KV3Sbr.js} +1 -1
  107. package/dist/assets/{index-C6NR226r.css → index-Ced82689.css} +3178 -1103
  108. package/dist/assets/{index-DuT-FIl1.js → index-Cz15Tiv9.js} +8223 -6692
  109. package/dist/assets/{index-rj5i1dCk.js → index-DVGGZEuK.js} +1 -1
  110. package/dist/assets/{pickBy-Dt7YGwxv.js → pickBy-Bd6X8Hwr.js} +1 -1
  111. package/dist/assets/{readyToRunWorkflows.store-BMekdydj.js → readyToRunWorkflows.store-Cmgt_RuC.js} +1 -1
  112. package/dist/assets/{templateActions-BJtozPHh.js → templateActions-C8pcWzAR.js} +1 -1
  113. package/dist/assets/{useBeforeUnload-_0Sc5GzG.js → useBeforeUnload-BkXoGUBm.js} +1 -1
  114. package/dist/assets/{useExecutionDebugging-BE0aGBWM.js → useExecutionDebugging-Frigwi9s.js} +1 -1
  115. package/dist/assets/{useImportCurlCommand-dBmf2eJ5.js → useImportCurlCommand-C8hZCPg6.js} +10 -3
  116. package/dist/assets/{useProjectPages-BkXBOvhp.js → useProjectPages-atXZB4mX.js} +1 -1
  117. package/dist/assets/{usePushConnection-_wOU-QzC.js → usePushConnection-CdWJ1GHK.js} +8 -3
  118. package/dist/assets/{useWorkflowActivate-IL8D7V3s.js → useWorkflowActivate-DUdD-y87.js} +1 -1
  119. package/dist/index.html +2 -2
  120. package/package.json +1 -1
  121. package/dist/assets/CollectionParameter-Cgq5mid5.js +0 -4
  122. package/dist/assets/NodeCreator-COgNP4W1.css +0 -3569
@@ -1,13 +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 Tooltip, 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, 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-DuT-FIl1.js";
2
- import { _ as __unplugin_components_0, W as WorkflowActivator } from "./WorkflowActivator-5rkOtBNg.js";
3
- import { _ as _sfc_main$f } from "./PushConnectionTracker.vue_vue_type_script_setup_true_lang-CC7YLT_t.js";
4
- import { u as useBeforeUnload } from "./useBeforeUnload-_0Sc5GzG.js";
5
- import { T as Tag } from "./Tag-BU_1pCk_.js";
6
- import { u as usePushConnection } from "./usePushConnection-_wOU-QzC.js";
7
- import "./ProjectBreadcrumb-CzeQoSDB.js";
8
- import "./useWorkflowActivate-IL8D7V3s.js";
9
- import "./global-link-actions-DVZ42e62.js";
10
- import "./readyToRunWorkflows.store-BMekdydj.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-Cz15Tiv9.js";
2
+ import { _ as __unplugin_components_0, W as WorkflowActivator } from "./WorkflowActivator-_e923o0y.js";
3
+ import { u as useBeforeUnload } from "./useBeforeUnload-BkXoGUBm.js";
4
+ import { _ as _sfc_main$f } from "./PushConnectionTracker.vue_vue_type_script_setup_true_lang-CO-M5R89.js";
5
+ import { T as Tag } from "./Tag-DU_lYKFb.js";
6
+ import { u as usePushConnection } from "./usePushConnection-CdWJ1GHK.js";
7
+ import "./ProjectBreadcrumb-CWq8ubCf.js";
8
+ import "./useWorkflowActivate-DUdD-y87.js";
9
+ import "./global-link-actions-B6KV3Sbr.js";
10
+ import "./readyToRunWorkflows.store-Cmgt_RuC.js";
11
11
  const _hoisted_1$4 = ["data-action-id", "onClick"];
12
12
  const _hoisted_2$3 = { key: 0 };
13
13
  const _sfc_main$c = /* @__PURE__ */ defineComponent({
@@ -394,271 +394,6 @@ const cssModules$3 = {
394
394
  };
395
395
  const TabBar = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$3]]);
396
396
  const _sfc_main$9 = /* @__PURE__ */ defineComponent({
397
- __name: "IntersectionObserver",
398
- props: {
399
- threshold: { default: 0 },
400
- enabled: { type: Boolean, default: false },
401
- eventBus: {}
402
- },
403
- emits: ["observed"],
404
- setup(__props, { emit: __emit }) {
405
- const props = __props;
406
- const emit = __emit;
407
- const observer = ref(null);
408
- const root = ref(null);
409
- onBeforeUnmount(() => {
410
- if (props.enabled && observer.value) {
411
- observer.value.disconnect();
412
- }
413
- });
414
- onMounted(() => {
415
- if (!props.enabled) {
416
- return;
417
- }
418
- const options = {
419
- root: root.value,
420
- rootMargin: "0px",
421
- threshold: props.threshold
422
- };
423
- const intersectionObserver = new IntersectionObserver((entries) => {
424
- entries.forEach(({ target, isIntersecting }) => {
425
- emit("observed", {
426
- el: target,
427
- isIntersecting
428
- });
429
- });
430
- }, options);
431
- observer.value = intersectionObserver;
432
- props.eventBus.on("observe", (observed) => {
433
- if (observed) {
434
- intersectionObserver.observe(observed);
435
- }
436
- });
437
- props.eventBus.on("unobserve", (observed) => {
438
- intersectionObserver.unobserve(observed);
439
- });
440
- });
441
- return (_ctx, _cache) => {
442
- return openBlock(), createElementBlock("div", {
443
- ref_key: "root",
444
- ref: root
445
- }, [
446
- renderSlot(_ctx.$slots, "default")
447
- ], 512);
448
- };
449
- }
450
- });
451
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
452
- __name: "IntersectionObserved",
453
- props: {
454
- enabled: { type: Boolean, default: false },
455
- eventBus: {}
456
- },
457
- setup(__props) {
458
- const props = __props;
459
- const observed = ref(null);
460
- onMounted(async () => {
461
- if (!props.enabled) {
462
- return;
463
- }
464
- await nextTick();
465
- props.eventBus.emit("observe", observed.value);
466
- });
467
- onBeforeUnmount(() => {
468
- if (props.enabled) {
469
- props.eventBus.emit("unobserve", observed.value);
470
- }
471
- });
472
- return (_ctx, _cache) => {
473
- return openBlock(), createElementBlock("span", {
474
- ref_key: "observed",
475
- ref: observed
476
- }, [
477
- renderSlot(_ctx.$slots, "default")
478
- ], 512);
479
- };
480
- }
481
- });
482
- const _hoisted_1$2 = { class: "tags" };
483
- const _hoisted_2$2 = ["onClick"];
484
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
485
- __name: "TagsContainer",
486
- props: {
487
- tagIds: {},
488
- tagsById: {},
489
- limit: { default: 20 },
490
- clickable: { type: Boolean, default: false },
491
- responsive: { type: Boolean, default: false },
492
- hoverable: { type: Boolean, default: false }
493
- },
494
- emits: ["click"],
495
- setup(__props, { emit: __emit }) {
496
- const props = __props;
497
- const emit = __emit;
498
- const maxWidth = ref(320);
499
- const intersectionEventBus = createEventBus();
500
- const visibility = ref({});
501
- const tagsContainer = ref();
502
- const style = computed(() => ({
503
- "max-width": `${maxWidth.value}px`
504
- }));
505
- const tags = computed(() => {
506
- const allTags = props.tagIds.map((tagId) => props.tagsById[tagId]).filter(Boolean);
507
- let toDisplay = props.limit ? allTags.slice(0, props.limit) : allTags;
508
- toDisplay = toDisplay.map((tag) => ({
509
- ...tag,
510
- hidden: props.responsive && !visibility.value[tag.id]
511
- }));
512
- let visibleCount = toDisplay.length;
513
- if (props.responsive) {
514
- visibleCount = Object.values(visibility.value).reduce(
515
- (accu, val) => val ? accu + 1 : accu,
516
- 0
517
- );
518
- }
519
- if (visibleCount < allTags.length) {
520
- const hidden = allTags.slice(visibleCount);
521
- const hiddenTitle = hidden.reduce(
522
- (accu, tag) => accu ? `${accu}, ${tag.name}` : tag.name,
523
- ""
524
- );
525
- const countTag = {
526
- id: "count",
527
- name: `+${hidden.length}`,
528
- title: hiddenTitle,
529
- isCount: true
530
- };
531
- toDisplay.splice(visibleCount, 0, countTag);
532
- }
533
- return toDisplay;
534
- });
535
- const setMaxWidth = () => {
536
- const container2 = tagsContainer.value?.$el;
537
- const parent = container2?.parentNode;
538
- if (parent) {
539
- maxWidth.value = 0;
540
- void nextTick(() => {
541
- maxWidth.value = parent.clientWidth;
542
- });
543
- }
544
- };
545
- const debouncedSetMaxWidth = debounce(setMaxWidth, 100);
546
- const onObserved = ({ el, isIntersecting }) => {
547
- if (el.dataset.id) {
548
- visibility.value = { ...visibility.value, [el.dataset.id]: isIntersecting };
549
- }
550
- };
551
- const onClick = (e, tag) => {
552
- if (props.clickable) {
553
- e.stopPropagation();
554
- }
555
- if (!tag.hidden) {
556
- emit("click", tag.id);
557
- }
558
- };
559
- onMounted(() => {
560
- setMaxWidth();
561
- window.addEventListener("resize", debouncedSetMaxWidth);
562
- });
563
- onBeforeUnmount(() => {
564
- window.removeEventListener("resize", debouncedSetMaxWidth);
565
- });
566
- return (_ctx, _cache) => {
567
- const _component_el_tag = resolveComponent("el-tag");
568
- return openBlock(), createBlock(_sfc_main$9, {
569
- ref_key: "tagsContainer",
570
- ref: tagsContainer,
571
- threshold: 1,
572
- class: "tags-container",
573
- style: normalizeStyle(style.value),
574
- enabled: _ctx.responsive,
575
- "event-bus": unref(intersectionEventBus),
576
- onObserved
577
- }, {
578
- default: withCtx(() => [
579
- createBaseVNode("span", _hoisted_1$2, [
580
- (openBlock(true), createElementBlock(Fragment, null, renderList(tags.value, (tag) => {
581
- return openBlock(), createElementBlock("span", {
582
- key: tag.id,
583
- class: normalizeClass({ clickable: !tag.hidden }),
584
- onClick: (e) => onClick(e, tag)
585
- }, [
586
- tag.isCount ? (openBlock(), createBlock(_component_el_tag, {
587
- key: 0,
588
- title: tag.title,
589
- type: "info",
590
- size: "small",
591
- class: "count-container",
592
- "disable-transitions": true
593
- }, {
594
- default: withCtx(() => [
595
- createTextVNode(toDisplayString(tag.name), 1)
596
- ]),
597
- _: 2
598
- }, 1032, ["title"])) : (openBlock(), createBlock(_sfc_main$8, {
599
- key: 1,
600
- class: normalizeClass({ hideTag: tag.hidden }),
601
- "data-id": tag.id,
602
- enabled: _ctx.responsive,
603
- "event-bus": unref(intersectionEventBus)
604
- }, {
605
- default: withCtx(() => [
606
- createVNode(_component_el_tag, {
607
- title: tag.name,
608
- type: "info",
609
- size: "mini",
610
- class: normalizeClass({ hoverable: _ctx.hoverable }),
611
- "disable-transitions": true
612
- }, {
613
- default: withCtx(() => [
614
- createTextVNode(toDisplayString(tag.name), 1)
615
- ]),
616
- _: 2
617
- }, 1032, ["title", "class"])
618
- ]),
619
- _: 2
620
- }, 1032, ["class", "data-id", "enabled", "event-bus"]))
621
- ], 10, _hoisted_2$2);
622
- }), 128))
623
- ])
624
- ]),
625
- _: 1
626
- }, 8, ["style", "enabled", "event-bus"]);
627
- };
628
- }
629
- });
630
- const TagsContainer = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-6bab2764"]]);
631
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
632
- __name: "WorkflowTagsContainer",
633
- props: {
634
- tagIds: {},
635
- limit: {},
636
- clickable: { type: Boolean },
637
- responsive: { type: Boolean },
638
- hoverable: { type: Boolean }
639
- },
640
- emits: ["click"],
641
- setup(__props, { emit: __emit }) {
642
- const emit = __emit;
643
- const annotationTagsStore = useTagsStore();
644
- const tagsById = computed(() => annotationTagsStore.tagsById);
645
- function onClick(tagId) {
646
- emit("click", tagId);
647
- }
648
- return (_ctx, _cache) => {
649
- return openBlock(), createBlock(TagsContainer, {
650
- "tag-ids": _ctx.tagIds,
651
- "tags-by-id": tagsById.value,
652
- limit: _ctx.limit,
653
- clickable: _ctx.clickable,
654
- responsive: _ctx.responsive,
655
- hoverable: _ctx.hoverable,
656
- onClick
657
- }, null, 8, ["tag-ids", "tags-by-id", "limit", "clickable", "responsive", "hoverable"]);
658
- };
659
- }
660
- });
661
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
662
397
  __name: "BreakpointsObserver",
663
398
  props: {
664
399
  valueXS: {},
@@ -731,71 +466,6 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
731
466
  };
732
467
  }
733
468
  });
734
- const _hoisted_1$1 = { key: 0 };
735
- const _hoisted_2$1 = { key: 1 };
736
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
737
- __name: "WorkflowHistoryButton",
738
- props: {
739
- workflowId: {},
740
- isNewWorkflow: { type: Boolean },
741
- isFeatureEnabled: { type: Boolean }
742
- },
743
- emits: ["upgrade"],
744
- setup(__props, { emit: __emit }) {
745
- const locale = useI18n$1();
746
- const props = __props;
747
- const emit = __emit;
748
- const workflowHistoryRoute = computed(() => ({
749
- name: VIEWS.WORKFLOW_HISTORY,
750
- params: {
751
- workflowId: props.workflowId
752
- }
753
- }));
754
- return (_ctx, _cache) => {
755
- const _component_N8nIconButton = _sfc_main$d;
756
- const _component_RouterLink = resolveComponent("RouterLink");
757
- const _component_N8nLink = N8nLink;
758
- const _component_N8nTooltip = Tooltip;
759
- return openBlock(), createBlock(_component_N8nTooltip, { placement: "bottom" }, {
760
- content: withCtx(() => [
761
- _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), {
762
- key: 2,
763
- keypath: "workflowHistory.button.tooltip.disabled",
764
- scope: "global"
765
- }, {
766
- link: withCtx(() => [
767
- createVNode(_component_N8nLink, {
768
- size: "small",
769
- onClick: _cache[0] || (_cache[0] = ($event) => emit("upgrade"))
770
- }, {
771
- default: withCtx(() => [
772
- createTextVNode(toDisplayString(unref(locale).baseText("workflowHistory.button.tooltip.disabled.link")), 1)
773
- ]),
774
- _: 1
775
- })
776
- ]),
777
- _: 1
778
- }))
779
- ]),
780
- default: withCtx(() => [
781
- createVNode(_component_RouterLink, { to: workflowHistoryRoute.value }, {
782
- default: withCtx(() => [
783
- createVNode(_component_N8nIconButton, {
784
- disabled: _ctx.isNewWorkflow || !_ctx.isFeatureEnabled,
785
- "data-test-id": "workflow-history-button",
786
- type: "highlight",
787
- icon: "history",
788
- size: "medium"
789
- }, null, 8, ["disabled"])
790
- ]),
791
- _: 1
792
- }, 8, ["to"])
793
- ]),
794
- _: 1
795
- });
796
- };
797
- }
798
- });
799
469
  const HEARTBEAT_INTERVAL = 5 * TIME.MINUTE;
800
470
  const useCollaborationStore = defineStore(STORES.COLLABORATION, () => {
801
471
  const pushStore = usePushConnectionStore();
@@ -871,7 +541,7 @@ const useCollaborationStore = defineStore(STORES.COLLABORATION, () => {
871
541
  stopHeartbeat
872
542
  };
873
543
  });
874
- const _sfc_main$3 = /* @__PURE__ */ defineComponent({
544
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
875
545
  __name: "CollaborationPane",
876
546
  setup(__props) {
877
547
  const collaborationStore = useCollaborationStore();
@@ -914,15 +584,80 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
914
584
  };
915
585
  }
916
586
  });
917
- const container$2 = "_container_ame1i_123";
918
- const style0$1 = {
919
- container: container$2
920
- };
921
- const cssModules$2 = {
922
- "$style": style0$1
923
- };
924
- const CollaborationPane = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$2]]);
925
- 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({
926
661
  __name: "WorkflowProductionChecklist",
927
662
  props: {
928
663
  workflow: {}
@@ -986,106 +721,371 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
986
721
  completed: hasEvaluationSetOutputsNode.value
987
722
  });
988
723
  }
989
- if (!suggestedActionSettings.timeSaved?.ignored) {
990
- actions.push({
991
- id: "timeSaved",
992
- title: i18n.baseText("workflowProductionChecklist.timeSaved.title"),
993
- description: i18n.baseText("workflowProductionChecklist.timeSaved.description"),
994
- moreInfoLink: TIME_SAVED_DOCS_URL,
995
- completed: hasTimeSaved.value
996
- });
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);
997
963
  }
998
- return actions;
964
+ return toDisplay;
999
965
  });
1000
- async function loadWorkflowSettings() {
1001
- if (props.workflow.id) {
1002
- cachedSettings.value = await workflowsCache.getMergedWorkflowSettings(props.workflow.id);
1003
- }
1004
- }
1005
- async function handleActionClick(actionId) {
1006
- if (actionId === "evaluations") {
1007
- await router.push({
1008
- name: VIEWS.EVALUATION_EDIT,
1009
- 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;
1010
973
  });
1011
- } else if (actionId === "errorWorkflow" || actionId === "timeSaved") {
1012
- uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);
1013
- }
1014
- isPopoverOpen.value = false;
1015
- }
1016
- function isValidAction(action) {
1017
- return ["evaluations", "errorWorkflow", "timeSaved"].includes(action);
1018
- }
1019
- async function handleIgnoreClick(actionId) {
1020
- if (!isValidAction(actionId)) {
1021
- return;
1022
974
  }
1023
- await workflowsCache.ignoreSuggestedAction(props.workflow.id, actionId);
1024
- await loadWorkflowSettings();
1025
- telemetry.track("user clicked ignore suggested action", {
1026
- actionId
1027
- });
1028
- }
1029
- async function handleIgnoreAll() {
1030
- const ignoreAllConfirmed = await message.confirm(
1031
- i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.description"),
1032
- i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.title"),
1033
- {
1034
- confirmButtonText: i18n.baseText("workflowProductionChecklist.ignoreAllConfirmation.confirm")
1035
- }
1036
- );
1037
- if (ignoreAllConfirmed === MODAL_CONFIRM) {
1038
- await workflowsCache.ignoreAllSuggestedActionsForAllWorkflows(
1039
- availableActions.value.map((action) => action.id)
1040
- );
1041
- await loadWorkflowSettings();
1042
- 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 };
1043
980
  }
1044
- }
1045
- function openSuggestedActions() {
1046
- isPopoverOpen.value = true;
1047
- }
1048
- function onPopoverOpened() {
1049
- telemetry.track("user opened suggested actions checklist");
1050
- }
1051
- function handlePopoverOpenChange(open) {
1052
- if (open) {
1053
- isPopoverOpen.value = true;
1054
- onPopoverOpened();
1055
- } else if (!isActivationModalOpen.value) {
1056
- isPopoverOpen.value = false;
981
+ };
982
+ const onClick = (e, tag) => {
983
+ if (props.clickable) {
984
+ e.stopPropagation();
1057
985
  }
1058
- }
1059
- watch(
1060
- () => props.workflow.active,
1061
- async (isActive, wasActive) => {
1062
- if (isActive && !wasActive) {
1063
- if (!cachedSettings.value?.firstActivatedAt) {
1064
- setTimeout(() => {
1065
- openSuggestedActions();
1066
- }, 0);
1067
- }
1068
- await workflowsCache.updateFirstActivatedAt(props.workflow.id);
1069
- }
986
+ if (!tag.hidden) {
987
+ emit("click", tag.id);
1070
988
  }
1071
- );
1072
- onMounted(async () => {
1073
- await loadWorkflowSettings();
989
+ };
990
+ onMounted(() => {
991
+ setMaxWidth();
992
+ window.addEventListener("resize", debouncedSetMaxWidth);
993
+ });
994
+ onBeforeUnmount(() => {
995
+ window.removeEventListener("resize", debouncedSetMaxWidth);
1074
996
  });
1075
997
  return (_ctx, _cache) => {
1076
- return availableActions.value.length > 0 ? (openBlock(), createBlock(unref(N8nSuggestedActions), {
1077
- key: 0,
1078
- open: isPopoverOpen.value,
1079
- title: unref(i18n).baseText("workflowProductionChecklist.title"),
1080
- actions: availableActions.value,
1081
- "ignore-all-label": unref(i18n).baseText("workflowProductionChecklist.turnOffWorkflowSuggestions"),
1082
- notice: isProtectedEnvironment.value ? unref(i18n).baseText("workflowProductionChecklist.readOnlyNotice") : "",
1083
- "popover-alignment": "end",
1084
- onActionClick: handleActionClick,
1085
- onIgnoreClick: handleIgnoreClick,
1086
- onIgnoreAll: handleIgnoreAll,
1087
- "onUpdate:open": handlePopoverOpenChange
1088
- }, 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"]);
1089
1089
  };
1090
1090
  }
1091
1091
  });
@@ -1637,33 +1637,43 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1637
1637
  function goToWorkflowHistoryUpgrade() {
1638
1638
  void pageRedirectionHelper.goToUpgrade("workflow-history", "upgrade-workflow-history");
1639
1639
  }
1640
- function showCreateWorkflowSuccessToast(id) {
1641
- if (!id || ["new", PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(id)) {
1642
- let toastTitle = locale.baseText("workflows.create.personal.toast.title");
1643
- let toastText = locale.baseText("workflows.create.personal.toast.text");
1644
- if (projectsStore.currentProject) {
1645
- if (props.currentFolder) {
1646
- toastTitle = locale.baseText("workflows.create.folder.toast.title", {
1647
- interpolate: {
1648
- projectName: currentProjectName.value ?? "",
1649
- folderName: props.currentFolder.name ?? ""
1650
- }
1651
- });
1652
- } else if (projectsStore.currentProject.id !== projectsStore.personalProject?.id) {
1653
- toastTitle = locale.baseText("workflows.create.project.toast.title", {
1654
- interpolate: { projectName: currentProjectName.value ?? "" }
1655
- });
1656
- }
1657
- toastText = locale.baseText("workflows.create.project.toast.text", {
1658
- interpolate: { projectName: currentProjectName.value ?? "" }
1659
- });
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
1660
1649
  }
1661
- toast.showMessage({
1662
- title: toastTitle,
1663
- message: toastText,
1664
- type: "success"
1665
- });
1666
- }
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
+ });
1667
1677
  }
1668
1678
  const onBreadcrumbsItemSelected = (item) => {
1669
1679
  if (item.href) {
@@ -1682,7 +1692,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1682
1692
  return openBlock(), createElementBlock("div", {
1683
1693
  class: normalizeClass(unref($style).container)
1684
1694
  }, [
1685
- createVNode(_sfc_main$5, {
1695
+ createVNode(_sfc_main$9, {
1686
1696
  "value-x-s": 15,
1687
1697
  "value-s-m": 25,
1688
1698
  "value-m-d": 50,
@@ -1739,7 +1749,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1739
1749
  "data-test-id": "new-tag-link",
1740
1750
  onClick: onTagsEditEnable
1741
1751
  }, " + " + toDisplayString(unref(i18n).baseText("workflowDetails.addTag")), 1)
1742
- ])) : (openBlock(), createBlock(_sfc_main$6, {
1752
+ ])) : (openBlock(), createBlock(_sfc_main$2, {
1743
1753
  key: _ctx.id,
1744
1754
  "tag-ids": workflowTagIds.value,
1745
1755
  clickable: true,
@@ -1765,7 +1775,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1765
1775
  ]),
1766
1776
  createVNode(_sfc_main$f, { class: "actions" }, {
1767
1777
  default: withCtx(() => [
1768
- !isNewWorkflow.value ? (openBlock(), createBlock(_sfc_main$2, {
1778
+ !isNewWorkflow.value ? (openBlock(), createBlock(_sfc_main$6, {
1769
1779
  key: 0,
1770
1780
  workflow: unref(workflowsStore).workflow
1771
1781
  }, null, 8, ["workflow"])) : createCommentVNode("", true),
@@ -1844,7 +1854,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1844
1854
  "data-test-id": "workflow-save-button",
1845
1855
  onClick: onSaveButtonClick
1846
1856
  }, null, 8, ["saved", "disabled", "is-saving", "with-shortcut", "shortcut-tooltip"]),
1847
- createVNode(_sfc_main$4, {
1857
+ createVNode(_sfc_main$7, {
1848
1858
  "workflow-id": props.id,
1849
1859
  "is-feature-enabled": isWorkflowHistoryFeatureEnabled.value,
1850
1860
  "is-new-workflow": isNewWorkflow.value,
@@ -1893,7 +1903,7 @@ const style1 = {
1893
1903
  const cssModules$1 = {
1894
1904
  "$style": style1
1895
1905
  };
1896
- const WorkflowDetails = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1], ["__scopeId", "data-v-2a478201"]]);
1906
+ const WorkflowDetails = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1], ["__scopeId", "data-v-3cc77b55"]]);
1897
1907
  const GithubButton = defineComponent({
1898
1908
  name: "github-button",
1899
1909
  props: {