n8n-editor-ui 1.47.0 → 1.47.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 (160) hide show
  1. package/.turbo/turbo-build.log +78 -78
  2. package/dist/assets/{AuthView-BgFWzBDm.js → AuthView-CMxdNKZJ.js} +2 -2
  3. package/dist/assets/{AuthView-BgFWzBDm.js.map → AuthView-CMxdNKZJ.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-m_3acPPd.js → CanvasControls-3FMjwMqA.js} +2 -2
  5. package/dist/assets/{CanvasControls-m_3acPPd.js.map → CanvasControls-3FMjwMqA.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-CN6JWR-N.js → ChangePasswordView-_NkkcUVb.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-CN6JWR-N.js.map → ChangePasswordView-_NkkcUVb.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-DHmcKhO-.js → CollectionParameter-BXMOfisf.js} +2 -2
  9. package/dist/assets/CollectionParameter-BXMOfisf.js.map +1 -0
  10. package/dist/assets/{CredentialsView-D9TXjOnK.js → CredentialsView-B2UF3tK_.js} +2 -2
  11. package/dist/assets/{CredentialsView-D9TXjOnK.js.map → CredentialsView-B2UF3tK_.js.map} +1 -1
  12. package/dist/assets/{ErrorView-CYag8fsg.js → ErrorView-B_lpOlen.js} +2 -2
  13. package/dist/assets/{ErrorView-CYag8fsg.js.map → ErrorView-B_lpOlen.js.map} +1 -1
  14. package/dist/assets/{ExecutionsFilter-Cf35yNfd.js → ExecutionsFilter-dNFZor7l.js} +2 -2
  15. package/dist/assets/{ExecutionsFilter-Cf35yNfd.js.map → ExecutionsFilter-dNFZor7l.js.map} +1 -1
  16. package/dist/assets/{ExecutionsView-ztrgLYNP.js → ExecutionsView-BYe-KERG.js} +2 -2
  17. package/dist/assets/{ExecutionsView-ztrgLYNP.js.map → ExecutionsView-BYe-KERG.js.map} +1 -1
  18. package/dist/assets/{ForgotMyPasswordView-C-0yB-bx.js → ForgotMyPasswordView-D97J06wc.js} +2 -2
  19. package/dist/assets/{ForgotMyPasswordView-C-0yB-bx.js.map → ForgotMyPasswordView-D97J06wc.js.map} +1 -1
  20. package/dist/assets/MainHeader-CT4nF2mY.js +2 -0
  21. package/dist/assets/{MainHeader-CMxbwL4C.js.map → MainHeader-CT4nF2mY.js.map} +1 -1
  22. package/dist/assets/{MainSidebar-BuwaBgG9.js → MainSidebar-CTg5wPzP.js} +2 -2
  23. package/dist/assets/{MainSidebar-BuwaBgG9.js.map → MainSidebar-CTg5wPzP.js.map} +1 -1
  24. package/dist/assets/{NodeCreation-B7Uimsok.js → NodeCreation-BF_L2-99.js} +3 -3
  25. package/dist/assets/{NodeCreation-B7Uimsok.js.map → NodeCreation-BF_L2-99.js.map} +1 -1
  26. package/dist/assets/{NodeCreator-IRjqf3_R.js → NodeCreator-B_yCtSu6.js} +2 -2
  27. package/dist/assets/{NodeCreator-IRjqf3_R.js.map → NodeCreator-B_yCtSu6.js.map} +1 -1
  28. package/dist/assets/{NodeDetailsView-CSnjluIR.js → NodeDetailsView-ggolOsHM.js} +4 -4
  29. package/dist/assets/{NodeDetailsView-CSnjluIR.js.map → NodeDetailsView-ggolOsHM.js.map} +1 -1
  30. package/dist/assets/{NodeView-DMzj-gox.css → NodeView--67hs6V6.css} +1 -1
  31. package/dist/assets/NodeView-B2MlTl6g.js +3 -0
  32. package/dist/assets/NodeView-B2MlTl6g.js.map +1 -0
  33. package/dist/assets/{NodeView.v2-DyU_S0rY.js → NodeView.v2-D_CKj9CS.js} +3 -3
  34. package/dist/assets/{NodeView.v2-DyU_S0rY.js.map → NodeView.v2-D_CKj9CS.js.map} +1 -1
  35. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-C1N0EZCM.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js} +2 -2
  36. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-C1N0EZCM.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js.map} +1 -1
  37. package/dist/assets/{ProjectSettings-CbNlX27g.js → ProjectSettings-DpJesEZX.js} +2 -2
  38. package/dist/assets/{ProjectSettings-CbNlX27g.js.map → ProjectSettings-DpJesEZX.js.map} +1 -1
  39. package/dist/assets/{ProjectTabs-Cx2VWeba.js → ProjectTabs-D7nNxtFO.js} +2 -2
  40. package/dist/assets/{ProjectTabs-Cx2VWeba.js.map → ProjectTabs-D7nNxtFO.js.map} +1 -1
  41. package/dist/assets/{PushConnectionTracker-C_r8Zv-p.js → PushConnectionTracker-YJuy57g2.js} +2 -2
  42. package/dist/assets/{PushConnectionTracker-C_r8Zv-p.js.map → PushConnectionTracker-YJuy57g2.js.map} +1 -1
  43. package/dist/assets/{ResourcesListLayout-CKSHiUAP.js → ResourcesListLayout-mZ4ijKRB.js} +2 -2
  44. package/dist/assets/{ResourcesListLayout-CKSHiUAP.js.map → ResourcesListLayout-mZ4ijKRB.js.map} +1 -1
  45. package/dist/assets/{RunDataAi-BVqsN7UN.js → RunDataAi-D0m0Vg_p.js} +2 -2
  46. package/dist/assets/{RunDataAi-BVqsN7UN.js.map → RunDataAi-D0m0Vg_p.js.map} +1 -1
  47. package/dist/assets/{RunDataJson-6Yfwd78r.js → RunDataJson-DkHNIqVj.js} +3 -3
  48. package/dist/assets/{RunDataJson-6Yfwd78r.js.map → RunDataJson-DkHNIqVj.js.map} +1 -1
  49. package/dist/assets/{RunDataJsonActions-5ig3g4km.js → RunDataJsonActions-Cgxcpw8t.js} +2 -2
  50. package/dist/assets/{RunDataJsonActions-5ig3g4km.js.map → RunDataJsonActions-Cgxcpw8t.js.map} +1 -1
  51. package/dist/assets/{RunDataSchema-CrW957BW.js → RunDataSchema-C6aZoC0a.js} +3 -3
  52. package/dist/assets/{RunDataSchema-CrW957BW.js.map → RunDataSchema-C6aZoC0a.js.map} +1 -1
  53. package/dist/assets/{RunDataSearch-BrIWOZXO.js → RunDataSearch-D2CDg21N.js} +2 -2
  54. package/dist/assets/{RunDataSearch-BrIWOZXO.js.map → RunDataSearch-D2CDg21N.js.map} +1 -1
  55. package/dist/assets/RunDataTable-D597NRFD.js +2 -0
  56. package/dist/assets/{RunDataTable-B01U16vv.js.map → RunDataTable-D597NRFD.js.map} +1 -1
  57. package/dist/assets/{SamlOnboarding-CfbBlTNm.js → SamlOnboarding-Me669myi.js} +2 -2
  58. package/dist/assets/{SamlOnboarding-CfbBlTNm.js.map → SamlOnboarding-Me669myi.js.map} +1 -1
  59. package/dist/assets/{SettingsApiView-CuliNEKo.js → SettingsApiView-DV8pIHDw.js} +2 -2
  60. package/dist/assets/{SettingsApiView-CuliNEKo.js.map → SettingsApiView-DV8pIHDw.js.map} +1 -1
  61. package/dist/assets/{SettingsCommunityNodesView-CeY4uqH-.js → SettingsCommunityNodesView-D_gtSdk3.js} +2 -2
  62. package/dist/assets/{SettingsCommunityNodesView-CeY4uqH-.js.map → SettingsCommunityNodesView-D_gtSdk3.js.map} +1 -1
  63. package/dist/assets/{SettingsExternalSecrets-CE7ObFx_.js → SettingsExternalSecrets-xprYKjAW.js} +2 -2
  64. package/dist/assets/{SettingsExternalSecrets-CE7ObFx_.js.map → SettingsExternalSecrets-xprYKjAW.js.map} +1 -1
  65. package/dist/assets/{SettingsFakeDoorView-DQqNf_Q9.js → SettingsFakeDoorView-CKaSOYh5.js} +2 -2
  66. package/dist/assets/{SettingsFakeDoorView-DQqNf_Q9.js.map → SettingsFakeDoorView-CKaSOYh5.js.map} +1 -1
  67. package/dist/assets/{SettingsLdapView-9hy5C87y.js → SettingsLdapView-BBCv2tmk.js} +2 -2
  68. package/dist/assets/{SettingsLdapView-9hy5C87y.js.map → SettingsLdapView-BBCv2tmk.js.map} +1 -1
  69. package/dist/assets/{SettingsLogStreamingView-Cc0h5DhT.js → SettingsLogStreamingView-HRIp8kyL.js} +2 -2
  70. package/dist/assets/{SettingsLogStreamingView-Cc0h5DhT.js.map → SettingsLogStreamingView-HRIp8kyL.js.map} +1 -1
  71. package/dist/assets/{SettingsPersonalView-Cs82ezMX.js → SettingsPersonalView-CsUb3SvK.js} +2 -2
  72. package/dist/assets/{SettingsPersonalView-Cs82ezMX.js.map → SettingsPersonalView-CsUb3SvK.js.map} +1 -1
  73. package/dist/assets/{SettingsSourceControl-Dr7R-QpH.js → SettingsSourceControl-BkPpVGsk.js} +2 -2
  74. package/dist/assets/{SettingsSourceControl-Dr7R-QpH.js.map → SettingsSourceControl-BkPpVGsk.js.map} +1 -1
  75. package/dist/assets/{SettingsSso-Di6lHXV2.js → SettingsSso-BueUV3RH.js} +2 -2
  76. package/dist/assets/{SettingsSso-Di6lHXV2.js.map → SettingsSso-BueUV3RH.js.map} +1 -1
  77. package/dist/assets/{SettingsUsageAndPlan-g86Q7EQY.js → SettingsUsageAndPlan-DzDC9m54.js} +2 -2
  78. package/dist/assets/{SettingsUsageAndPlan-g86Q7EQY.js.map → SettingsUsageAndPlan-DzDC9m54.js.map} +1 -1
  79. package/dist/assets/{SettingsUsersView-dOWjUJTW.js → SettingsUsersView-CTd5MQLw.js} +2 -2
  80. package/dist/assets/{SettingsUsersView-dOWjUJTW.js.map → SettingsUsersView-CTd5MQLw.js.map} +1 -1
  81. package/dist/assets/{SettingsView-DQ0hQWFt.js → SettingsView-DMxqsNh0.js} +2 -2
  82. package/dist/assets/{SettingsView-DQ0hQWFt.js.map → SettingsView-DMxqsNh0.js.map} +1 -1
  83. package/dist/assets/{SetupView-CqT8d0D8.js → SetupView-tkyttChl.js} +2 -2
  84. package/dist/assets/{SetupView-CqT8d0D8.js.map → SetupView-tkyttChl.js.map} +1 -1
  85. package/dist/assets/{SetupWorkflowCredentialsButton-BR-ObOqw.js → SetupWorkflowCredentialsButton-B3HZvKQp.js} +2 -2
  86. package/dist/assets/{SetupWorkflowCredentialsButton-BR-ObOqw.js.map → SetupWorkflowCredentialsButton-B3HZvKQp.js.map} +1 -1
  87. package/dist/assets/{SetupWorkflowFromTemplateView-DHHtk6_-.js → SetupWorkflowFromTemplateView-DL3b-TZS.js} +2 -2
  88. package/dist/assets/{SetupWorkflowFromTemplateView-DHHtk6_-.js.map → SetupWorkflowFromTemplateView-DL3b-TZS.js.map} +1 -1
  89. package/dist/assets/{SigninView-2eLLF8DU.js → SigninView-BPLGsvzz.js} +2 -2
  90. package/dist/assets/{SigninView-2eLLF8DU.js.map → SigninView-BPLGsvzz.js.map} +1 -1
  91. package/dist/assets/{SignoutView-BQyCyjsK.js → SignoutView-BySf9D7k.js} +2 -2
  92. package/dist/assets/{SignoutView-BQyCyjsK.js.map → SignoutView-BySf9D7k.js.map} +1 -1
  93. package/dist/assets/{SignupView-ByYEkUpW.js → SignupView-EU3JWt4T.js} +2 -2
  94. package/dist/assets/{SignupView-ByYEkUpW.js.map → SignupView-EU3JWt4T.js.map} +1 -1
  95. package/dist/assets/{TemplateDetails-I6WMCxGm.js → TemplateDetails-Cemx-ozB.js} +2 -2
  96. package/dist/assets/{TemplateDetails-I6WMCxGm.js.map → TemplateDetails-Cemx-ozB.js.map} +1 -1
  97. package/dist/assets/{TemplateList-DRf0Cbhg.js → TemplateList-h3b91b7e.js} +2 -2
  98. package/dist/assets/{TemplateList-DRf0Cbhg.js.map → TemplateList-h3b91b7e.js.map} +1 -1
  99. package/dist/assets/{TemplatesCollectionView-BYkDe49v.js → TemplatesCollectionView-aBX3f7Pp.js} +2 -2
  100. package/dist/assets/{TemplatesCollectionView-BYkDe49v.js.map → TemplatesCollectionView-aBX3f7Pp.js.map} +1 -1
  101. package/dist/assets/{TemplatesSearchView-CiZ7aZcy.js → TemplatesSearchView-DyoC9WUR.js} +2 -2
  102. package/dist/assets/{TemplatesSearchView-CiZ7aZcy.js.map → TemplatesSearchView-DyoC9WUR.js.map} +1 -1
  103. package/dist/assets/{TemplatesView-zULLoEwu.js → TemplatesView-GQmC_sY8.js} +2 -2
  104. package/dist/assets/{TemplatesView-zULLoEwu.js.map → TemplatesView-GQmC_sY8.js.map} +1 -1
  105. package/dist/assets/{TemplatesWorkflowView-DptRLbdX.js → TemplatesWorkflowView-C-0pXdDh.js} +2 -2
  106. package/dist/assets/{TemplatesWorkflowView-DptRLbdX.js.map → TemplatesWorkflowView-C-0pXdDh.js.map} +1 -1
  107. package/dist/assets/{VariablesView-NcNcsjHY.js → VariablesView-BO5fdkwt.js} +2 -2
  108. package/dist/assets/{VariablesView-NcNcsjHY.js.map → VariablesView-BO5fdkwt.js.map} +1 -1
  109. package/dist/assets/{WorkerView-dtJzfgCM.js → WorkerView-C3Rdbsfq.js} +2 -2
  110. package/dist/assets/{WorkerView-dtJzfgCM.js.map → WorkerView-C3Rdbsfq.js.map} +1 -1
  111. package/dist/assets/{WorkflowActivator-D6Zad1X2.js → WorkflowActivator-DQXSsw0V.js} +2 -2
  112. package/dist/assets/{WorkflowActivator-D6Zad1X2.js.map → WorkflowActivator-DQXSsw0V.js.map} +1 -1
  113. package/dist/assets/{WorkflowExecutionsInfoAccordion-C86A1CHv.js → WorkflowExecutionsInfoAccordion-DJPF47om.js} +2 -2
  114. package/dist/assets/{WorkflowExecutionsInfoAccordion-C86A1CHv.js.map → WorkflowExecutionsInfoAccordion-DJPF47om.js.map} +1 -1
  115. package/dist/assets/{WorkflowExecutionsLandingPage-DAfHDMth.js → WorkflowExecutionsLandingPage-DoSsHWxH.js} +2 -2
  116. package/dist/assets/{WorkflowExecutionsLandingPage-DAfHDMth.js.map → WorkflowExecutionsLandingPage-DoSsHWxH.js.map} +1 -1
  117. package/dist/assets/{WorkflowExecutionsPreview-C_EBlNX6.js → WorkflowExecutionsPreview-Dt23N5A4.js} +2 -2
  118. package/dist/assets/WorkflowExecutionsPreview-Dt23N5A4.js.map +1 -0
  119. package/dist/assets/WorkflowExecutionsView-CpAIVxYQ.js +2 -0
  120. package/dist/assets/WorkflowExecutionsView-CpAIVxYQ.js.map +1 -0
  121. package/dist/assets/{WorkflowHistory-DkdQ1koF.js → WorkflowHistory-D1-E_J_s.js} +2 -2
  122. package/dist/assets/{WorkflowHistory-DkdQ1koF.js.map → WorkflowHistory-D1-E_J_s.js.map} +1 -1
  123. package/dist/assets/{WorkflowOnboardingView-BPMBW_hz.js → WorkflowOnboardingView-fzAZuVh5.js} +2 -2
  124. package/dist/assets/{WorkflowOnboardingView-BPMBW_hz.js.map → WorkflowOnboardingView-fzAZuVh5.js.map} +1 -1
  125. package/dist/assets/{WorkflowPreview-CLzyAzmJ.js → WorkflowPreview-BkL2jDRm.js} +2 -2
  126. package/dist/assets/{WorkflowPreview-CLzyAzmJ.js.map → WorkflowPreview-BkL2jDRm.js.map} +1 -1
  127. package/dist/assets/{WorkflowsView-CzJx_-P5.js → WorkflowsView-rbygROmM.js} +2 -2
  128. package/dist/assets/{WorkflowsView-CzJx_-P5.js.map → WorkflowsView-rbygROmM.js.map} +1 -1
  129. package/dist/assets/{cloud-CRMEbZfJ.js → cloud-B90x0-JC.js} +2 -2
  130. package/dist/assets/{cloud-CRMEbZfJ.js.map → cloud-B90x0-JC.js.map} +1 -1
  131. package/dist/assets/{collaboration.store-Co5wlk8y.js → collaboration.store-ElxCV91F.js} +2 -2
  132. package/dist/assets/{collaboration.store-Co5wlk8y.js.map → collaboration.store-ElxCV91F.js.map} +1 -1
  133. package/dist/assets/index-BE0Xl-jy.js +341 -0
  134. package/dist/assets/index-BE0Xl-jy.js.map +1 -0
  135. package/dist/assets/{nodeCreator.store-CTXKjjQB.js → nodeCreator.store-Q1T99YCl.js} +2 -2
  136. package/dist/assets/{nodeCreator.store-CTXKjjQB.js.map → nodeCreator.store-Q1T99YCl.js.map} +1 -1
  137. package/dist/assets/{templateActions-CIRsIG2W.js → templateActions-B7R6qRak.js} +2 -2
  138. package/dist/assets/{templateActions-CIRsIG2W.js.map → templateActions-B7R6qRak.js.map} +1 -1
  139. package/dist/assets/{useExecutionDebugging-BzC-1xF-.js → useExecutionDebugging-BJ0CgMh8.js} +2 -2
  140. package/dist/assets/{useExecutionDebugging-BzC-1xF-.js.map → useExecutionDebugging-BJ0CgMh8.js.map} +1 -1
  141. package/dist/assets/{useExecutionHelpers-C2K8pfbF.js → useExecutionHelpers-D3294Pbg.js} +2 -2
  142. package/dist/assets/{useExecutionHelpers-C2K8pfbF.js.map → useExecutionHelpers-D3294Pbg.js.map} +1 -1
  143. package/dist/assets/{usePushConnection-EMXpPhl-.js → usePushConnection-CsYeEXN4.js} +2 -2
  144. package/dist/assets/{usePushConnection-EMXpPhl-.js.map → usePushConnection-CsYeEXN4.js.map} +1 -1
  145. package/dist/assets/{useUserHelpers-Bn_ZV9Jv.js → useUserHelpers-CzNhI0vP.js} +2 -2
  146. package/dist/assets/{useUserHelpers-Bn_ZV9Jv.js.map → useUserHelpers-CzNhI0vP.js.map} +1 -1
  147. package/dist/assets/{useWorkflowActivate-BwVActuc.js → useWorkflowActivate-D8iK20ua.js} +2 -2
  148. package/dist/assets/{useWorkflowActivate-BwVActuc.js.map → useWorkflowActivate-D8iK20ua.js.map} +1 -1
  149. package/dist/index.html +1 -1
  150. package/package.json +1 -1
  151. package/dist/assets/CollectionParameter-DHmcKhO-.js.map +0 -1
  152. package/dist/assets/MainHeader-CMxbwL4C.js +0 -2
  153. package/dist/assets/NodeView-C-hQ3_xD.js +0 -3
  154. package/dist/assets/NodeView-C-hQ3_xD.js.map +0 -1
  155. package/dist/assets/RunDataTable-B01U16vv.js +0 -2
  156. package/dist/assets/WorkflowExecutionsPreview-C_EBlNX6.js.map +0 -1
  157. package/dist/assets/WorkflowExecutionsView-Nm1Oo9El.js +0 -2
  158. package/dist/assets/WorkflowExecutionsView-Nm1Oo9El.js.map +0 -1
  159. package/dist/assets/index-Dtri_pSJ.js +0 -341
  160. package/dist/assets/index-Dtri_pSJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TemplatesWorkflowView-DptRLbdX.js","sources":["../../src/views/TemplatesWorkflowView.vue"],"sourcesContent":["<template>\n\t<TemplatesView :go-back-enabled=\"true\">\n\t\t<template #header>\n\t\t\t<div v-if=\"!notFoundError\" :class=\"$style.wrapper\">\n\t\t\t\t<div :class=\"$style.title\">\n\t\t\t\t\t<n8n-heading v-if=\"template && template.name\" tag=\"h1\" size=\"2xlarge\">{{\n\t\t\t\t\t\ttemplate.name\n\t\t\t\t\t}}</n8n-heading>\n\t\t\t\t\t<n8n-text v-if=\"template && template.name\" color=\"text-base\" size=\"small\">\n\t\t\t\t\t\t{{ $locale.baseText('generic.workflow') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<n8n-loading :loading=\"!template || !template.name\" :rows=\"2\" variant=\"h1\" />\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.button\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tv-if=\"template\"\n\t\t\t\t\t\tdata-test-id=\"use-template-button\"\n\t\t\t\t\t\t:label=\"$locale.baseText('template.buttons.useThisWorkflowButton')\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t@click=\"openTemplateSetup(templateId, $event)\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-loading :loading=\"!template\" :rows=\"1\" variant=\"button\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.notFound\">\n\t\t\t\t<n8n-text color=\"text-base\">{{ $locale.baseText('templates.workflowsNotFound') }}</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-if=\"!notFoundError\" #content>\n\t\t\t<div :class=\"$style.image\">\n\t\t\t\t<WorkflowPreview\n\t\t\t\t\tv-if=\"showPreview\"\n\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t:workflow=\"template?.workflow\"\n\t\t\t\t\t@close=\"onHidePreview\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.content\">\n\t\t\t\t<div :class=\"$style.markdown\" data-test-id=\"template-description\">\n\t\t\t\t\t<n8n-markdown\n\t\t\t\t\t\t:content=\"template?.description\"\n\t\t\t\t\t\t:images=\"template?.image\"\n\t\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.details\">\n\t\t\t\t\t<TemplateDetails\n\t\t\t\t\t\t:block-title=\"$locale.baseText('template.details.appsInTheWorkflow')\"\n\t\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t\t:template=\"template\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</TemplatesView>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport TemplateDetails from '@/components/TemplateDetails.vue';\nimport TemplatesView from './TemplatesView.vue';\nimport WorkflowPreview from '@/components/WorkflowPreview.vue';\n\nimport type { ITemplatesWorkflowFull } from '@/Interface';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { usePostHog } from '@/stores/posthog.store';\nimport { useTemplateWorkflow } from '@/utils/templates/templateActions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport default defineComponent({\n\tname: 'TemplatesWorkflowView',\n\tcomponents: {\n\t\tTemplateDetails,\n\t\tTemplatesView,\n\t\tWorkflowPreview,\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useTemplatesStore, usePostHog),\n\t\ttemplate(): ITemplatesWorkflowFull | null {\n\t\t\treturn this.templatesStore.getFullTemplateById(this.templateId);\n\t\t},\n\t\ttemplateId() {\n\t\t\treturn Array.isArray(this.$route.params.id)\n\t\t\t\t? this.$route.params.id[0]\n\t\t\t\t: this.$route.params.id;\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\tshowPreview: true,\n\t\t\tnotFoundError: false,\n\t\t};\n\t},\n\twatch: {\n\t\ttemplate(template: ITemplatesWorkflowFull) {\n\t\t\tif (template) {\n\t\t\t\tsetPageTitle(`n8n - Template template: ${template.name}`);\n\t\t\t} else {\n\t\t\t\tsetPageTitle('n8n - Templates');\n\t\t\t}\n\t\t},\n\t},\n\tasync mounted() {\n\t\tthis.scrollToTop();\n\n\t\tif (this.template && this.template.full) {\n\t\t\tthis.loading = false;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.templatesStore.fetchTemplateById(this.templateId);\n\t\t} catch (e) {\n\t\t\tthis.notFoundError = true;\n\t\t}\n\n\t\tthis.loading = false;\n\t},\n\tmethods: {\n\t\tasync openTemplateSetup(id: string, e: PointerEvent) {\n\t\t\tawait useTemplateWorkflow({\n\t\t\t\tposthogStore: this.posthogStore,\n\t\t\t\trouter: this.$router,\n\t\t\t\ttemplateId: id,\n\t\t\t\tinNewBrowserTab: e.metaKey || e.ctrlKey,\n\t\t\t\texternalHooks: this.externalHooks,\n\t\t\t\tnodeTypesStore: useNodeTypesStore(),\n\t\t\t\ttelemetry: this.$telemetry,\n\t\t\t\ttemplatesStore: useTemplatesStore(),\n\t\t\t\tsource: 'template_preview',\n\t\t\t});\n\t\t},\n\t\tonHidePreview() {\n\t\t\tthis.showPreview = false;\n\t\t},\n\t\tscrollToTop() {\n\t\t\tconst contentArea = document.getElementById('content');\n\n\t\t\tif (contentArea) {\n\t\t\t\tcontentArea.scrollTo({\n\t\t\t\t\ttop: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: flex;\n\tjustify-content: space-between;\n}\n\n.notFound {\n\tpadding-top: var(--spacing-xl);\n}\n\n.title {\n\twidth: 75%;\n}\n\n.button {\n\tdisplay: block;\n}\n\n.image {\n\twidth: 100%;\n\theight: 500px;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-large);\n\toverflow: hidden;\n\n\timg {\n\t\twidth: 100%;\n\t}\n}\n\n.content {\n\tpadding: var(--spacing-2xl) 0;\n\tdisplay: flex;\n\tjustify-content: space-between;\n\n\t@media (max-width: $breakpoint-xs) {\n\t\tdisplay: block;\n\t}\n}\n\n.markdown {\n\twidth: calc(100% - 180px);\n\tpadding-right: var(--spacing-2xl);\n\tmargin-bottom: var(--spacing-l);\n\n\t@media (max-width: $breakpoint-xs) {\n\t\twidth: 100%;\n\t}\n}\n\n.details {\n\twidth: 180px;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","TemplateDetails","TemplatesView","WorkflowPreview","useExternalHooks","mapStores","useTemplatesStore","usePostHog","template","setPageTitle","id","e","useTemplateWorkflow","useNodeTypesStore","contentArea","_component_TemplatesView","_resolveComponent","notFoundError","_createBlock","_createSlots","_withCtx","_ctx","_openBlock","_createElementBlock","$style","_normalizeClass","_createVNode","_component_n8n_text","$locale","_createTextVNode","_toDisplayString","_component_n8n_heading","_createCommentVNode","_component_n8n_loading","_createElementVNode","_component_n8n_button","templateId","_cache","$event","showPreview","_component_WorkflowPreview","onHidePreview","loading","_c"],"mappings":"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"}
