n8n-editor-ui 1.31.0 → 1.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.turbo/turbo-build.log +63 -63
  2. package/dist/assets/{AuthView-RfvlQPh5.js → AuthView-HA2BeS7f.js} +2 -2
  3. package/dist/assets/{AuthView-RfvlQPh5.js.map → AuthView-HA2BeS7f.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-l1b_Zx_I.js → CanvasControls-cUUtH5At.js} +2 -2
  5. package/dist/assets/{CanvasControls-l1b_Zx_I.js.map → CanvasControls-cUUtH5At.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-khhMqm-D.js → ChangePasswordView-LvlBcxOc.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-khhMqm-D.js.map → ChangePasswordView-LvlBcxOc.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-Zf8DWdFO.js → CollectionParameter-m-zt5fCV.js} +2 -2
  9. package/dist/assets/CollectionParameter-m-zt5fCV.js.map +1 -0
  10. package/dist/assets/{CredentialsView-f__IcIwo.js → CredentialsView-KBhkHODh.js} +2 -2
  11. package/dist/assets/{CredentialsView-f__IcIwo.js.map → CredentialsView-KBhkHODh.js.map} +1 -1
  12. package/dist/assets/{ExecutionFilter-mXzOcdkW.js → ExecutionFilter-V_hSgWod.js} +2 -2
  13. package/dist/assets/{ExecutionFilter-mXzOcdkW.js.map → ExecutionFilter-V_hSgWod.js.map} +1 -1
  14. package/dist/assets/{ExecutionPreview-Av4NpeIF.js → ExecutionPreview--u-5HE62.js} +2 -2
  15. package/dist/assets/{ExecutionPreview-Av4NpeIF.js.map → ExecutionPreview--u-5HE62.js.map} +1 -1
  16. package/dist/assets/{ExecutionsInfoAccordion-_GKLsSu_.js → ExecutionsInfoAccordion-x5q8J1U1.js} +2 -2
  17. package/dist/assets/{ExecutionsInfoAccordion-_GKLsSu_.js.map → ExecutionsInfoAccordion-x5q8J1U1.js.map} +1 -1
  18. package/dist/assets/{ExecutionsLandingPage-YC_2DX-_.js → ExecutionsLandingPage-L28oIFKc.js} +2 -2
  19. package/dist/assets/{ExecutionsLandingPage-YC_2DX-_.js.map → ExecutionsLandingPage-L28oIFKc.js.map} +1 -1
  20. package/dist/assets/{ExecutionsList-oSHXwRlB.js → ExecutionsList-0tFgI6WR.js} +2 -2
  21. package/dist/assets/{ExecutionsList-oSHXwRlB.js.map → ExecutionsList-0tFgI6WR.js.map} +1 -1
  22. package/dist/assets/{ExecutionsView-Pksjr3jh.js → ExecutionsView-TqkdmRRD.js} +2 -2
  23. package/dist/assets/{ExecutionsView-Pksjr3jh.js.map → ExecutionsView-TqkdmRRD.js.map} +1 -1
  24. package/dist/assets/{ForgotMyPasswordView-sxQf0ZxA.js → ForgotMyPasswordView-D1sIgYax.js} +2 -2
  25. package/dist/assets/{ForgotMyPasswordView-sxQf0ZxA.js.map → ForgotMyPasswordView-D1sIgYax.js.map} +1 -1
  26. package/dist/assets/{MainHeader-xz6puNIL.js → MainHeader-rSjJUqni.js} +2 -2
  27. package/dist/assets/{MainHeader-xz6puNIL.js.map → MainHeader-rSjJUqni.js.map} +1 -1
  28. package/dist/assets/{MainSidebar-rQpe5M3X.js → MainSidebar-YIkYQNvU.js} +2 -2
  29. package/dist/assets/{MainSidebar-rQpe5M3X.js.map → MainSidebar-YIkYQNvU.js.map} +1 -1
  30. package/dist/assets/{NodeCreation-8CGLiFnw.js → NodeCreation-Fzq2oHdG.js} +3 -3
  31. package/dist/assets/{NodeCreation-8CGLiFnw.js.map → NodeCreation-Fzq2oHdG.js.map} +1 -1
  32. package/dist/assets/{NodeCreator-0H6HfISN.js → NodeCreator-ZB-_-VPe.js} +2 -2
  33. package/dist/assets/{NodeCreator-0H6HfISN.js.map → NodeCreator-ZB-_-VPe.js.map} +1 -1
  34. package/dist/assets/{NodeList-02mJFRoY.js → NodeList-SQExkC1I.js} +2 -2
  35. package/dist/assets/{NodeList-02mJFRoY.js.map → NodeList-SQExkC1I.js.map} +1 -1
  36. package/dist/assets/{NodeView-WA4RerRw.css → NodeView-4TdTW4nM.css} +1 -1
  37. package/dist/assets/NodeView-R9MRan_s.js +8 -0
  38. package/dist/assets/NodeView-R9MRan_s.js.map +1 -0
  39. package/dist/assets/{RunDataAi-aB1oIQkq.js → RunDataAi-3ZnF5uZf.js} +2 -2
  40. package/dist/assets/{RunDataAi-aB1oIQkq.js.map → RunDataAi-3ZnF5uZf.js.map} +1 -1
  41. package/dist/assets/{RunDataJson-6dD5AHsW.js → RunDataJson-q9s2CJ1L.js} +3 -3
  42. package/dist/assets/{RunDataJson-6dD5AHsW.js.map → RunDataJson-q9s2CJ1L.js.map} +1 -1
  43. package/dist/assets/{RunDataJsonActions-3jBSymBt.js → RunDataJsonActions-87I4s3Q4.js} +2 -2
  44. package/dist/assets/{RunDataJsonActions-3jBSymBt.js.map → RunDataJsonActions-87I4s3Q4.js.map} +1 -1
  45. package/dist/assets/{RunDataSchema-uYs9i5gp.js → RunDataSchema-yoVX-T4I.js} +2 -2
  46. package/dist/assets/{RunDataSchema-uYs9i5gp.js.map → RunDataSchema-yoVX-T4I.js.map} +1 -1
  47. package/dist/assets/{RunDataTable-G1II-GXc.js → RunDataTable-64svWUC6.js} +2 -2
  48. package/dist/assets/{RunDataTable-G1II-GXc.js.map → RunDataTable-64svWUC6.js.map} +1 -1
  49. package/dist/assets/{SamlOnboarding-ekSCvOA8.js → SamlOnboarding-M2xGH4bo.js} +2 -2
  50. package/dist/assets/{SamlOnboarding-ekSCvOA8.js.map → SamlOnboarding-M2xGH4bo.js.map} +1 -1
  51. package/dist/assets/{SettingsApiView-nYqcsdag.js → SettingsApiView-DbkofsKW.js} +2 -2
  52. package/dist/assets/{SettingsApiView-nYqcsdag.js.map → SettingsApiView-DbkofsKW.js.map} +1 -1
  53. package/dist/assets/{SettingsCommunityNodesView-m3YKlauH.js → SettingsCommunityNodesView-AgA6fziO.js} +2 -2
  54. package/dist/assets/{SettingsCommunityNodesView-m3YKlauH.js.map → SettingsCommunityNodesView-AgA6fziO.js.map} +1 -1
  55. package/dist/assets/{SettingsExternalSecrets-34jgnmjV.js → SettingsExternalSecrets-bVUCWLUK.js} +2 -2
  56. package/dist/assets/{SettingsExternalSecrets-34jgnmjV.js.map → SettingsExternalSecrets-bVUCWLUK.js.map} +1 -1
  57. package/dist/assets/{SettingsFakeDoorView-PlM5Q7BR.js → SettingsFakeDoorView-vBsbSMTz.js} +2 -2
  58. package/dist/assets/{SettingsFakeDoorView-PlM5Q7BR.js.map → SettingsFakeDoorView-vBsbSMTz.js.map} +1 -1
  59. package/dist/assets/{SettingsLdapView-9xig0oET.js → SettingsLdapView-aOF3TxNb.js} +2 -2
  60. package/dist/assets/{SettingsLdapView-9xig0oET.js.map → SettingsLdapView-aOF3TxNb.js.map} +1 -1
  61. package/dist/assets/{SettingsLogStreamingView-ClMsYqOF.js → SettingsLogStreamingView-bm51qMta.js} +2 -2
  62. package/dist/assets/{SettingsLogStreamingView-ClMsYqOF.js.map → SettingsLogStreamingView-bm51qMta.js.map} +1 -1
  63. package/dist/assets/{SettingsSourceControl-YHwQ6IXq.js → SettingsSourceControl-WEi8c37q.js} +2 -2
  64. package/dist/assets/{SettingsSourceControl-YHwQ6IXq.js.map → SettingsSourceControl-WEi8c37q.js.map} +1 -1
  65. package/dist/assets/{SettingsSso-iFCiagfy.js → SettingsSso-1KUvHct8.js} +2 -2
  66. package/dist/assets/{SettingsSso-iFCiagfy.js.map → SettingsSso-1KUvHct8.js.map} +1 -1
  67. package/dist/assets/{SettingsUsageAndPlan-qV-dasPh.js → SettingsUsageAndPlan-qvlmdNIu.js} +2 -2
  68. package/dist/assets/{SettingsUsageAndPlan-qV-dasPh.js.map → SettingsUsageAndPlan-qvlmdNIu.js.map} +1 -1
  69. package/dist/assets/{SettingsUsersView-oFMSuGNj.js → SettingsUsersView-ipMjmS0J.js} +2 -2
  70. package/dist/assets/{SettingsUsersView-oFMSuGNj.js.map → SettingsUsersView-ipMjmS0J.js.map} +1 -1
  71. package/dist/assets/{SettingsView-PQr3D_Qw.js → SettingsView--YvZzIsd.js} +2 -2
  72. package/dist/assets/{SettingsView-PQr3D_Qw.js.map → SettingsView--YvZzIsd.js.map} +1 -1
  73. package/dist/assets/{SetupView-XgKAnmCH.js → SetupView-sXfLqAaw.js} +2 -2
  74. package/dist/assets/{SetupView-XgKAnmCH.js.map → SetupView-sXfLqAaw.js.map} +1 -1
  75. package/dist/assets/{SetupWorkflowCredentialsButton-1thP_Pd7.js → SetupWorkflowCredentialsButton-JeMgqdLT.js} +2 -2
  76. package/dist/assets/{SetupWorkflowCredentialsButton-1thP_Pd7.js.map → SetupWorkflowCredentialsButton-JeMgqdLT.js.map} +1 -1
  77. package/dist/assets/{SetupWorkflowFromTemplateView-srBMzN1e.js → SetupWorkflowFromTemplateView-CDQGT8sq.js} +2 -2
  78. package/dist/assets/{SetupWorkflowFromTemplateView-srBMzN1e.js.map → SetupWorkflowFromTemplateView-CDQGT8sq.js.map} +1 -1
  79. package/dist/assets/{SigninView-eE5qnff6.js → SigninView-Z98vY620.js} +2 -2
  80. package/dist/assets/{SigninView-eE5qnff6.js.map → SigninView-Z98vY620.js.map} +1 -1
  81. package/dist/assets/{SignupView-9d40Dggz.js → SignupView-X0K4hmyL.js} +2 -2
  82. package/dist/assets/{SignupView-9d40Dggz.js.map → SignupView-X0K4hmyL.js.map} +1 -1
  83. package/dist/assets/{TemplateDetails-rR8wjzGE.js → TemplateDetails-LkR9Mwpa.js} +2 -2
  84. package/dist/assets/{TemplateDetails-rR8wjzGE.js.map → TemplateDetails-LkR9Mwpa.js.map} +1 -1
  85. package/dist/assets/{TemplateList-iPTJU805.js → TemplateList-3Sn3bOND.js} +2 -2
  86. package/dist/assets/{TemplateList-iPTJU805.js.map → TemplateList-3Sn3bOND.js.map} +1 -1
  87. package/dist/assets/{TemplatesCollectionView-nbC99QSt.js → TemplatesCollectionView-ShC0Z9iK.js} +2 -2
  88. package/dist/assets/{TemplatesCollectionView-nbC99QSt.js.map → TemplatesCollectionView-ShC0Z9iK.js.map} +1 -1
  89. package/dist/assets/{TemplatesInfoCarousel-SruxUbHk.js → TemplatesInfoCarousel-LmSrKkcm.js} +2 -2
  90. package/dist/assets/{TemplatesInfoCarousel-SruxUbHk.js.map → TemplatesInfoCarousel-LmSrKkcm.js.map} +1 -1
  91. package/dist/assets/{TemplatesSearchView-v3YJ9cpx.js → TemplatesSearchView-WIbBh-fS.js} +2 -2
  92. package/dist/assets/{TemplatesSearchView-v3YJ9cpx.js.map → TemplatesSearchView-WIbBh-fS.js.map} +1 -1
  93. package/dist/assets/{TemplatesWorkflowView-fUesRX9J.js → TemplatesWorkflowView-GF7A2wQ8.js} +2 -2
  94. package/dist/assets/{TemplatesWorkflowView-fUesRX9J.js.map → TemplatesWorkflowView-GF7A2wQ8.js.map} +1 -1
  95. package/dist/assets/{VariablesView-VWkgCVLM.js → VariablesView-F5vY_O7t.js} +2 -2
  96. package/dist/assets/{VariablesView-VWkgCVLM.js.map → VariablesView-F5vY_O7t.js.map} +1 -1
  97. package/dist/assets/{WorkerView-2M4ULe2q.js → WorkerView-3HVNzSKY.js} +2 -2
  98. package/dist/assets/{WorkerView-2M4ULe2q.js.map → WorkerView-3HVNzSKY.js.map} +1 -1
  99. package/dist/assets/{WorkflowActivator-Ljzsj-Pc.js → WorkflowActivator-Bn6AJk6k.js} +2 -2
  100. package/dist/assets/{WorkflowActivator-Ljzsj-Pc.js.map → WorkflowActivator-Bn6AJk6k.js.map} +1 -1
  101. package/dist/assets/{WorkflowHistory-XIO4RPyW.js → WorkflowHistory-BOE4rgDP.js} +2 -2
  102. package/dist/assets/{WorkflowHistory-XIO4RPyW.js.map → WorkflowHistory-BOE4rgDP.js.map} +1 -1
  103. package/dist/assets/{WorkflowOnboardingView-uocM15_t.js → WorkflowOnboardingView-mo-6kuvd.js} +2 -2
  104. package/dist/assets/{WorkflowOnboardingView-uocM15_t.js.map → WorkflowOnboardingView-mo-6kuvd.js.map} +1 -1
  105. package/dist/assets/{WorkflowsView-kE5lfz5s.js → WorkflowsView-Xu_gm30s.js} +2 -2
  106. package/dist/assets/{WorkflowsView-kE5lfz5s.js.map → WorkflowsView-Xu_gm30s.js.map} +1 -1
  107. package/dist/assets/{cloud-eCWdzc_U.js → cloud-HXwHoJMx.js} +2 -2
  108. package/dist/assets/{cloud-eCWdzc_U.js.map → cloud-HXwHoJMx.js.map} +1 -1
  109. package/dist/assets/{index-6DR75wmI.js → index-36CdMZUz.js} +61 -61
  110. package/dist/assets/index-36CdMZUz.js.map +1 -0
  111. package/dist/assets/{index-nnspvX6P.css → index-wl9S8xQJ.css} +1 -1
  112. package/dist/assets/{pushConnection-Nsi8KY7W.js → pushConnection-oi9TyCK6.js} +2 -2
  113. package/dist/assets/{pushConnection-Nsi8KY7W.js.map → pushConnection-oi9TyCK6.js.map} +1 -1
  114. package/dist/assets/{templateActions-izEz5292.js → templateActions-EUfdPNqc.js} +2 -2
  115. package/dist/assets/{templateActions-izEz5292.js.map → templateActions-EUfdPNqc.js.map} +1 -1
  116. package/dist/assets/{useExecutionDebugging-io4M-GfO.js → useExecutionDebugging-986Mdc3C.js} +2 -2
  117. package/dist/assets/{useExecutionDebugging-io4M-GfO.js.map → useExecutionDebugging-986Mdc3C.js.map} +1 -1
  118. package/dist/assets/{workflowActivate-cwYrfIJI.js → workflowActivate-v05HQ2xy.js} +2 -2
  119. package/dist/assets/{workflowActivate-cwYrfIJI.js.map → workflowActivate-v05HQ2xy.js.map} +1 -1
  120. package/dist/index.html +2 -2
  121. package/package.json +1 -1
  122. package/dist/assets/CollectionParameter-Zf8DWdFO.js.map +0 -1
  123. package/dist/assets/NodeView-eyw1ZaPg.js +0 -8
  124. package/dist/assets/NodeView-eyw1ZaPg.js.map +0 -1
  125. package/dist/assets/index-6DR75wmI.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MainHeader-xz6puNIL.js","sources":["../../src/components/ShortenName.vue","../../src/components/IntersectionObserver.vue","../../src/components/IntersectionObserved.vue","../../src/components/TagsContainer.vue","../../src/components/ExpandableInput/ExpandableInputBase.vue","../../src/components/ExpandableInput/ExpandableInputEdit.vue","../../src/components/ExpandableInput/ExpandableInputPreview.vue","../../src/components/InlineTextEdit.vue","../../src/components/BreakpointsObserver.vue","../../src/components/MainHeader/CollaborationPane.vue","../../src/components/MainHeader/WorkflowDetails.vue","../../src/components/MainHeader/TabBar.vue","../../src/components/MainHeader/MainHeader.vue"],"sourcesContent":["<template>\n\t<span :title=\"name\" :data-test-id=\"testId\">\n\t\t<slot :shortened-name=\"shortenedName\"></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { shorten } from '@/utils/typesUtils';\n\nconst DEFAULT_WORKFLOW_NAME_LIMIT = 25;\nconst WORKFLOW_NAME_END_COUNT_TO_KEEP = 4;\n\nexport default defineComponent({\n\tname: 'ShortenName',\n\tprops: ['name', 'limit', 'testId'],\n\tcomputed: {\n\t\tshortenedName(): string {\n\t\t\treturn shorten(\n\t\t\t\tthis.name,\n\t\t\t\tthis.limit || DEFAULT_WORKFLOW_NAME_LIMIT,\n\t\t\t\tWORKFLOW_NAME_END_COUNT_TO_KEEP,\n\t\t\t);\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"root\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserver',\n\tprops: {\n\t\tthreshold: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tobserver: null,\n\t\t};\n\t},\n\tmounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst options = {\n\t\t\troot: this.$refs.root as Element,\n\t\t\trootMargin: '0px',\n\t\t\tthreshold: this.threshold,\n\t\t};\n\n\t\tconst observer = new IntersectionObserver((entries) => {\n\t\t\tentries.forEach(({ target, isIntersecting }) => {\n\t\t\t\tthis.$emit('observed', {\n\t\t\t\t\tel: target,\n\t\t\t\t\tisIntersecting,\n\t\t\t\t});\n\t\t\t});\n\t\t}, options);\n\n\t\tthis.observer = observer;\n\n\t\tthis.eventBus.on('observe', (observed: Element) => {\n\t\t\tif (observed) {\n\t\t\t\tobserver.observe(observed);\n\t\t\t}\n\t\t});\n\n\t\tthis.eventBus.on('unobserve', (observed: Element) => {\n\t\t\tobserver.unobserve(observed);\n\t\t});\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled) {\n\t\t\tthis.observer.disconnect();\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<span ref=\"observed\">\n\t\t<slot></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserved',\n\tprops: {\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tasync mounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.$nextTick();\n\t\tthis.eventBus.emit('observe', this.$refs.observed);\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled) {\n\t\t\tthis.eventBus.emit('unobserve', this.$refs.observed);\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<IntersectionObserver\n\t\tref=\"tagsContainer\"\n\t\t:threshold=\"1.0\"\n\t\tclass=\"tags-container\"\n\t\t:style=\"style\"\n\t\t:enabled=\"responsive\"\n\t\t:event-bus=\"intersectionEventBus\"\n\t\t@observed=\"onObserved\"\n\t>\n\t\t<span class=\"tags\">\n\t\t\t<span\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:class=\"{ clickable: !tag.hidden }\"\n\t\t\t\t@click=\"(e) => onClick(e, tag)\"\n\t\t\t>\n\t\t\t\t<el-tag\n\t\t\t\t\tv-if=\"tag.isCount\"\n\t\t\t\t\t:title=\"tag.title\"\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tclass=\"count-container\"\n\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t>\n\t\t\t\t\t{{ tag.name }}\n\t\t\t\t</el-tag>\n\t\t\t\t<IntersectionObserved\n\t\t\t\t\tv-else\n\t\t\t\t\t:class=\"{ hidden: tag.hidden }\"\n\t\t\t\t\t:data-id=\"tag.id\"\n\t\t\t\t\t:enabled=\"responsive\"\n\t\t\t\t\t:event-bus=\"intersectionEventBus\"\n\t\t\t\t>\n\t\t\t\t\t<el-tag\n\t\t\t\t\t\t:title=\"tag.name\"\n\t\t\t\t\t\ttype=\"info\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:class=\"{ hoverable }\"\n\t\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ tag.name }}\n\t\t\t\t\t</el-tag>\n\t\t\t\t</IntersectionObserved>\n\t\t\t</span>\n\t\t</span>\n\t</IntersectionObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nimport type { ITag } from '@/Interface';\nimport IntersectionObserver from './IntersectionObserver.vue';\nimport IntersectionObserved from './IntersectionObserved.vue';\nimport { mapStores } from 'pinia';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { debounce } from 'lodash-es';\n\n// random upper limit if none is set to minimize performance impact of observers\nconst DEFAULT_MAX_TAGS_LIMIT = 20;\n\ninterface TagEl extends ITag {\n\thidden?: boolean;\n\ttitle?: string;\n\tisCount?: boolean;\n}\n\nexport default defineComponent({\n\tname: 'TagsContainer',\n\tcomponents: { IntersectionObserver, IntersectionObserved },\n\tprops: ['tagIds', 'limit', 'clickable', 'responsive', 'hoverable'],\n\tdata() {\n\t\treturn {\n\t\t\tmaxWidth: 320,\n\t\t\tintersectionEventBus: createEventBus(),\n\t\t\tvisibility: {} as { [id: string]: boolean },\n\t\t\tdebouncedSetMaxWidth: () => {},\n\t\t};\n\t},\n\tcreated() {\n\t\tthis.debouncedSetMaxWidth = debounce(this.setMaxWidth, 100);\n\t},\n\tmounted() {\n\t\tthis.setMaxWidth();\n\t\twindow.addEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tcomputed: {\n\t\t...mapStores(useTagsStore),\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'max-width': `${this.maxWidth}px`,\n\t\t\t};\n\t\t},\n\t\ttags() {\n\t\t\tconst tags = this.tagIds\n\t\t\t\t.map((tagId: string) => this.tagsStore.getTagById(tagId))\n\t\t\t\t.filter(Boolean); // if tag has been deleted from store\n\n\t\t\tconst limit = this.limit || DEFAULT_MAX_TAGS_LIMIT;\n\n\t\t\tlet toDisplay: TagEl[] = limit ? tags.slice(0, limit) : tags;\n\t\t\ttoDisplay = toDisplay.map((tag: ITag) => ({\n\t\t\t\t...tag,\n\t\t\t\thidden: this.responsive && !this.visibility[tag.id],\n\t\t\t}));\n\n\t\t\tlet visibleCount = toDisplay.length;\n\t\t\tif (this.responsive) {\n\t\t\t\tvisibleCount = Object.values(this.visibility).reduce(\n\t\t\t\t\t(accu, val) => (val ? accu + 1 : accu),\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (visibleCount < tags.length) {\n\t\t\t\tconst hidden = tags.slice(visibleCount);\n\t\t\t\tconst hiddenTitle = hidden.reduce((accu: string, tag: ITag) => {\n\t\t\t\t\treturn accu ? `${accu}, ${tag.name}` : tag.name;\n\t\t\t\t}, '');\n\n\t\t\t\tconst countTag: TagEl = {\n\t\t\t\t\tid: 'count',\n\t\t\t\t\tname: `+${hidden.length}`,\n\t\t\t\t\ttitle: hiddenTitle,\n\t\t\t\t\tisCount: true,\n\t\t\t\t};\n\t\t\t\ttoDisplay.splice(visibleCount, 0, countTag);\n\t\t\t}\n\n\t\t\treturn toDisplay;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetMaxWidth() {\n\t\t\tconst container = this.$refs.tagsContainer.$el as HTMLElement;\n\t\t\tconst parent = container.parentNode as HTMLElement;\n\n\t\t\tif (parent) {\n\t\t\t\tthis.maxWidth = 0;\n\t\t\t\tvoid this.$nextTick(() => {\n\t\t\t\t\tthis.maxWidth = parent.clientWidth;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonObserved({ el, isIntersecting }: { el: HTMLElement; isIntersecting: boolean }) {\n\t\t\tif (el.dataset.id) {\n\t\t\t\tthis.visibility = { ...this.visibility, [el.dataset.id]: isIntersecting };\n\t\t\t}\n\t\t},\n\t\tonClick(e: MouseEvent, tag: TagEl) {\n\t\t\tif (this.clickable) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\n\t\t\t// if tag is hidden or not displayed\n\t\t\tif (!tag.hidden) {\n\t\t\t\tthis.$emit('click', tag.id);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.tags-container {\n\tdisplay: block;\n\tmax-width: 300px;\n}\n\n.tags {\n\tdisplay: block;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tmax-width: 100%;\n\n\t> span {\n\t\tpadding-right: 4px; // why not margin? for space between tags to be clickable\n\t}\n}\n\n.hidden {\n\tvisibility: hidden;\n}\n\n.el-tag.hoverable:hover {\n\tborder-color: $color-primary;\n}\n\n.count-container {\n\tposition: absolute;\n\tmax-width: 40px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n</style>\n","<template>\n\t<!-- mock el-input element to apply styles -->\n\t<div :class=\"{ 'el-input': true, 'static-size': staticSize }\" :data-value=\"hiddenValue\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputBase',\n\tprops: ['modelValue', 'placeholder', 'staticSize'],\n\tcomputed: {\n\t\thiddenValue() {\n\t\t\tlet value = (this.modelValue as string).replace(/\\s/g, '.'); // force input to expand on space chars\n\t\t\tif (!value) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tvalue = this.placeholder;\n\t\t\t}\n\n\t\t\treturn `${value}`; // adjust for padding\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n$--horiz-padding: 15px;\n\n.el-input {\n\tdisplay: inline-grid;\n\tfont: inherit;\n\tpadding: 10px 0;\n\n\t:deep(input) {\n\t\tborder: 1px solid transparent;\n\t\tpadding: 0 $--horiz-padding - 2px; // -2px for borders\n\t\twidth: 100%;\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t}\n\n\t&::after {\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t\tcontent: attr(data-value) ' ';\n\t\tvisibility: hidden;\n\t\twhite-space: nowrap;\n\t\tpadding: 0 $--horiz-padding;\n\t}\n\n\t&:not(.static-size)::after {\n\t\toverflow: hidden;\n\t}\n\n\t&:hover {\n\t\t:deep(input):not(:focus) {\n\t\t\tborder: 1px solid var(--color-text-lighter);\n\t\t}\n\t}\n\n\t:deep(input):focus {\n\t\tborder: 1px solid var(--color-secondary);\n\t}\n}\n</style>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :placeholder=\"placeholder\">\n\t\t<input\n\t\t\tref=\"input\"\n\t\t\tv-on-click-outside=\"onClickOutside\"\n\t\t\tclass=\"el-input__inner\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:maxlength=\"maxlength\"\n\t\t\tsize=\"4\"\n\t\t\t@input=\"onInput\"\n\t\t\t@keydown.enter=\"onEnter\"\n\t\t\t@keydown.esc=\"onEscape\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\nimport type { PropType } from 'vue';\nimport type { EventBus } from 'n8n-design-system';\n\nexport default defineComponent({\n\tname: 'ExpandableInputEdit',\n\tcomponents: { ExpandableInputBase },\n\tprops: {\n\t\tmodelValue: {},\n\t\tplaceholder: {},\n\t\tmaxlength: {},\n\t\tautofocus: {},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t},\n\tmounted() {\n\t\t// autofocus on input element is not reliable\n\t\tif (this.autofocus && this.$refs.input) {\n\t\t\tthis.focus();\n\t\t}\n\t\tthis.eventBus?.on('focus', this.focus);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('focus', this.focus);\n\t},\n\tmethods: {\n\t\tfocus() {\n\t\t\tif (this.$refs.input) {\n\t\t\t\t(this.$refs.input as HTMLInputElement).focus();\n\t\t\t}\n\t\t},\n\t\tonInput() {\n\t\t\tthis.$emit('update:modelValue', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonEnter() {\n\t\t\tthis.$emit('enter', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonClickOutside(e: Event) {\n\t\t\tif (e.type === 'click') {\n\t\t\t\tthis.$emit('blur', (this.$refs.input as HTMLInputElement).value);\n\t\t\t}\n\t\t},\n\t\tonEscape() {\n\t\t\tthis.$emit('esc');\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :static-size=\"true\">\n\t\t<input\n\t\t\t:class=\"{ 'el-input__inner': true, clickable: true }\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:disabled=\"true\"\n\t\t\tsize=\"4\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputPreview',\n\tcomponents: { ExpandableInputBase },\n\tprops: ['modelValue'],\n});\n</script>\n\n<style lang=\"scss\" scoped>\ninput,\ninput:hover {\n\tbackground-color: unset;\n\ttransition: unset;\n\tpointer-events: none; // fix firefox bug\n}\n\ninput[disabled] {\n\tcolor: $custom-font-black;\n\n\t// override safari colors\n\t-webkit-text-fill-color: $custom-font-black;\n\t-webkit-opacity: 1;\n}\n</style>\n","<template>\n\t<span class=\"inline-edit\" @keydown.stop>\n\t\t<span v-if=\"isEditEnabled && !isDisabled\">\n\t\t\t<ExpandableInputEdit\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:model-value=\"newValue\"\n\t\t\t\t:maxlength=\"maxLength\"\n\t\t\t\t:autofocus=\"true\"\n\t\t\t\t:event-bus=\"inputBus\"\n\t\t\t\t@update:modelValue=\"onInput\"\n\t\t\t\t@esc=\"onEscape\"\n\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t@enter=\"submit\"\n\t\t\t/>\n\t\t</span>\n\n\t\t<span v-else class=\"preview\" @click=\"onClick\">\n\t\t\t<ExpandableInputPreview :model-value=\"previewValue || modelValue\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputEdit from '@/components/ExpandableInput/ExpandableInputEdit.vue';\nimport ExpandableInputPreview from '@/components/ExpandableInput/ExpandableInputPreview.vue';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'InlineTextEdit',\n\tcomponents: { ExpandableInputEdit, ExpandableInputPreview },\n\tprops: {\n\t\tisEditEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tmaxLength: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tpreviewValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisDisabled: this.disabled,\n\t\t\tnewValue: '',\n\t\t\tescPressed: false,\n\t\t\tinputBus: createEventBus(),\n\t\t};\n\t},\n\twatch: {\n\t\tdisabled(value) {\n\t\t\tthis.isDisabled = value;\n\t\t},\n\t},\n\tmethods: {\n\t\tonInput(newValue: string) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = newValue;\n\t\t},\n\t\tonClick() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = this.modelValue;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t\tonBlur() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.escPressed) {\n\t\t\t\tthis.submit();\n\t\t\t}\n\t\t\tthis.escPressed = false;\n\t\t},\n\t\tsubmit() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst onSubmit = (updated: boolean) => {\n\t\t\t\tthis.isDisabled = false;\n\n\t\t\t\tif (!updated) {\n\t\t\t\t\tthis.inputBus.emit('focus');\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.isDisabled = true;\n\t\t\tthis.$emit('submit', { name: this.newValue, onSubmit });\n\t\t},\n\t\tonEscape() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.escPressed = true;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.preview {\n\tcursor: pointer;\n}\n</style>\n","<template>\n\t<span>\n\t\t<slot :bp=\"bp\" :value=\"value\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BREAKPOINT_SM, BREAKPOINT_MD, BREAKPOINT_LG, BREAKPOINT_XL } from '@/constants';\n\n/**\n * matching element.io https://element.eleme.io/#/en-US/component/layout#col-attributes\n * xs < 768\n * sm >= 768\n * md >= 992\n * lg >= 1200\n * xl >= 1920\n */\n\nimport { useUIStore } from '@/stores/ui.store';\nimport { getBannerRowHeight } from '@/utils/htmlUtils';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'BreakpointsObserver',\n\tprops: ['valueXS', 'valueXL', 'valueLG', 'valueMD', 'valueSM', 'valueDefault'],\n\tsetup() {\n\t\tconst { callDebounced } = useDebounce();\n\t\treturn { callDebounced };\n\t},\n\tdata() {\n\t\treturn {\n\t\t\twidth: window.innerWidth,\n\t\t};\n\t},\n\tcomputed: {\n\t\tbp(): string {\n\t\t\tif (this.width < BREAKPOINT_SM) {\n\t\t\t\treturn 'XS';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn 'XL';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn 'LG';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn 'MD';\n\t\t\t}\n\n\t\t\treturn 'SM';\n\t\t},\n\n\t\tvalue(): number | undefined {\n\t\t\tif (this.valueXS !== undefined && this.width < BREAKPOINT_SM) {\n\t\t\t\treturn this.valueXS;\n\t\t\t}\n\n\t\t\tif (this.valueXL !== undefined && this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn this.valueXL;\n\t\t\t}\n\n\t\t\tif (this.valueLG !== undefined && this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn this.valueLG;\n\t\t\t}\n\n\t\t\tif (this.valueMD !== undefined && this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn this.valueMD;\n\t\t\t}\n\n\t\t\tif (this.valueSM !== undefined) {\n\t\t\t\treturn this.valueSM;\n\t\t\t}\n\n\t\t\treturn this.valueDefault;\n\t\t},\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\tonResize() {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 50 });\n\t\t},\n\t\tasync onResizeEnd() {\n\t\t\tthis.width = window.innerWidth;\n\t\t\tawait this.$nextTick();\n\n\t\t\tconst bannerHeight = await getBannerRowHeight();\n\t\t\tuseUIStore().updateBannersHeight(bannerHeight);\n\t\t},\n\t},\n});\n</script>\n","<script setup lang=\"ts\">\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { onBeforeUnmount, onMounted, computed, ref } from 'vue';\nimport { TIME } from '@/constants';\n\nconst collaborationStore = useCollaborationStore();\nconst usersStore = useUsersStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst HEARTBEAT_INTERVAL = 5 * TIME.MINUTE;\nconst heartbeatTimer = ref<number | null>(null);\n\nconst activeUsersSorted = computed(() => {\n\tconst currentWorkflowUsers = (collaborationStore.getUsersForCurrentWorkflow ?? []).map(\n\t\t(userInfo) => userInfo.user,\n\t);\n\tconst owner = currentWorkflowUsers.find((user) => user.role === 'global:owner');\n\treturn {\n\t\tdefaultGroup: owner\n\t\t\t? [owner, ...currentWorkflowUsers.filter((user) => user.id !== owner.id)]\n\t\t\t: currentWorkflowUsers,\n\t};\n});\n\nconst currentUserEmail = computed(() => {\n\treturn usersStore.currentUser?.email;\n});\n\nconst startHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t\theartbeatTimer.value = null;\n\t}\n\theartbeatTimer.value = window.setInterval(() => {\n\t\tcollaborationStore.notifyWorkflowOpened(workflowsStore.workflow.id);\n\t}, HEARTBEAT_INTERVAL);\n};\n\nconst stopHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t}\n};\n\nconst onDocumentVisibilityChange = () => {\n\tif (document.visibilityState === 'hidden') {\n\t\tstopHeartbeat();\n\t} else {\n\t\tstartHeartbeat();\n\t}\n};\n\nonMounted(() => {\n\tstartHeartbeat();\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n\tstopHeartbeat();\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"`collaboration-pane-container ${$style.container}`\"\n\t\tdata-test-id=\"collaboration-pane\"\n\t>\n\t\t<n8n-user-stack :users=\"activeUsersSorted\" :current-user-email=\"currentUserEmail\" />\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tmargin: 0 var(--spacing-4xs);\n}\n</style>\n","<template>\n\t<div v-if=\"workflowName\" class=\"container\">\n\t\t<BreakpointsObserver :value-x-s=\"15\" :value-s-m=\"25\" :value-m-d=\"50\" class=\"name-container\">\n\t\t\t<template #default=\"{ value }\">\n\t\t\t\t<ShortenName\n\t\t\t\t\t:name=\"workflowName\"\n\t\t\t\t\t:limit=\"value\"\n\t\t\t\t\t:custom=\"true\"\n\t\t\t\t\ttest-id=\"workflow-name-input\"\n\t\t\t\t>\n\t\t\t\t\t<template #default=\"{ shortenedName }\">\n\t\t\t\t\t\t<InlineTextEdit\n\t\t\t\t\t\t\t:model-value=\"workflowName\"\n\t\t\t\t\t\t\t:preview-value=\"shortenedName\"\n\t\t\t\t\t\t\t:is-edit-enabled=\"isNameEditEnabled\"\n\t\t\t\t\t\t\t:max-length=\"MAX_WORKFLOW_NAME_LENGTH\"\n\t\t\t\t\t\t\t:disabled=\"readOnly\"\n\t\t\t\t\t\t\tplaceholder=\"Enter workflow name\"\n\t\t\t\t\t\t\tclass=\"name\"\n\t\t\t\t\t\t\t@toggle=\"onNameToggle\"\n\t\t\t\t\t\t\t@submit=\"onNameSubmit\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</ShortenName>\n\t\t\t</template>\n\t\t</BreakpointsObserver>\n\n\t\t<span v-if=\"settingsStore.areTagsEnabled\" class=\"tags\" data-test-id=\"workflow-tags-container\">\n\t\t\t<TagsDropdown\n\t\t\t\tv-if=\"isTagsEditEnabled && !readOnly\"\n\t\t\t\tref=\"dropdown\"\n\t\t\t\tv-model=\"appliedTagIds\"\n\t\t\t\t:create-enabled=\"true\"\n\t\t\t\t:event-bus=\"tagsEditBus\"\n\t\t\t\t:placeholder=\"$locale.baseText('workflowDetails.chooseOrCreateATag')\"\n\t\t\t\tclass=\"tags-edit\"\n\t\t\t\tdata-test-id=\"workflow-tags-dropdown\"\n\t\t\t\t@blur=\"onTagsBlur\"\n\t\t\t\t@esc=\"onTagsEditEsc\"\n\t\t\t/>\n\t\t\t<div v-else-if=\"currentWorkflowTagIds.length === 0 && !readOnly\">\n\t\t\t\t<span class=\"add-tag clickable\" data-test-id=\"new-tag-link\" @click=\"onTagsEditEnable\">\n\t\t\t\t\t+ {{ $locale.baseText('workflowDetails.addTag') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<TagsContainer\n\t\t\t\tv-else\n\t\t\t\t:key=\"currentWorkflowId\"\n\t\t\t\t:tag-ids=\"currentWorkflowTagIds\"\n\t\t\t\t:clickable=\"true\"\n\t\t\t\t:responsive=\"true\"\n\t\t\t\tdata-test-id=\"workflow-tags\"\n\t\t\t\t@click=\"onTagsEditEnable\"\n\t\t\t/>\n\t\t</span>\n\t\t<span v-else class=\"tags\"></span>\n\n\t\t<PushConnectionTracker class=\"actions\">\n\t\t\t<span :class=\"`activator ${$style.group}`\">\n\t\t\t\t<WorkflowActivator :workflow-active=\"isWorkflowActive\" :workflow-id=\"currentWorkflowId\" />\n\t\t\t</span>\n\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\">\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<CollaborationPane />\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tdata-test-id=\"workflow-share-button\"\n\t\t\t\t\t\t@click=\"onShareButtonClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #fallback>\n\t\t\t\t\t<n8n-tooltip>\n\t\t\t\t\t\t<n8n-button type=\"secondary\" :class=\"['mr-2xs', $style.disabledShareButton]\">\n\t\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t\n\t\t\t\t\t\t\t\t:keypath=\"\n\t\t\t\t\t\t\t\t\tcontextBasedTranslationKeys.workflows.sharing.unavailable.description.tooltip\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t\t\t<a @click=\"goToUpgrade\">\n\t\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t\t\tcontextBasedTranslationKeys.workflows.sharing.unavailable.button,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</template>\n\t\t\t</enterprise-edition>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<SaveButton\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:saved=\"!isDirty && !isNewWorkflow\"\n\t\t\t\t\t:disabled=\"isWorkflowSaving || readOnly\"\n\t\t\t\t\tdata-test-id=\"workflow-save-button\"\n\t\t\t\t\t@click=\"onSaveButtonClick\"\n\t\t\t\t/>\n\t\t\t\t<router-link\n\t\t\t\t\tv-if=\"isWorkflowHistoryFeatureEnabled\"\n\t\t\t\t\t:to=\"workflowHistoryRoute\"\n\t\t\t\t\t:class=\"$style.workflowHistoryButton\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t:disabled=\"isWorkflowHistoryButtonDisabled\"\n\t\t\t\t\t\tdata-test-id=\"workflow-history-button\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\ticon=\"history\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t/>\n\t\t\t\t</router-link>\n\t\t\t</div>\n\t\t\t<div :class=\"[$style.workflowMenuContainer, $style.group]\">\n\t\t\t\t<input\n\t\t\t\t\tref=\"importFile\"\n\t\t\t\t\t:class=\"$style.hiddenInput\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\tdata-test-id=\"workflow-import-input\"\n\t\t\t\t\t@change=\"handleFileImport()\"\n\t\t\t\t/>\n\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\t:items=\"workflowMenuItems\"\n\t\t\t\t\tdata-test-id=\"workflow-menu\"\n\t\t\t\t\t@select=\"onWorkflowMenuSelect\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</PushConnectionTracker>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport {\n\tDUPLICATE_MODAL_KEY,\n\tEnterpriseEditionFeature,\n\tMAX_WORKFLOW_NAME_LENGTH,\n\tMODAL_CONFIRM,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSOURCE_CONTROL_PUSH_MODAL_KEY,\n\tVIEWS,\n\tWORKFLOW_MENU_ACTIONS,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tWORKFLOW_SHARE_MODAL_KEY,\n} from '@/constants';\n\nimport ShortenName from '@/components/ShortenName.vue';\nimport TagsContainer from '@/components/TagsContainer.vue';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport WorkflowActivator from '@/components/WorkflowActivator.vue';\nimport SaveButton from '@/components/SaveButton.vue';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport InlineTextEdit from '@/components/InlineTextEdit.vue';\nimport BreakpointsObserver from '@/components/BreakpointsObserver.vue';\nimport CollaborationPane from '@/components/MainHeader/CollaborationPane.vue';\nimport type { IUser, IWorkflowDataUpdate, IWorkflowDb, IWorkflowToShare } from '@/Interface';\n\nimport { saveAs } from 'file-saver';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport type { MessageBoxInputData } from 'element-plus';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsageStore } from '@/stores/usage.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { IPermissions } from '@/permissions';\nimport { getWorkflowPermissions } from '@/permissions';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { nodeViewEventBus } from '@/event-bus';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\nconst hasChanged = (prev: string[], curr: string[]) => {\n\tif (prev.length !== curr.length) {\n\t\treturn true;\n\t}\n\n\tconst set = new Set(prev);\n\treturn curr.reduce((accu, val) => accu || !set.has(val), false);\n};\n\nexport default defineComponent({\n\tname: 'WorkflowDetails',\n\tcomponents: {\n\t\tTagsContainer,\n\t\tPushConnectionTracker,\n\t\tShortenName,\n\t\tWorkflowActivator,\n\t\tSaveButton,\n\t\tTagsDropdown,\n\t\tInlineTextEdit,\n\t\tBreakpointsObserver,\n\t\tCollaborationPane,\n\t},\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\tworkflowHelpers,\n\t\t\t...useTitleChange(),\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisTagsEditEnabled: false,\n\t\t\tisNameEditEnabled: false,\n\t\t\tappliedTagIds: [],\n\t\t\ttagsEditBus: createEventBus(),\n\t\t\tMAX_WORKFLOW_NAME_LENGTH,\n\t\t\ttagsSaving: false,\n\t\t\teventBus: createEventBus(),\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseTagsStore,\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsageStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseUsersStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseCanvasStore,\n\t\t),\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tcontextBasedTranslationKeys() {\n\t\t\treturn this.uiStore.contextBasedTranslationKeys;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\treturn this.workflowsStore.isWorkflowActive;\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tisDirty(): boolean {\n\t\t\treturn this.uiStore.stateIsDirty;\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tcurrentWorkflowTagIds(): string[] {\n\t\t\treturn this.workflowsStore.workflowTags;\n\t\t},\n\t\tisNewWorkflow(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.currentWorkflowId ||\n\t\t\t\tthis.currentWorkflowId === PLACEHOLDER_EMPTY_WORKFLOW_ID ||\n\t\t\t\tthis.currentWorkflowId === 'new'\n\t\t\t);\n\t\t},\n\t\tisWorkflowSaving(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowSaving');\n\t\t},\n\t\tworkflow(): IWorkflowDb {\n\t\t\treturn this.workflowsStore.workflow;\n\t\t},\n\t\tcurrentWorkflowId(): string {\n\t\t\treturn this.workflowsStore.workflowId;\n\t\t},\n\t\tonWorkflowPage(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.$route.meta &&\n\t\t\t\t(this.$route.meta.nodeView || this.$route.meta.keepWorkflowAlive === true)\n\t\t\t);\n\t\t},\n\t\tonExecutionsTab(): boolean {\n\t\t\treturn [\n\t\t\t\tVIEWS.EXECUTION_HOME.toString(),\n\t\t\t\tVIEWS.WORKFLOW_EXECUTIONS.toString(),\n\t\t\t\tVIEWS.EXECUTION_PREVIEW,\n\t\t\t].includes(this.$route.name || '');\n\t\t},\n\t\tworkflowPermissions(): IPermissions {\n\t\t\treturn getWorkflowPermissions(this.currentUser, this.workflow);\n\t\t},\n\t\tworkflowMenuItems(): Array<{}> {\n\t\t\tconst actions = [\n\t\t\t\t{\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.DOWNLOAD,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.download'),\n\t\t\t\t\tdisabled: !this.onWorkflowPage,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (!this.readOnly) {\n\t\t\t\tactions.unshift({\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.DUPLICATE,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.duplicate'),\n\t\t\t\t\tdisabled: !this.onWorkflowPage || !this.currentWorkflowId,\n\t\t\t\t});\n\n\t\t\t\tactions.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL,\n\t\t\t\t\t\tlabel: this.$locale.baseText('menuActions.importFromUrl'),\n\t\t\t\t\t\tdisabled: !this.onWorkflowPage || this.onExecutionsTab,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE,\n\t\t\t\t\t\tlabel: this.$locale.baseText('menuActions.importFromFile'),\n\t\t\t\t\t\tdisabled: !this.onWorkflowPage || this.onExecutionsTab,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (hasPermission(['rbac'], { rbac: { scope: 'sourceControl:push' } })) {\n\t\t\t\tactions.push({\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.PUSH,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.push'),\n\t\t\t\t\tdisabled:\n\t\t\t\t\t\t!this.sourceControlStore.isEnterpriseSourceControlEnabled ||\n\t\t\t\t\t\t!this.onWorkflowPage ||\n\t\t\t\t\t\tthis.onExecutionsTab ||\n\t\t\t\t\t\tthis.readOnlyEnv,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tactions.push({\n\t\t\t\tid: WORKFLOW_MENU_ACTIONS.SETTINGS,\n\t\t\t\tlabel: this.$locale.baseText('generic.settings'),\n\t\t\t\tdisabled: !this.onWorkflowPage || this.isNewWorkflow,\n\t\t\t});\n\n\t\t\tif (this.workflowPermissions.delete && !this.readOnly) {\n\t\t\t\tactions.push({\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.DELETE,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.delete'),\n\t\t\t\t\tdisabled: !this.onWorkflowPage || this.isNewWorkflow,\n\t\t\t\t\tcustomClass: this.$style.deleteItem,\n\t\t\t\t\tdivided: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn actions;\n\t\t},\n\t\tisWorkflowHistoryFeatureEnabled(): boolean {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(\n\t\t\t\tEnterpriseEditionFeature.WorkflowHistory,\n\t\t\t);\n\t\t},\n\t\tworkflowHistoryRoute(): { name: string; params: { workflowId: string } } {\n\t\t\treturn {\n\t\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\t\tparams: {\n\t\t\t\t\tworkflowId: this.currentWorkflowId,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tisWorkflowHistoryButtonDisabled(): boolean {\n\t\t\treturn this.workflowsStore.isNewWorkflow;\n\t\t},\n\t},\n\twatch: {\n\t\tcurrentWorkflowId() {\n\t\t\tthis.isTagsEditEnabled = false;\n\t\t\tthis.isNameEditEnabled = false;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onSaveButtonClick() {\n\t\t\tlet currentId = undefined;\n\t\t\tif (this.currentWorkflowId !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {\n\t\t\t\tcurrentId = this.currentWorkflowId;\n\t\t\t} else if (this.$route.params.name && this.$route.params.name !== 'new') {\n\t\t\t\tcurrentId = this.$route.params.name;\n\t\t\t}\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({\n\t\t\t\tid: currentId,\n\t\t\t\tname: this.workflowName,\n\t\t\t\ttags: this.currentWorkflowTagIds,\n\t\t\t});\n\n\t\t\tif (saved) {\n\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\n\t\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\t\tawait this.$router.replace({\n\t\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\t\tparams: { name: this.currentWorkflowId },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonShareButtonClick() {\n\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\tname: WORKFLOW_SHARE_MODAL_KEY,\n\t\t\t\tdata: { id: this.currentWorkflowId },\n\t\t\t});\n\n\t\t\tthis.$telemetry.track('User opened sharing modal', {\n\t\t\t\tworkflow_id: this.currentWorkflowId,\n\t\t\t\tuser_id_sharer: this.currentUser?.id,\n\t\t\t\tsub_view: this.$route.name === VIEWS.WORKFLOWS ? 'Workflows listing' : 'Workflow editor',\n\t\t\t});\n\t\t},\n\t\tonTagsEditEnable() {\n\t\t\tthis.appliedTagIds = this.currentWorkflowTagIds;\n\t\t\tthis.isTagsEditEnabled = true;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\t// allow name update to occur before disabling name edit\n\t\t\t\tthis.isNameEditEnabled = false;\n\t\t\t\tthis.tagsEditBus.emit('focus');\n\t\t\t}, 0);\n\t\t},\n\n\t\tasync onTagsBlur() {\n\t\t\tconst current = this.currentWorkflowTagIds;\n\t\t\tconst tags = this.appliedTagIds;\n\t\t\tif (!hasChanged(current, tags)) {\n\t\t\t\tthis.isTagsEditEnabled = false;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.tagsSaving) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.tagsSaving = true;\n\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({ tags });\n\t\t\tthis.$telemetry.track('User edited workflow tags', {\n\t\t\t\tworkflow_id: this.currentWorkflowId,\n\t\t\t\tnew_tag_count: tags.length,\n\t\t\t});\n\n\t\t\tthis.tagsSaving = false;\n\t\t\tif (saved) {\n\t\t\t\tthis.isTagsEditEnabled = false;\n\t\t\t}\n\t\t},\n\t\tonTagsEditEsc() {\n\t\t\tthis.isTagsEditEnabled = false;\n\t\t},\n\t\tonNameToggle() {\n\t\t\tthis.isNameEditEnabled = !this.isNameEditEnabled;\n\t\t\tif (this.isNameEditEnabled) {\n\t\t\t\tif (this.isTagsEditEnabled) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvoid this.onTagsBlur();\n\t\t\t\t}\n\n\t\t\t\tthis.isTagsEditEnabled = false;\n\t\t\t}\n\t\t},\n\t\tasync onNameSubmit({\n\t\t\tname,\n\t\t\tonSubmit: cb,\n\t\t}: {\n\t\t\tname: string;\n\t\t\tonSubmit: (saved: boolean) => void;\n\t\t}) {\n\t\t\tconst newName = name.trim();\n\t\t\tif (!newName) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('workflowDetails.showMessage.title'),\n\t\t\t\t\tmessage: this.$locale.baseText('workflowDetails.showMessage.message'),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\n\t\t\t\tcb(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (newName === this.workflowName) {\n\t\t\t\tthis.isNameEditEnabled = false;\n\n\t\t\t\tcb(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({ name });\n\t\t\tif (saved) {\n\t\t\t\tthis.isNameEditEnabled = false;\n\t\t\t}\n\t\t\tcb(saved);\n\t\t},\n\t\tasync handleFileImport(): Promise<void> {\n\t\t\tconst inputRef = this.$refs.importFile as HTMLInputElement | undefined;\n\t\t\tif (inputRef?.files && inputRef.files.length !== 0) {\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.onload = () => {\n\t\t\t\t\tlet workflowData: IWorkflowDataUpdate;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tworkflowData = JSON.parse(reader.result as string);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('mainSidebar.showMessage.handleFileImport.title'),\n\t\t\t\t\t\t\tmessage: this.$locale.baseText('mainSidebar.showMessage.handleFileImport.message'),\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\treader.onload = undefined;\n\t\t\t\t\t\tinputRef.value = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tnodeViewEventBus.emit('importWorkflowData', { data: workflowData });\n\t\t\t\t};\n\t\t\t\treader.readAsText(inputRef.files[0]);\n\t\t\t}\n\t\t},\n\t\tasync onWorkflowMenuSelect(action: string): Promise<void> {\n\t\t\tswitch (action) {\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.DUPLICATE: {\n\t\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\t\tname: DUPLICATE_MODAL_KEY,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tid: this.workflowsStore.workflowId,\n\t\t\t\t\t\t\tname: this.workflowsStore.workflowName,\n\t\t\t\t\t\t\ttags: this.workflowsStore.workflowTags,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.DOWNLOAD: {\n\t\t\t\t\tconst workflowData = await this.workflowHelpers.getWorkflowDataToSave();\n\t\t\t\t\tconst { tags, ...data } = workflowData;\n\t\t\t\t\tconst exportData: IWorkflowToShare = {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t...(this.workflowsStore.workflow.meta || {}),\n\t\t\t\t\t\t\tinstanceId: this.rootStore.instanceId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttags: (tags || []).map((tagId) => {\n\t\t\t\t\t\t\tconst { usageCount, ...tag } = this.tagsStore.getTagById(tagId);\n\n\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t}),\n\t\t\t\t\t};\n\n\t\t\t\t\tconst blob = new Blob([JSON.stringify(exportData, null, 2)], {\n\t\t\t\t\t\ttype: 'application/json;charset=utf-8',\n\t\t\t\t\t});\n\n\t\t\t\t\tlet workflowName = this.workflowName || 'unsaved_workflow';\n\t\t\t\t\tworkflowName = workflowName.replace(/[^a-z0-9]/gi, '_');\n\n\t\t\t\t\tthis.$telemetry.track('User exported workflow', { workflow_id: workflowData.id });\n\t\t\t\t\tsaveAs(blob, workflowName + '.json');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL: {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst promptResponse = (await this.prompt(\n\t\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.prompt.workflowUrl') + ':',\n\t\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.prompt.importWorkflowFromUrl') + ':',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('mainSidebar.prompt.import'),\n\t\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('mainSidebar.prompt.cancel'),\n\t\t\t\t\t\t\t\tinputErrorMessage: this.$locale.baseText('mainSidebar.prompt.invalidUrl'),\n\t\t\t\t\t\t\t\tinputPattern: /^http[s]?:\\/\\/.*\\.json$/i,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)) as MessageBoxInputData;\n\n\t\t\t\t\t\tnodeViewEventBus.emit('importWorkflowUrl', { url: promptResponse.value });\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE: {\n\t\t\t\t\t(this.$refs.importFile as HTMLInputElement).click();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.PUSH: {\n\t\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.onSaveButtonClick();\n\n\t\t\t\t\t\tconst status = await this.sourceControlStore.getAggregatedStatus();\n\n\t\t\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\t\t\t\t\tdata: { eventBus: this.eventBus, status },\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\tswitch (error.message) {\n\t\t\t\t\t\t\tcase 'source_control_not_connected':\n\t\t\t\t\t\t\t\tthis.showError(\n\t\t\t\t\t\t\t\t\t{ ...error, message: '' },\n\t\t\t\t\t\t\t\t\tthis.$locale.baseText('settings.sourceControl.error.not.connected.title'),\n\t\t\t\t\t\t\t\t\tthis.$locale.baseText('settings.sourceControl.error.not.connected.message'),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('error'));\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.SETTINGS: {\n\t\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.DELETE: {\n\t\t\t\t\tconst deleteConfirmed = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.message', {\n\t\t\t\t\t\t\tinterpolate: { workflowName: this.workflowName },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.headline'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tif (deleteConfirmed !== MODAL_CONFIRM) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.workflowsStore.deleteWorkflow(this.currentWorkflowId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('generic.deleteWorkflowError'));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\t\t// Reset tab title since workflow is deleted.\n\t\t\t\t\tthis.titleReset();\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('mainSidebar.showMessage.handleSelect1.title'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\n\t\t\t\t\tawait this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tgoToUpgrade() {\n\t\t\tvoid this.uiStore.goToUpgrade('workflow_sharing', 'upgrade-workflow-sharing');\n\t\t},\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n$--text-line-height: 24px;\n$--header-spacing: 20px;\n\n.container {\n\tposition: relative;\n\ttop: -1px;\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.name-container {\n\tmargin-right: $--header-spacing;\n}\n\n.name {\n\tcolor: $custom-font-dark;\n\tfont-size: 15px;\n}\n\n.activator {\n\tcolor: $custom-font-dark;\n\tfont-weight: 400;\n\tfont-size: 13px;\n\tline-height: $--text-line-height;\n\tdisplay: flex;\n\talign-items: center;\n\n\t> span {\n\t\tmargin-right: 5px;\n\t}\n}\n\n.add-tag {\n\tfont-size: 12px;\n\tpadding: 20px 0; // to be more clickable\n\tcolor: $custom-font-very-light;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\n\t&:hover {\n\t\tcolor: $color-primary;\n\t}\n}\n\n.tags {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tflex: 1;\n\tmargin-right: $--header-spacing;\n}\n\n.tags-edit {\n\tmin-width: 100px;\n\twidth: 100%;\n\tmax-width: 460px;\n}\n\n.actions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-m);\n}\n</style>\n\n<style module lang=\"scss\">\n.group {\n\tdisplay: flex;\n\tgap: var(--spacing-xs);\n}\n.hiddenInput {\n\tdisplay: none;\n}\n\n.deleteItem {\n\tcolor: var(--color-danger);\n}\n\n.disabledShareButton {\n\tcursor: not-allowed;\n}\n\n.workflowHistoryButton {\n\twidth: 30px;\n\theight: 30px;\n\tcolor: var(--color-text-dark);\n\tborder-radius: var(--border-radius-base);\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-base);\n\t}\n\n\t:disabled {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\topacity: 0.5;\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tv-if=\"items\"\n\t\t:class=\"{\n\t\t\t[$style.container]: true,\n\t\t\t['tab-bar-container']: true,\n\t\t\t[$style.menuCollapsed]: mainSidebarCollapsed,\n\t\t}\"\n\t>\n\t\t<n8n-radio-buttons :model-value=\"activeTab\" :options=\"items\" @update:modelValue=\"onSelect\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport type { ITabBarItem } from '@/Interface';\nimport { MAIN_HEADER_TABS } from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport default defineComponent({\n\tname: 'TabBar',\n\tprops: {\n\t\titems: {\n\t\t\ttype: Array as PropType<ITabBarItem[]>,\n\t\t\trequired: true,\n\t\t},\n\t\tactiveTab: {\n\t\t\ttype: String,\n\t\t\tdefault: MAIN_HEADER_TABS.WORKFLOW,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tMAIN_HEADER_TABS,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore),\n\t\tmainSidebarCollapsed(): boolean {\n\t\t\treturn this.uiStore.sidebarMenuCollapsed;\n\t\t},\n\t},\n\tmethods: {\n\t\tonSelect(tab: string, event: MouseEvent): void {\n\t\t\tthis.$emit('select', tab, event);\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tposition: absolute;\n\ttop: 47px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tmin-height: 30px;\n\tdisplay: flex;\n\tpadding: var(--spacing-5xs);\n\tbackground-color: var(--color-foreground-base);\n\tborder-radius: var(--border-radius-base);\n\ttransition: all 150ms ease-in-out;\n}\n\n@media screen and (max-width: 430px) {\n\t.container {\n\t\tflex-direction: column;\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<div :class=\"{ 'main-header': true, expanded: !uiStore.sidebarMenuCollapsed }\">\n\t\t\t<div v-show=\"!hideMenuBar\" class=\"top-menu\">\n\t\t\t\t<WorkflowDetails :read-only=\"readOnly\" />\n\t\t\t\t<TabBar\n\t\t\t\t\tv-if=\"onWorkflowPage\"\n\t\t\t\t\t:items=\"tabBarItems\"\n\t\t\t\t\t:active-tab=\"activeHeaderTab\"\n\t\t\t\t\t@select=\"onTabSelected\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { Route, RouteLocationRaw } from 'vue-router';\nimport { mapStores } from 'pinia';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { pushConnection } from '@/mixins/pushConnection';\nimport WorkflowDetails from '@/components/MainHeader/WorkflowDetails.vue';\nimport TabBar from '@/components/MainHeader/TabBar.vue';\nimport {\n\tMAIN_HEADER_TABS,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n} from '@/constants';\nimport type { INodeUi, ITabBarItem } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport default defineComponent({\n\tname: 'MainHeader',\n\tcomponents: {\n\t\tWorkflowDetails,\n\t\tTabBar,\n\t},\n\tmixins: [pushConnection],\n\tsetup(props, ctx) {\n\t\treturn {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...pushConnection.setup?.(props, ctx),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveHeaderTab: MAIN_HEADER_TABS.WORKFLOW,\n\t\t\tworkflowToReturnTo: '',\n\t\t\tdirtyState: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useUIStore, useSourceControlStore),\n\t\ttabBarItems(): ITabBarItem[] {\n\t\t\treturn [\n\t\t\t\t{ value: MAIN_HEADER_TABS.WORKFLOW, label: this.$locale.baseText('generic.editor') },\n\t\t\t\t{ value: MAIN_HEADER_TABS.EXECUTIONS, label: this.$locale.baseText('generic.executions') },\n\t\t\t];\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\thideMenuBar(): boolean {\n\t\t\treturn Boolean(this.activeNode && this.activeNode.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn this.$route.params.name || this.workflowsStore.workflowId;\n\t\t},\n\t\tonWorkflowPage(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.$route.meta &&\n\t\t\t\t(this.$route.meta.nodeView || this.$route.meta.keepWorkflowAlive === true)\n\t\t\t);\n\t\t},\n\t\tactiveExecution(): ExecutionSummary {\n\t\t\treturn this.workflowsStore.activeWorkflowExecution as ExecutionSummary;\n\t\t},\n\t\treadOnly(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t},\n\twatch: {\n\t\t$route(to, from) {\n\t\t\tthis.syncTabsWithRoute(to);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\tthis.syncTabsWithRoute(this.$route);\n\t},\n\tmethods: {\n\t\tsyncTabsWithRoute(route: Route): void {\n\t\t\tif (\n\t\t\t\troute.name === VIEWS.EXECUTION_HOME ||\n\t\t\t\troute.name === VIEWS.WORKFLOW_EXECUTIONS ||\n\t\t\t\troute.name === VIEWS.EXECUTION_PREVIEW\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t} else if (\n\t\t\t\troute.name === VIEWS.WORKFLOW ||\n\t\t\t\troute.name === VIEWS.NEW_WORKFLOW ||\n\t\t\t\troute.name === VIEWS.EXECUTION_DEBUG\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t}\n\t\t\tconst workflowName = route.params.name;\n\t\t\tif (workflowName !== 'new') {\n\t\t\t\tthis.workflowToReturnTo = workflowName;\n\t\t\t}\n\t\t},\n\t\tonTabSelected(tab: MAIN_HEADER_TABS, event: MouseEvent) {\n\t\t\tconst openInNewTab = event.ctrlKey || event.metaKey;\n\n\t\t\tswitch (tab) {\n\t\t\t\tcase MAIN_HEADER_TABS.WORKFLOW:\n\t\t\t\t\tvoid this.navigateToWorkflowView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MAIN_HEADER_TABS.EXECUTIONS:\n\t\t\t\t\tvoid this.navigateToExecutionsView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToWorkflowView(openInNewTab: boolean) {\n\t\t\tlet routeToNavigateTo: RouteLocationRaw;\n\t\t\tif (!['', 'new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(this.workflowToReturnTo)) {\n\t\t\t\trouteToNavigateTo = {\n\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\tparams: { name: this.workflowToReturnTo },\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\trouteToNavigateTo = { name: VIEWS.NEW_WORKFLOW };\n\t\t\t}\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tif (this.$route.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = this.dirtyState;\n\t\t\t\t}\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToExecutionsView(openInNewTab: boolean) {\n\t\t\tconst routeWorkflowId =\n\t\t\t\tthis.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID ? 'new' : this.currentWorkflow;\n\t\t\tconst routeToNavigateTo: RouteLocationRaw = this.activeExecution\n\t\t\t\t? {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\t\tparams: { name: routeWorkflowId, executionId: this.activeExecution.id },\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\t\t\tparams: { name: routeWorkflowId },\n\t\t\t\t };\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\t\t\tthis.workflowToReturnTo = this.currentWorkflow;\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.main-header {\n\tbackground-color: var(--color-background-xlight);\n\theight: $header-height;\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.top-menu {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: 0.9em;\n\theight: $header-height;\n\tfont-weight: 400;\n\tpadding: 0 var(--spacing-m) 0 var(--spacing-xs);\n}\n</style>\n"],"names":["DEFAULT_WORKFLOW_NAME_LIMIT","WORKFLOW_NAME_END_COUNT_TO_KEEP","_sfc_main$c","defineComponent","shorten","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_sfc_main$b","createEventBus","options","observer","entries","target","isIntersecting","observed","_sfc_main$a","DEFAULT_MAX_TAGS_LIMIT","_sfc_main$9","IntersectionObserver","IntersectionObserved","debounce","mapStores","useTagsStore","tags","tagId","limit","toDisplay","tag","visibleCount","accu","val","hidden","hiddenTitle","countTag","parent","el","_component_IntersectionObserver","_resolveComponent","_createBlock","_normalizeStyle","_withCtx","_createElementVNode","_hoisted_1","_Fragment","_renderList","_normalizeClass","e","_component_el_tag","_component_IntersectionObserved","_createVNode","_sfc_main$8","value","_sfc_main$7","ExpandableInputBase","_a","_directive_on_click_outside","_resolveDirective","_component_ExpandableInputBase","_withDirectives","args","_sfc_main$6","_sfc_main$5","ExpandableInputEdit","ExpandableInputPreview","newValue","onSubmit","updated","_component_ExpandableInputPreview","_withModifiers","_component_ExpandableInputEdit","_sfc_main$4","callDebounced","useDebounce","BREAKPOINT_SM","BREAKPOINT_XL","BREAKPOINT_LG","BREAKPOINT_MD","bannerHeight","getBannerRowHeight","useUIStore","_renderSlot","collaborationStore","useCollaborationStore","usersStore","useUsersStore","workflowsStore","useWorkflowsStore","HEARTBEAT_INTERVAL","TIME","heartbeatTimer","ref","activeUsersSorted","computed","currentWorkflowUsers","userInfo","owner","user","currentUserEmail","startHeartbeat","stopHeartbeat","onDocumentVisibilityChange","onMounted","onBeforeUnmount","hasChanged","prev","curr","set","_sfc_main$2","TagsContainer","PushConnectionTracker","ShortenName","WorkflowActivator","SaveButton","TagsDropdown","InlineTextEdit","BreakpointsObserver","CollaborationPane","router","useRouter","useWorkflowHelpers","useTitleChange","useToast","useMessage","MAX_WORKFLOW_NAME_LENGTH","EnterpriseEditionFeature","useRootStore","useSettingsStore","useUsageStore","useSourceControlStore","useCanvasStore","PLACEHOLDER_EMPTY_WORKFLOW_ID","VIEWS","getWorkflowPermissions","actions","WORKFLOW_MENU_ACTIONS","hasPermission","currentId","WORKFLOW_SHARE_MODAL_KEY","current","saved","name","cb","newName","inputRef","reader","workflowData","nodeViewEventBus","action","DUPLICATE_MODAL_KEY","data","exportData","usageCount","blob","workflowName","saveAs","promptResponse","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","WORKFLOW_SETTINGS_MODAL_KEY","MODAL_CONFIRM","_hoisted_2","_hoisted_4","_component_PushConnectionTracker","_component_BreakpointsObserver","_component_ShortenName","shortenedName","_component_InlineTextEdit","_component_TagsDropdown","$event","_hoisted_3","_toDisplayString","_component_TagsContainer","_component_WorkflowActivator","_component_enterprise_edition","_component_n8n_tooltip","_component_i18n_t","_component_n8n_button","_component_CollaborationPane","_component_SaveButton","_component_router_link","_component_n8n_icon_button","_createCommentVNode","_component_n8n_action_dropdown","_sfc_main$1","MAIN_HEADER_TABS","tab","event","_component_n8n_radio_buttons","_sfc_main","WorkflowDetails","TabBar","pushConnection","props","ctx","_b","useNDVStore","STICKY_NODE_TYPE","to","from","route","openInNewTab","routeToNavigateTo","href","routeWorkflowId","_component_WorkflowDetails","_component_TabBar"],"mappings":"g0DAUA,MAAMA,GAA8B,GAC9BC,GAAkC,EAExCC,GAAeC,EAAgB,CAC9B,KAAM,cACN,MAAO,CAAC,OAAQ,QAAS,QAAQ,EACjC,SAAU,CACT,eAAwB,CAChB,OAAAC,GACN,KAAK,KACL,KAAK,OAASJ,GACdC,EAAA,CAEF,CACD,CACD,CAAC,uCAxBYI,GAAMC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,CAAG,OAAAC,EAAA,EAAoBC,EAAA,OAAA,CAAA,MAAAP,EAAA,KACxC,eAA6CA,EAAA,MAAA,EAAA,6FCU/CQ,GAAeX,EAAgB,CAC9B,KAAM,uBACN,MAAO,CACN,UAAW,CACV,KAAM,OACN,QAAS,CACV,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,OACN,QAAS,IAAMY,EAAe,CAC/B,CACD,EACA,MAAO,CACC,MAAA,CACN,SAAU,IAAA,CAEZ,EACA,SAAU,CACL,GAAA,CAAC,KAAK,QACT,OAGD,MAAMC,EAAU,CACf,KAAM,KAAK,MAAM,KACjB,WAAY,MACZ,UAAW,KAAK,SAAA,EAGXC,EAAW,IAAI,qBAAsBC,GAAY,CACtDA,EAAQ,QAAQ,CAAC,CAAE,OAAAC,EAAQ,eAAAC,KAAqB,CAC/C,KAAK,MAAM,WAAY,CACtB,GAAID,EACJ,eAAAC,CAAA,CACA,CAAA,CACD,GACCJ,CAAO,EAEV,KAAK,SAAWC,EAEhB,KAAK,SAAS,GAAG,UAAYI,GAAsB,CAC9CA,GACHJ,EAAS,QAAQI,CAAQ,CAC1B,CACA,EAED,KAAK,SAAS,GAAG,YAAcA,GAAsB,CACpDJ,EAAS,UAAUI,CAAQ,CAAA,CAC3B,CACF,EACA,eAAgB,CACX,KAAK,SACR,KAAK,SAAS,YAEhB,CACD,CAAC,2BApEChB,GAAaC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,mFCUfW,GAAenB,EAAgB,CAC9B,KAAM,uBACN,MAAO,CACN,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,OACN,QAAS,IAAMY,EAAe,CAC/B,CACD,EACA,MAAM,SAAU,CACV,KAAK,UAIV,MAAM,KAAK,YACX,KAAK,SAAS,KAAK,UAAW,KAAK,MAAM,QAAQ,EAClD,EACA,eAAgB,CACX,KAAK,SACR,KAAK,SAAS,KAAK,YAAa,KAAK,MAAM,QAAQ,CAErD,CACD,CAAC,+BAnCCV,GAAaC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,oFC2DTY,GAAyB,GAQ/BC,GAAerB,EAAgB,CAC9B,KAAM,gBACN,WAAY,CAAA,qBAAEsB,GAAsB,qBAAAC,EAAqB,EACzD,MAAO,CAAC,SAAU,QAAS,YAAa,aAAc,WAAW,EACjE,MAAO,CACC,MAAA,CACN,SAAU,IACV,qBAAsBX,EAAe,EACrC,WAAY,CAAC,EACb,qBAAsB,IAAM,CAAC,CAAA,CAE/B,EACA,SAAU,CACT,KAAK,qBAAuBY,GAAS,KAAK,YAAa,GAAG,CAC3D,EACA,SAAU,CACT,KAAK,YAAY,EACV,OAAA,iBAAiB,SAAU,KAAK,oBAAoB,CAC5D,EACA,eAAgB,CACR,OAAA,oBAAoB,SAAU,KAAK,oBAAoB,CAC/D,EACA,SAAU,CACT,GAAGC,EAAUC,CAAY,EACzB,OAAQ,CACA,MAAA,CACN,YAAa,GAAG,KAAK,QAAQ,IAAA,CAE/B,EACA,MAAO,CACN,MAAMC,EAAO,KAAK,OAChB,IAAKC,GAAkB,KAAK,UAAU,WAAWA,CAAK,CAAC,EACvD,OAAO,OAAO,EAEVC,EAAQ,KAAK,OAAST,GAE5B,IAAIU,EAAqBD,EAAQF,EAAK,MAAM,EAAGE,CAAK,EAAIF,EAC5CG,EAAAA,EAAU,IAAKC,IAAe,CACzC,GAAGA,EACH,OAAQ,KAAK,YAAc,CAAC,KAAK,WAAWA,EAAI,EAAE,CACjD,EAAA,EAEF,IAAIC,EAAeF,EAAU,OAQzB,GAPA,KAAK,aACRE,EAAe,OAAO,OAAO,KAAK,UAAU,EAAE,OAC7C,CAACC,EAAMC,IAASA,EAAMD,EAAO,EAAIA,EACjC,CAAA,GAIED,EAAeL,EAAK,OAAQ,CACzB,MAAAQ,EAASR,EAAK,MAAMK,CAAY,EAChCI,EAAcD,EAAO,OAAO,CAACF,EAAcF,IACzCE,EAAO,GAAGA,CAAI,KAAKF,EAAI,IAAI,GAAKA,EAAI,KACzC,EAAE,EAECM,EAAkB,CACvB,GAAI,QACJ,KAAM,IAAIF,EAAO,MAAM,GACvB,MAAOC,EACP,QAAS,EAAA,EAEAN,EAAA,OAAOE,EAAc,EAAGK,CAAQ,CAC3C,CAEO,OAAAP,CACR,CACD,EACA,QAAS,CACR,aAAc,CAEb,MAAMQ,EADY,KAAK,MAAM,cAAc,IAClB,WAErBA,IACH,KAAK,SAAW,EACX,KAAK,UAAU,IAAM,CACzB,KAAK,SAAWA,EAAO,WAAA,CACvB,EAEH,EACA,WAAW,CAAE,GAAAC,EAAI,eAAAtB,GAAgE,CAC5EsB,EAAG,QAAQ,KACT,KAAA,WAAa,CAAE,GAAG,KAAK,WAAY,CAACA,EAAG,QAAQ,EAAE,EAAGtB,GAE3D,EACA,QAAQ,EAAec,EAAY,CAC9B,KAAK,WACR,EAAE,gBAAgB,EAIdA,EAAI,QACH,KAAA,MAAM,QAASA,EAAI,EAAE,CAE5B,CACD,CACD,CAAC,4GAvHuBS,EAAAC,EAAA,sBAAA,SA3CrBhC,EAAc,EAAAiC,EAAAF,EAAA,CACf,IAAK,gBACJ,UAAK,EACL,MAAO,iBACP,MAAWG,GAAAxC,EAAA,KAAA,EACX,QAAUA,EAAA,WAAA,YAAAA,EAAA,+CAGV,QAAAyC,EAAA,IAAA,CAAAC,EAAA,OAAAC,GAAA,EAAArC,EAEU,EAAG,EAAAC,EAAAqC,GAAA,KAAAC,GAAA7C,EAAA,KAAA4B,IACNtB,EAAA,EAAAC,EAAmB,OAAO,CAC/B,IAAKqB,EAAA,GAAA,MAAAkB,EAAA,CAAA,UAAA,CAAAlB,EAAA,MAAA,CAAA,UAGYmB,GAAA/C,EAAA,QAAA+C,EAAAnB,CAAA,CAAA,EAAA,CACNA,EAAA,SAAAtB,IAACiC,EAAKS,EAAA,CACjB,IAAI,EACJ,MAAKpB,EAAA,MACL,KAAK,OACJ,KAAA,QAAA,MAAA,kBAEa,sBAAA,EAAA,EAAA,0DAIc,EAAAW,EAAAU,EAAA,CAC3B,IAAA,EACA,MAAOH,EAAE,CAAU,OAAAlB,EAAA,MAAA,CAAA,EACnB,UAASA,EAAE,GAAA,QAAA5B,EAAA,WAEZ,YAAAA,EAAA,oBAAA,EAAA,CACO,QAAAyC,EAAM,IAAI,CAAAS,EACXF,EAAM,CACX,MAAKpB,EAAA,KACJ,KAAK,OACL,KAAA,QAAA,MAAAkB,EAAA,CAAA,UAAA9C,EAAA,SAAA,CAAA,EAEa,sBAAA,EAAA,EAAA,8PC/BpBmD,GAAetD,EAAgB,CAC9B,KAAM,sBACN,MAAO,CAAC,aAAc,cAAe,YAAY,EACjD,SAAU,CACT,aAAc,CACb,IAAIuD,EAAS,KAAK,WAAsB,QAAQ,MAAO,GAAG,EAC1D,OAAKA,IAEJA,EAAQ,KAAK,aAGP,GAAGA,CAAK,EAChB,CACD,CACD,CAAC,6BAtBWrD,GAAqCC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,CAAe,OAAAC,EAAA,EAAuBC,EAAA,MAAA,CAAA,MAAAuC,EAAA,CAAA,WAAA,GAAA,cAAA9C,EAAA,WAAA,EACrF,aAAaA,EAAA,WAAA,EAAA,0GCoBfqD,GAAexD,EAAgB,CAC9B,KAAM,sBACN,WAAY,CAAE,oBAAAyD,CAAoB,EAClC,MAAO,CACN,WAAY,CAAC,EACb,YAAa,CAAC,EACd,UAAW,CAAC,EACZ,UAAW,CAAC,EACZ,SAAU,CACT,KAAM,MACP,CACD,EACA,SAAU,OAEL,KAAK,WAAa,KAAK,MAAM,OAChC,KAAK,MAAM,GAEZC,EAAA,KAAK,WAAL,MAAAA,EAAe,GAAG,QAAS,KAAK,MACjC,EACA,eAAgB,QACfA,EAAA,KAAK,WAAL,MAAAA,EAAe,IAAI,QAAS,KAAK,MAClC,EACA,QAAS,CACR,OAAQ,CACH,KAAK,MAAM,OACb,KAAK,MAAM,MAA2B,OAEzC,EACA,SAAU,CACT,KAAK,MAAM,oBAAsB,KAAK,MAAM,MAA2B,KAAK,CAC7E,EACA,SAAU,CACT,KAAK,MAAM,QAAU,KAAK,MAAM,MAA2B,KAAK,CACjE,EACA,eAAe,EAAU,CACpB,EAAE,OAAS,SACd,KAAK,MAAM,OAAS,KAAK,MAAM,MAA2B,KAAK,CAEjE,EACA,UAAW,CACV,KAAK,MAAM,KAAK,CACjB,CACD,CACD,CAAC,mGApDsBC,EAAAC,GAAA,kBAAA,EAb0B,OAAAnD,EAAA,EAAwBiC,EAAAmB,EAAA,CAAA,cAAA1D,EAAA,WACvE,YAAAA,EAAA,WAAA,EAAA,SACKyC,EAAO,IAAA,CAAAkB,EAELjB,EAAiB,QAAA,CACtB,IAAK,QACL,MAAA,kBACA,MAAW1C,EAAA,WACZ,YAAQA,EAAA,YACP,UAAKA,EAAA,UACL,KAAA,IAAe,QAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,IAAA2D,IAAA5D,EAAA,SAAAA,EAAA,QAAA,GAAA4D,CAAA,GAAA,UAAA,wOCInBC,GAAehE,EAAgB,CAC9B,KAAM,yBACN,WAAY,CAAE,oBAAAyD,CAAoB,EAClC,MAAO,CAAC,YAAY,CACrB,CAAC,wCAXsB,MAAAI,EAAApB,EAAA,qBAAA,EAP0B,OAAAhC,EAAA,EAAiBiC,EAAAmB,EAAA,CAAA,cAAA1D,EAAA,8BAEzD,QAAAyC,EAAA,IAAA,CAAAC,EACE,QAAU,CACjB,MAAcI,EAAA,CAAA,kBAAA,GAAA,UAAA,GAAA,EACf,MAAK9C,EAAG,WAAA,SAAA,iHCsBX8D,GAAejE,EAAgB,CAC9B,KAAM,iBACN,WAAY,CAAE,oBAAAkE,GAAqB,uBAAAC,EAAuB,EAC1D,MAAO,CACN,cAAe,CACd,KAAM,QACN,QAAS,EACV,EACA,WAAY,CACX,KAAM,OACN,QAAS,EACV,EACA,YAAa,CACZ,KAAM,OACN,QAAS,EACV,EACA,UAAW,CACV,KAAM,OACN,QAAS,CACV,EACA,aAAc,CACb,KAAM,OACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,MAAA,CACN,WAAY,KAAK,SACjB,SAAU,GACV,WAAY,GACZ,SAAUvD,EAAe,CAAA,CAE3B,EACA,MAAO,CACN,SAAS2C,EAAO,CACf,KAAK,WAAaA,CACnB,CACD,EACA,QAAS,CACR,QAAQa,EAAkB,CACrB,KAAK,WAIT,KAAK,SAAWA,EACjB,EACA,SAAU,CACL,KAAK,WAIT,KAAK,SAAW,KAAK,WACrB,KAAK,MAAM,QAAQ,EACpB,EACA,QAAS,CACJ,KAAK,WAIJ,KAAK,YACT,KAAK,OAAO,EAEb,KAAK,WAAa,GACnB,EACA,QAAS,CACR,GAAI,KAAK,SACR,OAGK,MAAAC,EAAYC,GAAqB,CACtC,KAAK,WAAa,GAEbA,GACC,KAAA,SAAS,KAAK,OAAO,CAC3B,EAGD,KAAK,WAAa,GAClB,KAAK,MAAM,SAAU,CAAE,KAAM,KAAK,SAAU,SAAAD,EAAU,CACvD,EACA,UAAW,CACN,KAAK,WAIT,KAAK,WAAa,GAClB,KAAK,MAAM,QAAQ,EACpB,CACD,CACD,CAAC,uEAtGOE,EAAA9B,EAAA,wBAAA,SAlBoBhC,EAAO,EAAAC,EAAA,OAAA,CAAA,MAAA,cACrB,UAAAN,EAAA,CAAa,IAAKA,EAAU,CAAA,EAAAoE,GAAA,IAAA,CAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,GACvC,eAUE,CAAArE,EAAA,YAAAM,IATWC,EAAa,OAAAoC,GAAA,CAAAO,EACxBoB,EAAqB,CACrB,YAAWtE,EAAA,YACX,cAAeA,EAAA,SACf,UAASA,EAAE,UACX,UAAA,GACA,YAAKA,EAAA,SACL,sBAAYA,EAAA,QACZ,MAAKA,EAAE,SAAA,OAAAA,EAAA,iCAIV,cAEO,cAAA,YAAA,YAAA,sBAAA,QAAA,SAAA,SAAA,CAAA,CAAA,CAAA,IAAAM,EAAA,EAFqBC,EAAA,OAAA,CAAE,IAAA,EAAA,MAAA,UAC7B,QAAoEN,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,IAAA2D,IAAA5D,EAAA,SAAAA,EAAA,QAAA,GAAA4D,CAAA,EAAA,EAAA,iJCMvEW,GAAe1E,EAAgB,CAC9B,KAAM,sBACN,MAAO,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,cAAc,EAC7E,OAAQ,CACD,KAAA,CAAE,cAAA2E,GAAkBC,KAC1B,MAAO,CAAE,cAAAD,CAAc,CACxB,EACA,MAAO,CACC,MAAA,CACN,MAAO,OAAO,UAAA,CAEhB,EACA,SAAU,CACT,IAAa,CACR,OAAA,KAAK,MAAQE,EACT,KAGJ,KAAK,OAASC,EACV,KAGJ,KAAK,OAASC,EACV,KAGJ,KAAK,OAASC,EACV,KAGD,IACR,EAEA,OAA4B,CAC3B,OAAI,KAAK,UAAY,QAAa,KAAK,MAAQH,EACvC,KAAK,QAGT,KAAK,UAAY,QAAa,KAAK,OAASC,EACxC,KAAK,QAGT,KAAK,UAAY,QAAa,KAAK,OAASC,EACxC,KAAK,QAGT,KAAK,UAAY,QAAa,KAAK,OAASC,EACxC,KAAK,QAGT,KAAK,UAAY,OACb,KAAK,QAGN,KAAK,YACb,CACD,EACA,SAAU,CACF,OAAA,iBAAiB,SAAU,KAAK,QAAQ,CAChD,EACA,eAAgB,CACR,OAAA,oBAAoB,SAAU,KAAK,QAAQ,CACnD,EACA,QAAS,CACR,UAAW,CACL,KAAK,cAAc,KAAK,YAAa,CAAE,aAAc,GAAI,CAC/D,EACA,MAAM,aAAc,CACnB,KAAK,MAAQ,OAAO,WACpB,MAAM,KAAK,YAEL,MAAAC,EAAe,MAAMC,KAChBC,EAAA,EAAE,oBAAoBF,CAAY,CAC9C,CACD,CACD,CAAC,WAhGC/E,GAAgCC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,QAArBC,EAAE,EAAAC,EAAA,OAAA,KAAA,CAAA0E,EAAUjF,EAAK,OAAA,UAAA,CAAA,GAAAA,EAAA,8FCK9B,MAAMkF,EAAqBC,KACrBC,EAAaC,IACbC,EAAiBC,IAEjBC,EAAqB,EAAIC,GAAK,OAC9BC,EAAiBC,GAAmB,IAAI,EAExCC,EAAoBC,EAAS,IAAM,CACxC,MAAMC,GAAwBZ,EAAmB,4BAA8B,CAAI,GAAA,IACjFa,GAAaA,EAAS,IAAA,EAElBC,EAAQF,EAAqB,KAAMG,GAASA,EAAK,OAAS,cAAc,EACvE,MAAA,CACN,aAAcD,EACX,CAACA,EAAO,GAAGF,EAAqB,OAAQG,GAASA,EAAK,KAAOD,EAAM,EAAE,CAAC,EACtEF,CAAA,CACJ,CACA,EAEKI,EAAmBL,EAAS,IAAM,OACvC,OAAOtC,EAAA6B,EAAW,cAAX,YAAA7B,EAAwB,KAAA,CAC/B,EAEK4C,EAAiB,IAAM,CACxBT,EAAe,QAAU,OAC5B,cAAcA,EAAe,KAAK,EAClCA,EAAe,MAAQ,MAETA,EAAA,MAAQ,OAAO,YAAY,IAAM,CAC5BR,EAAA,qBAAqBI,EAAe,SAAS,EAAE,GAChEE,CAAkB,CAAA,EAGhBY,EAAgB,IAAM,CACvBV,EAAe,QAAU,MAC5B,cAAcA,EAAe,KAAK,CACnC,EAGKW,EAA6B,IAAM,CACpC,SAAS,kBAAoB,SAClBD,IAECD,GAChB,EAGD,OAAAG,GAAU,IAAM,CACAH,IACN,SAAA,iBAAiB,mBAAoBE,CAA0B,CAAA,CACxE,EAEDE,GAAgB,IAAM,CACZ,SAAA,oBAAoB,mBAAoBF,CAA0B,EAC7DD,GAAA,CACd,sVC+HKI,GAAa,CAACC,EAAgBC,IAAmB,CAClD,GAAAD,EAAK,SAAWC,EAAK,OACjB,MAAA,GAGF,MAAAC,EAAM,IAAI,IAAIF,CAAI,EACjB,OAAAC,EAAK,OAAO,CAAC5E,EAAMC,IAAQD,GAAQ,CAAC6E,EAAI,IAAI5E,CAAG,EAAG,EAAK,CAC/D,EAEA6E,GAAe/G,EAAgB,CAC9B,KAAM,kBACN,WAAY,CACX,cAAAgH,GACA,sBAAAC,GACA,YAAAC,GACA,kBAAAC,GACA,WAAAC,GACA,aAAAC,GACA,eAAAC,GACA,oBAAAC,GACA,kBAAAC,EACD,EACA,MAAO,CACN,SAAU,CACT,KAAM,QACN,QAAS,EACV,CACD,EACA,OAAQ,CACP,MAAMC,EAASC,KAGR,MAAA,CACN,gBAHuBC,GAAmB,CAAE,OAAAF,CAAQ,CAAA,EAIpD,GAAGG,GAAe,EAClB,GAAGC,GAAS,EACZ,GAAGC,GAAW,CAAA,CAEhB,EACA,MAAO,CACC,MAAA,CACN,kBAAmB,GACnB,kBAAmB,GACnB,cAAe,CAAC,EAChB,YAAalH,EAAe,EAC5B,yBAAAmH,GACA,WAAY,GACZ,SAAUnH,EAAe,EACzB,yBAAAoH,CAAA,CAEF,EACA,SAAU,CACT,GAAGvG,EACFC,EACAuG,GACAC,GACA/C,EACAgD,GACAzC,EACAF,EACA4C,EACAC,EACD,EACA,aAA4B,CAC3B,OAAO,KAAK,WAAW,WACxB,EACA,6BAA8B,CAC7B,OAAO,KAAK,QAAQ,2BACrB,EACA,kBAA4B,CAC3B,OAAO,KAAK,eAAe,gBAC5B,EACA,cAAuB,CACtB,OAAO,KAAK,eAAe,YAC5B,EACA,SAAmB,CAClB,OAAO,KAAK,QAAQ,YACrB,EACA,aAAuB,CACf,OAAA,KAAK,mBAAmB,YAAY,cAC5C,EACA,uBAAkC,CACjC,OAAO,KAAK,eAAe,YAC5B,EACA,eAAyB,CACxB,MACC,CAAC,KAAK,mBACN,KAAK,oBAAsBC,GAC3B,KAAK,oBAAsB,KAE7B,EACA,kBAA4B,CACpB,OAAA,KAAK,QAAQ,eAAe,gBAAgB,CACpD,EACA,UAAwB,CACvB,OAAO,KAAK,eAAe,QAC5B,EACA,mBAA4B,CAC3B,OAAO,KAAK,eAAe,UAC5B,EACA,gBAA0B,CAExB,OAAA,KAAK,OAAO,OACX,KAAK,OAAO,KAAK,UAAY,KAAK,OAAO,KAAK,oBAAsB,GAEvE,EACA,iBAA2B,CACnB,MAAA,CACNC,EAAM,eAAe,SAAS,EAC9BA,EAAM,oBAAoB,SAAS,EACnCA,EAAM,iBACL,EAAA,SAAS,KAAK,OAAO,MAAQ,EAAE,CAClC,EACA,qBAAoC,CACnC,OAAOC,GAAuB,KAAK,YAAa,KAAK,QAAQ,CAC9D,EACA,mBAA+B,CAC9B,MAAMC,EAAU,CACf,CACC,GAAIC,EAAsB,SAC1B,MAAO,KAAK,QAAQ,SAAS,sBAAsB,EACnD,SAAU,CAAC,KAAK,cACjB,CAAA,EAGG,OAAC,KAAK,WACTD,EAAQ,QAAQ,CACf,GAAIC,EAAsB,UAC1B,MAAO,KAAK,QAAQ,SAAS,uBAAuB,EACpD,SAAU,CAAC,KAAK,gBAAkB,CAAC,KAAK,iBAAA,CACxC,EAEOD,EAAA,KACP,CACC,GAAIC,EAAsB,gBAC1B,MAAO,KAAK,QAAQ,SAAS,2BAA2B,EACxD,SAAU,CAAC,KAAK,gBAAkB,KAAK,eACxC,EACA,CACC,GAAIA,EAAsB,iBAC1B,MAAO,KAAK,QAAQ,SAAS,4BAA4B,EACzD,SAAU,CAAC,KAAK,gBAAkB,KAAK,eACxC,CAAA,GAIEC,GAAc,CAAC,MAAM,EAAG,CAAE,KAAM,CAAE,MAAO,oBAAuB,CAAA,CAAC,GACpEF,EAAQ,KAAK,CACZ,GAAIC,EAAsB,KAC1B,MAAO,KAAK,QAAQ,SAAS,kBAAkB,EAC/C,SACC,CAAC,KAAK,mBAAmB,kCACzB,CAAC,KAAK,gBACN,KAAK,iBACL,KAAK,WAAA,CACN,EAGFD,EAAQ,KAAK,CACZ,GAAIC,EAAsB,SAC1B,MAAO,KAAK,QAAQ,SAAS,kBAAkB,EAC/C,SAAU,CAAC,KAAK,gBAAkB,KAAK,aAAA,CACvC,EAEG,KAAK,oBAAoB,QAAU,CAAC,KAAK,UAC5CD,EAAQ,KAAK,CACZ,GAAIC,EAAsB,OAC1B,MAAO,KAAK,QAAQ,SAAS,oBAAoB,EACjD,SAAU,CAAC,KAAK,gBAAkB,KAAK,cACvC,YAAa,KAAK,OAAO,WACzB,QAAS,EAAA,CACT,EAGKD,CACR,EACA,iCAA2C,CAC1C,OAAO,KAAK,cAAc,2BACzBT,EAAyB,eAAA,CAE3B,EACA,sBAAyE,CACjE,MAAA,CACN,KAAMO,EAAM,iBACZ,OAAQ,CACP,WAAY,KAAK,iBAClB,CAAA,CAEF,EACA,iCAA2C,CAC1C,OAAO,KAAK,eAAe,aAC5B,CACD,EACA,MAAO,CACN,mBAAoB,CACnB,KAAK,kBAAoB,GACzB,KAAK,kBAAoB,EAC1B,CACD,EACA,QAAS,CACR,MAAM,mBAAoB,CACzB,IAAIK,EACA,KAAK,oBAAsBN,EAC9BM,EAAY,KAAK,kBACP,KAAK,OAAO,OAAO,MAAQ,KAAK,OAAO,OAAO,OAAS,QACrDA,EAAA,KAAK,OAAO,OAAO,MAElB,MAAM,KAAK,gBAAgB,oBAAoB,CAC5D,GAAIA,EACJ,KAAM,KAAK,aACX,KAAM,KAAK,qBAAA,CACX,IAGM,MAAA,KAAK,cAAc,mBAErB,KAAK,OAAO,OAASL,EAAM,iBACxB,MAAA,KAAK,QAAQ,QAAQ,CAC1B,KAAMA,EAAM,SACZ,OAAQ,CAAE,KAAM,KAAK,iBAAkB,CAAA,CACvC,EAGJ,EACA,oBAAqB,OACpB,KAAK,QAAQ,kBAAkB,CAC9B,KAAMM,GACN,KAAM,CAAE,GAAI,KAAK,iBAAkB,CAAA,CACnC,EAEI,KAAA,WAAW,MAAM,4BAA6B,CAClD,YAAa,KAAK,kBAClB,gBAAgBnF,EAAA,KAAK,cAAL,YAAAA,EAAkB,GAClC,SAAU,KAAK,OAAO,OAAS6E,EAAM,UAAY,oBAAsB,iBAAA,CACvE,CACF,EACA,kBAAmB,CAClB,KAAK,cAAgB,KAAK,sBAC1B,KAAK,kBAAoB,GAEzB,WAAW,IAAM,CAEhB,KAAK,kBAAoB,GACpB,KAAA,YAAY,KAAK,OAAO,GAC3B,CAAC,CACL,EAEA,MAAM,YAAa,CAClB,MAAMO,EAAU,KAAK,sBACfnH,EAAO,KAAK,cAClB,GAAI,CAACgF,GAAWmC,EAASnH,CAAI,EAAG,CAC/B,KAAK,kBAAoB,GAEzB,MACD,CACA,GAAI,KAAK,WACR,OAED,KAAK,WAAa,GAElB,MAAMoH,EAAQ,MAAM,KAAK,gBAAgB,oBAAoB,CAAE,KAAApH,EAAM,EAChE,KAAA,WAAW,MAAM,4BAA6B,CAClD,YAAa,KAAK,kBAClB,cAAeA,EAAK,MAAA,CACpB,EAED,KAAK,WAAa,GACdoH,IACH,KAAK,kBAAoB,GAE3B,EACA,eAAgB,CACf,KAAK,kBAAoB,EAC1B,EACA,cAAe,CACT,KAAA,kBAAoB,CAAC,KAAK,kBAC3B,KAAK,oBACJ,KAAK,mBAEH,KAAK,aAGX,KAAK,kBAAoB,GAE3B,EACA,MAAM,aAAa,CAClB,KAAAC,EACA,SAAUC,CAAA,EAIR,CACI,MAAAC,EAAUF,EAAK,OACrB,GAAI,CAACE,EAAS,CACb,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,mCAAmC,EAChE,QAAS,KAAK,QAAQ,SAAS,qCAAqC,EACpE,KAAM,OAAA,CACN,EAEDD,EAAG,EAAK,EACR,MACD,CAEI,GAAAC,IAAY,KAAK,aAAc,CAClC,KAAK,kBAAoB,GAEzBD,EAAG,EAAI,EACP,MACD,CAEA,MAAMF,EAAQ,MAAM,KAAK,gBAAgB,oBAAoB,CAAE,KAAAC,EAAM,EACjED,IACH,KAAK,kBAAoB,IAE1BE,EAAGF,CAAK,CACT,EACA,MAAM,kBAAkC,CACjC,MAAAI,EAAW,KAAK,MAAM,WAC5B,GAAIA,GAAA,MAAAA,EAAU,OAASA,EAAS,MAAM,SAAW,EAAG,CAC7C,MAAAC,EAAS,IAAI,WACnBA,EAAO,OAAS,IAAM,CACjB,IAAAC,EACA,GAAA,CACYA,EAAA,KAAK,MAAMD,EAAO,MAAgB,OAClC,CACf,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,gDAAgD,EAC7E,QAAS,KAAK,QAAQ,SAAS,kDAAkD,EACjF,KAAM,OAAA,CACN,EACD,MAAA,QACC,CACDA,EAAO,OAAS,OAChBD,EAAS,MAAQ,IAClB,CAEAG,EAAiB,KAAK,qBAAsB,CAAE,KAAMD,CAAc,CAAA,CAAA,EAEnED,EAAO,WAAWD,EAAS,MAAM,CAAC,CAAC,CACpC,CACD,EACA,MAAM,qBAAqBI,EAA+B,CACzD,OAAQA,EAAQ,CACf,KAAKb,EAAsB,UAAW,CACrC,KAAK,QAAQ,kBAAkB,CAC9B,KAAMc,GACN,KAAM,CACL,GAAI,KAAK,eAAe,WACxB,KAAM,KAAK,eAAe,aAC1B,KAAM,KAAK,eAAe,YAC3B,CAAA,CACA,EACD,KACD,CACA,KAAKd,EAAsB,SAAU,CACpC,MAAMW,EAAe,MAAM,KAAK,gBAAgB,sBAAsB,EAChE,CAAE,KAAA1H,EAAM,GAAG8H,CAAA,EAASJ,EACpBK,EAA+B,CACpC,GAAGD,EACH,KAAM,CACL,GAAI,KAAK,eAAe,SAAS,MAAQ,CAAC,EAC1C,WAAY,KAAK,UAAU,UAC5B,EACA,MAAO9H,GAAQ,CAAI,GAAA,IAAKC,GAAU,CAC3B,KAAA,CAAE,WAAA+H,EAAY,GAAG5H,GAAQ,KAAK,UAAU,WAAWH,CAAK,EAEvD,OAAAG,CAAA,CACP,CAAA,EAGI6H,EAAO,IAAI,KAAK,CAAC,KAAK,UAAUF,EAAY,KAAM,CAAC,CAAC,EAAG,CAC5D,KAAM,gCAAA,CACN,EAEG,IAAAG,EAAe,KAAK,cAAgB,mBACzBA,EAAAA,EAAa,QAAQ,cAAe,GAAG,EAEtD,KAAK,WAAW,MAAM,yBAA0B,CAAE,YAAaR,EAAa,GAAI,EACzES,GAAAA,OAAAF,EAAMC,EAAe,OAAO,EACnC,KACD,CACA,KAAKnB,EAAsB,gBAAiB,CACvC,GAAA,CACG,MAAAqB,EAAkB,MAAM,KAAK,OAClC,KAAK,QAAQ,SAAS,gCAAgC,EAAI,IAC1D,KAAK,QAAQ,SAAS,0CAA0C,EAAI,IACpE,CACC,kBAAmB,KAAK,QAAQ,SAAS,2BAA2B,EACpE,iBAAkB,KAAK,QAAQ,SAAS,2BAA2B,EACnE,kBAAmB,KAAK,QAAQ,SAAS,+BAA+B,EACxE,aAAc,0BACf,CAAA,EAGDT,EAAiB,KAAK,oBAAqB,CAAE,IAAKS,EAAe,MAAO,OAC7D,CAAC,CACb,KACD,CACA,KAAKrB,EAAsB,iBAAkB,CAC3C,KAAK,MAAM,WAAgC,QAC5C,KACD,CACA,KAAKA,EAAsB,KAAM,CAChC,KAAK,YAAY,eACb,GAAA,CACH,MAAM,KAAK,oBAEX,MAAMsB,EAAS,MAAM,KAAK,mBAAmB,oBAAoB,EAEjE,KAAK,QAAQ,kBAAkB,CAC9B,KAAMC,GACN,KAAM,CAAE,SAAU,KAAK,SAAU,OAAAD,CAAO,CAAA,CACxC,QACOE,EAAO,CAEf,OAAQA,EAAM,QAAS,CACtB,IAAK,+BACC,KAAA,UACJ,CAAE,GAAGA,EAAO,QAAS,EAAG,EACxB,KAAK,QAAQ,SAAS,kDAAkD,EACxE,KAAK,QAAQ,SAAS,oDAAoD,CAAA,EAE3E,MACD,QACC,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,OAAO,CAAC,CACtD,CAAA,QACC,CACD,KAAK,YAAY,aAClB,CAEA,KACD,CACA,KAAKxB,EAAsB,SAAU,CAC/B,KAAA,QAAQ,UAAUyB,EAA2B,EAClD,KACD,CACA,KAAKzB,EAAsB,OAAQ,CAiBlC,GAhBwB,MAAM,KAAK,QAClC,KAAK,QAAQ,SAAS,oDAAqD,CAC1E,YAAa,CAAE,aAAc,KAAK,YAAa,CAAA,CAC/C,EACD,KAAK,QAAQ,SAAS,oDAAoD,EAC1E,CACC,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,6DACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,4DACD,CACD,CAAA,IAGuB0B,GACvB,OAGG,GAAA,CACH,MAAM,KAAK,eAAe,eAAe,KAAK,iBAAiB,QACvDF,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,6BAA6B,CAAC,EAC1E,MACD,CACA,KAAK,QAAQ,aAAe,GAE5B,KAAK,WAAW,EAChB,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,KAAM,SAAA,CACN,EAED,MAAM,KAAK,QAAQ,KAAK,CAAE,KAAM3B,EAAM,aAAc,EACpD,KACD,CAGD,CACD,EACA,aAAc,CACR,KAAK,QAAQ,YAAY,mBAAoB,0BAA0B,CAC7E,CACD,CACD,CAAC,8OA/pByBzF,GAAM,CAAA,IAAA,qBA0BYuH,GAAY,CAAC,IAAA,EAAA,MAAA,4DA4B1CC,GAAY,CAAA,IAAA,sXAtDHC,GAAA9H,EAAA,uBAAA,EACtB,OAAAtC,EAAA,cAAAM,IAA+BC,EAAI,MAAAoC,GAAA,CAAAO,EAAYmH,EAAI,CAAG,YAAW,GAAI,YAAM,GAAA,YAAA,GAC/D,MAAO,gBAAA,EAAA,CAEX,QAAA5H,EAAE,CAAY,CAAA,MAAAW,KAAA,CAAAF,EACXoH,EAAK,CACZ,KAAMtK,EAAE,aACT,MAAAoD,EAAA,OAAA,GAEW,UAAO,qBAAA,EAAA,CAEf,QAAAX,EAAW,CAAE,CAAY,cAAA8H,MAAA,CAAArH,EACzBsH,EAA4B,CAC5B,cAAiBxK,EAAA,aACjB,gBAAYuK,GACZ,kBAAUvK,EAAQ,kBACnB,aAAYA,EAAA,yBACZ,SAAMA,EAAM,SACX,YAAQ,sBACR,MAAA,OAAA,SAAAA,EAAA,8KAOM,EAAA,CAAA,CAAA,kBAEJ,gBAULM,EAAA,EAAAC,EAAA,OAAA2J,GAAA,CAAAlK,EAAA,mBAAA,CAAAA,EAAA,UAAAM,EATa,EAAAiC,EAAAkI,EAAA,CAAA,IAAA,iBAEb,WAAczK,EAAA,cACd,sBAAWC,EAAW,CAAA,IAAAA,EAAA,CAAA,EAAAyK,GAAA1K,EAAA,cAAA0K,GACtB,iBAAa,GACd,YAAM1K,EAAW,YACjB,cAAa,QAAwB,SAAA,oCAAA,EACpC,MAAI,YACJ,eAAK,yBAAA,OAAAA,EAAA,WAES,MAAAA,EAAA,aAAA,EAAA,KAAA,EAAA,CAAA,aAAhB,YAIM,cAAA,SAAA,OAAA,CAAA,GAAAA,EAHL,sBAEO,SAAA,GAAA,CAAAA,EAAA,UAAAM,IAFwBC,EAAA,MAAAoK,GAAA,CAAcjI,EAAA,OAAA,CAAgB,MAAK,oBAC/D,eAAA,eAAA,QAAAzC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,IAAA2D,IAAA5D,EAAA,kBAAAA,EAAA,iBAAA,GAAA4D,CAAA,EAWF,EAAA,MAAAgH,EAAA5K,EAAA,QAAA,SAAA,wBAAA,CAAA,EAAA,CAAA,CAAA,CAAA,IAAAM,EAAA,EALSiC,EAAqBsI,EAAA,CAC9B,IAAS7K,EAAA,kBACT,UAAUA,EAAM,sBACjB,UAAA,GACC,WAAO,GAAA,eAAA,iDAGV,EAAiC,CAAA,UAAA,SAAA,CAAA,EAKzB,CAAA,IAAAM,EAAA,EAAAC,EAAA,OAAA4J,EAAA,GAAAjH,EAFPkH,GAEO,CAAA,MAAA,SAAA,EAAA,CAFK,QAAA3H,EAAA,IAAA,CAAAC,EAAA,OAAA,CACX,MAA0FI,EAAA,aAAA9C,EAAA,OAAA,KAAA,EAAA,CAAA,EAAA,GAAlC8K,EAA8B,CAAA,kBAAA9K,EAAA,kDAsClE,EAAA,KAAA,EAAA,CAAA,kBAAA,aAAA,CAAA,CApCA,EAAA,CAAA,EAAAkD,EAAA6H,EAAA,CAWT,SAAQ,CAuBJ/K,EAAA,yBAAA,OAAA,CAAA,EAAA,CAlBF,SAAAyC,EAAO,IAgBR,CAAAS,EAfT8H,EAeS,KAAA,CAAA,QAdPvI,EAAO,IAAA,CAAYS,EAAsC+H,EAAA,CAGhD,QAAAjL,EAAA,4BAAA,UAAA,QAAA,YAAA,YAAA,QAEC,IAAA,MAAA,EAAA,QACNyC,EAAK,IAAA,CAEPC,EAAA,IAAA,CAA8B,QAA4BzC,EAAA,CAAA,IAAAA,EAAU,CAAQ,EAAA,IAAA2D,IAAY5D,EAAM,aAAAA,EAAA,YAAA,GAAA4D,CAAA,EAAA,EAAAgH,EAAA5K,EAAA,QAAA,oGAbnG,CAEa,CAAA,CAAA,EAFG,QAAAyC,EAAC,IAAW,CAAAS,EAAOgI,EAAa,CAAA,KAAA,YACA,MAAApI,EAAA,CAAA,SAAA9C,EAAA,OAAA,mBAAA,CAAA,CAAA,EAAA,kGAbvC,QAAAyC,EAAA,IAAA,CAAAC,EAAA,MAAA,CACV,MAAqBI,EAAA9C,EAAA,OAAA,KAAA,CAAA,EACrB,CAAAkD,EACMiI,CAAW,EAAAjI,EAChBgI,EAAa,CACZ,KAAA,YAAA,eAAA,sJA+BJ,EAAA,CAAA,EAAM,EAAK,CAAA,UAAA,CAAA,EAAAxI,EAAA,MAAA,CACV,MAMEI,EAAA9C,EAAA,OAAA,KAAA,CAAA,EAAA,GAJQoL,GAAY,CACpB,KAAA,UACD,MAAa,CAAApL,EAAA,SAAA,CAAAA,EAAA,cACZ,SAAOA,EAAiB,kBAAAA,EAAA,SAAA,eAAA,uBAGnB,QAAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,CAAA,QADP,WAac,SAAA,CAAA,EAAAA,EAAA,iCAAAM,IAXYiC,EAAA8I,GAAA,CACxB,IAAK,EAAA,GAAArL,EAAA,qBASJ,MAAA8C,EAAA9C,EAAA,OAAA,qBAAA,CAAA,EAAA,SANAyC,EAAU,IAAA,CAAAS,EACXoI,GAAa,CACb,SAAKtL,EAAA,gCACL,eAAc,0BACd,KAAK,WACL,KAAA,UAAA,KAAA,iEAIHuL,EAaM,GAAA,EAAA,CAbA,EAAA,CAAA,EAAA7I,EAAA,MAAA,CACL,MAMEI,EAAA,CAAA9C,EAAA,OAAA,sBAAAA,EAAA,OAAA,KAAA,CAAA,CAAA,EAAA,GAJK,QAAE,CACR,IAAI,aACJ,QAAaA,EAAuB,OAAA,WAAA,EACnC,KAAA,OAAA,eAAA,wBAEF,SAIEC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAyK,GAAA1K,EAAA,mBAAA,EAHA,KAAO,EAAA,EAAAkD,EACRsI,GAA4B,CAC3B,MAAQxL,EAAA,kBAAA,eAAA,wMC/GdyL,GAAe5L,EAAgB,CAC9B,KAAM,SACN,MAAO,CACN,MAAO,CACN,KAAM,MACN,SAAU,EACX,EACA,UAAW,CACV,KAAM,OACN,QAAS6L,EAAiB,QAC3B,CACD,EACA,MAAO,CACC,MAAA,CACN,iBAAAA,CAAA,CAEF,EACA,SAAU,CACT,GAAGpK,EAAU0D,CAAU,EACvB,sBAAgC,CAC/B,OAAO,KAAK,QAAQ,oBACrB,CACD,EACA,QAAS,CACR,SAAS2G,EAAaC,EAAyB,CACzC,KAAA,MAAM,SAAUD,EAAKC,CAAK,CAChC,CACD,CACD,CAAC,qEA/CY,MAAAC,EAAAvJ,EAAA,mBAAA,EACL,OAAAtC,EAAA,OAAAM,EAAA,EAAAC,EAAA,MAAA,CAAQ,IAAA,EAAA,MAAAuC,EAAA,EAA6D9C,EAAO,OAAA,SAAA,EAAA,GAAA,oBAAA,yDAM5B6L,EAAK,CAAG,cAAA7L,EAAA,UAAA,QAAAA,EAAA,gLC0BhE8L,GAAejM,EAAgB,CAC9B,KAAM,aACN,WAAY,CACX,gBAAAkM,GACA,OAAAC,EACD,EACA,OAAQ,CAACC,CAAc,EACvB,MAAMC,EAAOC,EAAK,SACV,MAAA,CAEN,IAAGC,GAAA7I,EAAA0I,GAAe,QAAf,YAAAG,EAAA,KAAA7I,EAAuB2I,EAAOC,EAAG,CAEtC,EACA,MAAO,CACC,MAAA,CACN,gBAAiBT,EAAiB,SAClC,mBAAoB,GACpB,WAAY,EAAA,CAEd,EACA,SAAU,CACT,GAAGpK,EAAU+K,GAAarH,EAAYiD,CAAqB,EAC3D,aAA6B,CACrB,MAAA,CACN,CAAE,MAAOyD,EAAiB,SAAU,MAAO,KAAK,QAAQ,SAAS,gBAAgB,CAAE,EACnF,CAAE,MAAOA,EAAiB,WAAY,MAAO,KAAK,QAAQ,SAAS,oBAAoB,CAAE,CAAA,CAE3F,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,aAAuB,CACtB,MAAO,GAAQ,KAAK,YAAc,KAAK,WAAW,OAASY,GAC5D,EACA,cAAuB,CACtB,OAAO,KAAK,eAAe,YAC5B,EACA,iBAA0B,CACzB,OAAO,KAAK,OAAO,OAAO,MAAQ,KAAK,eAAe,UACvD,EACA,gBAA0B,CAExB,OAAA,KAAK,OAAO,OACX,KAAK,OAAO,KAAK,UAAY,KAAK,OAAO,KAAK,oBAAsB,GAEvE,EACA,iBAAoC,CACnC,OAAO,KAAK,eAAe,uBAC5B,EACA,UAAoB,CACZ,OAAA,KAAK,mBAAmB,YAAY,cAC5C,CACD,EACA,MAAO,CACN,OAAOC,EAAIC,EAAM,CAChB,KAAK,kBAAkBD,CAAE,CAC1B,CACD,EACA,SAAU,CACJ,KAAA,WAAa,KAAK,QAAQ,aAC1B,KAAA,kBAAkB,KAAK,MAAM,CACnC,EACA,QAAS,CACR,kBAAkBE,EAAoB,CAEpCA,EAAM,OAASrE,EAAM,gBACrBqE,EAAM,OAASrE,EAAM,qBACrBqE,EAAM,OAASrE,EAAM,kBAErB,KAAK,gBAAkBsD,EAAiB,YAExCe,EAAM,OAASrE,EAAM,UACrBqE,EAAM,OAASrE,EAAM,cACrBqE,EAAM,OAASrE,EAAM,mBAErB,KAAK,gBAAkBsD,EAAiB,UAEnC,MAAAhC,EAAe+C,EAAM,OAAO,KAC9B/C,IAAiB,QACpB,KAAK,mBAAqBA,EAE5B,EACA,cAAciC,EAAuBC,EAAmB,CACjD,MAAAc,EAAed,EAAM,SAAWA,EAAM,QAE5C,OAAQD,EAAK,CACZ,KAAKD,EAAiB,SAChB,KAAK,uBAAuBgB,CAAY,EAC7C,MAED,KAAKhB,EAAiB,WAChB,KAAK,yBAAyBgB,CAAY,EAC/C,KAIF,CACD,EAEA,MAAM,uBAAuBA,EAAuB,CAC/C,IAAAC,EAUJ,GATK,CAAC,GAAI,MAAOxE,CAA6B,EAAE,SAAS,KAAK,kBAAkB,EAM3DwE,EAAA,CAAE,KAAMvE,EAAM,YAAa,EAL3BuE,EAAA,CACnB,KAAMvE,EAAM,SACZ,OAAQ,CAAE,KAAM,KAAK,kBAAmB,CAAA,EAMtCsE,EAAc,CACjB,KAAM,CAAE,KAAAE,CAAK,EAAI,KAAK,QAAQ,QAAQD,CAAiB,EAChD,OAAA,KAAKC,EAAM,QAAQ,CAChB,MAAA,KAAK,OAAO,OAASD,EAAkB,OAC7C,KAAK,OAAO,OAASvE,EAAM,eACzB,KAAA,QAAQ,aAAe,KAAK,YAElC,KAAK,gBAAkBsD,EAAiB,SAClC,MAAA,KAAK,QAAQ,KAAKiB,CAAiB,EAE3C,EAEA,MAAM,yBAAyBD,EAAuB,CACrD,MAAMG,EACL,KAAK,kBAAoB1E,EAAgC,MAAQ,KAAK,gBACjEwE,EAAsC,KAAK,gBAC9C,CACA,KAAMvE,EAAM,kBACZ,OAAQ,CAAE,KAAMyE,EAAiB,YAAa,KAAK,gBAAgB,EAAG,CAAA,EAEtE,CACA,KAAMzE,EAAM,eACZ,OAAQ,CAAE,KAAMyE,CAAgB,CAAA,EAGnC,GAAIH,EAAc,CACjB,KAAM,CAAE,KAAAE,CAAK,EAAI,KAAK,QAAQ,QAAQD,CAAiB,EAChD,OAAA,KAAKC,EAAM,QAAQ,CAChB,MAAA,KAAK,OAAO,OAASD,EAAkB,OAC5C,KAAA,WAAa,KAAK,QAAQ,aAC/B,KAAK,mBAAqB,KAAK,gBAC/B,KAAK,gBAAkBjB,EAAiB,WAClC,MAAA,KAAK,QAAQ,KAAKiB,CAAiB,EAE3C,CACD,CACD,CAAC,gFApLArK,EAYM,QAAA,SAXChC,EAAK,EAAAC,EAAA,MAAA,KAAA,CAAAmC,EAAA,MAAA,CACV,MAAAI,EAAA,CAAA,cAQM,GARN,SAQM,CAAA9C,EAAA,QAAA,qBAAA,CAAA,EAAA,GALE0C,EAAc,MAAAC,GAAA,CAInBO,EAAA4J,EAAA,CAAA,YAAA9M,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,WAAA,CAAA,EAAAA,EAAA,gBAAAM,IAHkBiC,EAAAwK,EAAA,CAClB,IAAA,EACA,MAAQ/M,EAAA,YAAA,aAAAA,EAAA,uFANG,GAAW,EAAA,CAAA,EAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"MainHeader-rSjJUqni.js","sources":["../../src/components/ShortenName.vue","../../src/components/IntersectionObserver.vue","../../src/components/IntersectionObserved.vue","../../src/components/TagsContainer.vue","../../src/components/ExpandableInput/ExpandableInputBase.vue","../../src/components/ExpandableInput/ExpandableInputEdit.vue","../../src/components/ExpandableInput/ExpandableInputPreview.vue","../../src/components/InlineTextEdit.vue","../../src/components/BreakpointsObserver.vue","../../src/components/MainHeader/CollaborationPane.vue","../../src/components/MainHeader/WorkflowDetails.vue","../../src/components/MainHeader/TabBar.vue","../../src/components/MainHeader/MainHeader.vue"],"sourcesContent":["<template>\n\t<span :title=\"name\" :data-test-id=\"testId\">\n\t\t<slot :shortened-name=\"shortenedName\"></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { shorten } from '@/utils/typesUtils';\n\nconst DEFAULT_WORKFLOW_NAME_LIMIT = 25;\nconst WORKFLOW_NAME_END_COUNT_TO_KEEP = 4;\n\nexport default defineComponent({\n\tname: 'ShortenName',\n\tprops: ['name', 'limit', 'testId'],\n\tcomputed: {\n\t\tshortenedName(): string {\n\t\t\treturn shorten(\n\t\t\t\tthis.name,\n\t\t\t\tthis.limit || DEFAULT_WORKFLOW_NAME_LIMIT,\n\t\t\t\tWORKFLOW_NAME_END_COUNT_TO_KEEP,\n\t\t\t);\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"root\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserver',\n\tprops: {\n\t\tthreshold: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tobserver: null,\n\t\t};\n\t},\n\tmounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst options = {\n\t\t\troot: this.$refs.root as Element,\n\t\t\trootMargin: '0px',\n\t\t\tthreshold: this.threshold,\n\t\t};\n\n\t\tconst observer = new IntersectionObserver((entries) => {\n\t\t\tentries.forEach(({ target, isIntersecting }) => {\n\t\t\t\tthis.$emit('observed', {\n\t\t\t\t\tel: target,\n\t\t\t\t\tisIntersecting,\n\t\t\t\t});\n\t\t\t});\n\t\t}, options);\n\n\t\tthis.observer = observer;\n\n\t\tthis.eventBus.on('observe', (observed: Element) => {\n\t\t\tif (observed) {\n\t\t\t\tobserver.observe(observed);\n\t\t\t}\n\t\t});\n\n\t\tthis.eventBus.on('unobserve', (observed: Element) => {\n\t\t\tobserver.unobserve(observed);\n\t\t});\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled) {\n\t\t\tthis.observer.disconnect();\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<span ref=\"observed\">\n\t\t<slot></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserved',\n\tprops: {\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tasync mounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.$nextTick();\n\t\tthis.eventBus.emit('observe', this.$refs.observed);\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled) {\n\t\t\tthis.eventBus.emit('unobserve', this.$refs.observed);\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<IntersectionObserver\n\t\tref=\"tagsContainer\"\n\t\t:threshold=\"1.0\"\n\t\tclass=\"tags-container\"\n\t\t:style=\"style\"\n\t\t:enabled=\"responsive\"\n\t\t:event-bus=\"intersectionEventBus\"\n\t\t@observed=\"onObserved\"\n\t>\n\t\t<span class=\"tags\">\n\t\t\t<span\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:class=\"{ clickable: !tag.hidden }\"\n\t\t\t\t@click=\"(e) => onClick(e, tag)\"\n\t\t\t>\n\t\t\t\t<el-tag\n\t\t\t\t\tv-if=\"tag.isCount\"\n\t\t\t\t\t:title=\"tag.title\"\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tclass=\"count-container\"\n\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t>\n\t\t\t\t\t{{ tag.name }}\n\t\t\t\t</el-tag>\n\t\t\t\t<IntersectionObserved\n\t\t\t\t\tv-else\n\t\t\t\t\t:class=\"{ hidden: tag.hidden }\"\n\t\t\t\t\t:data-id=\"tag.id\"\n\t\t\t\t\t:enabled=\"responsive\"\n\t\t\t\t\t:event-bus=\"intersectionEventBus\"\n\t\t\t\t>\n\t\t\t\t\t<el-tag\n\t\t\t\t\t\t:title=\"tag.name\"\n\t\t\t\t\t\ttype=\"info\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:class=\"{ hoverable }\"\n\t\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ tag.name }}\n\t\t\t\t\t</el-tag>\n\t\t\t\t</IntersectionObserved>\n\t\t\t</span>\n\t\t</span>\n\t</IntersectionObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nimport type { ITag } from '@/Interface';\nimport IntersectionObserver from './IntersectionObserver.vue';\nimport IntersectionObserved from './IntersectionObserved.vue';\nimport { mapStores } from 'pinia';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { debounce } from 'lodash-es';\n\n// random upper limit if none is set to minimize performance impact of observers\nconst DEFAULT_MAX_TAGS_LIMIT = 20;\n\ninterface TagEl extends ITag {\n\thidden?: boolean;\n\ttitle?: string;\n\tisCount?: boolean;\n}\n\nexport default defineComponent({\n\tname: 'TagsContainer',\n\tcomponents: { IntersectionObserver, IntersectionObserved },\n\tprops: ['tagIds', 'limit', 'clickable', 'responsive', 'hoverable'],\n\tdata() {\n\t\treturn {\n\t\t\tmaxWidth: 320,\n\t\t\tintersectionEventBus: createEventBus(),\n\t\t\tvisibility: {} as { [id: string]: boolean },\n\t\t\tdebouncedSetMaxWidth: () => {},\n\t\t};\n\t},\n\tcreated() {\n\t\tthis.debouncedSetMaxWidth = debounce(this.setMaxWidth, 100);\n\t},\n\tmounted() {\n\t\tthis.setMaxWidth();\n\t\twindow.addEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tcomputed: {\n\t\t...mapStores(useTagsStore),\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'max-width': `${this.maxWidth}px`,\n\t\t\t};\n\t\t},\n\t\ttags() {\n\t\t\tconst tags = this.tagIds\n\t\t\t\t.map((tagId: string) => this.tagsStore.getTagById(tagId))\n\t\t\t\t.filter(Boolean); // if tag has been deleted from store\n\n\t\t\tconst limit = this.limit || DEFAULT_MAX_TAGS_LIMIT;\n\n\t\t\tlet toDisplay: TagEl[] = limit ? tags.slice(0, limit) : tags;\n\t\t\ttoDisplay = toDisplay.map((tag: ITag) => ({\n\t\t\t\t...tag,\n\t\t\t\thidden: this.responsive && !this.visibility[tag.id],\n\t\t\t}));\n\n\t\t\tlet visibleCount = toDisplay.length;\n\t\t\tif (this.responsive) {\n\t\t\t\tvisibleCount = Object.values(this.visibility).reduce(\n\t\t\t\t\t(accu, val) => (val ? accu + 1 : accu),\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (visibleCount < tags.length) {\n\t\t\t\tconst hidden = tags.slice(visibleCount);\n\t\t\t\tconst hiddenTitle = hidden.reduce((accu: string, tag: ITag) => {\n\t\t\t\t\treturn accu ? `${accu}, ${tag.name}` : tag.name;\n\t\t\t\t}, '');\n\n\t\t\t\tconst countTag: TagEl = {\n\t\t\t\t\tid: 'count',\n\t\t\t\t\tname: `+${hidden.length}`,\n\t\t\t\t\ttitle: hiddenTitle,\n\t\t\t\t\tisCount: true,\n\t\t\t\t};\n\t\t\t\ttoDisplay.splice(visibleCount, 0, countTag);\n\t\t\t}\n\n\t\t\treturn toDisplay;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetMaxWidth() {\n\t\t\tconst container = this.$refs.tagsContainer.$el as HTMLElement;\n\t\t\tconst parent = container.parentNode as HTMLElement;\n\n\t\t\tif (parent) {\n\t\t\t\tthis.maxWidth = 0;\n\t\t\t\tvoid this.$nextTick(() => {\n\t\t\t\t\tthis.maxWidth = parent.clientWidth;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonObserved({ el, isIntersecting }: { el: HTMLElement; isIntersecting: boolean }) {\n\t\t\tif (el.dataset.id) {\n\t\t\t\tthis.visibility = { ...this.visibility, [el.dataset.id]: isIntersecting };\n\t\t\t}\n\t\t},\n\t\tonClick(e: MouseEvent, tag: TagEl) {\n\t\t\tif (this.clickable) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\n\t\t\t// if tag is hidden or not displayed\n\t\t\tif (!tag.hidden) {\n\t\t\t\tthis.$emit('click', tag.id);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.tags-container {\n\tdisplay: block;\n\tmax-width: 300px;\n}\n\n.tags {\n\tdisplay: block;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tmax-width: 100%;\n\n\t> span {\n\t\tpadding-right: 4px; // why not margin? for space between tags to be clickable\n\t}\n}\n\n.hidden {\n\tvisibility: hidden;\n}\n\n.el-tag.hoverable:hover {\n\tborder-color: $color-primary;\n}\n\n.count-container {\n\tposition: absolute;\n\tmax-width: 40px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n</style>\n","<template>\n\t<!-- mock el-input element to apply styles -->\n\t<div :class=\"{ 'el-input': true, 'static-size': staticSize }\" :data-value=\"hiddenValue\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputBase',\n\tprops: ['modelValue', 'placeholder', 'staticSize'],\n\tcomputed: {\n\t\thiddenValue() {\n\t\t\tlet value = (this.modelValue as string).replace(/\\s/g, '.'); // force input to expand on space chars\n\t\t\tif (!value) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tvalue = this.placeholder;\n\t\t\t}\n\n\t\t\treturn `${value}`; // adjust for padding\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n$--horiz-padding: 15px;\n\n.el-input {\n\tdisplay: inline-grid;\n\tfont: inherit;\n\tpadding: 10px 0;\n\n\t:deep(input) {\n\t\tborder: 1px solid transparent;\n\t\tpadding: 0 $--horiz-padding - 2px; // -2px for borders\n\t\twidth: 100%;\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t}\n\n\t&::after {\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t\tcontent: attr(data-value) ' ';\n\t\tvisibility: hidden;\n\t\twhite-space: nowrap;\n\t\tpadding: 0 $--horiz-padding;\n\t}\n\n\t&:not(.static-size)::after {\n\t\toverflow: hidden;\n\t}\n\n\t&:hover {\n\t\t:deep(input):not(:focus) {\n\t\t\tborder: 1px solid var(--color-text-lighter);\n\t\t}\n\t}\n\n\t:deep(input):focus {\n\t\tborder: 1px solid var(--color-secondary);\n\t}\n}\n</style>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :placeholder=\"placeholder\">\n\t\t<input\n\t\t\tref=\"input\"\n\t\t\tv-on-click-outside=\"onClickOutside\"\n\t\t\tclass=\"el-input__inner\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:maxlength=\"maxlength\"\n\t\t\tsize=\"4\"\n\t\t\t@input=\"onInput\"\n\t\t\t@keydown.enter=\"onEnter\"\n\t\t\t@keydown.esc=\"onEscape\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\nimport type { PropType } from 'vue';\nimport type { EventBus } from 'n8n-design-system';\n\nexport default defineComponent({\n\tname: 'ExpandableInputEdit',\n\tcomponents: { ExpandableInputBase },\n\tprops: {\n\t\tmodelValue: {},\n\t\tplaceholder: {},\n\t\tmaxlength: {},\n\t\tautofocus: {},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t},\n\tmounted() {\n\t\t// autofocus on input element is not reliable\n\t\tif (this.autofocus && this.$refs.input) {\n\t\t\tthis.focus();\n\t\t}\n\t\tthis.eventBus?.on('focus', this.focus);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('focus', this.focus);\n\t},\n\tmethods: {\n\t\tfocus() {\n\t\t\tif (this.$refs.input) {\n\t\t\t\t(this.$refs.input as HTMLInputElement).focus();\n\t\t\t}\n\t\t},\n\t\tonInput() {\n\t\t\tthis.$emit('update:modelValue', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonEnter() {\n\t\t\tthis.$emit('enter', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonClickOutside(e: Event) {\n\t\t\tif (e.type === 'click') {\n\t\t\t\tthis.$emit('blur', (this.$refs.input as HTMLInputElement).value);\n\t\t\t}\n\t\t},\n\t\tonEscape() {\n\t\t\tthis.$emit('esc');\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :static-size=\"true\">\n\t\t<input\n\t\t\t:class=\"{ 'el-input__inner': true, clickable: true }\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:disabled=\"true\"\n\t\t\tsize=\"4\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputPreview',\n\tcomponents: { ExpandableInputBase },\n\tprops: ['modelValue'],\n});\n</script>\n\n<style lang=\"scss\" scoped>\ninput,\ninput:hover {\n\tbackground-color: unset;\n\ttransition: unset;\n\tpointer-events: none; // fix firefox bug\n}\n\ninput[disabled] {\n\tcolor: $custom-font-black;\n\n\t// override safari colors\n\t-webkit-text-fill-color: $custom-font-black;\n\t-webkit-opacity: 1;\n}\n</style>\n","<template>\n\t<span class=\"inline-edit\" @keydown.stop>\n\t\t<span v-if=\"isEditEnabled && !isDisabled\">\n\t\t\t<ExpandableInputEdit\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:model-value=\"newValue\"\n\t\t\t\t:maxlength=\"maxLength\"\n\t\t\t\t:autofocus=\"true\"\n\t\t\t\t:event-bus=\"inputBus\"\n\t\t\t\t@update:modelValue=\"onInput\"\n\t\t\t\t@esc=\"onEscape\"\n\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t@enter=\"submit\"\n\t\t\t/>\n\t\t</span>\n\n\t\t<span v-else class=\"preview\" @click=\"onClick\">\n\t\t\t<ExpandableInputPreview :model-value=\"previewValue || modelValue\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputEdit from '@/components/ExpandableInput/ExpandableInputEdit.vue';\nimport ExpandableInputPreview from '@/components/ExpandableInput/ExpandableInputPreview.vue';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'InlineTextEdit',\n\tcomponents: { ExpandableInputEdit, ExpandableInputPreview },\n\tprops: {\n\t\tisEditEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tmaxLength: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tpreviewValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisDisabled: this.disabled,\n\t\t\tnewValue: '',\n\t\t\tescPressed: false,\n\t\t\tinputBus: createEventBus(),\n\t\t};\n\t},\n\twatch: {\n\t\tdisabled(value) {\n\t\t\tthis.isDisabled = value;\n\t\t},\n\t},\n\tmethods: {\n\t\tonInput(newValue: string) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = newValue;\n\t\t},\n\t\tonClick() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = this.modelValue;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t\tonBlur() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.escPressed) {\n\t\t\t\tthis.submit();\n\t\t\t}\n\t\t\tthis.escPressed = false;\n\t\t},\n\t\tsubmit() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst onSubmit = (updated: boolean) => {\n\t\t\t\tthis.isDisabled = false;\n\n\t\t\t\tif (!updated) {\n\t\t\t\t\tthis.inputBus.emit('focus');\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.isDisabled = true;\n\t\t\tthis.$emit('submit', { name: this.newValue, onSubmit });\n\t\t},\n\t\tonEscape() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.escPressed = true;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.preview {\n\tcursor: pointer;\n}\n</style>\n","<template>\n\t<span>\n\t\t<slot :bp=\"bp\" :value=\"value\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BREAKPOINT_SM, BREAKPOINT_MD, BREAKPOINT_LG, BREAKPOINT_XL } from '@/constants';\n\n/**\n * matching element.io https://element.eleme.io/#/en-US/component/layout#col-attributes\n * xs < 768\n * sm >= 768\n * md >= 992\n * lg >= 1200\n * xl >= 1920\n */\n\nimport { useUIStore } from '@/stores/ui.store';\nimport { getBannerRowHeight } from '@/utils/htmlUtils';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'BreakpointsObserver',\n\tprops: ['valueXS', 'valueXL', 'valueLG', 'valueMD', 'valueSM', 'valueDefault'],\n\tsetup() {\n\t\tconst { callDebounced } = useDebounce();\n\t\treturn { callDebounced };\n\t},\n\tdata() {\n\t\treturn {\n\t\t\twidth: window.innerWidth,\n\t\t};\n\t},\n\tcomputed: {\n\t\tbp(): string {\n\t\t\tif (this.width < BREAKPOINT_SM) {\n\t\t\t\treturn 'XS';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn 'XL';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn 'LG';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn 'MD';\n\t\t\t}\n\n\t\t\treturn 'SM';\n\t\t},\n\n\t\tvalue(): number | undefined {\n\t\t\tif (this.valueXS !== undefined && this.width < BREAKPOINT_SM) {\n\t\t\t\treturn this.valueXS;\n\t\t\t}\n\n\t\t\tif (this.valueXL !== undefined && this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn this.valueXL;\n\t\t\t}\n\n\t\t\tif (this.valueLG !== undefined && this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn this.valueLG;\n\t\t\t}\n\n\t\t\tif (this.valueMD !== undefined && this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn this.valueMD;\n\t\t\t}\n\n\t\t\tif (this.valueSM !== undefined) {\n\t\t\t\treturn this.valueSM;\n\t\t\t}\n\n\t\t\treturn this.valueDefault;\n\t\t},\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\tonResize() {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 50 });\n\t\t},\n\t\tasync onResizeEnd() {\n\t\t\tthis.width = window.innerWidth;\n\t\t\tawait this.$nextTick();\n\n\t\t\tconst bannerHeight = await getBannerRowHeight();\n\t\t\tuseUIStore().updateBannersHeight(bannerHeight);\n\t\t},\n\t},\n});\n</script>\n","<script setup lang=\"ts\">\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { onBeforeUnmount, onMounted, computed, ref } from 'vue';\nimport { TIME } from '@/constants';\n\nconst collaborationStore = useCollaborationStore();\nconst usersStore = useUsersStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst HEARTBEAT_INTERVAL = 5 * TIME.MINUTE;\nconst heartbeatTimer = ref<number | null>(null);\n\nconst activeUsersSorted = computed(() => {\n\tconst currentWorkflowUsers = (collaborationStore.getUsersForCurrentWorkflow ?? []).map(\n\t\t(userInfo) => userInfo.user,\n\t);\n\tconst owner = currentWorkflowUsers.find((user) => user.role === 'global:owner');\n\treturn {\n\t\tdefaultGroup: owner\n\t\t\t? [owner, ...currentWorkflowUsers.filter((user) => user.id !== owner.id)]\n\t\t\t: currentWorkflowUsers,\n\t};\n});\n\nconst currentUserEmail = computed(() => {\n\treturn usersStore.currentUser?.email;\n});\n\nconst startHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t\theartbeatTimer.value = null;\n\t}\n\theartbeatTimer.value = window.setInterval(() => {\n\t\tcollaborationStore.notifyWorkflowOpened(workflowsStore.workflow.id);\n\t}, HEARTBEAT_INTERVAL);\n};\n\nconst stopHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t}\n};\n\nconst onDocumentVisibilityChange = () => {\n\tif (document.visibilityState === 'hidden') {\n\t\tstopHeartbeat();\n\t} else {\n\t\tstartHeartbeat();\n\t}\n};\n\nonMounted(() => {\n\tstartHeartbeat();\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n\tstopHeartbeat();\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"`collaboration-pane-container ${$style.container}`\"\n\t\tdata-test-id=\"collaboration-pane\"\n\t>\n\t\t<n8n-user-stack :users=\"activeUsersSorted\" :current-user-email=\"currentUserEmail\" />\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tmargin: 0 var(--spacing-4xs);\n}\n</style>\n","<template>\n\t<div v-if=\"workflowName\" class=\"container\">\n\t\t<BreakpointsObserver :value-x-s=\"15\" :value-s-m=\"25\" :value-m-d=\"50\" class=\"name-container\">\n\t\t\t<template #default=\"{ value }\">\n\t\t\t\t<ShortenName\n\t\t\t\t\t:name=\"workflowName\"\n\t\t\t\t\t:limit=\"value\"\n\t\t\t\t\t:custom=\"true\"\n\t\t\t\t\ttest-id=\"workflow-name-input\"\n\t\t\t\t>\n\t\t\t\t\t<template #default=\"{ shortenedName }\">\n\t\t\t\t\t\t<InlineTextEdit\n\t\t\t\t\t\t\t:model-value=\"workflowName\"\n\t\t\t\t\t\t\t:preview-value=\"shortenedName\"\n\t\t\t\t\t\t\t:is-edit-enabled=\"isNameEditEnabled\"\n\t\t\t\t\t\t\t:max-length=\"MAX_WORKFLOW_NAME_LENGTH\"\n\t\t\t\t\t\t\t:disabled=\"readOnly\"\n\t\t\t\t\t\t\tplaceholder=\"Enter workflow name\"\n\t\t\t\t\t\t\tclass=\"name\"\n\t\t\t\t\t\t\t@toggle=\"onNameToggle\"\n\t\t\t\t\t\t\t@submit=\"onNameSubmit\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</ShortenName>\n\t\t\t</template>\n\t\t</BreakpointsObserver>\n\n\t\t<span v-if=\"settingsStore.areTagsEnabled\" class=\"tags\" data-test-id=\"workflow-tags-container\">\n\t\t\t<TagsDropdown\n\t\t\t\tv-if=\"isTagsEditEnabled && !readOnly\"\n\t\t\t\tref=\"dropdown\"\n\t\t\t\tv-model=\"appliedTagIds\"\n\t\t\t\t:create-enabled=\"true\"\n\t\t\t\t:event-bus=\"tagsEditBus\"\n\t\t\t\t:placeholder=\"$locale.baseText('workflowDetails.chooseOrCreateATag')\"\n\t\t\t\tclass=\"tags-edit\"\n\t\t\t\tdata-test-id=\"workflow-tags-dropdown\"\n\t\t\t\t@blur=\"onTagsBlur\"\n\t\t\t\t@esc=\"onTagsEditEsc\"\n\t\t\t/>\n\t\t\t<div v-else-if=\"currentWorkflowTagIds.length === 0 && !readOnly\">\n\t\t\t\t<span class=\"add-tag clickable\" data-test-id=\"new-tag-link\" @click=\"onTagsEditEnable\">\n\t\t\t\t\t+ {{ $locale.baseText('workflowDetails.addTag') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<TagsContainer\n\t\t\t\tv-else\n\t\t\t\t:key=\"currentWorkflowId\"\n\t\t\t\t:tag-ids=\"currentWorkflowTagIds\"\n\t\t\t\t:clickable=\"true\"\n\t\t\t\t:responsive=\"true\"\n\t\t\t\tdata-test-id=\"workflow-tags\"\n\t\t\t\t@click=\"onTagsEditEnable\"\n\t\t\t/>\n\t\t</span>\n\t\t<span v-else class=\"tags\"></span>\n\n\t\t<PushConnectionTracker class=\"actions\">\n\t\t\t<span :class=\"`activator ${$style.group}`\">\n\t\t\t\t<WorkflowActivator :workflow-active=\"isWorkflowActive\" :workflow-id=\"currentWorkflowId\" />\n\t\t\t</span>\n\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\">\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<CollaborationPane />\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tdata-test-id=\"workflow-share-button\"\n\t\t\t\t\t\t@click=\"onShareButtonClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #fallback>\n\t\t\t\t\t<n8n-tooltip>\n\t\t\t\t\t\t<n8n-button type=\"secondary\" :class=\"['mr-2xs', $style.disabledShareButton]\">\n\t\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t\n\t\t\t\t\t\t\t\t:keypath=\"\n\t\t\t\t\t\t\t\t\tcontextBasedTranslationKeys.workflows.sharing.unavailable.description.tooltip\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t\t\t<a @click=\"goToUpgrade\">\n\t\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t\t\tcontextBasedTranslationKeys.workflows.sharing.unavailable.button,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</template>\n\t\t\t</enterprise-edition>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<SaveButton\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:saved=\"!isDirty && !isNewWorkflow\"\n\t\t\t\t\t:disabled=\"isWorkflowSaving || readOnly\"\n\t\t\t\t\tdata-test-id=\"workflow-save-button\"\n\t\t\t\t\t@click=\"onSaveButtonClick\"\n\t\t\t\t/>\n\t\t\t\t<router-link\n\t\t\t\t\tv-if=\"isWorkflowHistoryFeatureEnabled\"\n\t\t\t\t\t:to=\"workflowHistoryRoute\"\n\t\t\t\t\t:class=\"$style.workflowHistoryButton\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t:disabled=\"isWorkflowHistoryButtonDisabled\"\n\t\t\t\t\t\tdata-test-id=\"workflow-history-button\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\ticon=\"history\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t/>\n\t\t\t\t</router-link>\n\t\t\t</div>\n\t\t\t<div :class=\"[$style.workflowMenuContainer, $style.group]\">\n\t\t\t\t<input\n\t\t\t\t\tref=\"importFile\"\n\t\t\t\t\t:class=\"$style.hiddenInput\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\tdata-test-id=\"workflow-import-input\"\n\t\t\t\t\t@change=\"handleFileImport()\"\n\t\t\t\t/>\n\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\t:items=\"workflowMenuItems\"\n\t\t\t\t\tdata-test-id=\"workflow-menu\"\n\t\t\t\t\t@select=\"onWorkflowMenuSelect\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</PushConnectionTracker>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport {\n\tDUPLICATE_MODAL_KEY,\n\tEnterpriseEditionFeature,\n\tMAX_WORKFLOW_NAME_LENGTH,\n\tMODAL_CONFIRM,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSOURCE_CONTROL_PUSH_MODAL_KEY,\n\tVIEWS,\n\tWORKFLOW_MENU_ACTIONS,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tWORKFLOW_SHARE_MODAL_KEY,\n} from '@/constants';\n\nimport ShortenName from '@/components/ShortenName.vue';\nimport TagsContainer from '@/components/TagsContainer.vue';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport WorkflowActivator from '@/components/WorkflowActivator.vue';\nimport SaveButton from '@/components/SaveButton.vue';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport InlineTextEdit from '@/components/InlineTextEdit.vue';\nimport BreakpointsObserver from '@/components/BreakpointsObserver.vue';\nimport CollaborationPane from '@/components/MainHeader/CollaborationPane.vue';\nimport type { IUser, IWorkflowDataUpdate, IWorkflowDb, IWorkflowToShare } from '@/Interface';\n\nimport { saveAs } from 'file-saver';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport type { MessageBoxInputData } from 'element-plus';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsageStore } from '@/stores/usage.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { IPermissions } from '@/permissions';\nimport { getWorkflowPermissions } from '@/permissions';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { nodeViewEventBus } from '@/event-bus';\nimport { hasPermission } from '@/rbac/permissions';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\nconst hasChanged = (prev: string[], curr: string[]) => {\n\tif (prev.length !== curr.length) {\n\t\treturn true;\n\t}\n\n\tconst set = new Set(prev);\n\treturn curr.reduce((accu, val) => accu || !set.has(val), false);\n};\n\nexport default defineComponent({\n\tname: 'WorkflowDetails',\n\tcomponents: {\n\t\tTagsContainer,\n\t\tPushConnectionTracker,\n\t\tShortenName,\n\t\tWorkflowActivator,\n\t\tSaveButton,\n\t\tTagsDropdown,\n\t\tInlineTextEdit,\n\t\tBreakpointsObserver,\n\t\tCollaborationPane,\n\t},\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\tworkflowHelpers,\n\t\t\t...useTitleChange(),\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisTagsEditEnabled: false,\n\t\t\tisNameEditEnabled: false,\n\t\t\tappliedTagIds: [],\n\t\t\ttagsEditBus: createEventBus(),\n\t\t\tMAX_WORKFLOW_NAME_LENGTH,\n\t\t\ttagsSaving: false,\n\t\t\teventBus: createEventBus(),\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseTagsStore,\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsageStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseUsersStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseCanvasStore,\n\t\t),\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tcontextBasedTranslationKeys() {\n\t\t\treturn this.uiStore.contextBasedTranslationKeys;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\treturn this.workflowsStore.isWorkflowActive;\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tisDirty(): boolean {\n\t\t\treturn this.uiStore.stateIsDirty;\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tcurrentWorkflowTagIds(): string[] {\n\t\t\treturn this.workflowsStore.workflowTags;\n\t\t},\n\t\tisNewWorkflow(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.currentWorkflowId ||\n\t\t\t\tthis.currentWorkflowId === PLACEHOLDER_EMPTY_WORKFLOW_ID ||\n\t\t\t\tthis.currentWorkflowId === 'new'\n\t\t\t);\n\t\t},\n\t\tisWorkflowSaving(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowSaving');\n\t\t},\n\t\tworkflow(): IWorkflowDb {\n\t\t\treturn this.workflowsStore.workflow;\n\t\t},\n\t\tcurrentWorkflowId(): string {\n\t\t\treturn this.workflowsStore.workflowId;\n\t\t},\n\t\tonWorkflowPage(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.$route.meta &&\n\t\t\t\t(this.$route.meta.nodeView || this.$route.meta.keepWorkflowAlive === true)\n\t\t\t);\n\t\t},\n\t\tonExecutionsTab(): boolean {\n\t\t\treturn [\n\t\t\t\tVIEWS.EXECUTION_HOME.toString(),\n\t\t\t\tVIEWS.WORKFLOW_EXECUTIONS.toString(),\n\t\t\t\tVIEWS.EXECUTION_PREVIEW,\n\t\t\t].includes(this.$route.name || '');\n\t\t},\n\t\tworkflowPermissions(): IPermissions {\n\t\t\treturn getWorkflowPermissions(this.currentUser, this.workflow);\n\t\t},\n\t\tworkflowMenuItems(): Array<{}> {\n\t\t\tconst actions = [\n\t\t\t\t{\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.DOWNLOAD,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.download'),\n\t\t\t\t\tdisabled: !this.onWorkflowPage,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (!this.readOnly) {\n\t\t\t\tactions.unshift({\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.DUPLICATE,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.duplicate'),\n\t\t\t\t\tdisabled: !this.onWorkflowPage || !this.currentWorkflowId,\n\t\t\t\t});\n\n\t\t\t\tactions.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL,\n\t\t\t\t\t\tlabel: this.$locale.baseText('menuActions.importFromUrl'),\n\t\t\t\t\t\tdisabled: !this.onWorkflowPage || this.onExecutionsTab,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE,\n\t\t\t\t\t\tlabel: this.$locale.baseText('menuActions.importFromFile'),\n\t\t\t\t\t\tdisabled: !this.onWorkflowPage || this.onExecutionsTab,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (hasPermission(['rbac'], { rbac: { scope: 'sourceControl:push' } })) {\n\t\t\t\tactions.push({\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.PUSH,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.push'),\n\t\t\t\t\tdisabled:\n\t\t\t\t\t\t!this.sourceControlStore.isEnterpriseSourceControlEnabled ||\n\t\t\t\t\t\t!this.onWorkflowPage ||\n\t\t\t\t\t\tthis.onExecutionsTab ||\n\t\t\t\t\t\tthis.readOnlyEnv,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tactions.push({\n\t\t\t\tid: WORKFLOW_MENU_ACTIONS.SETTINGS,\n\t\t\t\tlabel: this.$locale.baseText('generic.settings'),\n\t\t\t\tdisabled: !this.onWorkflowPage || this.isNewWorkflow,\n\t\t\t});\n\n\t\t\tif (this.workflowPermissions.delete && !this.readOnly) {\n\t\t\t\tactions.push({\n\t\t\t\t\tid: WORKFLOW_MENU_ACTIONS.DELETE,\n\t\t\t\t\tlabel: this.$locale.baseText('menuActions.delete'),\n\t\t\t\t\tdisabled: !this.onWorkflowPage || this.isNewWorkflow,\n\t\t\t\t\tcustomClass: this.$style.deleteItem,\n\t\t\t\t\tdivided: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn actions;\n\t\t},\n\t\tisWorkflowHistoryFeatureEnabled(): boolean {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(\n\t\t\t\tEnterpriseEditionFeature.WorkflowHistory,\n\t\t\t);\n\t\t},\n\t\tworkflowHistoryRoute(): { name: string; params: { workflowId: string } } {\n\t\t\treturn {\n\t\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\t\tparams: {\n\t\t\t\t\tworkflowId: this.currentWorkflowId,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tisWorkflowHistoryButtonDisabled(): boolean {\n\t\t\treturn this.workflowsStore.isNewWorkflow;\n\t\t},\n\t},\n\twatch: {\n\t\tcurrentWorkflowId() {\n\t\t\tthis.isTagsEditEnabled = false;\n\t\t\tthis.isNameEditEnabled = false;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onSaveButtonClick() {\n\t\t\tlet currentId = undefined;\n\t\t\tif (this.currentWorkflowId !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {\n\t\t\t\tcurrentId = this.currentWorkflowId;\n\t\t\t} else if (this.$route.params.name && this.$route.params.name !== 'new') {\n\t\t\t\tcurrentId = this.$route.params.name;\n\t\t\t}\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({\n\t\t\t\tid: currentId,\n\t\t\t\tname: this.workflowName,\n\t\t\t\ttags: this.currentWorkflowTagIds,\n\t\t\t});\n\n\t\t\tif (saved) {\n\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\n\t\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\t\tawait this.$router.replace({\n\t\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\t\tparams: { name: this.currentWorkflowId },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonShareButtonClick() {\n\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\tname: WORKFLOW_SHARE_MODAL_KEY,\n\t\t\t\tdata: { id: this.currentWorkflowId },\n\t\t\t});\n\n\t\t\tthis.$telemetry.track('User opened sharing modal', {\n\t\t\t\tworkflow_id: this.currentWorkflowId,\n\t\t\t\tuser_id_sharer: this.currentUser?.id,\n\t\t\t\tsub_view: this.$route.name === VIEWS.WORKFLOWS ? 'Workflows listing' : 'Workflow editor',\n\t\t\t});\n\t\t},\n\t\tonTagsEditEnable() {\n\t\t\tthis.appliedTagIds = this.currentWorkflowTagIds;\n\t\t\tthis.isTagsEditEnabled = true;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\t// allow name update to occur before disabling name edit\n\t\t\t\tthis.isNameEditEnabled = false;\n\t\t\t\tthis.tagsEditBus.emit('focus');\n\t\t\t}, 0);\n\t\t},\n\n\t\tasync onTagsBlur() {\n\t\t\tconst current = this.currentWorkflowTagIds;\n\t\t\tconst tags = this.appliedTagIds;\n\t\t\tif (!hasChanged(current, tags)) {\n\t\t\t\tthis.isTagsEditEnabled = false;\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.tagsSaving) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.tagsSaving = true;\n\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({ tags });\n\t\t\tthis.$telemetry.track('User edited workflow tags', {\n\t\t\t\tworkflow_id: this.currentWorkflowId,\n\t\t\t\tnew_tag_count: tags.length,\n\t\t\t});\n\n\t\t\tthis.tagsSaving = false;\n\t\t\tif (saved) {\n\t\t\t\tthis.isTagsEditEnabled = false;\n\t\t\t}\n\t\t},\n\t\tonTagsEditEsc() {\n\t\t\tthis.isTagsEditEnabled = false;\n\t\t},\n\t\tonNameToggle() {\n\t\t\tthis.isNameEditEnabled = !this.isNameEditEnabled;\n\t\t\tif (this.isNameEditEnabled) {\n\t\t\t\tif (this.isTagsEditEnabled) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvoid this.onTagsBlur();\n\t\t\t\t}\n\n\t\t\t\tthis.isTagsEditEnabled = false;\n\t\t\t}\n\t\t},\n\t\tasync onNameSubmit({\n\t\t\tname,\n\t\t\tonSubmit: cb,\n\t\t}: {\n\t\t\tname: string;\n\t\t\tonSubmit: (saved: boolean) => void;\n\t\t}) {\n\t\t\tconst newName = name.trim();\n\t\t\tif (!newName) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('workflowDetails.showMessage.title'),\n\t\t\t\t\tmessage: this.$locale.baseText('workflowDetails.showMessage.message'),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\n\t\t\t\tcb(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (newName === this.workflowName) {\n\t\t\t\tthis.isNameEditEnabled = false;\n\n\t\t\t\tcb(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({ name });\n\t\t\tif (saved) {\n\t\t\t\tthis.isNameEditEnabled = false;\n\t\t\t}\n\t\t\tcb(saved);\n\t\t},\n\t\tasync handleFileImport(): Promise<void> {\n\t\t\tconst inputRef = this.$refs.importFile as HTMLInputElement | undefined;\n\t\t\tif (inputRef?.files && inputRef.files.length !== 0) {\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.onload = () => {\n\t\t\t\t\tlet workflowData: IWorkflowDataUpdate;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tworkflowData = JSON.parse(reader.result as string);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('mainSidebar.showMessage.handleFileImport.title'),\n\t\t\t\t\t\t\tmessage: this.$locale.baseText('mainSidebar.showMessage.handleFileImport.message'),\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\treader.onload = undefined;\n\t\t\t\t\t\tinputRef.value = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tnodeViewEventBus.emit('importWorkflowData', { data: workflowData });\n\t\t\t\t};\n\t\t\t\treader.readAsText(inputRef.files[0]);\n\t\t\t}\n\t\t},\n\t\tasync onWorkflowMenuSelect(action: string): Promise<void> {\n\t\t\tswitch (action) {\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.DUPLICATE: {\n\t\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\t\tname: DUPLICATE_MODAL_KEY,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tid: this.workflowsStore.workflowId,\n\t\t\t\t\t\t\tname: this.workflowsStore.workflowName,\n\t\t\t\t\t\t\ttags: this.workflowsStore.workflowTags,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.DOWNLOAD: {\n\t\t\t\t\tconst workflowData = await this.workflowHelpers.getWorkflowDataToSave();\n\t\t\t\t\tconst { tags, ...data } = workflowData;\n\t\t\t\t\tconst exportData: IWorkflowToShare = {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t...(this.workflowsStore.workflow.meta || {}),\n\t\t\t\t\t\t\tinstanceId: this.rootStore.instanceId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttags: (tags || []).map((tagId) => {\n\t\t\t\t\t\t\tconst { usageCount, ...tag } = this.tagsStore.getTagById(tagId);\n\n\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t}),\n\t\t\t\t\t};\n\n\t\t\t\t\tconst blob = new Blob([JSON.stringify(exportData, null, 2)], {\n\t\t\t\t\t\ttype: 'application/json;charset=utf-8',\n\t\t\t\t\t});\n\n\t\t\t\t\tlet workflowName = this.workflowName || 'unsaved_workflow';\n\t\t\t\t\tworkflowName = workflowName.replace(/[^a-z0-9]/gi, '_');\n\n\t\t\t\t\tthis.$telemetry.track('User exported workflow', { workflow_id: workflowData.id });\n\t\t\t\t\tsaveAs(blob, workflowName + '.json');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL: {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst promptResponse = (await this.prompt(\n\t\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.prompt.workflowUrl') + ':',\n\t\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.prompt.importWorkflowFromUrl') + ':',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('mainSidebar.prompt.import'),\n\t\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('mainSidebar.prompt.cancel'),\n\t\t\t\t\t\t\t\tinputErrorMessage: this.$locale.baseText('mainSidebar.prompt.invalidUrl'),\n\t\t\t\t\t\t\t\tinputPattern: /^http[s]?:\\/\\/.*\\.json$/i,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)) as MessageBoxInputData;\n\n\t\t\t\t\t\tnodeViewEventBus.emit('importWorkflowUrl', { url: promptResponse.value });\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE: {\n\t\t\t\t\t(this.$refs.importFile as HTMLInputElement).click();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.PUSH: {\n\t\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.onSaveButtonClick();\n\n\t\t\t\t\t\tconst status = await this.sourceControlStore.getAggregatedStatus();\n\n\t\t\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\t\t\t\t\tdata: { eventBus: this.eventBus, status },\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\tswitch (error.message) {\n\t\t\t\t\t\t\tcase 'source_control_not_connected':\n\t\t\t\t\t\t\t\tthis.showError(\n\t\t\t\t\t\t\t\t\t{ ...error, message: '' },\n\t\t\t\t\t\t\t\t\tthis.$locale.baseText('settings.sourceControl.error.not.connected.title'),\n\t\t\t\t\t\t\t\t\tthis.$locale.baseText('settings.sourceControl.error.not.connected.message'),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('error'));\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.SETTINGS: {\n\t\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WORKFLOW_MENU_ACTIONS.DELETE: {\n\t\t\t\t\tconst deleteConfirmed = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.message', {\n\t\t\t\t\t\t\tinterpolate: { workflowName: this.workflowName },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.headline'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tif (deleteConfirmed !== MODAL_CONFIRM) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.workflowsStore.deleteWorkflow(this.currentWorkflowId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('generic.deleteWorkflowError'));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\t\t// Reset tab title since workflow is deleted.\n\t\t\t\t\tthis.titleReset();\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('mainSidebar.showMessage.handleSelect1.title'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\n\t\t\t\t\tawait this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tgoToUpgrade() {\n\t\t\tvoid this.uiStore.goToUpgrade('workflow_sharing', 'upgrade-workflow-sharing');\n\t\t},\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n$--text-line-height: 24px;\n$--header-spacing: 20px;\n\n.container {\n\tposition: relative;\n\ttop: -1px;\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.name-container {\n\tmargin-right: $--header-spacing;\n}\n\n.name {\n\tcolor: $custom-font-dark;\n\tfont-size: 15px;\n}\n\n.activator {\n\tcolor: $custom-font-dark;\n\tfont-weight: 400;\n\tfont-size: 13px;\n\tline-height: $--text-line-height;\n\tdisplay: flex;\n\talign-items: center;\n\n\t> span {\n\t\tmargin-right: 5px;\n\t}\n}\n\n.add-tag {\n\tfont-size: 12px;\n\tpadding: 20px 0; // to be more clickable\n\tcolor: $custom-font-very-light;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\n\t&:hover {\n\t\tcolor: $color-primary;\n\t}\n}\n\n.tags {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tflex: 1;\n\tmargin-right: $--header-spacing;\n}\n\n.tags-edit {\n\tmin-width: 100px;\n\twidth: 100%;\n\tmax-width: 460px;\n}\n\n.actions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-m);\n}\n</style>\n\n<style module lang=\"scss\">\n.group {\n\tdisplay: flex;\n\tgap: var(--spacing-xs);\n}\n.hiddenInput {\n\tdisplay: none;\n}\n\n.deleteItem {\n\tcolor: var(--color-danger);\n}\n\n.disabledShareButton {\n\tcursor: not-allowed;\n}\n\n.workflowHistoryButton {\n\twidth: 30px;\n\theight: 30px;\n\tcolor: var(--color-text-dark);\n\tborder-radius: var(--border-radius-base);\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-base);\n\t}\n\n\t:disabled {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\topacity: 0.5;\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tv-if=\"items\"\n\t\t:class=\"{\n\t\t\t[$style.container]: true,\n\t\t\t['tab-bar-container']: true,\n\t\t\t[$style.menuCollapsed]: mainSidebarCollapsed,\n\t\t}\"\n\t>\n\t\t<n8n-radio-buttons :model-value=\"activeTab\" :options=\"items\" @update:modelValue=\"onSelect\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport type { ITabBarItem } from '@/Interface';\nimport { MAIN_HEADER_TABS } from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport default defineComponent({\n\tname: 'TabBar',\n\tprops: {\n\t\titems: {\n\t\t\ttype: Array as PropType<ITabBarItem[]>,\n\t\t\trequired: true,\n\t\t},\n\t\tactiveTab: {\n\t\t\ttype: String,\n\t\t\tdefault: MAIN_HEADER_TABS.WORKFLOW,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tMAIN_HEADER_TABS,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore),\n\t\tmainSidebarCollapsed(): boolean {\n\t\t\treturn this.uiStore.sidebarMenuCollapsed;\n\t\t},\n\t},\n\tmethods: {\n\t\tonSelect(tab: string, event: MouseEvent): void {\n\t\t\tthis.$emit('select', tab, event);\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tposition: absolute;\n\ttop: 47px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tmin-height: 30px;\n\tdisplay: flex;\n\tpadding: var(--spacing-5xs);\n\tbackground-color: var(--color-foreground-base);\n\tborder-radius: var(--border-radius-base);\n\ttransition: all 150ms ease-in-out;\n}\n\n@media screen and (max-width: 430px) {\n\t.container {\n\t\tflex-direction: column;\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<div :class=\"{ 'main-header': true, expanded: !uiStore.sidebarMenuCollapsed }\">\n\t\t\t<div v-show=\"!hideMenuBar\" class=\"top-menu\">\n\t\t\t\t<WorkflowDetails :read-only=\"readOnly\" />\n\t\t\t\t<TabBar\n\t\t\t\t\tv-if=\"onWorkflowPage\"\n\t\t\t\t\t:items=\"tabBarItems\"\n\t\t\t\t\t:active-tab=\"activeHeaderTab\"\n\t\t\t\t\t@select=\"onTabSelected\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { Route, RouteLocationRaw } from 'vue-router';\nimport { mapStores } from 'pinia';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { pushConnection } from '@/mixins/pushConnection';\nimport WorkflowDetails from '@/components/MainHeader/WorkflowDetails.vue';\nimport TabBar from '@/components/MainHeader/TabBar.vue';\nimport {\n\tMAIN_HEADER_TABS,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n} from '@/constants';\nimport type { INodeUi, ITabBarItem } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport default defineComponent({\n\tname: 'MainHeader',\n\tcomponents: {\n\t\tWorkflowDetails,\n\t\tTabBar,\n\t},\n\tmixins: [pushConnection],\n\tsetup(props, ctx) {\n\t\treturn {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...pushConnection.setup?.(props, ctx),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveHeaderTab: MAIN_HEADER_TABS.WORKFLOW,\n\t\t\tworkflowToReturnTo: '',\n\t\t\tdirtyState: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useUIStore, useSourceControlStore),\n\t\ttabBarItems(): ITabBarItem[] {\n\t\t\treturn [\n\t\t\t\t{ value: MAIN_HEADER_TABS.WORKFLOW, label: this.$locale.baseText('generic.editor') },\n\t\t\t\t{ value: MAIN_HEADER_TABS.EXECUTIONS, label: this.$locale.baseText('generic.executions') },\n\t\t\t];\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\thideMenuBar(): boolean {\n\t\t\treturn Boolean(this.activeNode && this.activeNode.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn this.$route.params.name || this.workflowsStore.workflowId;\n\t\t},\n\t\tonWorkflowPage(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.$route.meta &&\n\t\t\t\t(this.$route.meta.nodeView || this.$route.meta.keepWorkflowAlive === true)\n\t\t\t);\n\t\t},\n\t\tactiveExecution(): ExecutionSummary {\n\t\t\treturn this.workflowsStore.activeWorkflowExecution as ExecutionSummary;\n\t\t},\n\t\treadOnly(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t},\n\twatch: {\n\t\t$route(to, from) {\n\t\t\tthis.syncTabsWithRoute(to);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\tthis.syncTabsWithRoute(this.$route);\n\t},\n\tmethods: {\n\t\tsyncTabsWithRoute(route: Route): void {\n\t\t\tif (\n\t\t\t\troute.name === VIEWS.EXECUTION_HOME ||\n\t\t\t\troute.name === VIEWS.WORKFLOW_EXECUTIONS ||\n\t\t\t\troute.name === VIEWS.EXECUTION_PREVIEW\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t} else if (\n\t\t\t\troute.name === VIEWS.WORKFLOW ||\n\t\t\t\troute.name === VIEWS.NEW_WORKFLOW ||\n\t\t\t\troute.name === VIEWS.EXECUTION_DEBUG\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t}\n\t\t\tconst workflowName = route.params.name;\n\t\t\tif (workflowName !== 'new') {\n\t\t\t\tthis.workflowToReturnTo = workflowName;\n\t\t\t}\n\t\t},\n\t\tonTabSelected(tab: MAIN_HEADER_TABS, event: MouseEvent) {\n\t\t\tconst openInNewTab = event.ctrlKey || event.metaKey;\n\n\t\t\tswitch (tab) {\n\t\t\t\tcase MAIN_HEADER_TABS.WORKFLOW:\n\t\t\t\t\tvoid this.navigateToWorkflowView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MAIN_HEADER_TABS.EXECUTIONS:\n\t\t\t\t\tvoid this.navigateToExecutionsView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToWorkflowView(openInNewTab: boolean) {\n\t\t\tlet routeToNavigateTo: RouteLocationRaw;\n\t\t\tif (!['', 'new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(this.workflowToReturnTo)) {\n\t\t\t\trouteToNavigateTo = {\n\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\tparams: { name: this.workflowToReturnTo },\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\trouteToNavigateTo = { name: VIEWS.NEW_WORKFLOW };\n\t\t\t}\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tif (this.$route.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = this.dirtyState;\n\t\t\t\t}\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToExecutionsView(openInNewTab: boolean) {\n\t\t\tconst routeWorkflowId =\n\t\t\t\tthis.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID ? 'new' : this.currentWorkflow;\n\t\t\tconst routeToNavigateTo: RouteLocationRaw = this.activeExecution\n\t\t\t\t? {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\t\tparams: { name: routeWorkflowId, executionId: this.activeExecution.id },\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\t\t\tparams: { name: routeWorkflowId },\n\t\t\t\t };\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\t\t\tthis.workflowToReturnTo = this.currentWorkflow;\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.main-header {\n\tbackground-color: var(--color-background-xlight);\n\theight: $header-height;\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.top-menu {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: 0.9em;\n\theight: $header-height;\n\tfont-weight: 400;\n\tpadding: 0 var(--spacing-m) 0 var(--spacing-xs);\n}\n</style>\n"],"names":["DEFAULT_WORKFLOW_NAME_LIMIT","WORKFLOW_NAME_END_COUNT_TO_KEEP","_sfc_main$c","defineComponent","shorten","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_sfc_main$b","createEventBus","options","observer","entries","target","isIntersecting","observed","_sfc_main$a","DEFAULT_MAX_TAGS_LIMIT","_sfc_main$9","IntersectionObserver","IntersectionObserved","debounce","mapStores","useTagsStore","tags","tagId","limit","toDisplay","tag","visibleCount","accu","val","hidden","hiddenTitle","countTag","parent","el","_component_IntersectionObserver","_resolveComponent","_createBlock","_normalizeStyle","_withCtx","_createElementVNode","_hoisted_1","_Fragment","_renderList","_normalizeClass","e","_component_el_tag","_component_IntersectionObserved","_createVNode","_sfc_main$8","value","_sfc_main$7","ExpandableInputBase","_a","_directive_on_click_outside","_resolveDirective","_component_ExpandableInputBase","_withDirectives","args","_sfc_main$6","_sfc_main$5","ExpandableInputEdit","ExpandableInputPreview","newValue","onSubmit","updated","_component_ExpandableInputPreview","_withModifiers","_component_ExpandableInputEdit","_sfc_main$4","callDebounced","useDebounce","BREAKPOINT_SM","BREAKPOINT_XL","BREAKPOINT_LG","BREAKPOINT_MD","bannerHeight","getBannerRowHeight","useUIStore","_renderSlot","collaborationStore","useCollaborationStore","usersStore","useUsersStore","workflowsStore","useWorkflowsStore","HEARTBEAT_INTERVAL","TIME","heartbeatTimer","ref","activeUsersSorted","computed","currentWorkflowUsers","userInfo","owner","user","currentUserEmail","startHeartbeat","stopHeartbeat","onDocumentVisibilityChange","onMounted","onBeforeUnmount","hasChanged","prev","curr","set","_sfc_main$2","TagsContainer","PushConnectionTracker","ShortenName","WorkflowActivator","SaveButton","TagsDropdown","InlineTextEdit","BreakpointsObserver","CollaborationPane","router","useRouter","useWorkflowHelpers","useTitleChange","useToast","useMessage","MAX_WORKFLOW_NAME_LENGTH","EnterpriseEditionFeature","useRootStore","useSettingsStore","useUsageStore","useSourceControlStore","useCanvasStore","PLACEHOLDER_EMPTY_WORKFLOW_ID","VIEWS","getWorkflowPermissions","actions","WORKFLOW_MENU_ACTIONS","hasPermission","currentId","WORKFLOW_SHARE_MODAL_KEY","current","saved","name","cb","newName","inputRef","reader","workflowData","nodeViewEventBus","action","DUPLICATE_MODAL_KEY","data","exportData","usageCount","blob","workflowName","saveAs","promptResponse","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","WORKFLOW_SETTINGS_MODAL_KEY","MODAL_CONFIRM","_hoisted_2","_hoisted_4","_component_PushConnectionTracker","_component_BreakpointsObserver","_component_ShortenName","shortenedName","_component_InlineTextEdit","_component_TagsDropdown","$event","_hoisted_3","_toDisplayString","_component_TagsContainer","_component_WorkflowActivator","_component_enterprise_edition","_component_n8n_tooltip","_component_i18n_t","_component_n8n_button","_component_CollaborationPane","_component_SaveButton","_component_router_link","_component_n8n_icon_button","_createCommentVNode","_component_n8n_action_dropdown","_sfc_main$1","MAIN_HEADER_TABS","tab","event","_component_n8n_radio_buttons","_sfc_main","WorkflowDetails","TabBar","pushConnection","props","ctx","_b","useNDVStore","STICKY_NODE_TYPE","to","from","route","openInNewTab","routeToNavigateTo","href","routeWorkflowId","_component_WorkflowDetails","_component_TabBar"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{_ as U,b as A,u as P,ap as G,S as F,d as z,m as W,d6 as j,x as V,O as K,e as Y,h as R,dx as Q,dz as J,k as X,aA as Z,v as ee,cO as te,f as se,l as oe,V as C,cN as ne,A as ae,a8 as re}from"./n8n-oSulVm5C.js";import{ag as d,l as g,m as T,T as i,p as u,I as a,G as L,e as E,O as c,S as y,R as b,u as p,Q as w,r as N,aE as ie,M as I,J as le,n as ce,a9 as ue}from"./vendor-e5jTRqqt.js";import{f as de,d as H,s as pe,g as me,b as be,h as ge}from"./index-6DR75wmI.js";import{d as he,m as _e}from"./pinia-jQLgEt_L.js";import{D as B}from"./luxon-ZRIU05qF.js";import"./lodash-es-JdX4GWLn.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./@vueuse/core-eU1v7QRm.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-IDI7B_27.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-feLn5IS9.js";import"./@lezer/common-1hBQ1gIF.js";import"./codemirror-lang-html-n8n-wWQLhhqk.js";import"./prettier-s3fE3Qyr.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-n8n-expression-HpIZnV_9.js";import"./fast-json-stable-stringify-z-DLxjte.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-b4L9G_D6.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const fe="_notification_j2u1w_12",Se={"gift-icon":"_gift-icon_j2u1w_5",notification:fe},Ce={},ye=u("div",null,null,-1),Te=[ye];function ve(e,t){const n=d("font-awesome-icon");return g(),T("div",{class:a(e.$style["gift-icon"])},[i(n,{icon:"gift"}),u("div",{class:a(e.$style.notification)},Te,2)],2)}const xe={$style:Se},ke=U(Ce,[["render",ve],["__cssModules",xe]]),Ee=["value","max"],we=8,$e=L({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const t=e,n=B.utc(),h=E(()=>{const{days:o=0}=m().diff(n,["days"]).toObject();return Math.ceil(o)}),l=E(()=>{var _;if(!((_=t.cloudPlanData)!=null&&_.expirationDate))return!1;const o=B.fromISO(t.cloudPlanData.expirationDate);return n.toMillis()>o.toMillis()}),m=()=>{var o;return B.fromISO(((o=t==null?void 0:t.cloudPlanData)==null?void 0:o.expirationDate)??"")},r=E(()=>{var o;return(o=t.cloudPlanData)!=null&&o.usage?t.cloudPlanData.usage.executions<t.cloudPlanData.monthlyExecutionsLimit:0}),v=E(()=>{var s;if(!((s=t.cloudPlanData)!=null&&s.usage))return 0;const o=t.cloudPlanData.usage.executions,_=t.cloudPlanData.monthlyExecutionsLimit;return o>_?_:o}),x=E(()=>{var f;if(!((f=t.cloudPlanData)!=null&&f.usage))return 0;const o=t.cloudPlanData.usage.executions,_=t.cloudPlanData.monthlyExecutionsLimit,s=we*_/100;return o<s?s:o}),k=E(()=>{var o;return(o=t.cloudPlanData)!=null&&o.monthlyExecutionsLimit?t.cloudPlanData.monthlyExecutionsLimit:0}),$=()=>{P().goToUpgrade("canvas-nav","upgrade-canvas-nav","redirect")};return(o,_)=>{const s=d("n8n-text"),f=d("i18n-t"),S=d("n8n-button");return g(),T("div",{class:a(o.$style.container)},[l.value?(g(),T("div",{key:0,class:a(o.$style.usageText)},[i(s,{size:"small",color:"danger"},{default:c(()=>[y(b(p(A).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!l.value&&r.value?(g(),T("div",{key:1,class:a(o.$style.usageText)},[i(f,{tag:"span",keypath:"executionUsage.currentUsage"},{text:c(()=>[i(s,{size:"small",color:"text-dark"},{default:c(()=>[y(b(p(A).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:c(()=>[i(s,{size:"small",bold:!0,color:"warning"},{default:c(()=>[y(b(p(A).baseText("executionUsage.currentUsage.count",{adjustToNumber:h.value||0})),1)]),_:1})]),_:1})],2)):r.value?w("",!0):(g(),T("div",{key:2,class:a(o.$style.usageText)},[i(s,{size:"small"},{default:c(()=>[y(b(p(A).baseText("executionUsage.ranOutOfExecutions.text")),1)]),_:1})],2)),l.value?w("",!0):(g(),T("div",{key:3,class:a(o.$style.usageCounter)},[u("div",{class:a(o.$style.progressBarDiv)},[u("progress",{class:a([r.value?o.$style.progressBarSuccess:o.$style.progressBarDanger,o.$style.progressBar]),value:x.value,max:k.value},null,10,Ee)],2),u("div",{class:a(o.$style.executionsCountSection)},[i(s,{size:"xsmall",color:r.value?"text-dark":"danger"},{default:c(()=>[y(b(v.value)+"/"+b(k.value),1)]),_:1},8,["color"]),i(s,{size:"xsmall",color:r.value?"text-dark":"danger"},{default:c(()=>[y(b(p(A).baseText("executionUsage.label.executions")),1)]),_:1},8,["color"])],2)],2)),u("div",{class:a(o.$style.upgradeButtonSection)},[i(S,{label:p(A).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:$},null,8,["label"])],2)],2)}}}),Me="_container_itrcs_5",Ae="_progressBarDiv_itrcs_13",Be="_progressBar_itrcs_13",De="_progressBarSuccess_itrcs_42",Ie="_progressBarDanger_itrcs_52",Ue="_usageText_itrcs_61",Le="_usageCounter_itrcs_68",Oe="_danger_itrcs_77",Re="_executionsCountSection_itrcs_81",Ne="_upgradeButtonSection_itrcs_85",Pe={container:Me,progressBarDiv:Ae,progressBar:Be,progressBarSuccess:De,progressBarDanger:Ie,usageText:Ue,usageCounter:Le,danger:Oe,executionsCountSection:Re,upgradeButtonSection:Ne},ze={$style:Pe},We=U($e,[["__cssModules",ze]]);async function Ve(e){return await G(e.baseUrl,"/cta/become-creator")}const He="N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT",qe=30,Ge=15*60*1e3,q=he(F.BECOME_TEMPLATE_CREATOR,()=>{const e=z(),t=W(),n=j(He),h=N(!1),l=N(null),m=E(()=>n.value?!Fe(n.value):!1),r=E(()=>h.value&&!e.userIsTrialing&&!m.value),v=()=>{n.value=B.now().toISO()},x=async()=>{const _=await Ve(t.getRestApiContext);h.value=_},k=async()=>{m.value||e.userIsTrialing||h.value||await x()};return{showBecomeCreatorCta:r,dismissCta:v,startMonitoringCta:()=>{l.value||(setTimeout(k,1e3),l.value=setInterval(k,Ge))},stopMonitoringCta:()=>{l.value&&(clearInterval(l.value),l.value=null)}}});function Fe(e){return B.fromISO(e).plus({days:qe})<=B.now()}const je=L({__name:"BecomeTemplateCreatorCta",setup(e){const t=V(),n=q(),h=K(),l=()=>{h.track("User clicked become creator CTA")};return(m,r)=>{const v=d("n8n-icon"),x=d("n8n-button");return p(n).showBecomeCreatorCta?(g(),T("div",{key:0,class:a(m.$style.container),"data-test-id":"become-template-creator-cta"},[u("div",{class:a(m.$style.textAndCloseButton)},[u("p",{class:a(m.$style.text)},b(p(t).baseText("becomeCreator.text")),3),u("button",{class:a(m.$style.closeButton),"data-test-id":"close-become-template-creator-cta",onClick:r[0]||(r[0]=k=>p(n).dismissCta())},[i(v,{icon:"times",size:"xsmall",title:p(t).baseText("generic.close")},null,8,["title"])],2)],2),i(x,{class:a(m.$style.becomeCreatorButton),label:p(t).baseText("becomeCreator.buttonText"),size:"xmini",type:"secondary",element:"a",href:"https://creators.n8n.io/hub",target:"_blank",onClick:l},null,8,["class","label"])],2)):w("",!0)}}}),Ke="_container_19xl2_5",Ye="_textAndCloseButton_19xl2_13",Qe="_text_19xl2_13",Je="_closeButton_19xl2_26",Xe="_becomeCreatorButton_19xl2_39",Ze={container:Ke,textAndCloseButton:Ye,text:Qe,closeButton:Je,becomeCreatorButton:Xe},et={$style:Ze},tt=U(je,[["__cssModules",et]]),st=L({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const t={CONFLICT:409};ie();const n=de(),h=P(),l=H(),m=Y(),r=V(),v=X(),x=N(300),k=E(()=>l.preferences.branchName),$=E(()=>l.isEnterpriseSourceControlEnabled&&R(["rbac"],{rbac:{scope:"sourceControl:manage"}}));async function o(){n.startLoading(),n.setLoadingText(r.baseText("settings.sourceControl.loading.checkingForChanges"));try{const s=await l.getAggregatedStatus();h.openModalWithData({name:Q,data:{eventBus:v,status:s}})}catch(s){m.showError(s,r.baseText("error"))}finally{n.stopLoading(),n.setLoadingText(r.baseText("genericHelpers.loading"))}}async function _(){n.startLoading(),n.setLoadingText(r.baseText("settings.sourceControl.loading.pull"));try{const s=await l.pullWorkfolder(!1)||[];if(s.filter(S=>!(S.type==="workflow"&&S.status==="created"&&S.location==="local")).length===0)m.showMessage({title:r.baseText("settings.sourceControl.pull.upToDate.title"),message:r.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{m.showMessage({title:r.baseText("settings.sourceControl.pull.success.title"),type:"success"});const S=["variables","credential"];(s||[]).some(M=>S.includes(M.type))&&ce(()=>{m.showMessage({message:r.baseText("settings.sourceControl.pull.oneLastStep.description"),title:r.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}pe.emit("pull")}catch(s){const f=s.response;(f==null?void 0:f.status)===t.CONFLICT?h.openModalWithData({name:J,data:{eventBus:v,status:f.data.data}}):m.showError(s,"Error")}finally{n.stopLoading(),n.setLoadingText(r.baseText("genericHelpers.loading"))}}return(s,f)=>{const S=d("n8n-icon"),D=d("n8n-button"),M=d("n8n-tooltip");return $.value?(g(),T("div",{key:0,class:a({[s.$style.sync]:!0,[s.$style.collapsed]:s.isCollapsed,[s.$style.isConnected]:p(l).isEnterpriseSourceControlEnabled}),style:le({borderLeftColor:p(l).preferences.branchColor}),"data-test-id":"main-sidebar-source-control"},[p(l).preferences.connected&&p(l).preferences.branchName?(g(),T("div",{key:0,class:a(s.$style.connected),"data-test-id":"main-sidebar-source-control-connected"},[u("span",{class:a(s.$style.branchName)},[i(S,{icon:"code-branch"}),y(" "+b(k.value),1)],2),u("div",{class:a({"pt-xs":!s.isCollapsed})},[i(M,{disabled:!s.isCollapsed,"show-after":x.value,placement:"right"},{content:c(()=>[u("div",null,b(p(r).baseText("settings.sourceControl.button.pull")),1)]),default:c(()=>[i(D,{class:a({"mr-2xs":!s.isCollapsed,"mb-2xs":s.isCollapsed&&!p(l).preferences.branchReadOnly}),icon:"arrow-down",type:"tertiary",size:"mini",square:s.isCollapsed,label:s.isCollapsed?"":p(r).baseText("settings.sourceControl.button.pull"),onClick:_},null,8,["class","square","label"])]),_:1},8,["disabled","show-after"]),p(l).preferences.branchReadOnly?w("",!0):(g(),I(M,{key:0,disabled:!s.isCollapsed,"show-after":x.value,placement:"right"},{content:c(()=>[u("div",null,b(p(r).baseText("settings.sourceControl.button.push")),1)]),default:c(()=>[i(D,{square:s.isCollapsed,label:s.isCollapsed?"":p(r).baseText("settings.sourceControl.button.push"),icon:"arrow-up",type:"tertiary",size:"mini",onClick:o},null,8,["square","label"])]),_:1},8,["disabled","show-after"]))],2)],2)):w("",!0)],6)):w("",!0)}}}),ot="_sync_1bnfs_5",nt="_isConnected_1bnfs_12",at="_collapsed_1bnfs_16",rt="_branchName_1bnfs_26",it="_connected_1bnfs_36",lt={sync:ot,isConnected:nt,collapsed:at,branchName:rt,connected:it},ct={$style:lt},ut=U(st,[["__cssModules",ct]]),dt=L({name:"MainSidebar",components:{GiftNotificationIcon:ke,ExecutionsUsage:We,MainSidebarSourceControl:ut,BecomeTemplateCreatorCta:tt},mixins:[me],setup(e,t){const n=re(),{callDebounced:h}=Z();return{externalHooks:n,callDebounced:h,...be()}},data(){return{basePath:"",fullyExpanded:!1}},computed:{..._e(W,oe,P,se,te,ee,z,H,q,ge),logoPath(){return this.basePath+(this.isCollapsed?"static/logo/collapsed.svg":this.uiStore.logo)},hasVersionUpdates(){return this.settingsStore.settings.releaseChannel==="stable"&&this.versionsStore.hasVersionUpdates},nextVersions(){return this.versionsStore.nextVersions},isCollapsed(){return this.uiStore.sidebarMenuCollapsed},canUserAccessSettings(){return this.findFirstAccessibleSettingsRoute()!==null},showUserArea(){return R(["authenticated"])},workflowExecution(){return this.workflowsStore.getWorkflowExecution},userMenuItems(){return[{id:"settings",label:this.$locale.baseText("settings")},{id:"logout",label:this.$locale.baseText("auth.signout")}]},mainMenuItems(){const e=[],t={id:"workflows",icon:"network-wired",label:this.$locale.baseText("mainSidebar.workflows"),position:"top",route:{to:{name:C.WORKFLOWS}},secondaryIcon:this.sourceControlStore.preferences.branchReadOnly?{name:"lock",tooltip:{content:this.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")}}:void 0},n=this.findFirstAccessibleSettingsRoute(),h=[t,{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"top",available:this.settingsStore.isTemplatesEnabled&&this.templatesStore.hasCustomTemplatesHost,route:{to:{name:C.TEMPLATES}}},{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"top",available:this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost,link:{href:this.templatesStore.getWebsiteTemplateRepositoryURL,target:"_blank"}},{id:"credentials",icon:"key",label:this.$locale.baseText("mainSidebar.credentials"),customIconSize:"medium",position:"top",route:{to:{name:C.CREDENTIALS}}},{id:"variables",icon:"variable",label:this.$locale.baseText("mainSidebar.variables"),customIconSize:"medium",position:"top",route:{to:{name:C.VARIABLES}}},{id:"executions",icon:"tasks",label:this.$locale.baseText("mainSidebar.executions"),position:"top",route:{to:{name:C.EXECUTIONS}}},{id:"cloud-admin",position:"bottom",label:"Admin Panel",icon:"home",available:this.settingsStore.isCloudDeployment&&R(["instanceOwner"])},{id:"settings",icon:"cog",label:this.$locale.baseText("settings"),position:"bottom",available:this.canUserAccessSettings&&this.usersStore.currentUser!==null,activateOnRouteNames:[C.USERS_SETTINGS,C.API_SETTINGS,C.PERSONAL_SETTINGS],route:{to:n}},{id:"help",icon:"question",label:"Help",position:"bottom",children:[{id:"quickstart",icon:"video",label:this.$locale.baseText("mainSidebar.helpMenuItems.quickstart"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"docs",icon:"book",label:this.$locale.baseText("mainSidebar.helpMenuItems.documentation"),link:{href:"https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"forum",icon:"users",label:this.$locale.baseText("mainSidebar.helpMenuItems.forum"),link:{href:"https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"examples",icon:"graduation-cap",label:this.$locale.baseText("mainSidebar.helpMenuItems.course"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"about",icon:"info",label:this.$locale.baseText("mainSidebar.aboutN8n"),position:"bottom"}]}];return[...e,...h]},userIsTrialing(){return this.cloudPlanStore.userIsTrialing},currentPlanAndUsageData(){const e=this.cloudPlanStore.currentPlanData,t=this.cloudPlanStore.currentUsageData;return!e||!t?null:{...e,usage:t}}},async mounted(){this.basePath=this.rootStore.baseUrl,this.$refs.user&&this.externalHooks.run("mainSidebar.mounted",{userRef:this.$refs.user}),this.$nextTick(()=>{window.innerWidth<900||this.uiStore.isNodeView?this.uiStore.sidebarMenuCollapsed=!0:this.uiStore.sidebarMenuCollapsed=!1,this.fullyExpanded=!this.isCollapsed}),this.becomeTemplateCreatorStore.startMonitoringCta()},created(){window.addEventListener("resize",this.onResize)},beforeUnmount(){this.becomeTemplateCreatorStore.stopMonitoringCta(),window.removeEventListener("resize",this.onResize)},methods:{trackHelpItemClick(e){this.$telemetry.track("User clicked help resource",{type:e,workflow_id:this.workflowsStore.workflowId})},trackTemplatesClick(){this.$telemetry.track("User clicked on templates",{})},async onUserActionToggle(e){switch(e){case"logout":this.onLogout();break;case"settings":this.$router.push({name:C.PERSONAL_SETTINGS});break}},onLogout(){this.$router.push({name:C.SIGNOUT})},toggleCollapse(){this.uiStore.toggleSidebarMenuCollapse(),this.isCollapsed?this.fullyExpanded=!this.isCollapsed:setTimeout(()=>{this.fullyExpanded=!this.isCollapsed},300)},openUpdatesPanel(){this.uiStore.openModal(ne)},async handleSelect(e){switch(e){case"templates":this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost&&this.trackTemplatesClick();break;case"about":{this.trackHelpItemClick("about"),this.uiStore.openModal(ae);break}case"cloud-admin":{this.cloudPlanStore.redirectToDashboard();break}case"quickstart":case"docs":case"forum":case"examples":{this.trackHelpItemClick(e);break}}},findFirstAccessibleSettingsRoute(){const e=this.$router.getRoutes().find(n=>n.path==="/settings").children.map(n=>n.name??"");let t={name:C.USERS_SETTINGS};for(const n of e)if(this.canUserAccessRouteByName(n.toString())){t={name:n.toString()};break}return t},onResize(e){this.callDebounced(this.onResizeEnd,{debounceTime:100},e)},async onResizeEnd(e){const t=e.target.outerWidth;await this.checkWidthAndAdjustSidebar(t)},async checkWidthAndAdjustSidebar(e){e<900&&(this.uiStore.sidebarMenuCollapsed=!0,await this.$nextTick(),this.fullyExpanded=!this.isCollapsed)}}}),pt="_sideMenu_q79od_5",mt="_logo_q79od_12",bt="_sideMenuCollapsed_q79od_23",gt="_sideMenuCollapseButton_q79od_30",ht="_updates_q79od_49",_t="_expanded_q79od_62",ft="_userArea_q79od_69",St="_userName_q79od_76",Ct="_userActions_q79od_90",yt={sideMenu:pt,logo:mt,sideMenuCollapsed:bt,sideMenuCollapseButton:gt,updates:ht,expanded:_t,userArea:ft,userName:St,userActions:Ct},Tt=["src"],vt={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function xt(e,t,n,h,l,m){const r=d("n8n-icon"),v=d("BecomeTemplateCreatorCta"),x=d("ExecutionsUsage"),k=d("GiftNotificationIcon"),$=d("n8n-text"),o=d("MainSidebarSourceControl"),_=d("n8n-avatar"),s=d("el-dropdown-item"),f=d("el-dropdown-menu"),S=d("el-dropdown"),D=d("n8n-action-dropdown"),M=d("n8n-menu");return g(),T("div",{id:"side-menu",class:a({"side-menu":!0,[e.$style.sideMenu]:!0,[e.$style.sideMenuCollapsed]:e.isCollapsed})},[u("div",{id:"collapse-change-button",class:a(["clickable",e.$style.sideMenuCollapseButton]),onClick:t[0]||(t[0]=(...O)=>e.toggleCollapse&&e.toggleCollapse(...O))},[e.isCollapsed?(g(),I(r,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(g(),I(r,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),i(M,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ue({header:c(()=>[u("div",{class:a(e.$style.logo)},[u("img",{src:e.logoPath,"data-test-id":"n8n-logo",class:a(e.$style.icon),alt:"n8n"},null,10,Tt)],2)]),beforeLowerMenu:c(()=>[e.fullyExpanded&&!e.userIsTrialing?(g(),I(v,{key:0})):w("",!0),e.fullyExpanded&&e.userIsTrialing?(g(),I(x,{key:1,"cloud-plan-data":e.currentPlanAndUsageData},null,8,["cloud-plan-data"])):w("",!0)]),menuSuffix:c(()=>[u("div",null,[e.hasVersionUpdates?(g(),T("div",{key:0,"data-test-id":"version-updates-panel-button",class:a(e.$style.updates),onClick:t[1]||(t[1]=(...O)=>e.openUpdatesPanel&&e.openUpdatesPanel(...O))},[u("div",{class:a(e.$style.giftContainer)},[i(k)],2),i($,{class:a({"ml-xs":!0,[e.$style.expanded]:e.fullyExpanded}),color:"text-base"},{default:c(()=>[y(b(e.nextVersions.length>99?"99+":e.nextVersions.length)+" update"+b(e.nextVersions.length>1?"s":""),1)]),_:1},8,["class"])],2)):w("",!0),i(o,{"is-collapsed":e.isCollapsed},null,8,["is-collapsed"])])]),_:2},[e.showUserArea?{name:"footer",fn:c(()=>[u("div",{class:a(e.$style.userArea)},[u("div",vt,[i(S,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:c(()=>[i(f,null,{default:c(()=>[i(s,{command:"settings"},{default:c(()=>[y(b(e.$locale.baseText("settings")),1)]),_:1}),i(s,{command:"logout"},{default:c(()=>[y(b(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:c(()=>[u("div",{class:a({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[i(_,{"first-name":e.usersStore.currentUser.firstName,"last-name":e.usersStore.currentUser.lastName,size:"small"},null,8,["first-name","last-name"])],2)]),_:1},8,["disabled","onCommand"])]),u("div",{class:a({"ml-2xs":!0,[e.$style.userName]:!0,[e.$style.expanded]:e.fullyExpanded})},[i($,{size:"small",bold:!0,color:"text-dark"},{default:c(()=>[y(b(e.usersStore.currentUser.fullName),1)]),_:1})],2),u("div",{class:a({[e.$style.userActions]:!0,[e.$style.expanded]:e.fullyExpanded})},[i(D,{items:e.userMenuItems,placement:"top-start","data-test-id":"user-menu",onSelect:e.onUserActionToggle},null,8,["items","onSelect"])],2)],2)]),key:"0"}:void 0]),1032,["items","collapsed","onSelect"])],2)}const kt={$style:yt},es=U(dt,[["render",xt],["__cssModules",kt]]);export{es as default};
2
- //# sourceMappingURL=MainSidebar-rQpe5M3X.js.map
1
+ import{_ as U,b as A,u as P,ap as G,S as F,d as z,m as W,d6 as j,x as V,O as K,e as Y,h as R,dx as Q,dz as J,k as X,aA as Z,v as ee,cO as te,f as se,l as oe,V as C,cN as ne,A as ae,a8 as re}from"./n8n-oSulVm5C.js";import{ag as d,l as g,m as T,T as i,p as u,I as a,G as L,e as E,O as c,S as y,R as b,u as p,Q as w,r as N,aE as ie,M as I,J as le,n as ce,a9 as ue}from"./vendor-e5jTRqqt.js";import{f as de,d as H,s as pe,g as me,b as be,h as ge}from"./index-36CdMZUz.js";import{d as he,m as _e}from"./pinia-jQLgEt_L.js";import{D as B}from"./luxon-ZRIU05qF.js";import"./lodash-es-JdX4GWLn.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./@vueuse/core-eU1v7QRm.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-IDI7B_27.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-feLn5IS9.js";import"./@lezer/common-1hBQ1gIF.js";import"./codemirror-lang-html-n8n-wWQLhhqk.js";import"./prettier-s3fE3Qyr.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-n8n-expression-HpIZnV_9.js";import"./fast-json-stable-stringify-z-DLxjte.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-b4L9G_D6.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const fe="_notification_j2u1w_12",Se={"gift-icon":"_gift-icon_j2u1w_5",notification:fe},Ce={},ye=u("div",null,null,-1),Te=[ye];function ve(e,t){const n=d("font-awesome-icon");return g(),T("div",{class:a(e.$style["gift-icon"])},[i(n,{icon:"gift"}),u("div",{class:a(e.$style.notification)},Te,2)],2)}const xe={$style:Se},ke=U(Ce,[["render",ve],["__cssModules",xe]]),Ee=["value","max"],we=8,$e=L({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const t=e,n=B.utc(),h=E(()=>{const{days:o=0}=m().diff(n,["days"]).toObject();return Math.ceil(o)}),l=E(()=>{var _;if(!((_=t.cloudPlanData)!=null&&_.expirationDate))return!1;const o=B.fromISO(t.cloudPlanData.expirationDate);return n.toMillis()>o.toMillis()}),m=()=>{var o;return B.fromISO(((o=t==null?void 0:t.cloudPlanData)==null?void 0:o.expirationDate)??"")},r=E(()=>{var o;return(o=t.cloudPlanData)!=null&&o.usage?t.cloudPlanData.usage.executions<t.cloudPlanData.monthlyExecutionsLimit:0}),v=E(()=>{var s;if(!((s=t.cloudPlanData)!=null&&s.usage))return 0;const o=t.cloudPlanData.usage.executions,_=t.cloudPlanData.monthlyExecutionsLimit;return o>_?_:o}),x=E(()=>{var f;if(!((f=t.cloudPlanData)!=null&&f.usage))return 0;const o=t.cloudPlanData.usage.executions,_=t.cloudPlanData.monthlyExecutionsLimit,s=we*_/100;return o<s?s:o}),k=E(()=>{var o;return(o=t.cloudPlanData)!=null&&o.monthlyExecutionsLimit?t.cloudPlanData.monthlyExecutionsLimit:0}),$=()=>{P().goToUpgrade("canvas-nav","upgrade-canvas-nav","redirect")};return(o,_)=>{const s=d("n8n-text"),f=d("i18n-t"),S=d("n8n-button");return g(),T("div",{class:a(o.$style.container)},[l.value?(g(),T("div",{key:0,class:a(o.$style.usageText)},[i(s,{size:"small",color:"danger"},{default:c(()=>[y(b(p(A).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!l.value&&r.value?(g(),T("div",{key:1,class:a(o.$style.usageText)},[i(f,{tag:"span",keypath:"executionUsage.currentUsage"},{text:c(()=>[i(s,{size:"small",color:"text-dark"},{default:c(()=>[y(b(p(A).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:c(()=>[i(s,{size:"small",bold:!0,color:"warning"},{default:c(()=>[y(b(p(A).baseText("executionUsage.currentUsage.count",{adjustToNumber:h.value||0})),1)]),_:1})]),_:1})],2)):r.value?w("",!0):(g(),T("div",{key:2,class:a(o.$style.usageText)},[i(s,{size:"small"},{default:c(()=>[y(b(p(A).baseText("executionUsage.ranOutOfExecutions.text")),1)]),_:1})],2)),l.value?w("",!0):(g(),T("div",{key:3,class:a(o.$style.usageCounter)},[u("div",{class:a(o.$style.progressBarDiv)},[u("progress",{class:a([r.value?o.$style.progressBarSuccess:o.$style.progressBarDanger,o.$style.progressBar]),value:x.value,max:k.value},null,10,Ee)],2),u("div",{class:a(o.$style.executionsCountSection)},[i(s,{size:"xsmall",color:r.value?"text-dark":"danger"},{default:c(()=>[y(b(v.value)+"/"+b(k.value),1)]),_:1},8,["color"]),i(s,{size:"xsmall",color:r.value?"text-dark":"danger"},{default:c(()=>[y(b(p(A).baseText("executionUsage.label.executions")),1)]),_:1},8,["color"])],2)],2)),u("div",{class:a(o.$style.upgradeButtonSection)},[i(S,{label:p(A).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:$},null,8,["label"])],2)],2)}}}),Me="_container_itrcs_5",Ae="_progressBarDiv_itrcs_13",Be="_progressBar_itrcs_13",De="_progressBarSuccess_itrcs_42",Ie="_progressBarDanger_itrcs_52",Ue="_usageText_itrcs_61",Le="_usageCounter_itrcs_68",Oe="_danger_itrcs_77",Re="_executionsCountSection_itrcs_81",Ne="_upgradeButtonSection_itrcs_85",Pe={container:Me,progressBarDiv:Ae,progressBar:Be,progressBarSuccess:De,progressBarDanger:Ie,usageText:Ue,usageCounter:Le,danger:Oe,executionsCountSection:Re,upgradeButtonSection:Ne},ze={$style:Pe},We=U($e,[["__cssModules",ze]]);async function Ve(e){return await G(e.baseUrl,"/cta/become-creator")}const He="N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT",qe=30,Ge=15*60*1e3,q=he(F.BECOME_TEMPLATE_CREATOR,()=>{const e=z(),t=W(),n=j(He),h=N(!1),l=N(null),m=E(()=>n.value?!Fe(n.value):!1),r=E(()=>h.value&&!e.userIsTrialing&&!m.value),v=()=>{n.value=B.now().toISO()},x=async()=>{const _=await Ve(t.getRestApiContext);h.value=_},k=async()=>{m.value||e.userIsTrialing||h.value||await x()};return{showBecomeCreatorCta:r,dismissCta:v,startMonitoringCta:()=>{l.value||(setTimeout(k,1e3),l.value=setInterval(k,Ge))},stopMonitoringCta:()=>{l.value&&(clearInterval(l.value),l.value=null)}}});function Fe(e){return B.fromISO(e).plus({days:qe})<=B.now()}const je=L({__name:"BecomeTemplateCreatorCta",setup(e){const t=V(),n=q(),h=K(),l=()=>{h.track("User clicked become creator CTA")};return(m,r)=>{const v=d("n8n-icon"),x=d("n8n-button");return p(n).showBecomeCreatorCta?(g(),T("div",{key:0,class:a(m.$style.container),"data-test-id":"become-template-creator-cta"},[u("div",{class:a(m.$style.textAndCloseButton)},[u("p",{class:a(m.$style.text)},b(p(t).baseText("becomeCreator.text")),3),u("button",{class:a(m.$style.closeButton),"data-test-id":"close-become-template-creator-cta",onClick:r[0]||(r[0]=k=>p(n).dismissCta())},[i(v,{icon:"times",size:"xsmall",title:p(t).baseText("generic.close")},null,8,["title"])],2)],2),i(x,{class:a(m.$style.becomeCreatorButton),label:p(t).baseText("becomeCreator.buttonText"),size:"xmini",type:"secondary",element:"a",href:"https://creators.n8n.io/hub",target:"_blank",onClick:l},null,8,["class","label"])],2)):w("",!0)}}}),Ke="_container_19xl2_5",Ye="_textAndCloseButton_19xl2_13",Qe="_text_19xl2_13",Je="_closeButton_19xl2_26",Xe="_becomeCreatorButton_19xl2_39",Ze={container:Ke,textAndCloseButton:Ye,text:Qe,closeButton:Je,becomeCreatorButton:Xe},et={$style:Ze},tt=U(je,[["__cssModules",et]]),st=L({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const t={CONFLICT:409};ie();const n=de(),h=P(),l=H(),m=Y(),r=V(),v=X(),x=N(300),k=E(()=>l.preferences.branchName),$=E(()=>l.isEnterpriseSourceControlEnabled&&R(["rbac"],{rbac:{scope:"sourceControl:manage"}}));async function o(){n.startLoading(),n.setLoadingText(r.baseText("settings.sourceControl.loading.checkingForChanges"));try{const s=await l.getAggregatedStatus();h.openModalWithData({name:Q,data:{eventBus:v,status:s}})}catch(s){m.showError(s,r.baseText("error"))}finally{n.stopLoading(),n.setLoadingText(r.baseText("genericHelpers.loading"))}}async function _(){n.startLoading(),n.setLoadingText(r.baseText("settings.sourceControl.loading.pull"));try{const s=await l.pullWorkfolder(!1)||[];if(s.filter(S=>!(S.type==="workflow"&&S.status==="created"&&S.location==="local")).length===0)m.showMessage({title:r.baseText("settings.sourceControl.pull.upToDate.title"),message:r.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{m.showMessage({title:r.baseText("settings.sourceControl.pull.success.title"),type:"success"});const S=["variables","credential"];(s||[]).some(M=>S.includes(M.type))&&ce(()=>{m.showMessage({message:r.baseText("settings.sourceControl.pull.oneLastStep.description"),title:r.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}pe.emit("pull")}catch(s){const f=s.response;(f==null?void 0:f.status)===t.CONFLICT?h.openModalWithData({name:J,data:{eventBus:v,status:f.data.data}}):m.showError(s,"Error")}finally{n.stopLoading(),n.setLoadingText(r.baseText("genericHelpers.loading"))}}return(s,f)=>{const S=d("n8n-icon"),D=d("n8n-button"),M=d("n8n-tooltip");return $.value?(g(),T("div",{key:0,class:a({[s.$style.sync]:!0,[s.$style.collapsed]:s.isCollapsed,[s.$style.isConnected]:p(l).isEnterpriseSourceControlEnabled}),style:le({borderLeftColor:p(l).preferences.branchColor}),"data-test-id":"main-sidebar-source-control"},[p(l).preferences.connected&&p(l).preferences.branchName?(g(),T("div",{key:0,class:a(s.$style.connected),"data-test-id":"main-sidebar-source-control-connected"},[u("span",{class:a(s.$style.branchName)},[i(S,{icon:"code-branch"}),y(" "+b(k.value),1)],2),u("div",{class:a({"pt-xs":!s.isCollapsed})},[i(M,{disabled:!s.isCollapsed,"show-after":x.value,placement:"right"},{content:c(()=>[u("div",null,b(p(r).baseText("settings.sourceControl.button.pull")),1)]),default:c(()=>[i(D,{class:a({"mr-2xs":!s.isCollapsed,"mb-2xs":s.isCollapsed&&!p(l).preferences.branchReadOnly}),icon:"arrow-down",type:"tertiary",size:"mini",square:s.isCollapsed,label:s.isCollapsed?"":p(r).baseText("settings.sourceControl.button.pull"),onClick:_},null,8,["class","square","label"])]),_:1},8,["disabled","show-after"]),p(l).preferences.branchReadOnly?w("",!0):(g(),I(M,{key:0,disabled:!s.isCollapsed,"show-after":x.value,placement:"right"},{content:c(()=>[u("div",null,b(p(r).baseText("settings.sourceControl.button.push")),1)]),default:c(()=>[i(D,{square:s.isCollapsed,label:s.isCollapsed?"":p(r).baseText("settings.sourceControl.button.push"),icon:"arrow-up",type:"tertiary",size:"mini",onClick:o},null,8,["square","label"])]),_:1},8,["disabled","show-after"]))],2)],2)):w("",!0)],6)):w("",!0)}}}),ot="_sync_1bnfs_5",nt="_isConnected_1bnfs_12",at="_collapsed_1bnfs_16",rt="_branchName_1bnfs_26",it="_connected_1bnfs_36",lt={sync:ot,isConnected:nt,collapsed:at,branchName:rt,connected:it},ct={$style:lt},ut=U(st,[["__cssModules",ct]]),dt=L({name:"MainSidebar",components:{GiftNotificationIcon:ke,ExecutionsUsage:We,MainSidebarSourceControl:ut,BecomeTemplateCreatorCta:tt},mixins:[me],setup(e,t){const n=re(),{callDebounced:h}=Z();return{externalHooks:n,callDebounced:h,...be()}},data(){return{basePath:"",fullyExpanded:!1}},computed:{..._e(W,oe,P,se,te,ee,z,H,q,ge),logoPath(){return this.basePath+(this.isCollapsed?"static/logo/collapsed.svg":this.uiStore.logo)},hasVersionUpdates(){return this.settingsStore.settings.releaseChannel==="stable"&&this.versionsStore.hasVersionUpdates},nextVersions(){return this.versionsStore.nextVersions},isCollapsed(){return this.uiStore.sidebarMenuCollapsed},canUserAccessSettings(){return this.findFirstAccessibleSettingsRoute()!==null},showUserArea(){return R(["authenticated"])},workflowExecution(){return this.workflowsStore.getWorkflowExecution},userMenuItems(){return[{id:"settings",label:this.$locale.baseText("settings")},{id:"logout",label:this.$locale.baseText("auth.signout")}]},mainMenuItems(){const e=[],t={id:"workflows",icon:"network-wired",label:this.$locale.baseText("mainSidebar.workflows"),position:"top",route:{to:{name:C.WORKFLOWS}},secondaryIcon:this.sourceControlStore.preferences.branchReadOnly?{name:"lock",tooltip:{content:this.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip")}}:void 0},n=this.findFirstAccessibleSettingsRoute(),h=[t,{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"top",available:this.settingsStore.isTemplatesEnabled&&this.templatesStore.hasCustomTemplatesHost,route:{to:{name:C.TEMPLATES}}},{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"top",available:this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost,link:{href:this.templatesStore.getWebsiteTemplateRepositoryURL,target:"_blank"}},{id:"credentials",icon:"key",label:this.$locale.baseText("mainSidebar.credentials"),customIconSize:"medium",position:"top",route:{to:{name:C.CREDENTIALS}}},{id:"variables",icon:"variable",label:this.$locale.baseText("mainSidebar.variables"),customIconSize:"medium",position:"top",route:{to:{name:C.VARIABLES}}},{id:"executions",icon:"tasks",label:this.$locale.baseText("mainSidebar.executions"),position:"top",route:{to:{name:C.EXECUTIONS}}},{id:"cloud-admin",position:"bottom",label:"Admin Panel",icon:"home",available:this.settingsStore.isCloudDeployment&&R(["instanceOwner"])},{id:"settings",icon:"cog",label:this.$locale.baseText("settings"),position:"bottom",available:this.canUserAccessSettings&&this.usersStore.currentUser!==null,activateOnRouteNames:[C.USERS_SETTINGS,C.API_SETTINGS,C.PERSONAL_SETTINGS],route:{to:n}},{id:"help",icon:"question",label:"Help",position:"bottom",children:[{id:"quickstart",icon:"video",label:this.$locale.baseText("mainSidebar.helpMenuItems.quickstart"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"docs",icon:"book",label:this.$locale.baseText("mainSidebar.helpMenuItems.documentation"),link:{href:"https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"forum",icon:"users",label:this.$locale.baseText("mainSidebar.helpMenuItems.forum"),link:{href:"https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"examples",icon:"graduation-cap",label:this.$locale.baseText("mainSidebar.helpMenuItems.course"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"about",icon:"info",label:this.$locale.baseText("mainSidebar.aboutN8n"),position:"bottom"}]}];return[...e,...h]},userIsTrialing(){return this.cloudPlanStore.userIsTrialing},currentPlanAndUsageData(){const e=this.cloudPlanStore.currentPlanData,t=this.cloudPlanStore.currentUsageData;return!e||!t?null:{...e,usage:t}}},async mounted(){this.basePath=this.rootStore.baseUrl,this.$refs.user&&this.externalHooks.run("mainSidebar.mounted",{userRef:this.$refs.user}),this.$nextTick(()=>{window.innerWidth<900||this.uiStore.isNodeView?this.uiStore.sidebarMenuCollapsed=!0:this.uiStore.sidebarMenuCollapsed=!1,this.fullyExpanded=!this.isCollapsed}),this.becomeTemplateCreatorStore.startMonitoringCta()},created(){window.addEventListener("resize",this.onResize)},beforeUnmount(){this.becomeTemplateCreatorStore.stopMonitoringCta(),window.removeEventListener("resize",this.onResize)},methods:{trackHelpItemClick(e){this.$telemetry.track("User clicked help resource",{type:e,workflow_id:this.workflowsStore.workflowId})},trackTemplatesClick(){this.$telemetry.track("User clicked on templates",{})},async onUserActionToggle(e){switch(e){case"logout":this.onLogout();break;case"settings":this.$router.push({name:C.PERSONAL_SETTINGS});break}},onLogout(){this.$router.push({name:C.SIGNOUT})},toggleCollapse(){this.uiStore.toggleSidebarMenuCollapse(),this.isCollapsed?this.fullyExpanded=!this.isCollapsed:setTimeout(()=>{this.fullyExpanded=!this.isCollapsed},300)},openUpdatesPanel(){this.uiStore.openModal(ne)},async handleSelect(e){switch(e){case"templates":this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost&&this.trackTemplatesClick();break;case"about":{this.trackHelpItemClick("about"),this.uiStore.openModal(ae);break}case"cloud-admin":{this.cloudPlanStore.redirectToDashboard();break}case"quickstart":case"docs":case"forum":case"examples":{this.trackHelpItemClick(e);break}}},findFirstAccessibleSettingsRoute(){const e=this.$router.getRoutes().find(n=>n.path==="/settings").children.map(n=>n.name??"");let t={name:C.USERS_SETTINGS};for(const n of e)if(this.canUserAccessRouteByName(n.toString())){t={name:n.toString()};break}return t},onResize(e){this.callDebounced(this.onResizeEnd,{debounceTime:100},e)},async onResizeEnd(e){const t=e.target.outerWidth;await this.checkWidthAndAdjustSidebar(t)},async checkWidthAndAdjustSidebar(e){e<900&&(this.uiStore.sidebarMenuCollapsed=!0,await this.$nextTick(),this.fullyExpanded=!this.isCollapsed)}}}),pt="_sideMenu_q79od_5",mt="_logo_q79od_12",bt="_sideMenuCollapsed_q79od_23",gt="_sideMenuCollapseButton_q79od_30",ht="_updates_q79od_49",_t="_expanded_q79od_62",ft="_userArea_q79od_69",St="_userName_q79od_76",Ct="_userActions_q79od_90",yt={sideMenu:pt,logo:mt,sideMenuCollapsed:bt,sideMenuCollapseButton:gt,updates:ht,expanded:_t,userArea:ft,userName:St,userActions:Ct},Tt=["src"],vt={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function xt(e,t,n,h,l,m){const r=d("n8n-icon"),v=d("BecomeTemplateCreatorCta"),x=d("ExecutionsUsage"),k=d("GiftNotificationIcon"),$=d("n8n-text"),o=d("MainSidebarSourceControl"),_=d("n8n-avatar"),s=d("el-dropdown-item"),f=d("el-dropdown-menu"),S=d("el-dropdown"),D=d("n8n-action-dropdown"),M=d("n8n-menu");return g(),T("div",{id:"side-menu",class:a({"side-menu":!0,[e.$style.sideMenu]:!0,[e.$style.sideMenuCollapsed]:e.isCollapsed})},[u("div",{id:"collapse-change-button",class:a(["clickable",e.$style.sideMenuCollapseButton]),onClick:t[0]||(t[0]=(...O)=>e.toggleCollapse&&e.toggleCollapse(...O))},[e.isCollapsed?(g(),I(r,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(g(),I(r,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),i(M,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ue({header:c(()=>[u("div",{class:a(e.$style.logo)},[u("img",{src:e.logoPath,"data-test-id":"n8n-logo",class:a(e.$style.icon),alt:"n8n"},null,10,Tt)],2)]),beforeLowerMenu:c(()=>[e.fullyExpanded&&!e.userIsTrialing?(g(),I(v,{key:0})):w("",!0),e.fullyExpanded&&e.userIsTrialing?(g(),I(x,{key:1,"cloud-plan-data":e.currentPlanAndUsageData},null,8,["cloud-plan-data"])):w("",!0)]),menuSuffix:c(()=>[u("div",null,[e.hasVersionUpdates?(g(),T("div",{key:0,"data-test-id":"version-updates-panel-button",class:a(e.$style.updates),onClick:t[1]||(t[1]=(...O)=>e.openUpdatesPanel&&e.openUpdatesPanel(...O))},[u("div",{class:a(e.$style.giftContainer)},[i(k)],2),i($,{class:a({"ml-xs":!0,[e.$style.expanded]:e.fullyExpanded}),color:"text-base"},{default:c(()=>[y(b(e.nextVersions.length>99?"99+":e.nextVersions.length)+" update"+b(e.nextVersions.length>1?"s":""),1)]),_:1},8,["class"])],2)):w("",!0),i(o,{"is-collapsed":e.isCollapsed},null,8,["is-collapsed"])])]),_:2},[e.showUserArea?{name:"footer",fn:c(()=>[u("div",{class:a(e.$style.userArea)},[u("div",vt,[i(S,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:c(()=>[i(f,null,{default:c(()=>[i(s,{command:"settings"},{default:c(()=>[y(b(e.$locale.baseText("settings")),1)]),_:1}),i(s,{command:"logout"},{default:c(()=>[y(b(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:c(()=>[u("div",{class:a({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[i(_,{"first-name":e.usersStore.currentUser.firstName,"last-name":e.usersStore.currentUser.lastName,size:"small"},null,8,["first-name","last-name"])],2)]),_:1},8,["disabled","onCommand"])]),u("div",{class:a({"ml-2xs":!0,[e.$style.userName]:!0,[e.$style.expanded]:e.fullyExpanded})},[i($,{size:"small",bold:!0,color:"text-dark"},{default:c(()=>[y(b(e.usersStore.currentUser.fullName),1)]),_:1})],2),u("div",{class:a({[e.$style.userActions]:!0,[e.$style.expanded]:e.fullyExpanded})},[i(D,{items:e.userMenuItems,placement:"top-start","data-test-id":"user-menu",onSelect:e.onUserActionToggle},null,8,["items","onSelect"])],2)],2)]),key:"0"}:void 0]),1032,["items","collapsed","onSelect"])],2)}const kt={$style:yt},es=U(dt,[["render",xt],["__cssModules",kt]]);export{es as default};
2
+ //# sourceMappingURL=MainSidebar-YIkYQNvU.js.map