1
+ {"version":3,"file":"TemplatesWorkflowView-C-0pXdDh.js","sources":["../../src/views/TemplatesWorkflowView.vue"],"sourcesContent":["<template>\n\t<TemplatesView :go-back-enabled=\"true\">\n\t\t<template #header>\n\t\t\t<div v-if=\"!notFoundError\" :class=\"$style.wrapper\">\n\t\t\t\t<div :class=\"$style.title\">\n\t\t\t\t\t<n8n-heading v-if=\"template && template.name\" tag=\"h1\" size=\"2xlarge\">{{\n\t\t\t\t\t\ttemplate.name\n\t\t\t\t\t}}</n8n-heading>\n\t\t\t\t\t<n8n-text v-if=\"template && template.name\" color=\"text-base\" size=\"small\">\n\t\t\t\t\t\t{{ $locale.baseText('generic.workflow') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<n8n-loading :loading=\"!template || !template.name\" :rows=\"2\" variant=\"h1\" />\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.button\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tv-if=\"template\"\n\t\t\t\t\t\tdata-test-id=\"use-template-button\"\n\t\t\t\t\t\t:label=\"$locale.baseText('template.buttons.useThisWorkflowButton')\"\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t@click=\"openTemplateSetup(templateId, $event)\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-loading :loading=\"!template\" :rows=\"1\" variant=\"button\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.notFound\">\n\t\t\t\t<n8n-text color=\"text-base\">{{ $locale.baseText('templates.workflowsNotFound') }}</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-if=\"!notFoundError\" #content>\n\t\t\t<div :class=\"$style.image\">\n\t\t\t\t<WorkflowPreview\n\t\t\t\t\tv-if=\"showPreview\"\n\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t:workflow=\"template?.workflow\"\n\t\t\t\t\t@close=\"onHidePreview\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.content\">\n\t\t\t\t<div :class=\"$style.markdown\" data-test-id=\"template-description\">\n\t\t\t\t\t<n8n-markdown\n\t\t\t\t\t\t:content=\"template?.description\"\n\t\t\t\t\t\t:images=\"template?.image\"\n\t\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.details\">\n\t\t\t\t\t<TemplateDetails\n\t\t\t\t\t\t:block-title=\"$locale.baseText('template.details.appsInTheWorkflow')\"\n\t\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t\t:template=\"template\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</TemplatesView>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport TemplateDetails from '@/components/TemplateDetails.vue';\nimport TemplatesView from './TemplatesView.vue';\nimport WorkflowPreview from '@/components/WorkflowPreview.vue';\n\nimport type { ITemplatesWorkflowFull } from '@/Interface';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { usePostHog } from '@/stores/posthog.store';\nimport { useTemplateWorkflow } from '@/utils/templates/templateActions';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport default defineComponent({\n\tname: 'TemplatesWorkflowView',\n\tcomponents: {\n\t\tTemplateDetails,\n\t\tTemplatesView,\n\t\tWorkflowPreview,\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useTemplatesStore, usePostHog),\n\t\ttemplate(): ITemplatesWorkflowFull | null {\n\t\t\treturn this.templatesStore.getFullTemplateById(this.templateId);\n\t\t},\n\t\ttemplateId() {\n\t\t\treturn Array.isArray(this.$route.params.id)\n\t\t\t\t? this.$route.params.id[0]\n\t\t\t\t: this.$route.params.id;\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\tshowPreview: true,\n\t\t\tnotFoundError: false,\n\t\t};\n\t},\n\twatch: {\n\t\ttemplate(template: ITemplatesWorkflowFull) {\n\t\t\tif (template) {\n\t\t\t\tsetPageTitle(`n8n - Template template: ${template.name}`);\n\t\t\t} else {\n\t\t\t\tsetPageTitle('n8n - Templates');\n\t\t\t}\n\t\t},\n\t},\n\tasync mounted() {\n\t\tthis.scrollToTop();\n\n\t\tif (this.template && this.template.full) {\n\t\t\tthis.loading = false;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.templatesStore.fetchTemplateById(this.templateId);\n\t\t} catch (e) {\n\t\t\tthis.notFoundError = true;\n\t\t}\n\n\t\tthis.loading = false;\n\t},\n\tmethods: {\n\t\tasync openTemplateSetup(id: string, e: PointerEvent) {\n\t\t\tawait useTemplateWorkflow({\n\t\t\t\tposthogStore: this.posthogStore,\n\t\t\t\trouter: this.$router,\n\t\t\t\ttemplateId: id,\n\t\t\t\tinNewBrowserTab: e.metaKey || e.ctrlKey,\n\t\t\t\texternalHooks: this.externalHooks,\n\t\t\t\tnodeTypesStore: useNodeTypesStore(),\n\t\t\t\ttelemetry: this.$telemetry,\n\t\t\t\ttemplatesStore: useTemplatesStore(),\n\t\t\t\tsource: 'template_preview',\n\t\t\t});\n\t\t},\n\t\tonHidePreview() {\n\t\t\tthis.showPreview = false;\n\t\t},\n\t\tscrollToTop() {\n\t\t\tconst contentArea = document.getElementById('content');\n\n\t\t\tif (contentArea) {\n\t\t\t\tcontentArea.scrollTo({\n\t\t\t\t\ttop: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: flex;\n\tjustify-content: space-between;\n}\n\n.notFound {\n\tpadding-top: var(--spacing-xl);\n}\n\n.title {\n\twidth: 75%;\n}\n\n.button {\n\tdisplay: block;\n}\n\n.image {\n\twidth: 100%;\n\theight: 500px;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-large);\n\toverflow: hidden;\n\n\timg {\n\t\twidth: 100%;\n\t}\n}\n\n.content {\n\tpadding: var(--spacing-2xl) 0;\n\tdisplay: flex;\n\tjustify-content: space-between;\n\n\t@media (max-width: $breakpoint-xs) {\n\t\tdisplay: block;\n\t}\n}\n\n.markdown {\n\twidth: calc(100% - 180px);\n\tpadding-right: var(--spacing-2xl);\n\tmargin-bottom: var(--spacing-l);\n\n\t@media (max-width: $breakpoint-xs) {\n\t\twidth: 100%;\n\t}\n}\n\n.details {\n\twidth: 180px;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","TemplateDetails","TemplatesView","WorkflowPreview","useExternalHooks","mapStores","useTemplatesStore","usePostHog","template","setPageTitle","id","e","useTemplateWorkflow","useNodeTypesStore","contentArea","_component_TemplatesView","_resolveComponent","notFoundError","_createBlock","_createSlots","_withCtx","_ctx","_openBlock","_createElementBlock","$style","_normalizeClass","_createVNode","_component_n8n_text","$locale","_createTextVNode","_toDisplayString","_component_n8n_heading","_createCommentVNode","_component_n8n_loading","_createElementVNode","_component_n8n_button","templateId","_cache","$event","showPreview","_component_WorkflowPreview","onHidePreview","loading","_c"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{aK as de,u as te,b as se,a as le,dp as ne,E as oe,x as ie,aQ as ce,e as ve,n as be,A as me,G as pe,H as fe}from"./index-Dtri_pSJ.js";import{R as ye}from"./ResourcesListLayout-CKSHiUAP.js";import{G as re,e as C,r as g,b as _e,d as ge,ag as R,l as r,m as y,p as f,T as c,M as U,u as b,U as m,O as l,S as _,I as H,R as J,n as ae,D as Te,y as ke,a9 as he}from"./vendor-Dv5OeN6t.js";import{_ as ue,as as xe}from"./n8n-4UEsHtUL.js";import"./pinia-sugP77Im.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const Ce={class:"variables-key-column"},we={key:0},Ve={class:"variables-value-column"},$e={key:0},Re={class:"variables-usage-column"},Ee={key:0},Se=re({__name:"VariablesRow",props:{data:{},editing:{type:Boolean,default:!1}},emits:["save","cancel","edit","delete"],setup(ee,{emit:j}){const n=ie(),L=de(),{showMessage:W}=te(),K=se(),u=le(),E=j,S=ee,w=C(()=>ne(u.currentUser)),t=g({...S.data}),V=g({key:!1,value:!1}),i=C(()=>V.value.name&&V.value.value),T=g(),P=g(),d=g(`$vars.${S.data.name}`),X=C(()=>K.isEnterpriseFeatureEnabled(oe.Variables));_e(()=>{I()});const A=[{name:"REQUIRED"},{name:"MAX_LENGTH",config:{maximum:50}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z]/,message:n.baseText("variables.editing.key.error.startsWithLetter")}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z][a-zA-Z0-9_]*$/,message:n.baseText("variables.editing.key.error.jsonKey")}}],Z=[{name:"MAX_LENGTH",config:{maximum:220}}];ge(()=>t.value.name,async()=>{await ae(),V.value.name&&k()});function k(){d.value=`$vars.${t.value.name||S.data.name}`}async function p(){t.value={...S.data},E("cancel",t.value)}async function z(){E("save",t.value)}async function Q(){E("edit",t.value),await ae(),I()}async function q(){E("delete",t.value)}function O(o,s){V.value[o]=s}function G(){L.copy(d.value),W({title:n.baseText("variables.row.usage.copiedToClipboard"),type:"success"})}function I(){var o,s,$;($=(s=(o=T.value)==null?void 0:o.inputRef)==null?void 0:s.focus)==null||$.call(s)}return(o,s)=>{const $=R("n8n-form-input"),D=R("n8n-tooltip"),h=R("n8n-button");return r(),y("tr",{class:H(o.$style.variablesRow),"data-test-id":"variables-row"},[f("td",Ce,[f("div",null,[o.editing?(r(),U($,{key:1,ref_key:"keyInputRef",ref:T,modelValue:t.value.name,"onUpdate:modelValue":s[0]||(s[0]=v=>t.value.name=v),label:"",name:"name","data-test-id":"variable-row-key-input",placeholder:b(n).baseText("variables.editing.key.placeholder"),required:"","validate-on-blur":"","validation-rules":A,onValidate:s[1]||(s[1]=v=>O("name",v))},null,8,["modelValue","placeholder"])):(r(),y("span",we,c(o.data.name),1))])]),f("td",Ve,[f("div",null,[o.editing?(r(),U($,{key:1,ref_key:"valueInputRef",ref:P,modelValue:t.value.value,"onUpdate:modelValue":s[2]||(s[2]=v=>t.value.value=v),label:"",name:"value","data-test-id":"variable-row-value-input",placeholder:b(n).baseText("variables.editing.value.placeholder"),"validate-on-blur":"","validation-rules":Z,onValidate:s[3]||(s[3]=v=>O("value",v))},null,8,["modelValue","placeholder"])):(r(),y("span",$e,c(o.data.value),1))])]),f("td",Re,[f("div",null,[m(D,{placement:"top"},{content:l(()=>[_(c(b(n).baseText("variables.row.usage.copyToClipboard")),1)]),default:l(()=>[t.value.name&&d.value?(r(),y("span",{key:0,class:H(o.$style.usageSyntax),onClick:G},c(d.value),3)):J("",!0)]),_:1})])]),X.value?(r(),y("td",Ee,[o.editing?(r(),y("div",{key:0,class:H(o.$style.buttons)},[m(h,{"data-test-id":"variable-row-cancel-button",type:"tertiary",class:"mr-xs",onClick:p},{default:l(()=>[_(c(b(n).baseText("variables.row.button.cancel")),1)]),_:1}),m(h,{"data-test-id":"variable-row-save-button",disabled:!i.value,type:"primary",onClick:z},{default:l(()=>[_(c(b(n).baseText("variables.row.button.save")),1)]),_:1},8,["disabled"])],2)):(r(),y("div",{key:1,class:H([o.$style.buttons,o.$style.hoverButtons])},[m(D,{disabled:w.value.update,placement:"top"},{content:l(()=>[_(c(b(n).baseText("variables.row.button.edit.onlyRoleCanEdit")),1)]),default:l(()=>[f("div",null,[m(h,{"data-test-id":"variable-row-edit-button",type:"tertiary",class:"mr-xs",disabled:!w.value.update,onClick:Q},{default:l(()=>[_(c(b(n).baseText("variables.row.button.edit")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"]),m(D,{disabled:w.value.delete,placement:"top"},{content:l(()=>[_(c(b(n).baseText("variables.row.button.delete.onlyRoleCanDelete")),1)]),default:l(()=>[f("div",null,[m(h,{"data-test-id":"variable-row-delete-button",type:"tertiary",disabled:!w.value.delete,onClick:q},{default:l(()=>[_(c(b(n).baseText("variables.row.button.delete")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])],2))])):J("",!0)],2)}}}),Ae="_variablesRow_14ir1_1",Be="_hoverButtons_14ir1_1",Me="_buttons_14ir1_10",Ue="_usageSyntax_14ir1_21",Ie={variablesRow:Ae,hoverButtons:Be,buttons:Me,usageSyntax:Ue},De={$style:Ie},Ne=ue(Se,[["__cssModules",De]]),Fe={key:0},Le={key:1},F="@tmpvar",We=re({__name:"VariablesView",setup(ee){const j=se(),n=ce(),L=le(),W=ve(),K=pe(),u=ie(),E=fe(),S=be();let w=()=>{};const t=g(null),{showError:V}=te(),i=g([]),T=g({}),P=ne(L.currentUser),d=C(()=>j.isEnterpriseFeatureEnabled(oe.Variables)),X=C(()=>i.value.map(e=>({id:e.id,name:e.key,value:e.value}))),A=C(()=>d.value&&P.create),Z=C(()=>[{id:0,path:"name",label:u.baseText("variables.table.key"),classes:["variables-key-column"]},{id:1,path:"value",label:u.baseText("variables.table.value"),classes:["variables-value-column"]},{id:2,path:"usage",label:u.baseText("variables.table.usage"),classes:["variables-usage-column"]},...d.value?[{id:3,path:"actions",label:""}]:[]]),k=C(()=>W.contextBasedTranslationKeys),p=g([]),z=(e,a,x)=>`${e.id}`.startsWith(F)?-1:`${a.id}`.startsWith(F)?1:p.value.includes(e.id)&&p.value.includes(a.id)?p.value.indexOf(e.id)-p.value.indexOf(a.id):p.value.includes(e.id)?-1:p.value.includes(a.id)?1:x==="asc"?v(e).trim().localeCompare(v(a).trim()):v(a).trim().localeCompare(v(e).trim()),Q={nameAsc:(e,a)=>z(e,a,"asc"),nameDesc:(e,a)=>z(e,a,"desc")};function q(){p.value=[]}const O=e=>({id:e.id,key:e.name,value:"value"in e?e.value:""});async function G(){d.value&&(await n.fetchAllVariables(),i.value=[...n.variables])}function I(){const e={id:xe(F),key:"",value:""};t.value&&(t.value.$refs.listWrapperRef&&(t.value.$refs.listWrapperRef.scrollTop=0),t.value.currentPage!==1&&t.value.setCurrentPage(1)),i.value.unshift(e),T.value[e.id]=!0,K.track("User clicked add variable button")}async function o(e){let a;const x=O(e);try{if(typeof e.id=="string"&&e.id.startsWith(F)){const{id:B,...Y}=x;a=await n.createVariable(Y),i.value.unshift(a),i.value=i.value.filter(N=>N.id!==e.id),p.value.unshift(a.id)}else a=await n.updateVariable(x),i.value=i.value.filter(B=>B.id!==e.id),i.value.push(a),s(a)}catch(B){V(B,u.baseText("variables.errors.save"))}}function s(e){T.value={...T.value,[e.id]:!T.value[e.id]}}function $(e){typeof e.id=="string"&&e.id.startsWith(F)?i.value=i.value.filter(a=>a.id!==e.id):s(e)}async function D(e){try{if(await E.confirm(u.baseText("variables.modals.deleteConfirm.message",{interpolate:{name:e.key}}),u.baseText("variables.modals.deleteConfirm.title"),{confirmButtonText:u.baseText("variables.modals.deleteConfirm.confirmButton"),cancelButtonText:u.baseText("variables.modals.deleteConfirm.cancelButton")})!==me)return;await n.deleteVariable(e),i.value=i.value.filter(x=>x.id!==e.id)}catch(a){V(a,u.baseText("variables.errors.delete"))}}function h(){W.goToUpgrade("variables","upgrade-variables")}function v(e){return e.name}return Te(()=>{w=S.$onAction(({name:e,after:a})=>{e==="pullWorkfolder"&&a&&a(()=>{G()})})}),ke(()=>{w()}),(e,a)=>{const x=R("n8n-heading"),B=R("n8n-button"),Y=R("n8n-tooltip"),N=R("n8n-action-box");return r(),U(ye,{ref_key:"layoutRef",ref:t,class:"variables-view","resource-key":"variables",disabled:!d.value,resources:X.value,initialize:G,shareable:!1,"display-name":v,"sort-fns":Q,"sort-options":["nameAsc","nameDesc"],"show-filters-dropdown":!1,type:"datatable","type-props":{columns:Z.value},onSort:q,"onClick:add":I},he({header:l(()=>[m(x,{size:"2xlarge",class:"mb-m"},{default:l(()=>[_(c(b(u).baseText("variables.heading")),1)]),_:1})]),"add-button":l(()=>[m(Y,{placement:"top",disabled:A.value},{content:l(()=>[d.value?(r(),y("span",Le,c(b(u).baseText("variables.add.onlyOwnerCanCreate")),1)):(r(),y("span",Fe,c(b(u).baseText(`variables.add.unavailable${i.value.length===0?".empty":""}`)),1))]),default:l(()=>[f("div",null,[m(B,{size:"large",block:"",disabled:!A.value,"data-test-id":"resources-list-add",onClick:I},{default:l(()=>[_(c(e.$locale.baseText("variables.add")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])]),default:l(({data:M})=>[(r(),U(Ne,{key:M.id,editing:T.value[M.id],data:M,onSave:o,onEdit:s,onCancel:$,onDelete:D},null,8,["editing","data"]))]),_:2},[d.value?void 0:{name:"preamble",fn:l(()=>[m(N,{class:"mb-m","data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(k.value.variables.unavailable.title),description:e.$locale.baseText(k.value.variables.unavailable.description),"button-text":e.$locale.baseText(k.value.variables.unavailable.button),"button-type":"secondary","onClick:button":h},null,8,["heading","description","button-text"])]),key:"0"},!d.value||d.value&&!A.value?{name:"empty",fn:l(()=>{var M;return[d.value?A.value?J("",!0):(r(),U(N,{key:1,"data-test-id":"cannot-create-variables",emoji:"👋",heading:e.$locale.baseText("variables.empty.notAllowedToCreate.heading",{interpolate:{name:((M=b(L).currentUser)==null?void 0:M.firstName)??""}}),description:e.$locale.baseText("variables.empty.notAllowedToCreate.description"),onClick:h},null,8,["heading","description"])):(r(),U(N,{key:0,"data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(k.value.variables.unavailable.title),description:e.$locale.baseText(k.value.variables.unavailable.description),"button-text":e.$locale.baseText(k.value.variables.unavailable.button),"button-type":"secondary","onClick:button":h},null,8,["heading","description","button-text"]))]}),key:"1"}:void 0]),1032,["disabled","resources","type-props"])}}}),ze="_sidebarContainer_pm4w0_5",Oe={"type-input":"_type-input_pm4w0_1",sidebarContainer:ze},Ge={$style:Oe},Ta=ue(We,[["__cssModules",Ge],["__scopeId","data-v-32167291"]]);export{Ta as default};
2
- //# sourceMappingURL=VariablesView-NcNcsjHY.js.map
1
+ import{aK as de,u as te,b as se,a as le,dm as ne,E as oe,x as ie,aQ as ce,e as ve,n as be,A as me,G as pe,H as fe}from"./index-BE0Xl-jy.js";import{R as ye}from"./ResourcesListLayout-mZ4ijKRB.js";import{G as re,e as C,r as g,b as _e,d as ge,ag as R,l as r,m as y,p as f,T as c,M as U,u as b,U as m,O as l,S as _,I as H,R as J,n as ae,D as Te,y as ke,a9 as he}from"./vendor-Dv5OeN6t.js";import{_ as ue,as as xe}from"./n8n-4UEsHtUL.js";import"./pinia-sugP77Im.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const Ce={class:"variables-key-column"},we={key:0},Ve={class:"variables-value-column"},$e={key:0},Re={class:"variables-usage-column"},Ee={key:0},Se=re({__name:"VariablesRow",props:{data:{},editing:{type:Boolean,default:!1}},emits:["save","cancel","edit","delete"],setup(ee,{emit:j}){const n=ie(),L=de(),{showMessage:W}=te(),K=se(),u=le(),E=j,S=ee,w=C(()=>ne(u.currentUser)),t=g({...S.data}),V=g({key:!1,value:!1}),i=C(()=>V.value.name&&V.value.value),T=g(),P=g(),d=g(`$vars.${S.data.name}`),X=C(()=>K.isEnterpriseFeatureEnabled(oe.Variables));_e(()=>{I()});const A=[{name:"REQUIRED"},{name:"MAX_LENGTH",config:{maximum:50}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z]/,message:n.baseText("variables.editing.key.error.startsWithLetter")}},{name:"MATCH_REGEX",config:{regex:/^[a-zA-Z][a-zA-Z0-9_]*$/,message:n.baseText("variables.editing.key.error.jsonKey")}}],Z=[{name:"MAX_LENGTH",config:{maximum:220}}];ge(()=>t.value.name,async()=>{await ae(),V.value.name&&k()});function k(){d.value=`$vars.${t.value.name||S.data.name}`}async function p(){t.value={...S.data},E("cancel",t.value)}async function z(){E("save",t.value)}async function Q(){E("edit",t.value),await ae(),I()}async function q(){E("delete",t.value)}function O(o,s){V.value[o]=s}function G(){L.copy(d.value),W({title:n.baseText("variables.row.usage.copiedToClipboard"),type:"success"})}function I(){var o,s,$;($=(s=(o=T.value)==null?void 0:o.inputRef)==null?void 0:s.focus)==null||$.call(s)}return(o,s)=>{const $=R("n8n-form-input"),D=R("n8n-tooltip"),h=R("n8n-button");return r(),y("tr",{class:H(o.$style.variablesRow),"data-test-id":"variables-row"},[f("td",Ce,[f("div",null,[o.editing?(r(),U($,{key:1,ref_key:"keyInputRef",ref:T,modelValue:t.value.name,"onUpdate:modelValue":s[0]||(s[0]=v=>t.value.name=v),label:"",name:"name","data-test-id":"variable-row-key-input",placeholder:b(n).baseText("variables.editing.key.placeholder"),required:"","validate-on-blur":"","validation-rules":A,onValidate:s[1]||(s[1]=v=>O("name",v))},null,8,["modelValue","placeholder"])):(r(),y("span",we,c(o.data.name),1))])]),f("td",Ve,[f("div",null,[o.editing?(r(),U($,{key:1,ref_key:"valueInputRef",ref:P,modelValue:t.value.value,"onUpdate:modelValue":s[2]||(s[2]=v=>t.value.value=v),label:"",name:"value","data-test-id":"variable-row-value-input",placeholder:b(n).baseText("variables.editing.value.placeholder"),"validate-on-blur":"","validation-rules":Z,onValidate:s[3]||(s[3]=v=>O("value",v))},null,8,["modelValue","placeholder"])):(r(),y("span",$e,c(o.data.value),1))])]),f("td",Re,[f("div",null,[m(D,{placement:"top"},{content:l(()=>[_(c(b(n).baseText("variables.row.usage.copyToClipboard")),1)]),default:l(()=>[t.value.name&&d.value?(r(),y("span",{key:0,class:H(o.$style.usageSyntax),onClick:G},c(d.value),3)):J("",!0)]),_:1})])]),X.value?(r(),y("td",Ee,[o.editing?(r(),y("div",{key:0,class:H(o.$style.buttons)},[m(h,{"data-test-id":"variable-row-cancel-button",type:"tertiary",class:"mr-xs",onClick:p},{default:l(()=>[_(c(b(n).baseText("variables.row.button.cancel")),1)]),_:1}),m(h,{"data-test-id":"variable-row-save-button",disabled:!i.value,type:"primary",onClick:z},{default:l(()=>[_(c(b(n).baseText("variables.row.button.save")),1)]),_:1},8,["disabled"])],2)):(r(),y("div",{key:1,class:H([o.$style.buttons,o.$style.hoverButtons])},[m(D,{disabled:w.value.update,placement:"top"},{content:l(()=>[_(c(b(n).baseText("variables.row.button.edit.onlyRoleCanEdit")),1)]),default:l(()=>[f("div",null,[m(h,{"data-test-id":"variable-row-edit-button",type:"tertiary",class:"mr-xs",disabled:!w.value.update,onClick:Q},{default:l(()=>[_(c(b(n).baseText("variables.row.button.edit")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"]),m(D,{disabled:w.value.delete,placement:"top"},{content:l(()=>[_(c(b(n).baseText("variables.row.button.delete.onlyRoleCanDelete")),1)]),default:l(()=>[f("div",null,[m(h,{"data-test-id":"variable-row-delete-button",type:"tertiary",disabled:!w.value.delete,onClick:q},{default:l(()=>[_(c(b(n).baseText("variables.row.button.delete")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])],2))])):J("",!0)],2)}}}),Ae="_variablesRow_14ir1_1",Be="_hoverButtons_14ir1_1",Me="_buttons_14ir1_10",Ue="_usageSyntax_14ir1_21",Ie={variablesRow:Ae,hoverButtons:Be,buttons:Me,usageSyntax:Ue},De={$style:Ie},Ne=ue(Se,[["__cssModules",De]]),Fe={key:0},Le={key:1},F="@tmpvar",We=re({__name:"VariablesView",setup(ee){const j=se(),n=ce(),L=le(),W=ve(),K=pe(),u=ie(),E=fe(),S=be();let w=()=>{};const t=g(null),{showError:V}=te(),i=g([]),T=g({}),P=ne(L.currentUser),d=C(()=>j.isEnterpriseFeatureEnabled(oe.Variables)),X=C(()=>i.value.map(e=>({id:e.id,name:e.key,value:e.value}))),A=C(()=>d.value&&P.create),Z=C(()=>[{id:0,path:"name",label:u.baseText("variables.table.key"),classes:["variables-key-column"]},{id:1,path:"value",label:u.baseText("variables.table.value"),classes:["variables-value-column"]},{id:2,path:"usage",label:u.baseText("variables.table.usage"),classes:["variables-usage-column"]},...d.value?[{id:3,path:"actions",label:""}]:[]]),k=C(()=>W.contextBasedTranslationKeys),p=g([]),z=(e,a,x)=>`${e.id}`.startsWith(F)?-1:`${a.id}`.startsWith(F)?1:p.value.includes(e.id)&&p.value.includes(a.id)?p.value.indexOf(e.id)-p.value.indexOf(a.id):p.value.includes(e.id)?-1:p.value.includes(a.id)?1:x==="asc"?v(e).trim().localeCompare(v(a).trim()):v(a).trim().localeCompare(v(e).trim()),Q={nameAsc:(e,a)=>z(e,a,"asc"),nameDesc:(e,a)=>z(e,a,"desc")};function q(){p.value=[]}const O=e=>({id:e.id,key:e.name,value:"value"in e?e.value:""});async function G(){d.value&&(await n.fetchAllVariables(),i.value=[...n.variables])}function I(){const e={id:xe(F),key:"",value:""};t.value&&(t.value.$refs.listWrapperRef&&(t.value.$refs.listWrapperRef.scrollTop=0),t.value.currentPage!==1&&t.value.setCurrentPage(1)),i.value.unshift(e),T.value[e.id]=!0,K.track("User clicked add variable button")}async function o(e){let a;const x=O(e);try{if(typeof e.id=="string"&&e.id.startsWith(F)){const{id:B,...Y}=x;a=await n.createVariable(Y),i.value.unshift(a),i.value=i.value.filter(N=>N.id!==e.id),p.value.unshift(a.id)}else a=await n.updateVariable(x),i.value=i.value.filter(B=>B.id!==e.id),i.value.push(a),s(a)}catch(B){V(B,u.baseText("variables.errors.save"))}}function s(e){T.value={...T.value,[e.id]:!T.value[e.id]}}function $(e){typeof e.id=="string"&&e.id.startsWith(F)?i.value=i.value.filter(a=>a.id!==e.id):s(e)}async function D(e){try{if(await E.confirm(u.baseText("variables.modals.deleteConfirm.message",{interpolate:{name:e.key}}),u.baseText("variables.modals.deleteConfirm.title"),{confirmButtonText:u.baseText("variables.modals.deleteConfirm.confirmButton"),cancelButtonText:u.baseText("variables.modals.deleteConfirm.cancelButton")})!==me)return;await n.deleteVariable(e),i.value=i.value.filter(x=>x.id!==e.id)}catch(a){V(a,u.baseText("variables.errors.delete"))}}function h(){W.goToUpgrade("variables","upgrade-variables")}function v(e){return e.name}return Te(()=>{w=S.$onAction(({name:e,after:a})=>{e==="pullWorkfolder"&&a&&a(()=>{G()})})}),ke(()=>{w()}),(e,a)=>{const x=R("n8n-heading"),B=R("n8n-button"),Y=R("n8n-tooltip"),N=R("n8n-action-box");return r(),U(ye,{ref_key:"layoutRef",ref:t,class:"variables-view","resource-key":"variables",disabled:!d.value,resources:X.value,initialize:G,shareable:!1,"display-name":v,"sort-fns":Q,"sort-options":["nameAsc","nameDesc"],"show-filters-dropdown":!1,type:"datatable","type-props":{columns:Z.value},onSort:q,"onClick:add":I},he({header:l(()=>[m(x,{size:"2xlarge",class:"mb-m"},{default:l(()=>[_(c(b(u).baseText("variables.heading")),1)]),_:1})]),"add-button":l(()=>[m(Y,{placement:"top",disabled:A.value},{content:l(()=>[d.value?(r(),y("span",Le,c(b(u).baseText("variables.add.onlyOwnerCanCreate")),1)):(r(),y("span",Fe,c(b(u).baseText(`variables.add.unavailable${i.value.length===0?".empty":""}`)),1))]),default:l(()=>[f("div",null,[m(B,{size:"large",block:"",disabled:!A.value,"data-test-id":"resources-list-add",onClick:I},{default:l(()=>[_(c(e.$locale.baseText("variables.add")),1)]),_:1},8,["disabled"])])]),_:1},8,["disabled"])]),default:l(({data:M})=>[(r(),U(Ne,{key:M.id,editing:T.value[M.id],data:M,onSave:o,onEdit:s,onCancel:$,onDelete:D},null,8,["editing","data"]))]),_:2},[d.value?void 0:{name:"preamble",fn:l(()=>[m(N,{class:"mb-m","data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(k.value.variables.unavailable.title),description:e.$locale.baseText(k.value.variables.unavailable.description),"button-text":e.$locale.baseText(k.value.variables.unavailable.button),"button-type":"secondary","onClick:button":h},null,8,["heading","description","button-text"])]),key:"0"},!d.value||d.value&&!A.value?{name:"empty",fn:l(()=>{var M;return[d.value?A.value?J("",!0):(r(),U(N,{key:1,"data-test-id":"cannot-create-variables",emoji:"👋",heading:e.$locale.baseText("variables.empty.notAllowedToCreate.heading",{interpolate:{name:((M=b(L).currentUser)==null?void 0:M.firstName)??""}}),description:e.$locale.baseText("variables.empty.notAllowedToCreate.description"),onClick:h},null,8,["heading","description"])):(r(),U(N,{key:0,"data-test-id":"unavailable-resources-list",emoji:"👋",heading:e.$locale.baseText(k.value.variables.unavailable.title),description:e.$locale.baseText(k.value.variables.unavailable.description),"button-text":e.$locale.baseText(k.value.variables.unavailable.button),"button-type":"secondary","onClick:button":h},null,8,["heading","description","button-text"]))]}),key:"1"}:void 0]),1032,["disabled","resources","type-props"])}}}),ze="_sidebarContainer_pm4w0_5",Oe={"type-input":"_type-input_pm4w0_1",sidebarContainer:ze},Ge={$style:Oe},Ta=ue(We,[["__cssModules",Ge],["__scopeId","data-v-32167291"]]);export{Ta as default};
2
+ //# sourceMappingURL=VariablesView-BO5fdkwt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VariablesView-NcNcsjHY.js","sources":["../../src/components/VariablesRow.vue","../../src/views/VariablesView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ComponentPublicInstance } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\nimport type { Rule, RuleGroup } from '@/Interface';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { getVariablesPermissions } from '@/permissions';\nimport type { IResource } from './layouts/ResourcesListLayout.vue';\n\nconst i18n = useI18n();\nconst clipboard = useClipboard();\nconst { showMessage } = useToast();\nconst settingsStore = useSettingsStore();\nconst usersStore = useUsersStore();\n\nconst emit = defineEmits(['save', 'cancel', 'edit', 'delete']);\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tdata: IResource;\n\t\tediting: boolean;\n\t}>(),\n\t{\n\t\tediting: false,\n\t},\n);\n\nconst permissions = computed(() => getVariablesPermissions(usersStore.currentUser));\nconst modelValue = ref<IResource>({ ...props.data });\n\nconst formValidationStatus = ref<Record<string, boolean>>({\n\tkey: false,\n\tvalue: false,\n});\nconst formValid = computed(() => {\n\treturn formValidationStatus.value.name && formValidationStatus.value.value;\n});\n\nconst keyInputRef = ref<ComponentPublicInstance & { inputRef?: HTMLElement }>();\nconst valueInputRef = ref<HTMLElement>();\n\nconst usage = ref(`$vars.${props.data.name}`);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nonMounted(() => {\n\tfocusFirstInput();\n});\n\nconst keyValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'REQUIRED' },\n\t{ name: 'MAX_LENGTH', config: { maximum: 50 } },\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z]/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.startsWithLetter'),\n\t\t},\n\t},\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z][a-zA-Z0-9_]*$/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.jsonKey'),\n\t\t},\n\t},\n];\n\nconst valueValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'MAX_LENGTH', config: { maximum: 220 } },\n];\n\nwatch(\n\t() => modelValue.value.name,\n\tasync () => {\n\t\tawait nextTick();\n\t\tif (formValidationStatus.value.name) {\n\t\t\tupdateUsageSyntax();\n\t\t}\n\t},\n);\n\nfunction updateUsageSyntax() {\n\tusage.value = `$vars.${modelValue.value.name || props.data.name}`;\n}\n\nasync function onCancel() {\n\tmodelValue.value = { ...props.data };\n\temit('cancel', modelValue.value);\n}\n\nasync function onSave() {\n\temit('save', modelValue.value);\n}\n\nasync function onEdit() {\n\temit('edit', modelValue.value);\n\n\tawait nextTick();\n\n\tfocusFirstInput();\n}\n\nasync function onDelete() {\n\temit('delete', modelValue.value);\n}\n\nfunction onValidate(name: string, value: boolean) {\n\tformValidationStatus.value[name] = value;\n}\n\nfunction onUsageClick() {\n\tvoid clipboard.copy(usage.value);\n\tshowMessage({\n\t\ttitle: i18n.baseText('variables.row.usage.copiedToClipboard'),\n\t\ttype: 'success',\n\t});\n}\n\nfunction focusFirstInput() {\n\tkeyInputRef.value?.inputRef?.focus?.();\n}\n</script>\n\n<template>\n\t<tr :class=\"$style.variablesRow\" data-test-id=\"variables-row\">\n\t\t<td class=\"variables-key-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.name }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tref=\"keyInputRef\"\n\t\t\t\t\tv-model=\"modelValue.name\"\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"name\"\n\t\t\t\t\tdata-test-id=\"variable-row-key-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.key.placeholder')\"\n\t\t\t\t\trequired\n\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t:validation-rules=\"keyValidationRules\"\n\t\t\t\t\t@validate=\"(value: boolean) => onValidate('name', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-value-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.value }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tref=\"valueInputRef\"\n\t\t\t\t\tv-model=\"modelValue.value\"\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"value\"\n\t\t\t\t\tdata-test-id=\"variable-row-value-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.value.placeholder')\"\n\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t:validation-rules=\"valueValidationRules\"\n\t\t\t\t\t@validate=\"(value: boolean) => onValidate('value', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-usage-column\">\n\t\t\t<div>\n\t\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t\t<span v-if=\"modelValue.name && usage\" :class=\"$style.usageSyntax\" @click=\"onUsageClick\">{{\n\t\t\t\t\t\tusage\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.usage.copyToClipboard') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t\t<td v-if=\"isFeatureEnabled\">\n\t\t\t<div v-if=\"editing\" :class=\"$style.buttons\">\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-cancel-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t@click=\"onCancel\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.cancel') }}\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-save-button\"\n\t\t\t\t\t:disabled=\"!formValid\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t@click=\"onSave\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.save') }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"[$style.buttons, $style.hoverButtons]\">\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.update\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-edit-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.update\"\n\t\t\t\t\t\t\t@click=\"onEdit\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit.onlyRoleCanEdit') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.delete\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-delete-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.delete\"\n\t\t\t\t\t\t\t@click=\"onDelete\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete.onlyRoleCanDelete') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t</tr>\n</template>\n\n<style lang=\"scss\" module>\n.variablesRow {\n\t&:hover {\n\t\t.hoverButtons {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\ttd {\n\t\t> div {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tmin-height: 40px;\n\t\t}\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tflex-wrap: nowrap;\n\tjustify-content: flex-end;\n}\n\n.hoverButtons {\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n}\n\n.usageSyntax {\n\tcursor: pointer;\n\tbackground: var(--color-variables-usage-syntax-bg);\n\tcolor: var(--color-variables-usage-font);\n\tfont-family: var(--font-family-monospace);\n\tfont-size: var(--font-size-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, ref, onBeforeMount, onBeforeUnmount } from 'vue';\nimport { useEnvironmentsStore } from '@/stores/environments.ee.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useToast } from '@/composables/useToast';\nimport { useMessage } from '@/composables/useMessage';\n\nimport type { IResource } from '@/components/layouts/ResourcesListLayout.vue';\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport VariablesRow from '@/components/VariablesRow.vue';\n\nimport { EnterpriseEditionFeature, MODAL_CONFIRM } from '@/constants';\nimport type { DatatableColumn, EnvironmentVariable } from '@/Interface';\nimport { uid } from 'n8n-design-system/utils';\nimport { getVariablesPermissions } from '@/permissions';\nimport type { BaseTextKey } from '@/plugins/i18n';\n\nconst settingsStore = useSettingsStore();\nconst environmentsStore = useEnvironmentsStore();\nconst usersStore = useUsersStore();\nconst uiStore = useUIStore();\nconst telemetry = useTelemetry();\nconst i18n = useI18n();\nconst message = useMessage();\nconst sourceControlStore = useSourceControlStore();\nlet sourceControlStoreUnsubscribe = () => {};\n\nconst layoutRef = ref<InstanceType<typeof ResourcesListLayout> | null>(null);\n\nconst { showError } = useToast();\n\nconst TEMPORARY_VARIABLE_UID_BASE = '@tmpvar';\n\nconst allVariables = ref<EnvironmentVariable[]>([]);\nconst editMode = ref<Record<string, boolean>>({});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nconst variablesToResources = computed((): IResource[] =>\n\tallVariables.value.map((v) => ({ id: v.id, name: v.key, value: v.value })),\n);\n\nconst canCreateVariables = computed(() => isFeatureEnabled.value && permissions.create);\n\nconst datatableColumns = computed<DatatableColumn[]>(() => [\n\t{\n\t\tid: 0,\n\t\tpath: 'name',\n\t\tlabel: i18n.baseText('variables.table.key'),\n\t\tclasses: ['variables-key-column'],\n\t},\n\t{\n\t\tid: 1,\n\t\tpath: 'value',\n\t\tlabel: i18n.baseText('variables.table.value'),\n\t\tclasses: ['variables-value-column'],\n\t},\n\t{\n\t\tid: 2,\n\t\tpath: 'usage',\n\t\tlabel: i18n.baseText('variables.table.usage'),\n\t\tclasses: ['variables-usage-column'],\n\t},\n\t...(isFeatureEnabled.value\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: 3,\n\t\t\t\t\tpath: 'actions',\n\t\t\t\t\tlabel: '',\n\t\t\t\t},\n\t\t\t]\n\t\t: []),\n]);\n\nconst contextBasedTranslationKeys = computed(() => uiStore.contextBasedTranslationKeys);\n\nconst newlyAddedVariableIds = ref<string[]>([]);\n\nconst nameSortFn = (a: IResource, b: IResource, direction: 'asc' | 'desc') => {\n\tif (`${a.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn -1;\n\t} else if (`${b.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn 1;\n\t} else if (\n\t\tnewlyAddedVariableIds.value.includes(a.id) &&\n\t\tnewlyAddedVariableIds.value.includes(b.id)\n\t) {\n\t\treturn newlyAddedVariableIds.value.indexOf(a.id) - newlyAddedVariableIds.value.indexOf(b.id);\n\t} else if (newlyAddedVariableIds.value.includes(a.id)) {\n\t\treturn -1;\n\t} else if (newlyAddedVariableIds.value.includes(b.id)) {\n\t\treturn 1;\n\t}\n\n\treturn direction === 'asc'\n\t\t? displayName(a).trim().localeCompare(displayName(b).trim())\n\t\t: displayName(b).trim().localeCompare(displayName(a).trim());\n};\nconst sortFns = {\n\tnameAsc: (a: IResource, b: IResource) => {\n\t\treturn nameSortFn(a, b, 'asc');\n\t},\n\tnameDesc: (a: IResource, b: IResource) => {\n\t\treturn nameSortFn(a, b, 'desc');\n\t},\n};\n\nfunction resetNewVariablesList() {\n\tnewlyAddedVariableIds.value = [];\n}\n\nconst resourceToEnvironmentVariable = (data: IResource): EnvironmentVariable => {\n\treturn {\n\t\tid: data.id,\n\t\tkey: data.name,\n\t\tvalue: 'value' in data ? data.value : '',\n\t};\n};\n\nasync function initialize() {\n\tif (!isFeatureEnabled.value) return;\n\tawait environmentsStore.fetchAllVariables();\n\n\tallVariables.value = [...environmentsStore.variables];\n}\n\nfunction addTemporaryVariable() {\n\tconst temporaryVariable: EnvironmentVariable = {\n\t\tid: uid(TEMPORARY_VARIABLE_UID_BASE),\n\t\tkey: '',\n\t\tvalue: '',\n\t};\n\n\tif (layoutRef.value) {\n\t\t// Reset scroll position\n\t\tif (layoutRef.value.$refs.listWrapperRef) {\n\t\t\t(layoutRef.value.$refs.listWrapperRef as HTMLDivElement).scrollTop = 0;\n\t\t}\n\n\t\t// Reset pagination\n\t\tif (layoutRef.value.currentPage !== 1) {\n\t\t\tlayoutRef.value.setCurrentPage(1);\n\t\t}\n\t}\n\n\tallVariables.value.unshift(temporaryVariable);\n\teditMode.value[temporaryVariable.id] = true;\n\n\ttelemetry.track('User clicked add variable button');\n}\n\nasync function saveVariable(data: IResource) {\n\tlet updatedVariable: EnvironmentVariable;\n\tconst variable = resourceToEnvironmentVariable(data);\n\n\ttry {\n\t\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\t\tconst { id, ...rest } = variable;\n\t\t\tupdatedVariable = await environmentsStore.createVariable(rest);\n\t\t\tallVariables.value.unshift(updatedVariable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tnewlyAddedVariableIds.value.unshift(updatedVariable.id);\n\t\t} else {\n\t\t\tupdatedVariable = await environmentsStore.updateVariable(variable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tallVariables.value.push(updatedVariable);\n\t\t\ttoggleEditing(updatedVariable);\n\t\t}\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.save'));\n\t}\n}\n\nfunction toggleEditing(data: EnvironmentVariable) {\n\teditMode.value = {\n\t\t...editMode.value,\n\t\t[data.id]: !editMode.value[data.id],\n\t};\n}\n\nfunction cancelEditing(data: EnvironmentVariable) {\n\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} else {\n\t\ttoggleEditing(data);\n\t}\n}\n\nasync function deleteVariable(data: EnvironmentVariable) {\n\ttry {\n\t\tconst confirmed = await message.confirm(\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.message', { interpolate: { name: data.key } }),\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: i18n.baseText('variables.modals.deleteConfirm.confirmButton'),\n\t\t\t\tcancelButtonText: i18n.baseText('variables.modals.deleteConfirm.cancelButton'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmed !== MODAL_CONFIRM) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait environmentsStore.deleteVariable(data);\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.delete'));\n\t}\n}\n\nfunction goToUpgrade() {\n\tvoid uiStore.goToUpgrade('variables', 'upgrade-variables');\n}\n\nfunction displayName(resource: IResource) {\n\treturn resource.name;\n}\n\nonBeforeMount(() => {\n\tsourceControlStoreUnsubscribe = sourceControlStore.$onAction(({ name, after }) => {\n\t\tif (name === 'pullWorkfolder' && after) {\n\t\t\tafter(() => {\n\t\t\t\tvoid initialize();\n\t\t\t});\n\t\t}\n\t});\n});\n\nonBeforeUnmount(() => {\n\tsourceControlStoreUnsubscribe();\n});\n</script>\n\n<template>\n\t<ResourcesListLayout\n\t\tref=\"layoutRef\"\n\t\tclass=\"variables-view\"\n\t\tresource-key=\"variables\"\n\t\t:disabled=\"!isFeatureEnabled\"\n\t\t:resources=\"variablesToResources\"\n\t\t:initialize=\"initialize\"\n\t\t:shareable=\"false\"\n\t\t:display-name=\"displayName\"\n\t\t:sort-fns=\"sortFns\"\n\t\t:sort-options=\"['nameAsc', 'nameDesc']\"\n\t\t:show-filters-dropdown=\"false\"\n\t\ttype=\"datatable\"\n\t\t:type-props=\"{ columns: datatableColumns }\"\n\t\t@sort=\"resetNewVariablesList\"\n\t\t@click:add=\"addTemporaryVariable\"\n\t>\n\t\t<template #header>\n\t\t\t<n8n-heading size=\"2xlarge\" class=\"mb-m\">\n\t\t\t\t{{ i18n.baseText('variables.heading') }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<template #add-button>\n\t\t\t<n8n-tooltip placement=\"top\" :disabled=\"canCreateVariables\">\n\t\t\t\t<div>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"!canCreateVariables\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t\t@click=\"addTemporaryVariable\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText(`variables.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #content>\n\t\t\t\t\t<span v-if=\"!isFeatureEnabled\">{{\n\t\t\t\t\t\ti18n.baseText(`variables.add.unavailable${allVariables.length === 0 ? '.empty' : ''}`)\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<span v-else>{{ i18n.baseText('variables.add.onlyOwnerCanCreate') }}</span>\n\t\t\t\t</template>\n\t\t\t</n8n-tooltip>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled\" #preamble>\n\t\t\t<n8n-action-box\n\t\t\t\tclass=\"mb-m\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\tcontextBasedTranslationKeys.variables.unavailable.description as BaseTextKey,\n\t\t\t\t\t)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\tbutton-type=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled || (isFeatureEnabled && !canCreateVariables)\" #empty>\n\t\t\t<n8n-action-box\n\t\t\t\tv-if=\"!isFeatureEnabled\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\tcontextBasedTranslationKeys.variables.unavailable.description as BaseTextKey,\n\t\t\t\t\t)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\tbutton-type=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t\t<n8n-action-box\n\t\t\t\tv-else-if=\"!canCreateVariables\"\n\t\t\t\tdata-test-id=\"cannot-create-variables\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText('variables.empty.notAllowedToCreate.heading', {\n\t\t\t\t\t\tinterpolate: { name: usersStore.currentUser?.firstName ?? '' },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t\t:description=\"$locale.baseText('variables.empty.notAllowedToCreate.description')\"\n\t\t\t\t@click=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #default=\"{ data }\">\n\t\t\t<VariablesRow\n\t\t\t\t:key=\"data.id\"\n\t\t\t\t:editing=\"editMode[data.id]\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t@save=\"saveVariable\"\n\t\t\t\t@edit=\"toggleEditing\"\n\t\t\t\t@cancel=\"cancelEditing\"\n\t\t\t\t@delete=\"deleteVariable\"\n\t\t\t/>\n\t\t</template>\n\t</ResourcesListLayout>\n</template>\n\n<style lang=\"scss\" module>\n.type-input {\n\t--max-width: 265px;\n}\n\n.sidebarContainer ul {\n\tpadding: 0 !important;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@use 'n8n-design-system/css/common/var.scss';\n\n.variables-view {\n\t:deep(.datatable) {\n\t\ttable {\n\t\t\ttable-layout: fixed;\n\t\t}\n\n\t\tth,\n\t\ttd {\n\t\t\twidth: 25%;\n\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\twidth: 33.33%;\n\t\t\t}\n\n\t\t\t&.variables-value-column,\n\t\t\t&.variables-key-column,\n\t\t\t&.variables-usage-column {\n\t\t\t\t> div {\n\t\t\t\t\twidth: 100%;\n\n\t\t\t\t\t> span {\n\t\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\t\toverflow: hidden;\n\t\t\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\t\theight: 18px;\n\t\t\t\t\t}\n\n\t\t\t\t\t> div {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.variables-usage-column {\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n"],"names":["i18n","useI18n","clipboard","useClipboard","showMessage","useToast","settingsStore","useSettingsStore","usersStore","useUsersStore","emit","__emit","props","__props","permissions","computed","getVariablesPermissions","modelValue","ref","formValidationStatus","formValid","keyInputRef","valueInputRef","usage","isFeatureEnabled","EnterpriseEditionFeature","onMounted","focusFirstInput","keyValidationRules","valueValidationRules","watch","nextTick","updateUsageSyntax","onCancel","onSave","onEdit","onDelete","onValidate","name","value","onUsageClick","_c","_b","_a","TEMPORARY_VARIABLE_UID_BASE","environmentsStore","useEnvironmentsStore","uiStore","useUIStore","telemetry","useTelemetry","message","useMessage","sourceControlStore","useSourceControlStore","sourceControlStoreUnsubscribe","layoutRef","showError","allVariables","editMode","variablesToResources","v","canCreateVariables","datatableColumns","contextBasedTranslationKeys","newlyAddedVariableIds","nameSortFn","a","b","direction","displayName","sortFns","resetNewVariablesList","resourceToEnvironmentVariable","data","initialize","addTemporaryVariable","temporaryVariable","uid","saveVariable","updatedVariable","variable","id","rest","toggleEditing","error","cancelEditing","deleteVariable","MODAL_CONFIRM","goToUpgrade","resource","onBeforeMount","after","onBeforeUnmount"],"mappings":"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"}
1
+ {"version":3,"file":"VariablesView-BO5fdkwt.js","sources":["../../src/components/VariablesRow.vue","../../src/views/VariablesView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ComponentPublicInstance } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\nimport type { Rule, RuleGroup } from '@/Interface';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { getVariablesPermissions } from '@/permissions';\nimport type { IResource } from './layouts/ResourcesListLayout.vue';\n\nconst i18n = useI18n();\nconst clipboard = useClipboard();\nconst { showMessage } = useToast();\nconst settingsStore = useSettingsStore();\nconst usersStore = useUsersStore();\n\nconst emit = defineEmits(['save', 'cancel', 'edit', 'delete']);\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tdata: IResource;\n\t\tediting: boolean;\n\t}>(),\n\t{\n\t\tediting: false,\n\t},\n);\n\nconst permissions = computed(() => getVariablesPermissions(usersStore.currentUser));\nconst modelValue = ref<IResource>({ ...props.data });\n\nconst formValidationStatus = ref<Record<string, boolean>>({\n\tkey: false,\n\tvalue: false,\n});\nconst formValid = computed(() => {\n\treturn formValidationStatus.value.name && formValidationStatus.value.value;\n});\n\nconst keyInputRef = ref<ComponentPublicInstance & { inputRef?: HTMLElement }>();\nconst valueInputRef = ref<HTMLElement>();\n\nconst usage = ref(`$vars.${props.data.name}`);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nonMounted(() => {\n\tfocusFirstInput();\n});\n\nconst keyValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'REQUIRED' },\n\t{ name: 'MAX_LENGTH', config: { maximum: 50 } },\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z]/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.startsWithLetter'),\n\t\t},\n\t},\n\t{\n\t\tname: 'MATCH_REGEX',\n\t\tconfig: {\n\t\t\tregex: /^[a-zA-Z][a-zA-Z0-9_]*$/,\n\t\t\tmessage: i18n.baseText('variables.editing.key.error.jsonKey'),\n\t\t},\n\t},\n];\n\nconst valueValidationRules: Array<Rule | RuleGroup> = [\n\t{ name: 'MAX_LENGTH', config: { maximum: 220 } },\n];\n\nwatch(\n\t() => modelValue.value.name,\n\tasync () => {\n\t\tawait nextTick();\n\t\tif (formValidationStatus.value.name) {\n\t\t\tupdateUsageSyntax();\n\t\t}\n\t},\n);\n\nfunction updateUsageSyntax() {\n\tusage.value = `$vars.${modelValue.value.name || props.data.name}`;\n}\n\nasync function onCancel() {\n\tmodelValue.value = { ...props.data };\n\temit('cancel', modelValue.value);\n}\n\nasync function onSave() {\n\temit('save', modelValue.value);\n}\n\nasync function onEdit() {\n\temit('edit', modelValue.value);\n\n\tawait nextTick();\n\n\tfocusFirstInput();\n}\n\nasync function onDelete() {\n\temit('delete', modelValue.value);\n}\n\nfunction onValidate(name: string, value: boolean) {\n\tformValidationStatus.value[name] = value;\n}\n\nfunction onUsageClick() {\n\tvoid clipboard.copy(usage.value);\n\tshowMessage({\n\t\ttitle: i18n.baseText('variables.row.usage.copiedToClipboard'),\n\t\ttype: 'success',\n\t});\n}\n\nfunction focusFirstInput() {\n\tkeyInputRef.value?.inputRef?.focus?.();\n}\n</script>\n\n<template>\n\t<tr :class=\"$style.variablesRow\" data-test-id=\"variables-row\">\n\t\t<td class=\"variables-key-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.name }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tref=\"keyInputRef\"\n\t\t\t\t\tv-model=\"modelValue.name\"\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"name\"\n\t\t\t\t\tdata-test-id=\"variable-row-key-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.key.placeholder')\"\n\t\t\t\t\trequired\n\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t:validation-rules=\"keyValidationRules\"\n\t\t\t\t\t@validate=\"(value: boolean) => onValidate('name', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-value-column\">\n\t\t\t<div>\n\t\t\t\t<span v-if=\"!editing\">{{ data.value }}</span>\n\t\t\t\t<n8n-form-input\n\t\t\t\t\tv-else\n\t\t\t\t\tref=\"valueInputRef\"\n\t\t\t\t\tv-model=\"modelValue.value\"\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"value\"\n\t\t\t\t\tdata-test-id=\"variable-row-value-input\"\n\t\t\t\t\t:placeholder=\"i18n.baseText('variables.editing.value.placeholder')\"\n\t\t\t\t\tvalidate-on-blur\n\t\t\t\t\t:validation-rules=\"valueValidationRules\"\n\t\t\t\t\t@validate=\"(value: boolean) => onValidate('value', value)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td class=\"variables-usage-column\">\n\t\t\t<div>\n\t\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t\t<span v-if=\"modelValue.name && usage\" :class=\"$style.usageSyntax\" @click=\"onUsageClick\">{{\n\t\t\t\t\t\tusage\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.usage.copyToClipboard') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t\t<td v-if=\"isFeatureEnabled\">\n\t\t\t<div v-if=\"editing\" :class=\"$style.buttons\">\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-cancel-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t@click=\"onCancel\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.cancel') }}\n\t\t\t\t</n8n-button>\n\t\t\t\t<n8n-button\n\t\t\t\t\tdata-test-id=\"variable-row-save-button\"\n\t\t\t\t\t:disabled=\"!formValid\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t@click=\"onSave\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('variables.row.button.save') }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"[$style.buttons, $style.hoverButtons]\">\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.update\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-edit-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\tclass=\"mr-xs\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.update\"\n\t\t\t\t\t\t\t@click=\"onEdit\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.edit.onlyRoleCanEdit') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-tooltip :disabled=\"permissions.delete\" placement=\"top\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\tdata-test-id=\"variable-row-delete-button\"\n\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"!permissions.delete\"\n\t\t\t\t\t\t\t@click=\"onDelete\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ i18n.baseText('variables.row.button.delete.onlyRoleCanDelete') }}\n\t\t\t\t\t</template>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</td>\n\t</tr>\n</template>\n\n<style lang=\"scss\" module>\n.variablesRow {\n\t&:hover {\n\t\t.hoverButtons {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\ttd {\n\t\t> div {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tmin-height: 40px;\n\t\t}\n\t}\n}\n\n.buttons {\n\tdisplay: flex;\n\tflex-wrap: nowrap;\n\tjustify-content: flex-end;\n}\n\n.hoverButtons {\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n}\n\n.usageSyntax {\n\tcursor: pointer;\n\tbackground: var(--color-variables-usage-syntax-bg);\n\tcolor: var(--color-variables-usage-font);\n\tfont-family: var(--font-family-monospace);\n\tfont-size: var(--font-size-s);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, ref, onBeforeMount, onBeforeUnmount } from 'vue';\nimport { useEnvironmentsStore } from '@/stores/environments.ee.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useToast } from '@/composables/useToast';\nimport { useMessage } from '@/composables/useMessage';\n\nimport type { IResource } from '@/components/layouts/ResourcesListLayout.vue';\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport VariablesRow from '@/components/VariablesRow.vue';\n\nimport { EnterpriseEditionFeature, MODAL_CONFIRM } from '@/constants';\nimport type { DatatableColumn, EnvironmentVariable } from '@/Interface';\nimport { uid } from 'n8n-design-system/utils';\nimport { getVariablesPermissions } from '@/permissions';\nimport type { BaseTextKey } from '@/plugins/i18n';\n\nconst settingsStore = useSettingsStore();\nconst environmentsStore = useEnvironmentsStore();\nconst usersStore = useUsersStore();\nconst uiStore = useUIStore();\nconst telemetry = useTelemetry();\nconst i18n = useI18n();\nconst message = useMessage();\nconst sourceControlStore = useSourceControlStore();\nlet sourceControlStoreUnsubscribe = () => {};\n\nconst layoutRef = ref<InstanceType<typeof ResourcesListLayout> | null>(null);\n\nconst { showError } = useToast();\n\nconst TEMPORARY_VARIABLE_UID_BASE = '@tmpvar';\n\nconst allVariables = ref<EnvironmentVariable[]>([]);\nconst editMode = ref<Record<string, boolean>>({});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nconst variablesToResources = computed((): IResource[] =>\n\tallVariables.value.map((v) => ({ id: v.id, name: v.key, value: v.value })),\n);\n\nconst canCreateVariables = computed(() => isFeatureEnabled.value && permissions.create);\n\nconst datatableColumns = computed<DatatableColumn[]>(() => [\n\t{\n\t\tid: 0,\n\t\tpath: 'name',\n\t\tlabel: i18n.baseText('variables.table.key'),\n\t\tclasses: ['variables-key-column'],\n\t},\n\t{\n\t\tid: 1,\n\t\tpath: 'value',\n\t\tlabel: i18n.baseText('variables.table.value'),\n\t\tclasses: ['variables-value-column'],\n\t},\n\t{\n\t\tid: 2,\n\t\tpath: 'usage',\n\t\tlabel: i18n.baseText('variables.table.usage'),\n\t\tclasses: ['variables-usage-column'],\n\t},\n\t...(isFeatureEnabled.value\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: 3,\n\t\t\t\t\tpath: 'actions',\n\t\t\t\t\tlabel: '',\n\t\t\t\t},\n\t\t\t]\n\t\t: []),\n]);\n\nconst contextBasedTranslationKeys = computed(() => uiStore.contextBasedTranslationKeys);\n\nconst newlyAddedVariableIds = ref<string[]>([]);\n\nconst nameSortFn = (a: IResource, b: IResource, direction: 'asc' | 'desc') => {\n\tif (`${a.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn -1;\n\t} else if (`${b.id}`.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\treturn 1;\n\t} else if (\n\t\tnewlyAddedVariableIds.value.includes(a.id) &&\n\t\tnewlyAddedVariableIds.value.includes(b.id)\n\t) {\n\t\treturn newlyAddedVariableIds.value.indexOf(a.id) - newlyAddedVariableIds.value.indexOf(b.id);\n\t} else if (newlyAddedVariableIds.value.includes(a.id)) {\n\t\treturn -1;\n\t} else if (newlyAddedVariableIds.value.includes(b.id)) {\n\t\treturn 1;\n\t}\n\n\treturn direction === 'asc'\n\t\t? displayName(a).trim().localeCompare(displayName(b).trim())\n\t\t: displayName(b).trim().localeCompare(displayName(a).trim());\n};\nconst sortFns = {\n\tnameAsc: (a: IResource, b: IResource) => {\n\t\treturn nameSortFn(a, b, 'asc');\n\t},\n\tnameDesc: (a: IResource, b: IResource) => {\n\t\treturn nameSortFn(a, b, 'desc');\n\t},\n};\n\nfunction resetNewVariablesList() {\n\tnewlyAddedVariableIds.value = [];\n}\n\nconst resourceToEnvironmentVariable = (data: IResource): EnvironmentVariable => {\n\treturn {\n\t\tid: data.id,\n\t\tkey: data.name,\n\t\tvalue: 'value' in data ? data.value : '',\n\t};\n};\n\nasync function initialize() {\n\tif (!isFeatureEnabled.value) return;\n\tawait environmentsStore.fetchAllVariables();\n\n\tallVariables.value = [...environmentsStore.variables];\n}\n\nfunction addTemporaryVariable() {\n\tconst temporaryVariable: EnvironmentVariable = {\n\t\tid: uid(TEMPORARY_VARIABLE_UID_BASE),\n\t\tkey: '',\n\t\tvalue: '',\n\t};\n\n\tif (layoutRef.value) {\n\t\t// Reset scroll position\n\t\tif (layoutRef.value.$refs.listWrapperRef) {\n\t\t\t(layoutRef.value.$refs.listWrapperRef as HTMLDivElement).scrollTop = 0;\n\t\t}\n\n\t\t// Reset pagination\n\t\tif (layoutRef.value.currentPage !== 1) {\n\t\t\tlayoutRef.value.setCurrentPage(1);\n\t\t}\n\t}\n\n\tallVariables.value.unshift(temporaryVariable);\n\teditMode.value[temporaryVariable.id] = true;\n\n\ttelemetry.track('User clicked add variable button');\n}\n\nasync function saveVariable(data: IResource) {\n\tlet updatedVariable: EnvironmentVariable;\n\tconst variable = resourceToEnvironmentVariable(data);\n\n\ttry {\n\t\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\t\tconst { id, ...rest } = variable;\n\t\t\tupdatedVariable = await environmentsStore.createVariable(rest);\n\t\t\tallVariables.value.unshift(updatedVariable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tnewlyAddedVariableIds.value.unshift(updatedVariable.id);\n\t\t} else {\n\t\t\tupdatedVariable = await environmentsStore.updateVariable(variable);\n\t\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t\t\tallVariables.value.push(updatedVariable);\n\t\t\ttoggleEditing(updatedVariable);\n\t\t}\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.save'));\n\t}\n}\n\nfunction toggleEditing(data: EnvironmentVariable) {\n\teditMode.value = {\n\t\t...editMode.value,\n\t\t[data.id]: !editMode.value[data.id],\n\t};\n}\n\nfunction cancelEditing(data: EnvironmentVariable) {\n\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} else {\n\t\ttoggleEditing(data);\n\t}\n}\n\nasync function deleteVariable(data: EnvironmentVariable) {\n\ttry {\n\t\tconst confirmed = await message.confirm(\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.message', { interpolate: { name: data.key } }),\n\t\t\ti18n.baseText('variables.modals.deleteConfirm.title'),\n\t\t\t{\n\t\t\t\tconfirmButtonText: i18n.baseText('variables.modals.deleteConfirm.confirmButton'),\n\t\t\t\tcancelButtonText: i18n.baseText('variables.modals.deleteConfirm.cancelButton'),\n\t\t\t},\n\t\t);\n\n\t\tif (confirmed !== MODAL_CONFIRM) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait environmentsStore.deleteVariable(data);\n\t\tallVariables.value = allVariables.value.filter((variable) => variable.id !== data.id);\n\t} catch (error) {\n\t\tshowError(error, i18n.baseText('variables.errors.delete'));\n\t}\n}\n\nfunction goToUpgrade() {\n\tvoid uiStore.goToUpgrade('variables', 'upgrade-variables');\n}\n\nfunction displayName(resource: IResource) {\n\treturn resource.name;\n}\n\nonBeforeMount(() => {\n\tsourceControlStoreUnsubscribe = sourceControlStore.$onAction(({ name, after }) => {\n\t\tif (name === 'pullWorkfolder' && after) {\n\t\t\tafter(() => {\n\t\t\t\tvoid initialize();\n\t\t\t});\n\t\t}\n\t});\n});\n\nonBeforeUnmount(() => {\n\tsourceControlStoreUnsubscribe();\n});\n</script>\n\n<template>\n\t<ResourcesListLayout\n\t\tref=\"layoutRef\"\n\t\tclass=\"variables-view\"\n\t\tresource-key=\"variables\"\n\t\t:disabled=\"!isFeatureEnabled\"\n\t\t:resources=\"variablesToResources\"\n\t\t:initialize=\"initialize\"\n\t\t:shareable=\"false\"\n\t\t:display-name=\"displayName\"\n\t\t:sort-fns=\"sortFns\"\n\t\t:sort-options=\"['nameAsc', 'nameDesc']\"\n\t\t:show-filters-dropdown=\"false\"\n\t\ttype=\"datatable\"\n\t\t:type-props=\"{ columns: datatableColumns }\"\n\t\t@sort=\"resetNewVariablesList\"\n\t\t@click:add=\"addTemporaryVariable\"\n\t>\n\t\t<template #header>\n\t\t\t<n8n-heading size=\"2xlarge\" class=\"mb-m\">\n\t\t\t\t{{ i18n.baseText('variables.heading') }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<template #add-button>\n\t\t\t<n8n-tooltip placement=\"top\" :disabled=\"canCreateVariables\">\n\t\t\t\t<div>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"!canCreateVariables\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t\t@click=\"addTemporaryVariable\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText(`variables.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #content>\n\t\t\t\t\t<span v-if=\"!isFeatureEnabled\">{{\n\t\t\t\t\t\ti18n.baseText(`variables.add.unavailable${allVariables.length === 0 ? '.empty' : ''}`)\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<span v-else>{{ i18n.baseText('variables.add.onlyOwnerCanCreate') }}</span>\n\t\t\t\t</template>\n\t\t\t</n8n-tooltip>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled\" #preamble>\n\t\t\t<n8n-action-box\n\t\t\t\tclass=\"mb-m\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\tcontextBasedTranslationKeys.variables.unavailable.description as BaseTextKey,\n\t\t\t\t\t)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\tbutton-type=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template v-if=\"!isFeatureEnabled || (isFeatureEnabled && !canCreateVariables)\" #empty>\n\t\t\t<n8n-action-box\n\t\t\t\tv-if=\"!isFeatureEnabled\"\n\t\t\t\tdata-test-id=\"unavailable-resources-list\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\tcontextBasedTranslationKeys.variables.unavailable.description as BaseTextKey,\n\t\t\t\t\t)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button as BaseTextKey)\n\t\t\t\t\"\n\t\t\t\tbutton-type=\"secondary\"\n\t\t\t\t@click:button=\"goToUpgrade\"\n\t\t\t/>\n\t\t\t<n8n-action-box\n\t\t\t\tv-else-if=\"!canCreateVariables\"\n\t\t\t\tdata-test-id=\"cannot-create-variables\"\n\t\t\t\temoji=\"👋\"\n\t\t\t\t:heading=\"\n\t\t\t\t\t$locale.baseText('variables.empty.notAllowedToCreate.heading', {\n\t\t\t\t\t\tinterpolate: { name: usersStore.currentUser?.firstName ?? '' },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t\t:description=\"$locale.baseText('variables.empty.notAllowedToCreate.description')\"\n\t\t\t\t@click=\"goToUpgrade\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #default=\"{ data }\">\n\t\t\t<VariablesRow\n\t\t\t\t:key=\"data.id\"\n\t\t\t\t:editing=\"editMode[data.id]\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t@save=\"saveVariable\"\n\t\t\t\t@edit=\"toggleEditing\"\n\t\t\t\t@cancel=\"cancelEditing\"\n\t\t\t\t@delete=\"deleteVariable\"\n\t\t\t/>\n\t\t</template>\n\t</ResourcesListLayout>\n</template>\n\n<style lang=\"scss\" module>\n.type-input {\n\t--max-width: 265px;\n}\n\n.sidebarContainer ul {\n\tpadding: 0 !important;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@use 'n8n-design-system/css/common/var.scss';\n\n.variables-view {\n\t:deep(.datatable) {\n\t\ttable {\n\t\t\ttable-layout: fixed;\n\t\t}\n\n\t\tth,\n\t\ttd {\n\t\t\twidth: 25%;\n\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\twidth: 33.33%;\n\t\t\t}\n\n\t\t\t&.variables-value-column,\n\t\t\t&.variables-key-column,\n\t\t\t&.variables-usage-column {\n\t\t\t\t> div {\n\t\t\t\t\twidth: 100%;\n\n\t\t\t\t\t> span {\n\t\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\t\toverflow: hidden;\n\t\t\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\t\theight: 18px;\n\t\t\t\t\t}\n\n\t\t\t\t\t> div {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.variables-usage-column {\n\t\t\t@media screen and (max-width: var.$md) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n"],"names":["i18n","useI18n","clipboard","useClipboard","showMessage","useToast","settingsStore","useSettingsStore","usersStore","useUsersStore","emit","__emit","props","__props","permissions","computed","getVariablesPermissions","modelValue","ref","formValidationStatus","formValid","keyInputRef","valueInputRef","usage","isFeatureEnabled","EnterpriseEditionFeature","onMounted","focusFirstInput","keyValidationRules","valueValidationRules","watch","nextTick","updateUsageSyntax","onCancel","onSave","onEdit","onDelete","onValidate","name","value","onUsageClick","_c","_b","_a","TEMPORARY_VARIABLE_UID_BASE","environmentsStore","useEnvironmentsStore","uiStore","useUIStore","telemetry","useTelemetry","message","useMessage","sourceControlStore","useSourceControlStore","sourceControlStoreUnsubscribe","layoutRef","showError","allVariables","editMode","variablesToResources","v","canCreateVariables","datatableColumns","contextBasedTranslationKeys","newlyAddedVariableIds","nameSortFn","a","b","direction","displayName","sortFns","resetNewVariablesList","resourceToEnvironmentVariable","data","initialize","addTemporaryVariable","temporaryVariable","uid","saveVariable","updatedVariable","variable","id","rest","toggleEditing","error","cancelEditing","deleteVariable","MODAL_CONFIRM","goToUpgrade","resource","onBeforeMount","after","onBeforeUnmount"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{m as oe}from"./pinia-sugP77Im.js";import{P as se}from"./PushConnectionTracker-C_r8Zv-p.js";import{aK as re,u as X,x as Z,e as ee,l as ne,da as ae,b as ce}from"./index-Dtri_pSJ.js";import{a as J,W as T,u as ie}from"./usePushConnection-EMXpPhl-.js";import{G as I,r as v,ag as g,l,m as d,p as k,U as u,O as p,H as Y,I as c,R as F,M as L,S as b,T as s,F as E,a7 as N,u as f,e as q,b as le,y as de,aH as ue}from"./vendor-Dv5OeN6t.js";import{_ as S}from"./n8n-4UEsHtUL.js";import{C as H}from"./vue-chartjs-DGI3EW71.js";import{a as pe}from"./collaboration.store-Co5wlk8y.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";function te(t){return t.reduce((a,r)=>a+r,0)/t.length}function me(t){return te(t).toFixed(2)}function R(t){return t/1024/1024/1024}const _e=I({__name:"WorkerAccordion.ee",props:{icon:{default:"tasks"},iconColor:{default:"black"},initialExpanded:{type:Boolean,default:!0}},setup(t){const r=v(t.initialExpanded);function i(){r.value=!r.value}return(o,m)=>{const e=g("n8n-icon"),h=g("n8n-text");return l(),d("div",{class:c(["accordion",o.$style.container])},[k("div",{class:c({[o.$style.header]:!0,[o.$style.expanded]:r.value}),onClick:i},[u(e,{icon:o.icon,color:o.iconColor,size:"small",class:"mr-2xs"},null,8,["icon","color"]),u(h,{class:c(o.$style.headerText),color:"text-base",size:"small",align:"left",bold:""},{default:p(()=>[Y(o.$slots,"title")]),_:3},8,["class"]),u(e,{icon:r.value?"chevron-up":"chevron-down",bold:""},null,8,["icon"])],2),r.value?(l(),d("div",{key:0,class:c({[o.$style.description]:!0,[o.$style.collapsed]:!r.value})},[Y(o.$slots,"content")],2)):F("",!0)],2)}}}),he="_container_odamb_1",ke="_header_odamb_5",ye="_headerText_odamb_11",fe="_expanded_odamb_15",ge="_description_odamb_19",$e={container:he,header:ke,headerText:ye,expanded:fe,description:ge},be={$style:$e},O=S(_e,[["__cssModules",be]]),we=["href"],ve=["href"],Me=I({__name:"WorkerJobAccordion.ee",props:{items:{}},setup(t){const a=t;function r(i){let o=Math.floor((new Date().getTime()-i.getTime())/1e3);const m=Math.floor(o/3600);o-=m*3600;const e=Math.floor(o/60);return o-=e*60,`${m}h ${e}m ${Math.floor(o)}s`}return(i,o)=>{const m=g("n8n-text");return l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!0},{title:p(()=>[b(s(i.$locale.baseText("workerList.item.jobListTitle"))+" ("+s(i.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:c(i.$style.accordionItems)},[(l(!0),d(E,null,N(a.items,e=>(l(),d("div",{key:e.executionId,class:c(i.$style.accordionItem)},[k("a",{href:"/workflow/"+e.workflowId+"/executions/"+e.executionId}," Execution "+s(e.executionId)+" - "+s(e.workflowName),9,we),u(m,{color:"text-base",size:"small",align:"left"},{default:p(()=>{var h;return[b(" | Started at: "+s((h=new Date(e.startedAt))==null?void 0:h.toLocaleTimeString())+" | Running for "+s(r(new Date(e.startedAt)))+" "+s(e.retryOf?`| Retry of: ${e.retryOf}`:"")+" | ",1)]}),_:2},1024),k("a",{target:"_blank",href:"/workflow/"+e.workflowId}," (Open workflow)",8,ve)],2))),128))],2)):(l(),d("div",{key:1,class:c(i.$style.accordionItems)},[k("span",{class:c(i.$style.empty)},s(i.$locale.baseText("workerList.item.jobList.empty")),3)],2))]),_:1})}}}),Ie="_accordionItems_kt5sk_1",Se="_accordionItem_kt5sk_1",Ce="_empty_kt5sk_14",Te={accordionItems:Ie,accordionItem:Se,empty:Ce},Le={$style:Te},xe=S(Me,[["__cssModules",Le]]),Ae=["onClick"],We=I({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const a=t,r=Z(),i=re(),{showMessage:o}=X();function m(e){try{i.copy(e),o({title:r.baseText("workerList.item.copyAddressToClipboard"),type:"success"})}catch{}}return(e,h)=>(l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[b(s(e.$locale.baseText("workerList.item.netListTitle"))+" ("+s(e.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:c(e.$style.accordionItems)},[(l(!0),d(E,null,N(a.items,y=>(l(),d("div",{key:y.address,class:c(e.$style.accordionItem),onClick:n=>m(y.address)},[b(s(y.family)+": ",1),k("span",{class:c(e.$style.clickable)},s(y.address),3),b(" "+s(y.internal?"(internal)":""),1)],10,Ae))),128))],2)):F("",!0)]),_:1}))}}),Ue="_accordionItems_10xds_1",Re="_accordionItem_10xds_1",Be="_clickable_10xds_15",De={accordionItems:Ue,accordionItem:Re,clickable:Be},Pe={$style:De},He=S(We,[["__cssModules",Pe]]),Je=I({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var j,z,G;const a=t,r=(w,x,C=0)=>({datasets:[{label:w,backgroundColor:x,data:C?Array(Math.min(T,C)).fill(0):[]}],labels:Array(Math.min(T,C)).fill("")}),i=J(),o=v(void 0),m=v(void 0),e=v(void 0),h=()=>({responsive:!0,maintainAspectRatio:!0,scales:{y:{type:"linear",display:!0,position:"left",min:0,suggestedMax:5}}}),y=h(),n=h();(j=n.scales)!=null&&j.y&&(n.scales.y.suggestedMax=100);const _=R((z=i.workers[a.workerId])==null?void 0:z.totalMem)??1,$=h();(G=$.scales)!=null&&G.y&&($.scales.y.suggestedMax=_);const M=v(r("Job Count","rgb(255, 111, 92)",T)),W=v(r("Processor Usage","rgb(19, 205, 103)",T)),V=v(r("Memory Usage","rgb(244, 216, 174)",T));return i.$onAction(({name:w,store:x})=>{var C,K;if(w==="updateWorkerStatus"){const B=T-(((C=x.workersHistory[a.workerId])==null?void 0:C.length)??0),A=r("Job Count","rgb(255, 111, 92)",B),D=r("Processor Usage","rgb(19, 205, 103)",B),P=r("Memory Usage","rgb(244, 216, 174)",B);(K=x.workersHistory[a.workerId])==null||K.forEach(U=>{var Q;A.datasets[0].data.push(U.data.runningJobsSummary.length),(Q=A.labels)==null||Q.push(new Date(U.timestamp).toLocaleTimeString()),D.datasets[0].data.push(te(U.data.loadAvg)),D.labels=A.labels,P.datasets[0].data.push(_-R(U.data.freeMem)),P.labels=A.labels}),M.value=A,W.value=D,V.value=P}}),(w,x)=>(l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[b(s(w.$locale.baseText("workerList.item.chartsTitle")),1)]),content:p(()=>[k("div",{class:c(w.$style.charts)},[u(f(H),{ref_key:"chartRefJobs",ref:o,type:"line",data:M.value,options:f(y),class:c(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefCPU",ref:m,type:"line",data:W.value,options:f(n),class:c(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefMemory",ref:e,type:"line",data:V.value,options:f($),class:c(w.$style.chart)},null,8,["data","options","class"])],2)]),_:1}))}}),Fe="_accordionItems_2yo1p_1",Ee="_accordionItem_2yo1p_1",Ne="_charts_2yo1p_14",Oe="_chart_2yo1p_14",Ve={accordionItems:Fe,accordionItem:Ee,charts:Ne,chart:Oe},je={$style:Ve},ze=S(Je,[["__cssModules",je]]),Ge=k("br",null,null,-1),Ke=I({__name:"WorkerCard.ee",props:{workerId:{}},setup(t){let a;const r=J(),i=t,o=v("0"),m=v(!1),e=q(()=>r.getWorkerStatus(i.workerId)),h=q(()=>{var n;return((n=e.value)==null?void 0:n.interfaces.toSorted((_,$)=>_.family.localeCompare($.family)))??[]});function y(n){const _=Math.floor(n/86400);n-=_*3600*24;const $=Math.floor(n/3600);n-=$*3600;const M=Math.floor(n/60);return n-=M*60,`${_}d ${$}h ${M}m ${Math.floor(n)}s`}return le(()=>{a=setInterval(()=>{const n=r.getWorkerLastUpdated(i.workerId);if(!n)return;const _=Math.ceil((Date.now()-n)/1e3);m.value=_>10,o.value=_.toFixed(0)},500)}),de(()=>{clearInterval(a)}),(n,_)=>{const $=g("n8n-heading"),M=g("n8n-text"),W=g("n8n-card");return e.value?(l(),L(W,{key:0,class:c(n.$style.cardLink)},{header:p(()=>[u($,{tag:"h2",bold:"",class:c(m.value?[n.$style.cardHeading,n.$style.stale]:[n.$style.cardHeading]),"data-test-id":"worker-card-name"},{default:p(()=>[b(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),Ge,b(" Average Load: "+s(f(me)(e.value.loadAvg??[0]))+" | Free Memory: "+s(f(R)(e.value.freeMem).toFixed(2))+"GB / "+s(f(R)(e.value.totalMem).toFixed(2))+"GB "+s(m.value?" (stale)":""),1)]),_:1},8,["class"])]),append:p(()=>[k("div",{ref:"cardActions",class:c(n.$style.cardActions)},null,2)]),default:p(()=>[k("div",{class:c(n.$style.cardDescription)},[u(M,{color:"text-light",size:"small",class:c(n.$style.container)},{default:p(()=>[k("span",null,s(n.$locale.baseText("workerList.item.lastUpdated"))+" "+s(o.value)+"s ago | n8n-Version: "+s(e.value.version)+" | Architecture: "+s(e.value.arch)+" ( "+s(e.value.platform)+") | Uptime: "+s(y(e.value.uptime)),1),u(xe,{items:e.value.runningJobsSummary},null,8,["items"]),u(He,{items:h.value},null,8,["items"]),u(ze,{"worker-id":e.value.workerId},null,8,["worker-id"])]),_:1},8,["class"])],2)]),_:1},8,["class"])):F("",!0)}}}),Qe="_container_s5el6_1",Ye="_cardLink_s5el6_5",qe="_cardHeading_s5el6_15",Xe="_stale_s5el6_21",Ze="_cardDescription_s5el6_25",et="_cardActions_s5el6_32",tt={container:Qe,cardLink:Ye,cardHeading:qe,stale:Xe,cardDescription:Ze,cardActions:et},ot={$style:tt},st=S(Ke,[["__cssModules",ot]]),rt=I({name:"WorkerList",components:{PushConnectionTracker:se,WorkerCard:st},props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(){const t=ue(),a=Z(),r=ie({router:t});return{i18n:a,pushConnection:r,...X()}},computed:{...oe(ne,ee,pe,J),combinedWorkers(){const t=[];for(const a in this.orchestrationManagerStore.workers)t.push(this.orchestrationManagerStore.workers[a]);return t},initialStatusReceived(){return this.orchestrationManagerStore.initialStatusReceived},workerIds(){return Object.keys(this.orchestrationManagerStore.workers)},pageTitle(){return this.i18n.baseText("workerList.pageTitle")}},mounted(){ae(`n8n - ${this.pageTitle}`),this.$telemetry.track("User viewed worker view",{instance_id:this.rootStore.instanceId})},beforeMount(){window.Cypress===void 0&&(this.pushConnection.initialize(),this.pushStore.pushConnect(),this.orchestrationManagerStore.startWorkerStatusPolling())},beforeUnmount(){window.Cypress===void 0&&(this.orchestrationManagerStore.stopWorkerStatusPolling(),this.pushStore.pushDisconnect(),this.pushConnection.terminate())},methods:{averageLoadAvg(t){return(t.reduce((a,r)=>a+r,0)/t.length).toFixed(2)},getStatus(t){return t.runningJobsSummary.length>0?"running":"success"},getRowClass(t){return[this.$style.execRow,this.$style[this.getStatus(t)]].join(" ")}}}),nt="_workerListHeader_12j1s_1",at="_card_12j1s_8",ct="_tableLoader_12j1s_12",it={workerListHeader:nt,card:at,tableLoader:ct},lt={key:0},dt={key:1},ut={key:0},pt={key:1};function mt(t,a,r,i,o,m){const e=g("PushConnectionTracker"),h=g("n8n-heading"),y=g("n8n-spinner"),n=g("WorkerCard");return l(),d("div",null,[u(e,{class:"actions"}),k("div",{class:c(t.$style.workerListHeader)},[u(h,{tag:"h1",size:"2xlarge"},{default:p(()=>[b(s(t.pageTitle),1)]),_:1})],2),t.initialStatusReceived?(l(),d("div",dt,[t.workerIds.length===0?(l(),d("div",ut,s(t.$locale.baseText("workerList.empty")),1)):(l(),d("div",pt,[(l(!0),d(E,null,N(t.workerIds,_=>(l(),d("div",{key:_,class:c(t.$style.card)},[u(n,{"worker-id":_,"data-test-id":"worker-card"},null,8,["worker-id"])],2))),128))]))])):(l(),d("div",lt,[u(y)]))])}const _t={$style:it},ht=S(rt,[["render",mt],["__cssModules",_t]]),kt=["href"],yt=I({__name:"WorkerView",setup(t){const a=ce(),r=ee(),i=()=>{r.goToUpgrade("worker-view","upgrade-worker-view")};return(o,m)=>{const e=g("n8n-action-box");return f(a).isQueueModeEnabled&&f(a).isWorkerViewAvailable?(l(),L(ht,{key:0,"data-test-id":"worker-view-licensed"})):(l(),L(e,{key:1,"data-test-id":"worker-view-unlicensed",class:c(o.$style.actionBox),description:o.$locale.baseText("workerList.actionBox.description"),"button-text":o.$locale.baseText("workerList.actionBox.buttonText"),"onClick:button":i},{heading:p(()=>[k("span",null,s(o.$locale.baseText("workerList.actionBox.title")),1)]),description:p(()=>[b(s(o.$locale.baseText("workerList.actionBox.description"))+" ",1),k("a",{href:o.$locale.baseText("workerList.docs.url"),target:"_blank"},s(o.$locale.baseText("workerList.actionBox.description.link")),9,kt)]),_:1},8,["class","description","button-text"]))}}}),ft="_actionBox_13ul9_1",gt={actionBox:ft},$t={$style:gt},eo=S(yt,[["__cssModules",$t]]);export{eo as default};
2
- //# sourceMappingURL=WorkerView-dtJzfgCM.js.map
1
+ import{m as oe}from"./pinia-sugP77Im.js";import{P as se}from"./PushConnectionTracker-YJuy57g2.js";import{aK as re,u as X,x as Z,e as ee,l as ne,d8 as ae,b as ce}from"./index-BE0Xl-jy.js";import{a as J,W as T,u as ie}from"./usePushConnection-CsYeEXN4.js";import{G as I,r as v,ag as g,l,m as d,p as k,U as u,O as p,H as Y,I as c,R as F,M as L,S as b,T as s,F as E,a7 as N,u as f,e as q,b as le,y as de,aH as ue}from"./vendor-Dv5OeN6t.js";import{_ as S}from"./n8n-4UEsHtUL.js";import{C as H}from"./vue-chartjs-DGI3EW71.js";import{a as pe}from"./collaboration.store-ElxCV91F.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";function te(t){return t.reduce((a,r)=>a+r,0)/t.length}function me(t){return te(t).toFixed(2)}function R(t){return t/1024/1024/1024}const _e=I({__name:"WorkerAccordion.ee",props:{icon:{default:"tasks"},iconColor:{default:"black"},initialExpanded:{type:Boolean,default:!0}},setup(t){const r=v(t.initialExpanded);function i(){r.value=!r.value}return(o,m)=>{const e=g("n8n-icon"),h=g("n8n-text");return l(),d("div",{class:c(["accordion",o.$style.container])},[k("div",{class:c({[o.$style.header]:!0,[o.$style.expanded]:r.value}),onClick:i},[u(e,{icon:o.icon,color:o.iconColor,size:"small",class:"mr-2xs"},null,8,["icon","color"]),u(h,{class:c(o.$style.headerText),color:"text-base",size:"small",align:"left",bold:""},{default:p(()=>[Y(o.$slots,"title")]),_:3},8,["class"]),u(e,{icon:r.value?"chevron-up":"chevron-down",bold:""},null,8,["icon"])],2),r.value?(l(),d("div",{key:0,class:c({[o.$style.description]:!0,[o.$style.collapsed]:!r.value})},[Y(o.$slots,"content")],2)):F("",!0)],2)}}}),he="_container_odamb_1",ke="_header_odamb_5",ye="_headerText_odamb_11",fe="_expanded_odamb_15",ge="_description_odamb_19",$e={container:he,header:ke,headerText:ye,expanded:fe,description:ge},be={$style:$e},O=S(_e,[["__cssModules",be]]),we=["href"],ve=["href"],Me=I({__name:"WorkerJobAccordion.ee",props:{items:{}},setup(t){const a=t;function r(i){let o=Math.floor((new Date().getTime()-i.getTime())/1e3);const m=Math.floor(o/3600);o-=m*3600;const e=Math.floor(o/60);return o-=e*60,`${m}h ${e}m ${Math.floor(o)}s`}return(i,o)=>{const m=g("n8n-text");return l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!0},{title:p(()=>[b(s(i.$locale.baseText("workerList.item.jobListTitle"))+" ("+s(i.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:c(i.$style.accordionItems)},[(l(!0),d(E,null,N(a.items,e=>(l(),d("div",{key:e.executionId,class:c(i.$style.accordionItem)},[k("a",{href:"/workflow/"+e.workflowId+"/executions/"+e.executionId}," Execution "+s(e.executionId)+" - "+s(e.workflowName),9,we),u(m,{color:"text-base",size:"small",align:"left"},{default:p(()=>{var h;return[b(" | Started at: "+s((h=new Date(e.startedAt))==null?void 0:h.toLocaleTimeString())+" | Running for "+s(r(new Date(e.startedAt)))+" "+s(e.retryOf?`| Retry of: ${e.retryOf}`:"")+" | ",1)]}),_:2},1024),k("a",{target:"_blank",href:"/workflow/"+e.workflowId}," (Open workflow)",8,ve)],2))),128))],2)):(l(),d("div",{key:1,class:c(i.$style.accordionItems)},[k("span",{class:c(i.$style.empty)},s(i.$locale.baseText("workerList.item.jobList.empty")),3)],2))]),_:1})}}}),Ie="_accordionItems_kt5sk_1",Se="_accordionItem_kt5sk_1",Ce="_empty_kt5sk_14",Te={accordionItems:Ie,accordionItem:Se,empty:Ce},Le={$style:Te},xe=S(Me,[["__cssModules",Le]]),Ae=["onClick"],We=I({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const a=t,r=Z(),i=re(),{showMessage:o}=X();function m(e){try{i.copy(e),o({title:r.baseText("workerList.item.copyAddressToClipboard"),type:"success"})}catch{}}return(e,h)=>(l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[b(s(e.$locale.baseText("workerList.item.netListTitle"))+" ("+s(e.items.length)+") ",1)]),content:p(()=>[a.items.length>0?(l(),d("div",{key:0,class:c(e.$style.accordionItems)},[(l(!0),d(E,null,N(a.items,y=>(l(),d("div",{key:y.address,class:c(e.$style.accordionItem),onClick:n=>m(y.address)},[b(s(y.family)+": ",1),k("span",{class:c(e.$style.clickable)},s(y.address),3),b(" "+s(y.internal?"(internal)":""),1)],10,Ae))),128))],2)):F("",!0)]),_:1}))}}),Ue="_accordionItems_10xds_1",Re="_accordionItem_10xds_1",Be="_clickable_10xds_15",De={accordionItems:Ue,accordionItem:Re,clickable:Be},Pe={$style:De},He=S(We,[["__cssModules",Pe]]),Je=I({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var j,z,G;const a=t,r=(w,x,C=0)=>({datasets:[{label:w,backgroundColor:x,data:C?Array(Math.min(T,C)).fill(0):[]}],labels:Array(Math.min(T,C)).fill("")}),i=J(),o=v(void 0),m=v(void 0),e=v(void 0),h=()=>({responsive:!0,maintainAspectRatio:!0,scales:{y:{type:"linear",display:!0,position:"left",min:0,suggestedMax:5}}}),y=h(),n=h();(j=n.scales)!=null&&j.y&&(n.scales.y.suggestedMax=100);const _=R((z=i.workers[a.workerId])==null?void 0:z.totalMem)??1,$=h();(G=$.scales)!=null&&G.y&&($.scales.y.suggestedMax=_);const M=v(r("Job Count","rgb(255, 111, 92)",T)),W=v(r("Processor Usage","rgb(19, 205, 103)",T)),V=v(r("Memory Usage","rgb(244, 216, 174)",T));return i.$onAction(({name:w,store:x})=>{var C,K;if(w==="updateWorkerStatus"){const B=T-(((C=x.workersHistory[a.workerId])==null?void 0:C.length)??0),A=r("Job Count","rgb(255, 111, 92)",B),D=r("Processor Usage","rgb(19, 205, 103)",B),P=r("Memory Usage","rgb(244, 216, 174)",B);(K=x.workersHistory[a.workerId])==null||K.forEach(U=>{var Q;A.datasets[0].data.push(U.data.runningJobsSummary.length),(Q=A.labels)==null||Q.push(new Date(U.timestamp).toLocaleTimeString()),D.datasets[0].data.push(te(U.data.loadAvg)),D.labels=A.labels,P.datasets[0].data.push(_-R(U.data.freeMem)),P.labels=A.labels}),M.value=A,W.value=D,V.value=P}}),(w,x)=>(l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[b(s(w.$locale.baseText("workerList.item.chartsTitle")),1)]),content:p(()=>[k("div",{class:c(w.$style.charts)},[u(f(H),{ref_key:"chartRefJobs",ref:o,type:"line",data:M.value,options:f(y),class:c(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefCPU",ref:m,type:"line",data:W.value,options:f(n),class:c(w.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefMemory",ref:e,type:"line",data:V.value,options:f($),class:c(w.$style.chart)},null,8,["data","options","class"])],2)]),_:1}))}}),Fe="_accordionItems_2yo1p_1",Ee="_accordionItem_2yo1p_1",Ne="_charts_2yo1p_14",Oe="_chart_2yo1p_14",Ve={accordionItems:Fe,accordionItem:Ee,charts:Ne,chart:Oe},je={$style:Ve},ze=S(Je,[["__cssModules",je]]),Ge=k("br",null,null,-1),Ke=I({__name:"WorkerCard.ee",props:{workerId:{}},setup(t){let a;const r=J(),i=t,o=v("0"),m=v(!1),e=q(()=>r.getWorkerStatus(i.workerId)),h=q(()=>{var n;return((n=e.value)==null?void 0:n.interfaces.toSorted((_,$)=>_.family.localeCompare($.family)))??[]});function y(n){const _=Math.floor(n/86400);n-=_*3600*24;const $=Math.floor(n/3600);n-=$*3600;const M=Math.floor(n/60);return n-=M*60,`${_}d ${$}h ${M}m ${Math.floor(n)}s`}return le(()=>{a=setInterval(()=>{const n=r.getWorkerLastUpdated(i.workerId);if(!n)return;const _=Math.ceil((Date.now()-n)/1e3);m.value=_>10,o.value=_.toFixed(0)},500)}),de(()=>{clearInterval(a)}),(n,_)=>{const $=g("n8n-heading"),M=g("n8n-text"),W=g("n8n-card");return e.value?(l(),L(W,{key:0,class:c(n.$style.cardLink)},{header:p(()=>[u($,{tag:"h2",bold:"",class:c(m.value?[n.$style.cardHeading,n.$style.stale]:[n.$style.cardHeading]),"data-test-id":"worker-card-name"},{default:p(()=>[b(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),Ge,b(" Average Load: "+s(f(me)(e.value.loadAvg??[0]))+" | Free Memory: "+s(f(R)(e.value.freeMem).toFixed(2))+"GB / "+s(f(R)(e.value.totalMem).toFixed(2))+"GB "+s(m.value?" (stale)":""),1)]),_:1},8,["class"])]),append:p(()=>[k("div",{ref:"cardActions",class:c(n.$style.cardActions)},null,2)]),default:p(()=>[k("div",{class:c(n.$style.cardDescription)},[u(M,{color:"text-light",size:"small",class:c(n.$style.container)},{default:p(()=>[k("span",null,s(n.$locale.baseText("workerList.item.lastUpdated"))+" "+s(o.value)+"s ago | n8n-Version: "+s(e.value.version)+" | Architecture: "+s(e.value.arch)+" ( "+s(e.value.platform)+") | Uptime: "+s(y(e.value.uptime)),1),u(xe,{items:e.value.runningJobsSummary},null,8,["items"]),u(He,{items:h.value},null,8,["items"]),u(ze,{"worker-id":e.value.workerId},null,8,["worker-id"])]),_:1},8,["class"])],2)]),_:1},8,["class"])):F("",!0)}}}),Qe="_container_s5el6_1",Ye="_cardLink_s5el6_5",qe="_cardHeading_s5el6_15",Xe="_stale_s5el6_21",Ze="_cardDescription_s5el6_25",et="_cardActions_s5el6_32",tt={container:Qe,cardLink:Ye,cardHeading:qe,stale:Xe,cardDescription:Ze,cardActions:et},ot={$style:tt},st=S(Ke,[["__cssModules",ot]]),rt=I({name:"WorkerList",components:{PushConnectionTracker:se,WorkerCard:st},props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(){const t=ue(),a=Z(),r=ie({router:t});return{i18n:a,pushConnection:r,...X()}},computed:{...oe(ne,ee,pe,J),combinedWorkers(){const t=[];for(const a in this.orchestrationManagerStore.workers)t.push(this.orchestrationManagerStore.workers[a]);return t},initialStatusReceived(){return this.orchestrationManagerStore.initialStatusReceived},workerIds(){return Object.keys(this.orchestrationManagerStore.workers)},pageTitle(){return this.i18n.baseText("workerList.pageTitle")}},mounted(){ae(`n8n - ${this.pageTitle}`),this.$telemetry.track("User viewed worker view",{instance_id:this.rootStore.instanceId})},beforeMount(){window.Cypress===void 0&&(this.pushConnection.initialize(),this.pushStore.pushConnect(),this.orchestrationManagerStore.startWorkerStatusPolling())},beforeUnmount(){window.Cypress===void 0&&(this.orchestrationManagerStore.stopWorkerStatusPolling(),this.pushStore.pushDisconnect(),this.pushConnection.terminate())},methods:{averageLoadAvg(t){return(t.reduce((a,r)=>a+r,0)/t.length).toFixed(2)},getStatus(t){return t.runningJobsSummary.length>0?"running":"success"},getRowClass(t){return[this.$style.execRow,this.$style[this.getStatus(t)]].join(" ")}}}),nt="_workerListHeader_12j1s_1",at="_card_12j1s_8",ct="_tableLoader_12j1s_12",it={workerListHeader:nt,card:at,tableLoader:ct},lt={key:0},dt={key:1},ut={key:0},pt={key:1};function mt(t,a,r,i,o,m){const e=g("PushConnectionTracker"),h=g("n8n-heading"),y=g("n8n-spinner"),n=g("WorkerCard");return l(),d("div",null,[u(e,{class:"actions"}),k("div",{class:c(t.$style.workerListHeader)},[u(h,{tag:"h1",size:"2xlarge"},{default:p(()=>[b(s(t.pageTitle),1)]),_:1})],2),t.initialStatusReceived?(l(),d("div",dt,[t.workerIds.length===0?(l(),d("div",ut,s(t.$locale.baseText("workerList.empty")),1)):(l(),d("div",pt,[(l(!0),d(E,null,N(t.workerIds,_=>(l(),d("div",{key:_,class:c(t.$style.card)},[u(n,{"worker-id":_,"data-test-id":"worker-card"},null,8,["worker-id"])],2))),128))]))])):(l(),d("div",lt,[u(y)]))])}const _t={$style:it},ht=S(rt,[["render",mt],["__cssModules",_t]]),kt=["href"],yt=I({__name:"WorkerView",setup(t){const a=ce(),r=ee(),i=()=>{r.goToUpgrade("worker-view","upgrade-worker-view")};return(o,m)=>{const e=g("n8n-action-box");return f(a).isQueueModeEnabled&&f(a).isWorkerViewAvailable?(l(),L(ht,{key:0,"data-test-id":"worker-view-licensed"})):(l(),L(e,{key:1,"data-test-id":"worker-view-unlicensed",class:c(o.$style.actionBox),description:o.$locale.baseText("workerList.actionBox.description"),"button-text":o.$locale.baseText("workerList.actionBox.buttonText"),"onClick:button":i},{heading:p(()=>[k("span",null,s(o.$locale.baseText("workerList.actionBox.title")),1)]),description:p(()=>[b(s(o.$locale.baseText("workerList.actionBox.description"))+" ",1),k("a",{href:o.$locale.baseText("workerList.docs.url"),target:"_blank"},s(o.$locale.baseText("workerList.actionBox.description.link")),9,kt)]),_:1},8,["class","description","button-text"]))}}}),ft="_actionBox_13ul9_1",gt={actionBox:ft},$t={$style:gt},eo=S(yt,[["__cssModules",$t]]);export{eo as default};
2
+ //# sourceMappingURL=WorkerView-C3Rdbsfq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerView-dtJzfgCM.js","sources":["../../src/utils/workerUtils.ts","../../src/components/Workers/WorkerAccordion.ee.vue","../../src/components/Workers/WorkerJobAccordion.ee.vue","../../src/components/Workers/WorkerNetAccordion.ee.vue","../../src/components/Workers/WorkerChartsAccordion.ee.vue","../../src/components/Workers/WorkerCard.ee.vue","../../src/components/WorkerList.ee.vue","../../src/views/WorkerView.vue"],"sourcesContent":["export function averageWorkerLoadFromLoads(loads: number[]): number {\n\treturn loads.reduce((prev, curr) => prev + curr, 0) / loads.length;\n}\n\nexport function averageWorkerLoadFromLoadsAsString(loads: number[]): string {\n\treturn averageWorkerLoadFromLoads(loads).toFixed(2);\n}\n\nexport function memAsGb(mem: number): number {\n\treturn mem / 1024 / 1024 / 1024;\n}\n","<template>\n\t<div :class=\"['accordion', $style.container]\">\n\t\t<div :class=\"{ [$style.header]: true, [$style.expanded]: expanded }\" @click=\"toggle\">\n\t\t\t<n8n-icon :icon=\"icon\" :color=\"iconColor\" size=\"small\" class=\"mr-2xs\" />\n\t\t\t<n8n-text :class=\"$style.headerText\" color=\"text-base\" size=\"small\" align=\"left\" bold>\n\t\t\t\t<slot name=\"title\"></slot>\n\t\t\t</n8n-text>\n\t\t\t<n8n-icon :icon=\"expanded ? 'chevron-up' : 'chevron-down'\" bold />\n\t\t</div>\n\t\t<div v-if=\"expanded\" :class=\"{ [$style.description]: true, [$style.collapsed]: !expanded }\">\n\t\t\t<slot name=\"content\"></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\ticon?: string;\n\t\ticonColor?: string;\n\t\tinitialExpanded?: boolean;\n\t}>(),\n\t{\n\t\ticon: 'tasks',\n\t\ticonColor: 'black',\n\t\tinitialExpanded: true,\n\t},\n);\n\nconst expanded = ref<boolean>(props.initialExpanded);\n\nfunction toggle() {\n\texpanded.value = !expanded.value;\n}\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.header {\n\tcursor: pointer;\n\tdisplay: flex;\n\tpadding-top: var(--spacing-s);\n\talign-items: center;\n\n\t.headerText {\n\t\tflex-grow: 1;\n\t}\n}\n\n.expanded {\n\tpadding: var(--spacing-s) 0 0 0;\n}\n\n.description {\n\tdisplay: flex;\n\tpadding: 0 var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\n\tb {\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"true\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.jobListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div v-for=\"item in props.items\" :key=\"item.executionId\" :class=\"$style.accordionItem\">\n\t\t\t\t\t<a :href=\"'/workflow/' + item.workflowId + '/executions/' + item.executionId\">\n\t\t\t\t\t\tExecution {{ item.executionId }} - {{ item.workflowName }}</a\n\t\t\t\t\t>\n\t\t\t\t\t<n8n-text color=\"text-base\" size=\"small\" align=\"left\">\n\t\t\t\t\t\t| Started at:\n\t\t\t\t\t\t{{ new Date(item.startedAt)?.toLocaleTimeString() }} | Running for\n\t\t\t\t\t\t{{ runningSince(new Date(item.startedAt)) }}\n\t\t\t\t\t\t{{ item.retryOf ? `| Retry of: ${item.retryOf}` : '' }} |\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<a target=\"_blank\" :href=\"'/workflow/' + item.workflowId\"> (Open workflow)</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.accordionItems\">\n\t\t\t\t<span :class=\"$style.empty\">\n\t\t\t\t\t{{ $locale.baseText('workerList.item.jobList.empty') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { WorkerJobStatusSummary } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\n\nconst props = defineProps<{\n\titems: WorkerJobStatusSummary[];\n}>();\n\nfunction runningSince(started: Date): string {\n\tlet seconds = Math.floor((new Date().getTime() - started.getTime()) / 1000);\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.empty {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-top: var(--spacing-2xs);\n\tmargin-left: var(--spacing-4xs);\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.netListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"item in props.items\"\n\t\t\t\t\t:key=\"item.address\"\n\t\t\t\t\t:class=\"$style.accordionItem\"\n\t\t\t\t\t@click=\"onCopyToClipboard(item.address)\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.family }}: <span :class=\"$style.clickable\">{{ item.address }}</span>\n\t\t\t\t\t{{ item.internal ? '(internal)' : '' }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\n\nconst props = defineProps<{\n\titems: IPushDataWorkerStatusPayload['interfaces'];\n}>();\n\nconst i18n = useI18n();\nconst clipboard = useClipboard();\nconst { showMessage } = useToast();\n\nfunction onCopyToClipboard(content: string) {\n\ttry {\n\t\tvoid clipboard.copy(content);\n\t\tshowMessage({\n\t\t\ttitle: i18n.baseText('workerList.item.copyAddressToClipboard'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch {}\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.clickable {\n\tcursor: pointer !important;\n\n\t&:hover {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.chartsTitle') }}\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div :class=\"$style.charts\">\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefJobs\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataJobs\"\n\t\t\t\t\t:options=\"optionsJobs\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefCPU\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataCPU\"\n\t\t\t\t\t:options=\"optionsCPU\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefMemory\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataMemory\"\n\t\t\t\t\t:options=\"optionsMemory\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { WORKER_HISTORY_LENGTH, useOrchestrationStore } from '@/stores/orchestration.store';\nimport { ref } from 'vue';\nimport type { ChartData, ChartOptions } from 'chart.js';\nimport type { ChartComponentRef } from 'vue-chartjs';\nimport { Chart } from 'vue-chartjs';\nimport { averageWorkerLoadFromLoads, memAsGb } from '@/utils/workerUtils';\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst blankDataSet = (label: string, color: string, prefill: number = 0) => ({\n\tdatasets: [\n\t\t{\n\t\t\tlabel,\n\t\t\tbackgroundColor: color,\n\t\t\tdata: prefill ? Array<number>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(0) : [],\n\t\t},\n\t],\n\tlabels: Array<string>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(''),\n});\n\nconst orchestrationStore = useOrchestrationStore();\nconst chartRefJobs = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefCPU = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefMemory = ref<ChartComponentRef | undefined>(undefined);\nconst optionsBase: () => Partial<ChartOptions<'line'>> = () => ({\n\tresponsive: true,\n\tmaintainAspectRatio: true,\n\tscales: {\n\t\ty: {\n\t\t\ttype: 'linear',\n\t\t\tdisplay: true,\n\t\t\tposition: 'left',\n\t\t\tmin: 0,\n\t\t\tsuggestedMax: 5,\n\t\t},\n\t},\n\t// uncomment to disable animation\n\t// animation: {\n\t// \tduration: 0,\n\t// },\n});\nconst optionsJobs: Partial<ChartOptions<'line'>> = optionsBase();\nconst optionsCPU: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsCPU.scales?.y) optionsCPU.scales.y.suggestedMax = 100;\nconst maxMemory = memAsGb(orchestrationStore.workers[props.workerId]?.totalMem) ?? 1;\nconst optionsMemory: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsMemory.scales?.y) optionsMemory.scales.y.suggestedMax = maxMemory;\n\n// prefilled initial arrays\nconst dataJobs = ref<ChartData>(\n\tblankDataSet('Job Count', 'rgb(255, 111, 92)', WORKER_HISTORY_LENGTH),\n);\nconst dataCPU = ref<ChartData>(\n\tblankDataSet('Processor Usage', 'rgb(19, 205, 103)', WORKER_HISTORY_LENGTH),\n);\nconst dataMemory = ref<ChartData>(\n\tblankDataSet('Memory Usage', 'rgb(244, 216, 174)', WORKER_HISTORY_LENGTH),\n);\n\norchestrationStore.$onAction(({ name, store }) => {\n\tif (name === 'updateWorkerStatus') {\n\t\tconst prefillCount =\n\t\t\tWORKER_HISTORY_LENGTH - (store.workersHistory[props.workerId]?.length ?? 0);\n\t\tconst newDataJobs: ChartData = blankDataSet('Job Count', 'rgb(255, 111, 92)', prefillCount);\n\t\tconst newDataCPU: ChartData = blankDataSet(\n\t\t\t'Processor Usage',\n\t\t\t'rgb(19, 205, 103)',\n\t\t\tprefillCount,\n\t\t);\n\t\tconst newDataMemory: ChartData = blankDataSet(\n\t\t\t'Memory Usage',\n\t\t\t'rgb(244, 216, 174)',\n\t\t\tprefillCount,\n\t\t);\n\t\tstore.workersHistory[props.workerId]?.forEach((item) => {\n\t\t\tnewDataJobs.datasets[0].data.push(item.data.runningJobsSummary.length);\n\t\t\tnewDataJobs.labels?.push(new Date(item.timestamp).toLocaleTimeString());\n\t\t\tnewDataCPU.datasets[0].data.push(averageWorkerLoadFromLoads(item.data.loadAvg));\n\t\t\tnewDataCPU.labels = newDataJobs.labels;\n\t\t\tnewDataMemory.datasets[0].data.push(maxMemory - memAsGb(item.data.freeMem));\n\t\t\tnewDataMemory.labels = newDataJobs.labels;\n\t\t});\n\t\tdataJobs.value = newDataJobs;\n\t\tdataCPU.value = newDataCPU;\n\t\tdataMemory.value = newDataMemory;\n\t}\n});\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.charts {\n\twidth: 100%;\n\tflex-direction: column;\n}\n\n.chart {\n\tmax-width: 100%;\n\tmax-height: 200px;\n\tposition: relative;\n}\n</style>\n","<template>\n\t<n8n-card v-if=\"worker\" :class=\"$style.cardLink\">\n\t\t<template #header>\n\t\t\t<n8n-heading\n\t\t\t\ttag=\"h2\"\n\t\t\t\tbold\n\t\t\t\t:class=\"stale ? [$style.cardHeading, $style.stale] : [$style.cardHeading]\"\n\t\t\t\tdata-test-id=\"worker-card-name\"\n\t\t\t>\n\t\t\t\tName: {{ worker.workerId }} ({{ worker.hostname }}) <br />\n\t\t\t\tAverage Load: {{ averageWorkerLoadFromLoadsAsString(worker.loadAvg ?? [0]) }} | Free Memory:\n\t\t\t\t{{ memAsGb(worker.freeMem).toFixed(2) }}GB / {{ memAsGb(worker.totalMem).toFixed(2) }}GB\n\t\t\t\t{{ stale ? ' (stale)' : '' }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<div :class=\"$style.cardDescription\">\n\t\t\t<n8n-text color=\"text-light\" size=\"small\" :class=\"$style.container\">\n\t\t\t\t<span\n\t\t\t\t\t>{{ $locale.baseText('workerList.item.lastUpdated') }} {{ secondsSinceLastUpdateString }}s\n\t\t\t\t\tago | n8n-Version: {{ worker.version }} | Architecture: {{ worker.arch }} (\n\t\t\t\t\t{{ worker.platform }}) | Uptime: {{ upTime(worker.uptime) }}</span\n\t\t\t\t>\n\t\t\t\t<WorkerJobAccordion :items=\"worker.runningJobsSummary\" />\n\t\t\t\t<WorkerNetAccordion :items=\"sortedWorkerInterfaces\" />\n\t\t\t\t<WorkerChartsAccordion :worker-id=\"worker.workerId\" />\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<template #append>\n\t\t\t<div ref=\"cardActions\" :class=\"$style.cardActions\">\n\t\t\t\t<!-- For future Worker actions -->\n\t\t\t</div>\n\t\t</template>\n\t</n8n-card>\n</template>\n\n<script setup lang=\"ts\">\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport { computed, onMounted, onBeforeUnmount, ref } from 'vue';\nimport { averageWorkerLoadFromLoadsAsString, memAsGb } from '../../utils/workerUtils';\nimport WorkerJobAccordion from './WorkerJobAccordion.ee.vue';\nimport WorkerNetAccordion from './WorkerNetAccordion.ee.vue';\nimport WorkerChartsAccordion from './WorkerChartsAccordion.ee.vue';\n\nlet interval: NodeJS.Timer;\n\nconst orchestrationStore = useOrchestrationStore();\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst secondsSinceLastUpdateString = ref<string>('0');\nconst stale = ref<boolean>(false);\n\nconst worker = computed((): IPushDataWorkerStatusPayload | undefined => {\n\treturn orchestrationStore.getWorkerStatus(props.workerId);\n});\n\nconst sortedWorkerInterfaces = computed(\n\t() => worker.value?.interfaces.toSorted((a, b) => a.family.localeCompare(b.family)) ?? [],\n);\n\nfunction upTime(seconds: number): string {\n\tconst days = Math.floor(seconds / (3600 * 24));\n\tseconds -= days * 3600 * 24;\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${days}d ${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n\nonMounted(() => {\n\tinterval = setInterval(() => {\n\t\tconst lastUpdated = orchestrationStore.getWorkerLastUpdated(props.workerId);\n\t\tif (!lastUpdated) {\n\t\t\treturn;\n\t\t}\n\t\tconst secondsSinceLastUpdate = Math.ceil((Date.now() - lastUpdated) / 1000);\n\t\tstale.value = secondsSinceLastUpdate > 10;\n\t\tsecondsSinceLastUpdateString.value = secondsSinceLastUpdate.toFixed(0);\n\t}, 500);\n});\n\nonBeforeUnmount(() => {\n\tclearInterval(interval);\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.cardLink {\n\ttransition: box-shadow 0.3s ease;\n\tcursor: pointer;\n\tpadding: 0;\n\talign-items: stretch;\n\n\t&:hover {\n\t\tbox-shadow: 0 2px 8px rgba(#441c17, 0.1);\n\t}\n}\n\n.cardHeading {\n\tfont-size: var(--font-size-s);\n\tword-break: break-word;\n\tpadding: var(--spacing-s) 0 0 var(--spacing-s);\n}\n\n.stale {\n\topacity: 0.5;\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s) var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<template>\n\t<div>\n\t\t<PushConnectionTracker class=\"actions\"></PushConnectionTracker>\n\t\t<div :class=\"$style.workerListHeader\">\n\t\t\t<n8n-heading tag=\"h1\" size=\"2xlarge\">{{ pageTitle }}</n8n-heading>\n\t\t</div>\n\t\t<div v-if=\"!initialStatusReceived\">\n\t\t\t<n8n-spinner />\n\t\t</div>\n\t\t<div v-else>\n\t\t\t<div v-if=\"workerIds.length === 0\">{{ $locale.baseText('workerList.empty') }}</div>\n\t\t\t<div v-else>\n\t\t\t\t<div v-for=\"workerId in workerIds\" :key=\"workerId\" :class=\"$style.card\">\n\t\t\t\t\t<WorkerCard :worker-id=\"workerId\" data-test-id=\"worker-card\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport type { ExecutionStatus } from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport WorkerCard from './Workers/WorkerCard.ee.vue';\nimport { usePushConnection } from '@/composables/usePushConnection';\nimport { useRouter } from 'vue-router';\nimport { usePushConnectionStore } from '@/stores/pushConnection.store';\nimport { useRootStore } from '@/stores/root.store';\n\n// eslint-disable-next-line import/no-default-export\nexport default defineComponent({\n\tname: 'WorkerList',\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/naming-convention\n\tcomponents: { PushConnectionTracker, WorkerCard },\n\tprops: {\n\t\tautoRefreshEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst i18n = useI18n();\n\t\tconst pushConnection = usePushConnection({ router });\n\n\t\treturn {\n\t\t\ti18n,\n\t\t\tpushConnection,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useRootStore, useUIStore, usePushConnectionStore, useOrchestrationStore),\n\t\tcombinedWorkers(): IPushDataWorkerStatusPayload[] {\n\t\t\tconst returnData: IPushDataWorkerStatusPayload[] = [];\n\t\t\tfor (const workerId in this.orchestrationManagerStore.workers) {\n\t\t\t\treturnData.push(this.orchestrationManagerStore.workers[workerId]);\n\t\t\t}\n\t\t\treturn returnData;\n\t\t},\n\t\tinitialStatusReceived(): boolean {\n\t\t\treturn this.orchestrationManagerStore.initialStatusReceived;\n\t\t},\n\t\tworkerIds(): string[] {\n\t\t\treturn Object.keys(this.orchestrationManagerStore.workers);\n\t\t},\n\t\tpageTitle() {\n\t\t\treturn this.i18n.baseText('workerList.pageTitle');\n\t\t},\n\t},\n\tmounted() {\n\t\tsetPageTitle(`n8n - ${this.pageTitle}`);\n\n\t\tthis.$telemetry.track('User viewed worker view', {\n\t\t\tinstance_id: this.rootStore.instanceId,\n\t\t});\n\t},\n\tbeforeMount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pushConnection.initialize();\n\t\tthis.pushStore.pushConnect();\n\t\tthis.orchestrationManagerStore.startWorkerStatusPolling();\n\t},\n\tbeforeUnmount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.orchestrationManagerStore.stopWorkerStatusPolling();\n\t\tthis.pushStore.pushDisconnect();\n\t\tthis.pushConnection.terminate();\n\t},\n\tmethods: {\n\t\taverageLoadAvg(loads: number[]) {\n\t\t\treturn (loads.reduce((prev, curr) => prev + curr, 0) / loads.length).toFixed(2);\n\t\t},\n\t\tgetStatus(payload: IPushDataWorkerStatusPayload): ExecutionStatus {\n\t\t\tif (payload.runningJobsSummary.length > 0) {\n\t\t\t\treturn 'running';\n\t\t\t} else {\n\t\t\t\treturn 'success';\n\t\t\t}\n\t\t},\n\t\tgetRowClass(payload: IPushDataWorkerStatusPayload): string {\n\t\t\treturn [this.$style.execRow, this.$style[this.getStatus(payload)]].join(' ');\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.workerListHeader {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.card {\n\tmargin-bottom: var(--spacing-s);\n}\n\n.tableLoader {\n\twidth: 100%;\n\theight: 48px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n</style>\n","<template>\n\t<WorkerList\n\t\tv-if=\"settingsStore.isQueueModeEnabled && settingsStore.isWorkerViewAvailable\"\n\t\tdata-test-id=\"worker-view-licensed\"\n\t/>\n\t<n8n-action-box\n\t\tv-else\n\t\tdata-test-id=\"worker-view-unlicensed\"\n\t\t:class=\"$style.actionBox\"\n\t\t:description=\"$locale.baseText('workerList.actionBox.description')\"\n\t\t:button-text=\"$locale.baseText('workerList.actionBox.buttonText')\"\n\t\t@click:button=\"goToUpgrade\"\n\t>\n\t\t<template #heading>\n\t\t\t<span>{{ $locale.baseText('workerList.actionBox.title') }}</span>\n\t\t</template>\n\t\t<template #description>\n\t\t\t{{ $locale.baseText('workerList.actionBox.description') }}\n\t\t\t<a :href=\"$locale.baseText('workerList.docs.url')\" target=\"_blank\">\n\t\t\t\t{{ $locale.baseText('workerList.actionBox.description.link') }}\n\t\t\t</a>\n\t\t</template>\n\t</n8n-action-box>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerList from '@/components/WorkerList.ee.vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\n\nconst settingsStore = useSettingsStore();\nconst uiStore = useUIStore();\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('worker-view', 'upgrade-worker-view');\n};\n</script>\n\n<style module lang=\"scss\">\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n</style>\n"],"names":["averageWorkerLoadFromLoads","loads","prev","curr","averageWorkerLoadFromLoadsAsString","memAsGb","mem","expanded","ref","__props","toggle","props","runningSince","started","seconds","hrs","mnts","i18n","useI18n","clipboard","useClipboard","showMessage","useToast","onCopyToClipboard","content","blankDataSet","label","color","prefill","WORKER_HISTORY_LENGTH","orchestrationStore","useOrchestrationStore","chartRefJobs","chartRefCPU","chartRefMemory","optionsBase","optionsJobs","optionsCPU","_a","maxMemory","_b","optionsMemory","_c","dataJobs","dataCPU","dataMemory","name","store","prefillCount","newDataJobs","newDataCPU","newDataMemory","item","interval","secondsSinceLastUpdateString","stale","worker","computed","sortedWorkerInterfaces","a","b","upTime","days","onMounted","lastUpdated","secondsSinceLastUpdate","onBeforeUnmount","_sfc_main$1","defineComponent","PushConnectionTracker","WorkerCard","router","useRouter","pushConnection","usePushConnection","mapStores","useRootStore","useUIStore","usePushConnectionStore","returnData","workerId","setPageTitle","payload","_hoisted_1","_hoisted_2","_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_PushConnectionTracker","_createElementVNode","_normalizeClass","_ctx","_component_n8n_heading","_createTextVNode","_toDisplayString","initialStatusReceived","_hoisted_3","workerIds","_hoisted_4","_Fragment","_renderList","_component_WorkerCard","_component_n8n_spinner","settingsStore","useSettingsStore","uiStore","goToUpgrade"],"mappings":"28CAAO,SAASA,GAA2BC,EAAyB,CAC5D,OAAAA,EAAM,OAAO,CAACC,EAAMC,IAASD,EAAOC,EAAM,CAAC,EAAIF,EAAM,MAC7D,CAEO,SAASG,GAAmCH,EAAyB,CAC3E,OAAOD,GAA2BC,CAAK,EAAE,QAAQ,CAAC,CACnD,CAEO,SAASI,EAAQC,EAAqB,CACrC,OAAAA,EAAM,KAAO,KAAO,IAC5B,uJCqBM,MAAAC,EAAWC,EAbHC,EAasB,eAAe,EAEnD,SAASC,GAAS,CACRH,EAAA,MAAQ,CAACA,EAAS,KAC5B,08BCFA,MAAMI,EAAQF,EAId,SAASG,EAAaC,EAAuB,CACxC,IAAAC,EAAU,KAAK,OAAW,IAAA,OAAO,QAAY,EAAAD,EAAQ,QAAQ,GAAK,GAAI,EAC1E,MAAME,EAAM,KAAK,MAAMD,EAAU,IAAI,EACrCA,GAAWC,EAAM,KACjB,MAAMC,EAAO,KAAK,MAAMF,EAAU,EAAE,EACpC,OAAAA,GAAWE,EAAO,GACX,GAAGD,CAAG,KAAKC,CAAI,KAAK,KAAK,MAAMF,CAAO,CAAC,GAC/C,qyCChBA,MAAMH,EAAQF,EAIRQ,EAAOC,IACPC,EAAYC,KACZ,CAAE,YAAAC,GAAgBC,IAExB,SAASC,EAAkBC,EAAiB,CACvC,GAAA,CACEL,EAAU,KAAKK,CAAO,EACfH,EAAA,CACX,MAAOJ,EAAK,SAAS,wCAAwC,EAC7D,KAAM,SAAA,CACN,CAAA,MACM,CAAC,CACV,oyBCFA,MAAMN,EAAQF,EAIRgB,EAAe,CAACC,EAAeC,EAAeC,EAAkB,KAAO,CAC5E,SAAU,CACT,CACC,MAAAF,EACA,gBAAiBC,EACjB,KAAMC,EAAU,MAAc,KAAK,IAAIC,EAAuBD,CAAO,CAAC,EAAE,KAAK,CAAC,EAAI,CAAC,CACpF,CACD,EACA,OAAQ,MAAc,KAAK,IAAIC,EAAuBD,CAAO,CAAC,EAAE,KAAK,EAAE,CAAA,GAGlEE,EAAqBC,IACrBC,EAAexB,EAAmC,MAAS,EAC3DyB,EAAczB,EAAmC,MAAS,EAC1D0B,EAAiB1B,EAAmC,MAAS,EAC7D2B,EAAmD,KAAO,CAC/D,WAAY,GACZ,oBAAqB,GACrB,OAAQ,CACP,EAAG,CACF,KAAM,SACN,QAAS,GACT,SAAU,OACV,IAAK,EACL,aAAc,CACf,CACD,CAAA,GAMKC,EAA6CD,IAC7CE,EAA4CF,KAC9CG,EAAAD,EAAW,SAAX,MAAAC,EAAmB,IAAcD,EAAA,OAAO,EAAE,aAAe,KACvD,MAAAE,EAAYlC,GAAQmC,EAAAV,EAAmB,QAAQnB,EAAM,QAAQ,IAAzC,YAAA6B,EAA4C,QAAQ,GAAK,EAC7EC,EAA+CN,KACjDO,EAAAD,EAAc,SAAd,MAAAC,EAAsB,IAAiBD,EAAA,OAAO,EAAE,aAAeF,GAGnE,MAAMI,EAAWnC,EAChBiB,EAAa,YAAa,oBAAqBI,CAAqB,CAAA,EAE/De,EAAUpC,EACfiB,EAAa,kBAAmB,oBAAqBI,CAAqB,CAAA,EAErEgB,EAAarC,EAClBiB,EAAa,eAAgB,qBAAsBI,CAAqB,CAAA,EAGzE,OAAAC,EAAmB,UAAU,CAAC,CAAE,KAAAgB,EAAM,MAAAC,KAAY,SACjD,GAAID,IAAS,qBAAsB,CAClC,MAAME,EACLnB,KAAyBS,EAAAS,EAAM,eAAepC,EAAM,QAAQ,IAAnC,YAAA2B,EAAsC,SAAU,GACpEW,EAAyBxB,EAAa,YAAa,oBAAqBuB,CAAY,EACpFE,EAAwBzB,EAC7B,kBACA,oBACAuB,CAAA,EAEKG,EAA2B1B,EAChC,eACA,qBACAuB,CAAA,GAEDR,EAAAO,EAAM,eAAepC,EAAM,QAAQ,IAAnC,MAAA6B,EAAsC,QAASY,GAAS,OAC3CH,EAAA,SAAS,CAAC,EAAE,KAAK,KAAKG,EAAK,KAAK,mBAAmB,MAAM,GACzDd,EAAAW,EAAA,SAAA,MAAAX,EAAQ,KAAK,IAAI,KAAKc,EAAK,SAAS,EAAE,sBACvCF,EAAA,SAAS,CAAC,EAAE,KAAK,KAAKlD,GAA2BoD,EAAK,KAAK,OAAO,CAAC,EAC9EF,EAAW,OAASD,EAAY,OAClBE,EAAA,SAAS,CAAC,EAAE,KAAK,KAAKZ,EAAYlC,EAAQ+C,EAAK,KAAK,OAAO,CAAC,EAC1ED,EAAc,OAASF,EAAY,MAAA,GAEpCN,EAAS,MAAQM,EACjBL,EAAQ,MAAQM,EAChBL,EAAW,MAAQM,CACpB,CAAA,CACA,84BC/EG,IAAAE,EAEJ,MAAMvB,EAAqBC,IAErBpB,EAAQF,EAIR6C,EAA+B9C,EAAY,GAAG,EAC9C+C,EAAQ/C,EAAa,EAAK,EAE1BgD,EAASC,EAAS,IAChB3B,EAAmB,gBAAgBnB,EAAM,QAAQ,CACxD,EAEK+C,EAAyBD,EAC9B,IAAA,OAAM,QAAAnB,EAAAkB,EAAO,QAAP,YAAAlB,EAAc,WAAW,SAAS,CAACqB,EAAGC,IAAMD,EAAE,OAAO,cAAcC,EAAE,MAAM,KAAM,CAAC,EAAA,EAGzF,SAASC,EAAO/C,EAAyB,CACxC,MAAMgD,EAAO,KAAK,MAAMhD,EAAW,KAAU,EAC7CA,GAAWgD,EAAO,KAAO,GACzB,MAAM/C,EAAM,KAAK,MAAMD,EAAU,IAAI,EACrCA,GAAWC,EAAM,KACjB,MAAMC,EAAO,KAAK,MAAMF,EAAU,EAAE,EACpC,OAAAA,GAAWE,EAAO,GACX,GAAG8C,CAAI,KAAK/C,CAAG,KAAKC,CAAI,KAAK,KAAK,MAAMF,CAAO,CAAC,GACxD,CAEA,OAAAiD,GAAU,IAAM,CACfV,EAAW,YAAY,IAAM,CAC5B,MAAMW,EAAclC,EAAmB,qBAAqBnB,EAAM,QAAQ,EAC1E,GAAI,CAACqD,EACJ,OAED,MAAMC,EAAyB,KAAK,MAAM,KAAK,IAAI,EAAID,GAAe,GAAI,EAC1ET,EAAM,MAAQU,EAAyB,GACVX,EAAA,MAAQW,EAAuB,QAAQ,CAAC,GACnE,GAAG,CAAA,CACN,EAEDC,GAAgB,IAAM,CACrB,cAAcb,CAAQ,CAAA,CACtB,6+CCjDDc,GAAeC,EAAgB,CAC9B,KAAM,aAEN,WAAY,CAAE,sBAAAC,GAAuB,WAAAC,EAAW,EAChD,MAAO,CACN,mBAAoB,CACnB,KAAM,QACN,QAAS,EACV,CACD,EACA,OAAQ,CACP,MAAMC,EAASC,KACTvD,EAAOC,IACPuD,EAAiBC,GAAkB,CAAE,OAAAH,CAAQ,CAAA,EAE5C,MAAA,CACN,KAAAtD,EACA,eAAAwD,EACA,GAAGnD,EAAS,CAAA,CAEd,EACA,SAAU,CACT,GAAGqD,GAAUC,GAAcC,GAAYC,GAAwB/C,CAAqB,EACpF,iBAAkD,CACjD,MAAMgD,EAA6C,CAAA,EACxC,UAAAC,KAAY,KAAK,0BAA0B,QACrDD,EAAW,KAAK,KAAK,0BAA0B,QAAQC,CAAQ,CAAC,EAE1D,OAAAD,CACR,EACA,uBAAiC,CAChC,OAAO,KAAK,0BAA0B,qBACvC,EACA,WAAsB,CACrB,OAAO,OAAO,KAAK,KAAK,0BAA0B,OAAO,CAC1D,EACA,WAAY,CACJ,OAAA,KAAK,KAAK,SAAS,sBAAsB,CACjD,CACD,EACA,SAAU,CACIE,GAAA,SAAS,KAAK,SAAS,EAAE,EAEjC,KAAA,WAAW,MAAM,0BAA2B,CAChD,YAAa,KAAK,UAAU,UAAA,CAC5B,CACF,EACA,aAAc,CACT,OAAO,UAAY,SAIvB,KAAK,eAAe,aACpB,KAAK,UAAU,cACf,KAAK,0BAA0B,2BAChC,EACA,eAAgB,CACX,OAAO,UAAY,SAIvB,KAAK,0BAA0B,0BAC/B,KAAK,UAAU,iBACf,KAAK,eAAe,YACrB,EACA,QAAS,CACR,eAAehF,EAAiB,CAC/B,OAAQA,EAAM,OAAO,CAACC,EAAMC,IAASD,EAAOC,EAAM,CAAC,EAAIF,EAAM,QAAQ,QAAQ,CAAC,CAC/E,EACA,UAAUiF,EAAwD,CAC7D,OAAAA,EAAQ,mBAAmB,OAAS,EAChC,UAEA,SAET,EACA,YAAYA,EAA+C,CAC1D,MAAO,CAAC,KAAK,OAAO,QAAS,KAAK,OAAO,KAAK,UAAUA,CAAO,CAAC,CAAC,EAAE,KAAK,GAAG,CAC5E,CACD,CACD,CAAC,+HAtHDC,GAAA,CAAA,IAAA,GAAAC,GAAA,CAAA,IAAA,6HACCC,EAgBM,YAAA,SAdLC,EAEM,EAAAC,EAAA,MAAA,KAAA,CAAAC,EALRC,EAGsB,CAAgB,MAAA,SAAA,CAAA,EAAAC,EAAA,MAAA,CACnC,MAAkEC,EAAAC,EAAA,OAAA,gBAAA,CAAA,EAAA,GAAvCC,EAAS,CAAA,IAAA,KAJvC,KAAA,SAAA,EAAA,gBAAAC,EAAAC,EAAAH,EAAA,SAAA,EAAA,CAAA,CAAA,CAAA,KAMcI,CAAAA,CAAAA,EAAAA,CAAAA,EACXJ,EAAA,uBASKN,EAAA,EAAAC,EANL,MAAmFH,GAVtF,CAAAQ,EAAA,UAAA,SAWG,SACC,MAEMK,GAAAF,EAFkBG,UAAS,SAArB,kBAAQ,cAApB,MAEMC,GAAA,EAAAb,EAFmC,EAAQ,EAAAC,EAAAa,EAAA,KAAAC,EAAAT,EAAA,UAAAZ,IAAQM,EAAA,EAAaC,EAAA,MAAA,CAAA,IAAAP,EACrE,MAA+DW,EAAAC,EAAA,OAAA,IAAA,CAAA,EAAA,GAA7BU,EAA0B,CAAA,YAAAtB,yEAN9DM,EAAA,EAAAC,EAAA,MAAAJ,GAAA,GAEDoB,CAOM,CAAA,CAAA,sHCcR,MAAMC,EAAgBC,KAChBC,EAAU7B,KAEV8B,EAAc,IAAM,CACpBD,EAAQ,YAAY,cAAe,qBAAqB,CAAA"}
1
+ {"version":3,"file":"WorkerView-C3Rdbsfq.js","sources":["../../src/utils/workerUtils.ts","../../src/components/Workers/WorkerAccordion.ee.vue","../../src/components/Workers/WorkerJobAccordion.ee.vue","../../src/components/Workers/WorkerNetAccordion.ee.vue","../../src/components/Workers/WorkerChartsAccordion.ee.vue","../../src/components/Workers/WorkerCard.ee.vue","../../src/components/WorkerList.ee.vue","../../src/views/WorkerView.vue"],"sourcesContent":["export function averageWorkerLoadFromLoads(loads: number[]): number {\n\treturn loads.reduce((prev, curr) => prev + curr, 0) / loads.length;\n}\n\nexport function averageWorkerLoadFromLoadsAsString(loads: number[]): string {\n\treturn averageWorkerLoadFromLoads(loads).toFixed(2);\n}\n\nexport function memAsGb(mem: number): number {\n\treturn mem / 1024 / 1024 / 1024;\n}\n","<template>\n\t<div :class=\"['accordion', $style.container]\">\n\t\t<div :class=\"{ [$style.header]: true, [$style.expanded]: expanded }\" @click=\"toggle\">\n\t\t\t<n8n-icon :icon=\"icon\" :color=\"iconColor\" size=\"small\" class=\"mr-2xs\" />\n\t\t\t<n8n-text :class=\"$style.headerText\" color=\"text-base\" size=\"small\" align=\"left\" bold>\n\t\t\t\t<slot name=\"title\"></slot>\n\t\t\t</n8n-text>\n\t\t\t<n8n-icon :icon=\"expanded ? 'chevron-up' : 'chevron-down'\" bold />\n\t\t</div>\n\t\t<div v-if=\"expanded\" :class=\"{ [$style.description]: true, [$style.collapsed]: !expanded }\">\n\t\t\t<slot name=\"content\"></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\ticon?: string;\n\t\ticonColor?: string;\n\t\tinitialExpanded?: boolean;\n\t}>(),\n\t{\n\t\ticon: 'tasks',\n\t\ticonColor: 'black',\n\t\tinitialExpanded: true,\n\t},\n);\n\nconst expanded = ref<boolean>(props.initialExpanded);\n\nfunction toggle() {\n\texpanded.value = !expanded.value;\n}\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.header {\n\tcursor: pointer;\n\tdisplay: flex;\n\tpadding-top: var(--spacing-s);\n\talign-items: center;\n\n\t.headerText {\n\t\tflex-grow: 1;\n\t}\n}\n\n.expanded {\n\tpadding: var(--spacing-s) 0 0 0;\n}\n\n.description {\n\tdisplay: flex;\n\tpadding: 0 var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\n\tb {\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"true\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.jobListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div v-for=\"item in props.items\" :key=\"item.executionId\" :class=\"$style.accordionItem\">\n\t\t\t\t\t<a :href=\"'/workflow/' + item.workflowId + '/executions/' + item.executionId\">\n\t\t\t\t\t\tExecution {{ item.executionId }} - {{ item.workflowName }}</a\n\t\t\t\t\t>\n\t\t\t\t\t<n8n-text color=\"text-base\" size=\"small\" align=\"left\">\n\t\t\t\t\t\t| Started at:\n\t\t\t\t\t\t{{ new Date(item.startedAt)?.toLocaleTimeString() }} | Running for\n\t\t\t\t\t\t{{ runningSince(new Date(item.startedAt)) }}\n\t\t\t\t\t\t{{ item.retryOf ? `| Retry of: ${item.retryOf}` : '' }} |\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<a target=\"_blank\" :href=\"'/workflow/' + item.workflowId\"> (Open workflow)</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.accordionItems\">\n\t\t\t\t<span :class=\"$style.empty\">\n\t\t\t\t\t{{ $locale.baseText('workerList.item.jobList.empty') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { WorkerJobStatusSummary } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\n\nconst props = defineProps<{\n\titems: WorkerJobStatusSummary[];\n}>();\n\nfunction runningSince(started: Date): string {\n\tlet seconds = Math.floor((new Date().getTime() - started.getTime()) / 1000);\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.empty {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-top: var(--spacing-2xs);\n\tmargin-left: var(--spacing-4xs);\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.netListTitle') }} ({{ items.length }})\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div v-if=\"props.items.length > 0\" :class=\"$style.accordionItems\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"item in props.items\"\n\t\t\t\t\t:key=\"item.address\"\n\t\t\t\t\t:class=\"$style.accordionItem\"\n\t\t\t\t\t@click=\"onCopyToClipboard(item.address)\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.family }}: <span :class=\"$style.clickable\">{{ item.address }}</span>\n\t\t\t\t\t{{ item.internal ? '(internal)' : '' }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\n\nconst props = defineProps<{\n\titems: IPushDataWorkerStatusPayload['interfaces'];\n}>();\n\nconst i18n = useI18n();\nconst clipboard = useClipboard();\nconst { showMessage } = useToast();\n\nfunction onCopyToClipboard(content: string) {\n\ttry {\n\t\tvoid clipboard.copy(content);\n\t\tshowMessage({\n\t\t\ttitle: i18n.baseText('workerList.item.copyAddressToClipboard'),\n\t\t\ttype: 'success',\n\t\t});\n\t} catch {}\n}\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.clickable {\n\tcursor: pointer !important;\n\n\t&:hover {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<WorkerAccordion icon=\"tasks\" icon-color=\"black\" :initial-expanded=\"false\">\n\t\t<template #title>\n\t\t\t{{ $locale.baseText('workerList.item.chartsTitle') }}\n\t\t</template>\n\t\t<template #content>\n\t\t\t<div :class=\"$style.charts\">\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefJobs\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataJobs\"\n\t\t\t\t\t:options=\"optionsJobs\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefCPU\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataCPU\"\n\t\t\t\t\t:options=\"optionsCPU\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t\t<Chart\n\t\t\t\t\tref=\"chartRefMemory\"\n\t\t\t\t\ttype=\"line\"\n\t\t\t\t\t:data=\"dataMemory\"\n\t\t\t\t\t:options=\"optionsMemory\"\n\t\t\t\t\t:class=\"$style.chart\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</WorkerAccordion>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerAccordion from './WorkerAccordion.ee.vue';\nimport { WORKER_HISTORY_LENGTH, useOrchestrationStore } from '@/stores/orchestration.store';\nimport { ref } from 'vue';\nimport type { ChartData, ChartOptions } from 'chart.js';\nimport type { ChartComponentRef } from 'vue-chartjs';\nimport { Chart } from 'vue-chartjs';\nimport { averageWorkerLoadFromLoads, memAsGb } from '@/utils/workerUtils';\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst blankDataSet = (label: string, color: string, prefill: number = 0) => ({\n\tdatasets: [\n\t\t{\n\t\t\tlabel,\n\t\t\tbackgroundColor: color,\n\t\t\tdata: prefill ? Array<number>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(0) : [],\n\t\t},\n\t],\n\tlabels: Array<string>(Math.min(WORKER_HISTORY_LENGTH, prefill)).fill(''),\n});\n\nconst orchestrationStore = useOrchestrationStore();\nconst chartRefJobs = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefCPU = ref<ChartComponentRef | undefined>(undefined);\nconst chartRefMemory = ref<ChartComponentRef | undefined>(undefined);\nconst optionsBase: () => Partial<ChartOptions<'line'>> = () => ({\n\tresponsive: true,\n\tmaintainAspectRatio: true,\n\tscales: {\n\t\ty: {\n\t\t\ttype: 'linear',\n\t\t\tdisplay: true,\n\t\t\tposition: 'left',\n\t\t\tmin: 0,\n\t\t\tsuggestedMax: 5,\n\t\t},\n\t},\n\t// uncomment to disable animation\n\t// animation: {\n\t// \tduration: 0,\n\t// },\n});\nconst optionsJobs: Partial<ChartOptions<'line'>> = optionsBase();\nconst optionsCPU: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsCPU.scales?.y) optionsCPU.scales.y.suggestedMax = 100;\nconst maxMemory = memAsGb(orchestrationStore.workers[props.workerId]?.totalMem) ?? 1;\nconst optionsMemory: Partial<ChartOptions<'line'>> = optionsBase();\nif (optionsMemory.scales?.y) optionsMemory.scales.y.suggestedMax = maxMemory;\n\n// prefilled initial arrays\nconst dataJobs = ref<ChartData>(\n\tblankDataSet('Job Count', 'rgb(255, 111, 92)', WORKER_HISTORY_LENGTH),\n);\nconst dataCPU = ref<ChartData>(\n\tblankDataSet('Processor Usage', 'rgb(19, 205, 103)', WORKER_HISTORY_LENGTH),\n);\nconst dataMemory = ref<ChartData>(\n\tblankDataSet('Memory Usage', 'rgb(244, 216, 174)', WORKER_HISTORY_LENGTH),\n);\n\norchestrationStore.$onAction(({ name, store }) => {\n\tif (name === 'updateWorkerStatus') {\n\t\tconst prefillCount =\n\t\t\tWORKER_HISTORY_LENGTH - (store.workersHistory[props.workerId]?.length ?? 0);\n\t\tconst newDataJobs: ChartData = blankDataSet('Job Count', 'rgb(255, 111, 92)', prefillCount);\n\t\tconst newDataCPU: ChartData = blankDataSet(\n\t\t\t'Processor Usage',\n\t\t\t'rgb(19, 205, 103)',\n\t\t\tprefillCount,\n\t\t);\n\t\tconst newDataMemory: ChartData = blankDataSet(\n\t\t\t'Memory Usage',\n\t\t\t'rgb(244, 216, 174)',\n\t\t\tprefillCount,\n\t\t);\n\t\tstore.workersHistory[props.workerId]?.forEach((item) => {\n\t\t\tnewDataJobs.datasets[0].data.push(item.data.runningJobsSummary.length);\n\t\t\tnewDataJobs.labels?.push(new Date(item.timestamp).toLocaleTimeString());\n\t\t\tnewDataCPU.datasets[0].data.push(averageWorkerLoadFromLoads(item.data.loadAvg));\n\t\t\tnewDataCPU.labels = newDataJobs.labels;\n\t\t\tnewDataMemory.datasets[0].data.push(maxMemory - memAsGb(item.data.freeMem));\n\t\t\tnewDataMemory.labels = newDataJobs.labels;\n\t\t});\n\t\tdataJobs.value = newDataJobs;\n\t\tdataCPU.value = newDataCPU;\n\t\tdataMemory.value = newDataMemory;\n\t}\n});\n</script>\n\n<style lang=\"scss\" module>\n.accordionItems {\n\tdisplay: flex;\n\tflex-direction: column !important;\n\talign-items: flex-start !important;\n\twidth: 100%;\n}\n\n.accordionItem {\n\tdisplay: block !important;\n\ttext-align: left;\n\tmargin-bottom: var(--spacing-4xs);\n}\n\n.charts {\n\twidth: 100%;\n\tflex-direction: column;\n}\n\n.chart {\n\tmax-width: 100%;\n\tmax-height: 200px;\n\tposition: relative;\n}\n</style>\n","<template>\n\t<n8n-card v-if=\"worker\" :class=\"$style.cardLink\">\n\t\t<template #header>\n\t\t\t<n8n-heading\n\t\t\t\ttag=\"h2\"\n\t\t\t\tbold\n\t\t\t\t:class=\"stale ? [$style.cardHeading, $style.stale] : [$style.cardHeading]\"\n\t\t\t\tdata-test-id=\"worker-card-name\"\n\t\t\t>\n\t\t\t\tName: {{ worker.workerId }} ({{ worker.hostname }}) <br />\n\t\t\t\tAverage Load: {{ averageWorkerLoadFromLoadsAsString(worker.loadAvg ?? [0]) }} | Free Memory:\n\t\t\t\t{{ memAsGb(worker.freeMem).toFixed(2) }}GB / {{ memAsGb(worker.totalMem).toFixed(2) }}GB\n\t\t\t\t{{ stale ? ' (stale)' : '' }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<div :class=\"$style.cardDescription\">\n\t\t\t<n8n-text color=\"text-light\" size=\"small\" :class=\"$style.container\">\n\t\t\t\t<span\n\t\t\t\t\t>{{ $locale.baseText('workerList.item.lastUpdated') }} {{ secondsSinceLastUpdateString }}s\n\t\t\t\t\tago | n8n-Version: {{ worker.version }} | Architecture: {{ worker.arch }} (\n\t\t\t\t\t{{ worker.platform }}) | Uptime: {{ upTime(worker.uptime) }}</span\n\t\t\t\t>\n\t\t\t\t<WorkerJobAccordion :items=\"worker.runningJobsSummary\" />\n\t\t\t\t<WorkerNetAccordion :items=\"sortedWorkerInterfaces\" />\n\t\t\t\t<WorkerChartsAccordion :worker-id=\"worker.workerId\" />\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<template #append>\n\t\t\t<div ref=\"cardActions\" :class=\"$style.cardActions\">\n\t\t\t\t<!-- For future Worker actions -->\n\t\t\t</div>\n\t\t</template>\n\t</n8n-card>\n</template>\n\n<script setup lang=\"ts\">\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport { computed, onMounted, onBeforeUnmount, ref } from 'vue';\nimport { averageWorkerLoadFromLoadsAsString, memAsGb } from '../../utils/workerUtils';\nimport WorkerJobAccordion from './WorkerJobAccordion.ee.vue';\nimport WorkerNetAccordion from './WorkerNetAccordion.ee.vue';\nimport WorkerChartsAccordion from './WorkerChartsAccordion.ee.vue';\n\nlet interval: NodeJS.Timer;\n\nconst orchestrationStore = useOrchestrationStore();\n\nconst props = defineProps<{\n\tworkerId: string;\n}>();\n\nconst secondsSinceLastUpdateString = ref<string>('0');\nconst stale = ref<boolean>(false);\n\nconst worker = computed((): IPushDataWorkerStatusPayload | undefined => {\n\treturn orchestrationStore.getWorkerStatus(props.workerId);\n});\n\nconst sortedWorkerInterfaces = computed(\n\t() => worker.value?.interfaces.toSorted((a, b) => a.family.localeCompare(b.family)) ?? [],\n);\n\nfunction upTime(seconds: number): string {\n\tconst days = Math.floor(seconds / (3600 * 24));\n\tseconds -= days * 3600 * 24;\n\tconst hrs = Math.floor(seconds / 3600);\n\tseconds -= hrs * 3600;\n\tconst mnts = Math.floor(seconds / 60);\n\tseconds -= mnts * 60;\n\treturn `${days}d ${hrs}h ${mnts}m ${Math.floor(seconds)}s`;\n}\n\nonMounted(() => {\n\tinterval = setInterval(() => {\n\t\tconst lastUpdated = orchestrationStore.getWorkerLastUpdated(props.workerId);\n\t\tif (!lastUpdated) {\n\t\t\treturn;\n\t\t}\n\t\tconst secondsSinceLastUpdate = Math.ceil((Date.now() - lastUpdated) / 1000);\n\t\tstale.value = secondsSinceLastUpdate > 10;\n\t\tsecondsSinceLastUpdateString.value = secondsSinceLastUpdate.toFixed(0);\n\t}, 500);\n});\n\nonBeforeUnmount(() => {\n\tclearInterval(interval);\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n}\n\n.cardLink {\n\ttransition: box-shadow 0.3s ease;\n\tcursor: pointer;\n\tpadding: 0;\n\talign-items: stretch;\n\n\t&:hover {\n\t\tbox-shadow: 0 2px 8px rgba(#441c17, 0.1);\n\t}\n}\n\n.cardHeading {\n\tfont-size: var(--font-size-s);\n\tword-break: break-word;\n\tpadding: var(--spacing-s) 0 0 var(--spacing-s);\n}\n\n.stale {\n\topacity: 0.5;\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s) var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<template>\n\t<div>\n\t\t<PushConnectionTracker class=\"actions\"></PushConnectionTracker>\n\t\t<div :class=\"$style.workerListHeader\">\n\t\t\t<n8n-heading tag=\"h1\" size=\"2xlarge\">{{ pageTitle }}</n8n-heading>\n\t\t</div>\n\t\t<div v-if=\"!initialStatusReceived\">\n\t\t\t<n8n-spinner />\n\t\t</div>\n\t\t<div v-else>\n\t\t\t<div v-if=\"workerIds.length === 0\">{{ $locale.baseText('workerList.empty') }}</div>\n\t\t\t<div v-else>\n\t\t\t\t<div v-for=\"workerId in workerIds\" :key=\"workerId\" :class=\"$style.card\">\n\t\t\t\t\t<WorkerCard :worker-id=\"workerId\" data-test-id=\"worker-card\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type { IPushDataWorkerStatusPayload } from '@/Interface';\nimport type { ExecutionStatus } from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useOrchestrationStore } from '@/stores/orchestration.store';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport WorkerCard from './Workers/WorkerCard.ee.vue';\nimport { usePushConnection } from '@/composables/usePushConnection';\nimport { useRouter } from 'vue-router';\nimport { usePushConnectionStore } from '@/stores/pushConnection.store';\nimport { useRootStore } from '@/stores/root.store';\n\n// eslint-disable-next-line import/no-default-export\nexport default defineComponent({\n\tname: 'WorkerList',\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/naming-convention\n\tcomponents: { PushConnectionTracker, WorkerCard },\n\tprops: {\n\t\tautoRefreshEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst i18n = useI18n();\n\t\tconst pushConnection = usePushConnection({ router });\n\n\t\treturn {\n\t\t\ti18n,\n\t\t\tpushConnection,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useRootStore, useUIStore, usePushConnectionStore, useOrchestrationStore),\n\t\tcombinedWorkers(): IPushDataWorkerStatusPayload[] {\n\t\t\tconst returnData: IPushDataWorkerStatusPayload[] = [];\n\t\t\tfor (const workerId in this.orchestrationManagerStore.workers) {\n\t\t\t\treturnData.push(this.orchestrationManagerStore.workers[workerId]);\n\t\t\t}\n\t\t\treturn returnData;\n\t\t},\n\t\tinitialStatusReceived(): boolean {\n\t\t\treturn this.orchestrationManagerStore.initialStatusReceived;\n\t\t},\n\t\tworkerIds(): string[] {\n\t\t\treturn Object.keys(this.orchestrationManagerStore.workers);\n\t\t},\n\t\tpageTitle() {\n\t\t\treturn this.i18n.baseText('workerList.pageTitle');\n\t\t},\n\t},\n\tmounted() {\n\t\tsetPageTitle(`n8n - ${this.pageTitle}`);\n\n\t\tthis.$telemetry.track('User viewed worker view', {\n\t\t\tinstance_id: this.rootStore.instanceId,\n\t\t});\n\t},\n\tbeforeMount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pushConnection.initialize();\n\t\tthis.pushStore.pushConnect();\n\t\tthis.orchestrationManagerStore.startWorkerStatusPolling();\n\t},\n\tbeforeUnmount() {\n\t\tif (window.Cypress !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.orchestrationManagerStore.stopWorkerStatusPolling();\n\t\tthis.pushStore.pushDisconnect();\n\t\tthis.pushConnection.terminate();\n\t},\n\tmethods: {\n\t\taverageLoadAvg(loads: number[]) {\n\t\t\treturn (loads.reduce((prev, curr) => prev + curr, 0) / loads.length).toFixed(2);\n\t\t},\n\t\tgetStatus(payload: IPushDataWorkerStatusPayload): ExecutionStatus {\n\t\t\tif (payload.runningJobsSummary.length > 0) {\n\t\t\t\treturn 'running';\n\t\t\t} else {\n\t\t\t\treturn 'success';\n\t\t\t}\n\t\t},\n\t\tgetRowClass(payload: IPushDataWorkerStatusPayload): string {\n\t\t\treturn [this.$style.execRow, this.$style[this.getStatus(payload)]].join(' ');\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.workerListHeader {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.card {\n\tmargin-bottom: var(--spacing-s);\n}\n\n.tableLoader {\n\twidth: 100%;\n\theight: 48px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n</style>\n","<template>\n\t<WorkerList\n\t\tv-if=\"settingsStore.isQueueModeEnabled && settingsStore.isWorkerViewAvailable\"\n\t\tdata-test-id=\"worker-view-licensed\"\n\t/>\n\t<n8n-action-box\n\t\tv-else\n\t\tdata-test-id=\"worker-view-unlicensed\"\n\t\t:class=\"$style.actionBox\"\n\t\t:description=\"$locale.baseText('workerList.actionBox.description')\"\n\t\t:button-text=\"$locale.baseText('workerList.actionBox.buttonText')\"\n\t\t@click:button=\"goToUpgrade\"\n\t>\n\t\t<template #heading>\n\t\t\t<span>{{ $locale.baseText('workerList.actionBox.title') }}</span>\n\t\t</template>\n\t\t<template #description>\n\t\t\t{{ $locale.baseText('workerList.actionBox.description') }}\n\t\t\t<a :href=\"$locale.baseText('workerList.docs.url')\" target=\"_blank\">\n\t\t\t\t{{ $locale.baseText('workerList.actionBox.description.link') }}\n\t\t\t</a>\n\t\t</template>\n\t</n8n-action-box>\n</template>\n\n<script setup lang=\"ts\">\nimport WorkerList from '@/components/WorkerList.ee.vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\n\nconst settingsStore = useSettingsStore();\nconst uiStore = useUIStore();\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('worker-view', 'upgrade-worker-view');\n};\n</script>\n\n<style module lang=\"scss\">\n.actionBox {\n\tmargin: var(--spacing-2xl) 0 0;\n}\n</style>\n"],"names":["averageWorkerLoadFromLoads","loads","prev","curr","averageWorkerLoadFromLoadsAsString","memAsGb","mem","expanded","ref","__props","toggle","props","runningSince","started","seconds","hrs","mnts","i18n","useI18n","clipboard","useClipboard","showMessage","useToast","onCopyToClipboard","content","blankDataSet","label","color","prefill","WORKER_HISTORY_LENGTH","orchestrationStore","useOrchestrationStore","chartRefJobs","chartRefCPU","chartRefMemory","optionsBase","optionsJobs","optionsCPU","_a","maxMemory","_b","optionsMemory","_c","dataJobs","dataCPU","dataMemory","name","store","prefillCount","newDataJobs","newDataCPU","newDataMemory","item","interval","secondsSinceLastUpdateString","stale","worker","computed","sortedWorkerInterfaces","a","b","upTime","days","onMounted","lastUpdated","secondsSinceLastUpdate","onBeforeUnmount","_sfc_main$1","defineComponent","PushConnectionTracker","WorkerCard","router","useRouter","pushConnection","usePushConnection","mapStores","useRootStore","useUIStore","usePushConnectionStore","returnData","workerId","setPageTitle","payload","_hoisted_1","_hoisted_2","_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_PushConnectionTracker","_createElementVNode","_normalizeClass","_ctx","_component_n8n_heading","_createTextVNode","_toDisplayString","initialStatusReceived","_hoisted_3","workerIds","_hoisted_4","_Fragment","_renderList","_component_WorkerCard","_component_n8n_spinner","settingsStore","useSettingsStore","uiStore","goToUpgrade"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{u as m,j as g,e as h,dv as A}from"./index-Dtri_pSJ.js";import{u as T}from"./useWorkflowActivate-BwVActuc.js";import{m as b}from"./pinia-sugP77Im.js";import{G as W,ag as s,aq as y,l as r,m as d,p as i,M as w,O as e,S as f,T as l,I as S,U as a,P as _,R as $}from"./vendor-Dv5OeN6t.js";import{_ as N}from"./n8n-4UEsHtUL.js";const C=W({name:"WorkflowActivator",props:["workflowActive","workflowId"],setup(){return{...m(),...T()}},computed:{...b(h,g),nodesIssuesExist(){return this.workflowsStore.nodesIssuesExist},isWorkflowActive(){return this.workflowsStore.activeWorkflows.includes(this.workflowId)},couldNotBeStarted(){return this.workflowActive===!0&&this.isWorkflowActive!==this.workflowActive},getActiveColor(){return this.couldNotBeStarted?"#ff4949":"#13ce66"},isCurrentWorkflow(){return this.workflowsStore.workflowId===this.workflowId},disabled(){return!this.workflowId||this.isCurrentWorkflow?!this.workflowActive&&!this.containsTrigger:!1},containsTrigger(){return A(this.workflowsStore.workflowTriggerNodes).length>0}},methods:{async activeChanged(o){return await this.updateWorkflowActivation(this.workflowId,o)},async displayActivationError(){let o;try{const t=await this.workflowsStore.getActivationError(this.workflowId);t===void 0?o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataUndefined"):o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined",{interpolate:{message:t}})}catch{o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.catchBlock")}this.showMessage({title:this.$locale.baseText("workflowActivator.showMessage.displayActivationError.title"),message:o,type:"warning",duration:0,dangerouslyUseHTMLString:!0})}}}),I="_activeStatusText_nj9sv_1",E={activeStatusText:I},M={class:"workflow-activator"},B={key:0,class:"could-not-be-started"},U=["innerHTML"];function D(o,t,x,H,z,L){const n=s("n8n-text"),v=s("el-switch"),c=s("n8n-tooltip"),k=s("font-awesome-icon"),u=y("loading");return r(),d("div",M,[i("div",{class:S(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(r(),w(n,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[f(l(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(r(),w(n,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[f(l(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),a(c,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[i("div",null,l(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[_(a(v,{"model-value":o.workflowActive,title:o.workflowActive?o.$locale.baseText("workflowActivator.deactivateWorkflow"):o.$locale.baseText("workflowActivator.activateWorkflow"),disabled:o.disabled||o.updatingWorkflowActivation,"active-color":o.getActiveColor,"inactive-color":"#8899AA","data-test-id":"workflow-activate-switch","onUpdate:modelValue":o.activeChanged},null,8,["model-value","title","disabled","active-color","onUpdate:modelValue"]),[[u,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(r(),d("div",B,[a(c,{placement:"top"},{content:e(()=>[i("div",{onClick:t[0]||(t[0]=(...p)=>o.displayActivationError&&o.displayActivationError(...p)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,U)]),default:e(()=>[a(k,{icon:"exclamation-triangle",onClick:o.displayActivationError},null,8,["onClick"])]),_:1})])):$("",!0)])}const V={$style:E},R=N(C,[["render",D],["__cssModules",V],["__scopeId","data-v-e3b4fb0e"]]);export{R as W};
2
- //# sourceMappingURL=WorkflowActivator-D6Zad1X2.js.map
1
+ import{u as m,j as g,e as h,dt as A}from"./index-BE0Xl-jy.js";import{u as T}from"./useWorkflowActivate-D8iK20ua.js";import{m as b}from"./pinia-sugP77Im.js";import{G as W,ag as s,aq as y,l as r,m as d,p as i,M as w,O as e,S as f,T as l,I as S,U as a,P as _,R as $}from"./vendor-Dv5OeN6t.js";import{_ as N}from"./n8n-4UEsHtUL.js";const C=W({name:"WorkflowActivator",props:["workflowActive","workflowId"],setup(){return{...m(),...T()}},computed:{...b(h,g),nodesIssuesExist(){return this.workflowsStore.nodesIssuesExist},isWorkflowActive(){return this.workflowsStore.activeWorkflows.includes(this.workflowId)},couldNotBeStarted(){return this.workflowActive===!0&&this.isWorkflowActive!==this.workflowActive},getActiveColor(){return this.couldNotBeStarted?"#ff4949":"#13ce66"},isCurrentWorkflow(){return this.workflowsStore.workflowId===this.workflowId},disabled(){return!this.workflowId||this.isCurrentWorkflow?!this.workflowActive&&!this.containsTrigger:!1},containsTrigger(){return A(this.workflowsStore.workflowTriggerNodes).length>0}},methods:{async activeChanged(o){return await this.updateWorkflowActivation(this.workflowId,o)},async displayActivationError(){let o;try{const t=await this.workflowsStore.getActivationError(this.workflowId);t===void 0?o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataUndefined"):o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined",{interpolate:{message:t}})}catch{o=this.$locale.baseText("workflowActivator.showMessage.displayActivationError.message.catchBlock")}this.showMessage({title:this.$locale.baseText("workflowActivator.showMessage.displayActivationError.title"),message:o,type:"warning",duration:0,dangerouslyUseHTMLString:!0})}}}),I="_activeStatusText_nj9sv_1",E={activeStatusText:I},M={class:"workflow-activator"},B={key:0,class:"could-not-be-started"},U=["innerHTML"];function D(o,t,x,H,z,L){const n=s("n8n-text"),v=s("el-switch"),c=s("n8n-tooltip"),k=s("font-awesome-icon"),u=y("loading");return r(),d("div",M,[i("div",{class:S(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(r(),w(n,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[f(l(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(r(),w(n,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[f(l(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),a(c,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[i("div",null,l(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[_(a(v,{"model-value":o.workflowActive,title:o.workflowActive?o.$locale.baseText("workflowActivator.deactivateWorkflow"):o.$locale.baseText("workflowActivator.activateWorkflow"),disabled:o.disabled||o.updatingWorkflowActivation,"active-color":o.getActiveColor,"inactive-color":"#8899AA","data-test-id":"workflow-activate-switch","onUpdate:modelValue":o.activeChanged},null,8,["model-value","title","disabled","active-color","onUpdate:modelValue"]),[[u,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(r(),d("div",B,[a(c,{placement:"top"},{content:e(()=>[i("div",{onClick:t[0]||(t[0]=(...p)=>o.displayActivationError&&o.displayActivationError(...p)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,U)]),default:e(()=>[a(k,{icon:"exclamation-triangle",onClick:o.displayActivationError},null,8,["onClick"])]),_:1})])):$("",!0)])}const V={$style:E},R=N(C,[["render",D],["__cssModules",V],["__scopeId","data-v-e3b4fb0e"]]);export{R as W};
2
+ //# sourceMappingURL=WorkflowActivator-DQXSsw0V.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowActivator-D6Zad1X2.js","sources":["../../src/components/WorkflowActivator.vue"],"sourcesContent":["<template>\n\t<div class=\"workflow-activator\">\n\t\t<div :class=\"$style.activeStatusText\" data-test-id=\"workflow-activator-status\">\n\t\t\t<n8n-text\n\t\t\t\tv-if=\"workflowActive\"\n\t\t\t\t:color=\"couldNotBeStarted ? 'danger' : 'success'\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tbold\n\t\t\t>\n\t\t\t\t{{ $locale.baseText('workflowActivator.active') }}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else color=\"text-base\" size=\"small\" bold>\n\t\t\t\t{{ $locale.baseText('workflowActivator.inactive') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<n8n-tooltip :disabled=\"!disabled\" placement=\"bottom\">\n\t\t\t<template #content>\n\t\t\t\t<div>\n\t\t\t\t\t{{ $locale.baseText('workflowActivator.thisWorkflowHasNoTriggerNodes') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<el-switch\n\t\t\t\tv-loading=\"updatingWorkflowActivation\"\n\t\t\t\t:model-value=\"workflowActive\"\n\t\t\t\t:title=\"\n\t\t\t\t\tworkflowActive\n\t\t\t\t\t\t? $locale.baseText('workflowActivator.deactivateWorkflow')\n\t\t\t\t\t\t: $locale.baseText('workflowActivator.activateWorkflow')\n\t\t\t\t\"\n\t\t\t\t:disabled=\"disabled || updatingWorkflowActivation\"\n\t\t\t\t:active-color=\"getActiveColor\"\n\t\t\t\tinactive-color=\"#8899AA\"\n\t\t\t\tdata-test-id=\"workflow-activate-switch\"\n\t\t\t\t@update:model-value=\"activeChanged\"\n\t\t\t>\n\t\t\t</el-switch>\n\t\t</n8n-tooltip>\n\n\t\t<div v-if=\"couldNotBeStarted\" class=\"could-not-be-started\">\n\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t<template #content>\n\t\t\t\t\t<div\n\t\t\t\t\t\t@click=\"displayActivationError\"\n\t\t\t\t\t\tv-html=\"$locale.baseText('workflowActivator.theWorkflowIsSetToBeActiveBut')\"\n\t\t\t\t\t></div>\n\t\t\t\t</template>\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" @click=\"displayActivationError\" />\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { useToast } from '@/composables/useToast';\nimport { useWorkflowActivate } from '@/composables/useWorkflowActivate';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\nimport { getActivatableTriggerNodes } from '@/utils/nodeTypesUtils';\n\nexport default defineComponent({\n\tname: 'WorkflowActivator',\n\tprops: ['workflowActive', 'workflowId'],\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t...useWorkflowActivate(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore, useWorkflowsStore),\n\t\tnodesIssuesExist(): boolean {\n\t\t\treturn this.workflowsStore.nodesIssuesExist;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\tconst activeWorkflows = this.workflowsStore.activeWorkflows;\n\t\t\treturn activeWorkflows.includes(this.workflowId);\n\t\t},\n\t\tcouldNotBeStarted(): boolean {\n\t\t\treturn this.workflowActive === true && this.isWorkflowActive !== this.workflowActive;\n\t\t},\n\t\tgetActiveColor(): string {\n\t\t\tif (this.couldNotBeStarted) {\n\t\t\t\treturn '#ff4949';\n\t\t\t}\n\t\t\treturn '#13ce66';\n\t\t},\n\t\tisCurrentWorkflow(): boolean {\n\t\t\treturn this.workflowsStore.workflowId === this.workflowId;\n\t\t},\n\t\tdisabled(): boolean {\n\t\t\tconst isNewWorkflow = !this.workflowId;\n\t\t\tif (isNewWorkflow || this.isCurrentWorkflow) {\n\t\t\t\treturn !this.workflowActive && !this.containsTrigger;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\tconst foundTriggers = getActivatableTriggerNodes(this.workflowsStore.workflowTriggerNodes);\n\t\t\treturn foundTriggers.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync activeChanged(newActiveState: boolean) {\n\t\t\treturn await this.updateWorkflowActivation(this.workflowId, newActiveState);\n\t\t},\n\t\tasync displayActivationError() {\n\t\t\tlet errorMessage: string;\n\t\t\ttry {\n\t\t\t\tconst errorData = await this.workflowsStore.getActivationError(this.workflowId);\n\n\t\t\t\tif (errorData === undefined) {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataUndefined',\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined',\n\t\t\t\t\t\t{ interpolate: { message: errorData } },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.catchBlock',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('workflowActivator.showMessage.displayActivationError.title'),\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'warning',\n\t\t\t\tduration: 0,\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.activeStatusText {\n\twidth: 64px; // Required to avoid jumping when changing active state\n\tpadding-right: var(--spacing-2xs);\n\tbox-sizing: border-box;\n\tdisplay: inline-block;\n\ttext-align: right;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.workflow-activator {\n\tdisplay: inline-flex;\n\tflex-wrap: nowrap;\n\talign-items: center;\n}\n\n.could-not-be-started {\n\tdisplay: inline-block;\n\tcolor: var(--color-text-danger);\n\tmargin-left: 0.5em;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","useToast","useWorkflowActivate","mapStores","useUIStore","useWorkflowsStore","getActivatableTriggerNodes","newActiveState","errorMessage","errorData","_hoisted_1","_hoisted_2","_directive_loading","_resolveDirective","_openBlock","_createElementVNode","_normalizeClass","_ctx","workflowActive","_createBlock","_component_n8n_text","_createTextVNode","_toDisplayString","_createVNode","_component_n8n_tooltip","_withCtx","_withDirectives","_component_el_switch","$locale","disabled","updatingWorkflowActivation","couldNotBeStarted","_createElementBlock","_cache","args","_hoisted_3","displayActivationError","_createCommentVNode"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowActivator-DQXSsw0V.js","sources":["../../src/components/WorkflowActivator.vue"],"sourcesContent":["<template>\n\t<div class=\"workflow-activator\">\n\t\t<div :class=\"$style.activeStatusText\" data-test-id=\"workflow-activator-status\">\n\t\t\t<n8n-text\n\t\t\t\tv-if=\"workflowActive\"\n\t\t\t\t:color=\"couldNotBeStarted ? 'danger' : 'success'\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tbold\n\t\t\t>\n\t\t\t\t{{ $locale.baseText('workflowActivator.active') }}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else color=\"text-base\" size=\"small\" bold>\n\t\t\t\t{{ $locale.baseText('workflowActivator.inactive') }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<n8n-tooltip :disabled=\"!disabled\" placement=\"bottom\">\n\t\t\t<template #content>\n\t\t\t\t<div>\n\t\t\t\t\t{{ $locale.baseText('workflowActivator.thisWorkflowHasNoTriggerNodes') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<el-switch\n\t\t\t\tv-loading=\"updatingWorkflowActivation\"\n\t\t\t\t:model-value=\"workflowActive\"\n\t\t\t\t:title=\"\n\t\t\t\t\tworkflowActive\n\t\t\t\t\t\t? $locale.baseText('workflowActivator.deactivateWorkflow')\n\t\t\t\t\t\t: $locale.baseText('workflowActivator.activateWorkflow')\n\t\t\t\t\"\n\t\t\t\t:disabled=\"disabled || updatingWorkflowActivation\"\n\t\t\t\t:active-color=\"getActiveColor\"\n\t\t\t\tinactive-color=\"#8899AA\"\n\t\t\t\tdata-test-id=\"workflow-activate-switch\"\n\t\t\t\t@update:model-value=\"activeChanged\"\n\t\t\t>\n\t\t\t</el-switch>\n\t\t</n8n-tooltip>\n\n\t\t<div v-if=\"couldNotBeStarted\" class=\"could-not-be-started\">\n\t\t\t<n8n-tooltip placement=\"top\">\n\t\t\t\t<template #content>\n\t\t\t\t\t<div\n\t\t\t\t\t\t@click=\"displayActivationError\"\n\t\t\t\t\t\tv-html=\"$locale.baseText('workflowActivator.theWorkflowIsSetToBeActiveBut')\"\n\t\t\t\t\t></div>\n\t\t\t\t</template>\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" @click=\"displayActivationError\" />\n\t\t\t</n8n-tooltip>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { useToast } from '@/composables/useToast';\nimport { useWorkflowActivate } from '@/composables/useWorkflowActivate';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\nimport { getActivatableTriggerNodes } from '@/utils/nodeTypesUtils';\n\nexport default defineComponent({\n\tname: 'WorkflowActivator',\n\tprops: ['workflowActive', 'workflowId'],\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t...useWorkflowActivate(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore, useWorkflowsStore),\n\t\tnodesIssuesExist(): boolean {\n\t\t\treturn this.workflowsStore.nodesIssuesExist;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\tconst activeWorkflows = this.workflowsStore.activeWorkflows;\n\t\t\treturn activeWorkflows.includes(this.workflowId);\n\t\t},\n\t\tcouldNotBeStarted(): boolean {\n\t\t\treturn this.workflowActive === true && this.isWorkflowActive !== this.workflowActive;\n\t\t},\n\t\tgetActiveColor(): string {\n\t\t\tif (this.couldNotBeStarted) {\n\t\t\t\treturn '#ff4949';\n\t\t\t}\n\t\t\treturn '#13ce66';\n\t\t},\n\t\tisCurrentWorkflow(): boolean {\n\t\t\treturn this.workflowsStore.workflowId === this.workflowId;\n\t\t},\n\t\tdisabled(): boolean {\n\t\t\tconst isNewWorkflow = !this.workflowId;\n\t\t\tif (isNewWorkflow || this.isCurrentWorkflow) {\n\t\t\t\treturn !this.workflowActive && !this.containsTrigger;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\tconst foundTriggers = getActivatableTriggerNodes(this.workflowsStore.workflowTriggerNodes);\n\t\t\treturn foundTriggers.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync activeChanged(newActiveState: boolean) {\n\t\t\treturn await this.updateWorkflowActivation(this.workflowId, newActiveState);\n\t\t},\n\t\tasync displayActivationError() {\n\t\t\tlet errorMessage: string;\n\t\t\ttry {\n\t\t\t\tconst errorData = await this.workflowsStore.getActivationError(this.workflowId);\n\n\t\t\t\tif (errorData === undefined) {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataUndefined',\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.errorDataNotUndefined',\n\t\t\t\t\t\t{ interpolate: { message: errorData } },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\terrorMessage = this.$locale.baseText(\n\t\t\t\t\t'workflowActivator.showMessage.displayActivationError.message.catchBlock',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('workflowActivator.showMessage.displayActivationError.title'),\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'warning',\n\t\t\t\tduration: 0,\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.activeStatusText {\n\twidth: 64px; // Required to avoid jumping when changing active state\n\tpadding-right: var(--spacing-2xs);\n\tbox-sizing: border-box;\n\tdisplay: inline-block;\n\ttext-align: right;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.workflow-activator {\n\tdisplay: inline-flex;\n\tflex-wrap: nowrap;\n\talign-items: center;\n}\n\n.could-not-be-started {\n\tdisplay: inline-block;\n\tcolor: var(--color-text-danger);\n\tmargin-left: 0.5em;\n}\n</style>\n"],"names":["_sfc_main","defineComponent","useToast","useWorkflowActivate","mapStores","useUIStore","useWorkflowsStore","getActivatableTriggerNodes","newActiveState","errorMessage","errorData","_hoisted_1","_hoisted_2","_directive_loading","_resolveDirective","_openBlock","_createElementVNode","_normalizeClass","_ctx","workflowActive","_createBlock","_component_n8n_text","_createTextVNode","_toDisplayString","_createVNode","_component_n8n_tooltip","_withCtx","_withDirectives","_component_el_switch","$locale","disabled","updatingWorkflowActivation","couldNotBeStarted","_createElementBlock","_cache","args","_hoisted_3","displayActivationError","_createCommentVNode"],"mappings":"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"}