n8n-editor-ui 1.41.0 → 1.41.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 (121) hide show
  1. package/.turbo/turbo-build.log +61 -61
  2. package/dist/assets/{AuthView-E0Dwqa78.js → AuthView-CMX_-yPy.js} +2 -2
  3. package/dist/assets/{AuthView-E0Dwqa78.js.map → AuthView-CMX_-yPy.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-yrXCY2V6.js → CanvasControls-9oKgZX9B.js} +2 -2
  5. package/dist/assets/{CanvasControls-yrXCY2V6.js.map → CanvasControls-9oKgZX9B.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-kHBWSwn5.js → ChangePasswordView-GG3ESv5E.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-kHBWSwn5.js.map → ChangePasswordView-GG3ESv5E.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-ZuNQUd29.js → CollectionParameter-1UnufhEZ.js} +2 -2
  9. package/dist/assets/CollectionParameter-1UnufhEZ.js.map +1 -0
  10. package/dist/assets/{CredentialsView-24rpr6nX.js → CredentialsView-TrGa_IpW.js} +2 -2
  11. package/dist/assets/{CredentialsView-24rpr6nX.js.map → CredentialsView-TrGa_IpW.js.map} +1 -1
  12. package/dist/assets/{ExecutionsFilter-RyBW2SgR.js → ExecutionsFilter-W0_jymTM.js} +2 -2
  13. package/dist/assets/{ExecutionsFilter-RyBW2SgR.js.map → ExecutionsFilter-W0_jymTM.js.map} +1 -1
  14. package/dist/assets/{ExecutionsView-NIusemYP.js → ExecutionsView-P-nSEBpq.js} +2 -2
  15. package/dist/assets/{ExecutionsView-NIusemYP.js.map → ExecutionsView-P-nSEBpq.js.map} +1 -1
  16. package/dist/assets/{ForgotMyPasswordView-ebrry8c_.js → ForgotMyPasswordView-_Ft-h_Xq.js} +2 -2
  17. package/dist/assets/{ForgotMyPasswordView-ebrry8c_.js.map → ForgotMyPasswordView-_Ft-h_Xq.js.map} +1 -1
  18. package/dist/assets/{MainHeader-JJIRXuyj.js → MainHeader-UFj-n8nH.js} +2 -2
  19. package/dist/assets/{MainHeader-JJIRXuyj.js.map → MainHeader-UFj-n8nH.js.map} +1 -1
  20. package/dist/assets/{MainSidebar-KnXGjnqU.js → MainSidebar-H7A2NfnT.js} +2 -2
  21. package/dist/assets/{MainSidebar-KnXGjnqU.js.map → MainSidebar-H7A2NfnT.js.map} +1 -1
  22. package/dist/assets/{NodeCreation-01VRbmJn.js → NodeCreation-MVULkw2n.js} +3 -3
  23. package/dist/assets/{NodeCreation-01VRbmJn.js.map → NodeCreation-MVULkw2n.js.map} +1 -1
  24. package/dist/assets/{NodeCreator-D_gQXSbT.js → NodeCreator-NjQetiNP.js} +2 -2
  25. package/dist/assets/{NodeCreator-D_gQXSbT.js.map → NodeCreator-NjQetiNP.js.map} +1 -1
  26. package/dist/assets/{NodeList-Ysq3Cjbn.js → NodeList-f4t5_e24.js} +2 -2
  27. package/dist/assets/{NodeList-Ysq3Cjbn.js.map → NodeList-f4t5_e24.js.map} +1 -1
  28. package/dist/assets/{NodeView-QjQV3eFX.js → NodeView-kA0j8oya.js} +4 -4
  29. package/dist/assets/{NodeView-QjQV3eFX.js.map → NodeView-kA0j8oya.js.map} +1 -1
  30. package/dist/assets/{RunDataAi-wbEK-oHX.js → RunDataAi-9Rk5nlrG.js} +2 -2
  31. package/dist/assets/{RunDataAi-wbEK-oHX.js.map → RunDataAi-9Rk5nlrG.js.map} +1 -1
  32. package/dist/assets/{RunDataJson-YtVT_k9o.js → RunDataJson-3HvvCXQv.js} +3 -3
  33. package/dist/assets/{RunDataJson-YtVT_k9o.js.map → RunDataJson-3HvvCXQv.js.map} +1 -1
  34. package/dist/assets/{RunDataJsonActions-dl7uUHxF.js → RunDataJsonActions-QVURaY0g.js} +2 -2
  35. package/dist/assets/{RunDataJsonActions-dl7uUHxF.js.map → RunDataJsonActions-QVURaY0g.js.map} +1 -1
  36. package/dist/assets/{RunDataSchema-zsup9Psk.js → RunDataSchema-8AcA4SSx.js} +2 -2
  37. package/dist/assets/{RunDataSchema-zsup9Psk.js.map → RunDataSchema-8AcA4SSx.js.map} +1 -1
  38. package/dist/assets/{RunDataTable-4PVwCliN.js → RunDataTable-aySP3LG2.js} +2 -2
  39. package/dist/assets/{RunDataTable-4PVwCliN.js.map → RunDataTable-aySP3LG2.js.map} +1 -1
  40. package/dist/assets/{SamlOnboarding-a7AOJSPY.js → SamlOnboarding-g5DOLc7y.js} +2 -2
  41. package/dist/assets/{SamlOnboarding-a7AOJSPY.js.map → SamlOnboarding-g5DOLc7y.js.map} +1 -1
  42. package/dist/assets/{SettingsApiView-MKVmxKrc.js → SettingsApiView-368bFhYh.js} +2 -2
  43. package/dist/assets/{SettingsApiView-MKVmxKrc.js.map → SettingsApiView-368bFhYh.js.map} +1 -1
  44. package/dist/assets/{SettingsCommunityNodesView-JSEAJRmQ.js → SettingsCommunityNodesView-4ma9ZrA6.js} +2 -2
  45. package/dist/assets/{SettingsCommunityNodesView-JSEAJRmQ.js.map → SettingsCommunityNodesView-4ma9ZrA6.js.map} +1 -1
  46. package/dist/assets/{SettingsExternalSecrets-LATcSwCb.js → SettingsExternalSecrets-anO5H_X6.js} +2 -2
  47. package/dist/assets/{SettingsExternalSecrets-LATcSwCb.js.map → SettingsExternalSecrets-anO5H_X6.js.map} +1 -1
  48. package/dist/assets/{SettingsFakeDoorView-JXYglIiV.js → SettingsFakeDoorView-DP8hJH_b.js} +2 -2
  49. package/dist/assets/{SettingsFakeDoorView-JXYglIiV.js.map → SettingsFakeDoorView-DP8hJH_b.js.map} +1 -1
  50. package/dist/assets/{SettingsLdapView-2qYzfmuL.js → SettingsLdapView-TVoyUgkx.js} +2 -2
  51. package/dist/assets/{SettingsLdapView-2qYzfmuL.js.map → SettingsLdapView-TVoyUgkx.js.map} +1 -1
  52. package/dist/assets/{SettingsLogStreamingView-Xc6EScgx.js → SettingsLogStreamingView-IIFjEkjs.js} +2 -2
  53. package/dist/assets/{SettingsLogStreamingView-Xc6EScgx.js.map → SettingsLogStreamingView-IIFjEkjs.js.map} +1 -1
  54. package/dist/assets/{SettingsSourceControl-Mb0LqGSl.js → SettingsSourceControl-1zDUY0dl.js} +2 -2
  55. package/dist/assets/{SettingsSourceControl-Mb0LqGSl.js.map → SettingsSourceControl-1zDUY0dl.js.map} +1 -1
  56. package/dist/assets/{SettingsSso-2YEXaMhF.js → SettingsSso-7dAOqmaA.js} +2 -2
  57. package/dist/assets/{SettingsSso-2YEXaMhF.js.map → SettingsSso-7dAOqmaA.js.map} +1 -1
  58. package/dist/assets/{SettingsUsageAndPlan-_C19BOT1.js → SettingsUsageAndPlan-0b_7OZCC.js} +2 -2
  59. package/dist/assets/{SettingsUsageAndPlan-_C19BOT1.js.map → SettingsUsageAndPlan-0b_7OZCC.js.map} +1 -1
  60. package/dist/assets/{SettingsUsersView-salH__qs.js → SettingsUsersView-0AZ_F16e.js} +2 -2
  61. package/dist/assets/{SettingsUsersView-salH__qs.js.map → SettingsUsersView-0AZ_F16e.js.map} +1 -1
  62. package/dist/assets/{SettingsView-EBt-ouA4.js → SettingsView-pF2qlNhK.js} +2 -2
  63. package/dist/assets/SettingsView-pF2qlNhK.js.map +1 -0
  64. package/dist/assets/{SetupView-T7JQiE1O.js → SetupView-IPdjd4om.js} +2 -2
  65. package/dist/assets/{SetupView-T7JQiE1O.js.map → SetupView-IPdjd4om.js.map} +1 -1
  66. package/dist/assets/{SetupWorkflowCredentialsButton-lDl1ksax.js → SetupWorkflowCredentialsButton-fL7BC8Hp.js} +2 -2
  67. package/dist/assets/{SetupWorkflowCredentialsButton-lDl1ksax.js.map → SetupWorkflowCredentialsButton-fL7BC8Hp.js.map} +1 -1
  68. package/dist/assets/{SetupWorkflowFromTemplateView-uEG55eR-.js → SetupWorkflowFromTemplateView-mDNSG38Q.js} +2 -2
  69. package/dist/assets/{SetupWorkflowFromTemplateView-uEG55eR-.js.map → SetupWorkflowFromTemplateView-mDNSG38Q.js.map} +1 -1
  70. package/dist/assets/{SigninView-tsJLDDbt.js → SigninView-4mpqXNHu.js} +2 -2
  71. package/dist/assets/{SigninView-tsJLDDbt.js.map → SigninView-4mpqXNHu.js.map} +1 -1
  72. package/dist/assets/{SignupView-ckdGMylG.js → SignupView-v6AVy0zJ.js} +2 -2
  73. package/dist/assets/{SignupView-ckdGMylG.js.map → SignupView-v6AVy0zJ.js.map} +1 -1
  74. package/dist/assets/{TemplateDetails-YEZlo0n4.js → TemplateDetails-WQVyxQi7.js} +2 -2
  75. package/dist/assets/{TemplateDetails-YEZlo0n4.js.map → TemplateDetails-WQVyxQi7.js.map} +1 -1
  76. package/dist/assets/{TemplateList-OGWLmWk_.js → TemplateList--WJ98ZVH.js} +2 -2
  77. package/dist/assets/{TemplateList-OGWLmWk_.js.map → TemplateList--WJ98ZVH.js.map} +1 -1
  78. package/dist/assets/{TemplatesCollectionView-Fx5qyXc6.js → TemplatesCollectionView-g59Pu268.js} +2 -2
  79. package/dist/assets/{TemplatesCollectionView-Fx5qyXc6.js.map → TemplatesCollectionView-g59Pu268.js.map} +1 -1
  80. package/dist/assets/{TemplatesInfoCarousel-oLwAv_o3.js → TemplatesInfoCarousel-Nq4oRyBi.js} +2 -2
  81. package/dist/assets/{TemplatesInfoCarousel-oLwAv_o3.js.map → TemplatesInfoCarousel-Nq4oRyBi.js.map} +1 -1
  82. package/dist/assets/{TemplatesSearchView-TtSL2qyI.js → TemplatesSearchView-Lv0e5mOk.js} +2 -2
  83. package/dist/assets/{TemplatesSearchView-TtSL2qyI.js.map → TemplatesSearchView-Lv0e5mOk.js.map} +1 -1
  84. package/dist/assets/{TemplatesWorkflowView-Ipt1HHPc.js → TemplatesWorkflowView-FoPXbc_4.js} +2 -2
  85. package/dist/assets/{TemplatesWorkflowView-Ipt1HHPc.js.map → TemplatesWorkflowView-FoPXbc_4.js.map} +1 -1
  86. package/dist/assets/{VariablesView-pLmlCm20.js → VariablesView-Sg4v_4Ai.js} +2 -2
  87. package/dist/assets/{VariablesView-pLmlCm20.js.map → VariablesView-Sg4v_4Ai.js.map} +1 -1
  88. package/dist/assets/{WorkerView-Du8mpTon.js → WorkerView-y-y5Q5E5.js} +2 -2
  89. package/dist/assets/{WorkerView-Du8mpTon.js.map → WorkerView-y-y5Q5E5.js.map} +1 -1
  90. package/dist/assets/{WorkflowActivator-MuCzpXdv.js → WorkflowActivator-vtOaSPI6.js} +2 -2
  91. package/dist/assets/{WorkflowActivator-MuCzpXdv.js.map → WorkflowActivator-vtOaSPI6.js.map} +1 -1
  92. package/dist/assets/{WorkflowExecutionsInfoAccordion-9gkfchSQ.js → WorkflowExecutionsInfoAccordion-Gm7eM0Un.js} +2 -2
  93. package/dist/assets/{WorkflowExecutionsInfoAccordion-9gkfchSQ.js.map → WorkflowExecutionsInfoAccordion-Gm7eM0Un.js.map} +1 -1
  94. package/dist/assets/{WorkflowExecutionsLandingPage-g4QNNuc4.js → WorkflowExecutionsLandingPage-C_oVBqy4.js} +2 -2
  95. package/dist/assets/{WorkflowExecutionsLandingPage-g4QNNuc4.js.map → WorkflowExecutionsLandingPage-C_oVBqy4.js.map} +1 -1
  96. package/dist/assets/{WorkflowExecutionsPreview-KNJgPBbn.js → WorkflowExecutionsPreview-Yw0HRwQz.js} +2 -2
  97. package/dist/assets/{WorkflowExecutionsPreview-KNJgPBbn.js.map → WorkflowExecutionsPreview-Yw0HRwQz.js.map} +1 -1
  98. package/dist/assets/{WorkflowExecutionsView-Iwwaw9Lt.js → WorkflowExecutionsView-dwh6ZDgY.js} +2 -2
  99. package/dist/assets/{WorkflowExecutionsView-Iwwaw9Lt.js.map → WorkflowExecutionsView-dwh6ZDgY.js.map} +1 -1
  100. package/dist/assets/{WorkflowHistory-HxH8_2Dt.js → WorkflowHistory-RGKALSm6.js} +2 -2
  101. package/dist/assets/{WorkflowHistory-HxH8_2Dt.js.map → WorkflowHistory-RGKALSm6.js.map} +1 -1
  102. package/dist/assets/{WorkflowOnboardingView-KirfsyFh.js → WorkflowOnboardingView-kAh_YIAL.js} +2 -2
  103. package/dist/assets/{WorkflowOnboardingView-KirfsyFh.js.map → WorkflowOnboardingView-kAh_YIAL.js.map} +1 -1
  104. package/dist/assets/{WorkflowsView-SJ6W5Ten.js → WorkflowsView-_nHq94Wq.js} +2 -2
  105. package/dist/assets/{WorkflowsView-SJ6W5Ten.js.map → WorkflowsView-_nHq94Wq.js.map} +1 -1
  106. package/dist/assets/{cloud-WKIHJYyR.js → cloud-jEANLTrV.js} +2 -2
  107. package/dist/assets/{cloud-WKIHJYyR.js.map → cloud-jEANLTrV.js.map} +1 -1
  108. package/dist/assets/{index-Qw68KAhz.js → index-6M_Mo9yq.js} +4 -4
  109. package/dist/assets/{index-Qw68KAhz.js.map → index-6M_Mo9yq.js.map} +1 -1
  110. package/dist/assets/{templateActions-5n_gDrp9.js → templateActions-l9fJr0Cu.js} +2 -2
  111. package/dist/assets/{templateActions-5n_gDrp9.js.map → templateActions-l9fJr0Cu.js.map} +1 -1
  112. package/dist/assets/{useExecutionDebugging-bM31shhY.js → useExecutionDebugging-ndesKh44.js} +2 -2
  113. package/dist/assets/{useExecutionDebugging-bM31shhY.js.map → useExecutionDebugging-ndesKh44.js.map} +1 -1
  114. package/dist/assets/{usePushConnection-YMVPmkf5.js → usePushConnection-vhkd7pw_.js} +2 -2
  115. package/dist/assets/{usePushConnection-YMVPmkf5.js.map → usePushConnection-vhkd7pw_.js.map} +1 -1
  116. package/dist/assets/{workflowActivate-L9KnNQBb.js → workflowActivate-dwxhdtFU.js} +2 -2
  117. package/dist/assets/{workflowActivate-L9KnNQBb.js.map → workflowActivate-dwxhdtFU.js.map} +1 -1
  118. package/dist/index.html +1 -1
  119. package/package.json +1 -1
  120. package/dist/assets/CollectionParameter-ZuNQUd29.js.map +0 -1
  121. package/dist/assets/SettingsView-EBt-ouA4.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"VariablesView-pLmlCm20.js","sources":["../../src/components/VariablesRow.vue","../../src/views/VariablesView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ComponentPublicInstance, PropType } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\nimport type { EnvironmentVariable, 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';\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 = defineProps({\n\tdata: {\n\t\ttype: Object as PropType<EnvironmentVariable>,\n\t\tdefault: () => ({}),\n\t},\n\tediting: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\nconst modelValue = ref<EnvironmentVariable>({ ...props.data });\n\nconst formValidationStatus = ref<Record<string, boolean>>({\n\tkey: false,\n\tvalue: false,\n});\nconst formValid = computed(() => {\n\treturn formValidationStatus.value.key && formValidationStatus.value.value;\n});\n\nconst keyInputRef = ref<ComponentPublicInstance & { inputRef?: HTMLElement }>();\nconst valueInputRef = ref<HTMLElement>();\n\nconst usage = ref(`$vars.${props.data.key}`);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nconst showActions = computed(\n\t() => isFeatureEnabled.value && (permissions.edit || permissions.delete),\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.key,\n\tasync () => {\n\t\tawait nextTick();\n\t\tif (formValidationStatus.value.key) {\n\t\t\tupdateUsageSyntax();\n\t\t}\n\t},\n);\n\nfunction updateUsageSyntax() {\n\tusage.value = `$vars.${modelValue.value.key || props.data.key}`;\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(key: string, value: boolean) {\n\tformValidationStatus.value[key] = 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.key }}</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.key\"\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"key\"\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) => onValidate('key', 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) => 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.key && 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.edit\" 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.edit\"\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.onlyOwnerCanSave') }}\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.onlyOwnerCanDelete') }}\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 ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport VariablesRow from '@/components/VariablesRow.vue';\n\nimport { EnterpriseEditionFeature, MODAL_CONFIRM } from '@/constants';\nimport type {\n\tDatatableColumn,\n\tEnvironmentVariable,\n\tTemporaryEnvironmentVariable,\n} from '@/Interface';\nimport { uid } from 'n8n-design-system/utils';\nimport { getVariablesPermissions } from '@/permissions';\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<Array<EnvironmentVariable | TemporaryEnvironmentVariable>>([]);\nconst editMode = ref<Record<string, boolean>>({});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\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<number[]>([]);\n\nconst nameSortFn = (a: EnvironmentVariable, b: EnvironmentVariable, 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: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'asc');\n\t},\n\tnameDesc: (a: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'desc');\n\t},\n};\n\nfunction resetNewVariablesList() {\n\tnewlyAddedVariableIds.value = [];\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: TemporaryEnvironmentVariable = {\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\tlayoutRef.value.$refs.listWrapperRef.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: EnvironmentVariable | TemporaryEnvironmentVariable) {\n\tlet updatedVariable: EnvironmentVariable;\n\n\ttry {\n\t\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\t\tconst { id, ...rest } = data;\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(data as EnvironmentVariable);\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 | TemporaryEnvironmentVariable) {\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 as EnvironmentVariable);\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: EnvironmentVariable) {\n\treturn resource.key;\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=\"allVariables\"\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 #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=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\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=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\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","getVariablesPermissions","modelValue","ref","formValidationStatus","formValid","computed","keyInputRef","valueInputRef","usage","isFeatureEnabled","EnterpriseEditionFeature","onMounted","focusFirstInput","keyValidationRules","valueValidationRules","watch","nextTick","updateUsageSyntax","onCancel","onSave","onEdit","onDelete","onValidate","key","value","onUsageClick","_c","_b","_a","TEMPORARY_VARIABLE_UID_BASE","environmentsStore","useEnvironmentsStore","uiStore","useUIStore","telemetry","useTelemetry","message","useMessage","sourceControlStore","useSourceControlStore","sourceControlStoreUnsubscribe","layoutRef","showError","allVariables","editMode","canCreateVariables","datatableColumns","contextBasedTranslationKeys","newlyAddedVariableIds","nameSortFn","a","b","direction","displayName","sortFns","resetNewVariablesList","initialize","addTemporaryVariable","temporaryVariable","uid","saveVariable","data","updatedVariable","id","rest","variable","toggleEditing","error","cancelEditing","deleteVariable","MODAL_CONFIRM","goToUpgrade","resource","onBeforeMount","name","after","onBeforeUnmount"],"mappings":"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"}
1
+ {"version":3,"file":"VariablesView-Sg4v_4Ai.js","sources":["../../src/components/VariablesRow.vue","../../src/views/VariablesView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ComponentPublicInstance, PropType } from 'vue';\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\nimport type { EnvironmentVariable, 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';\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 = defineProps({\n\tdata: {\n\t\ttype: Object as PropType<EnvironmentVariable>,\n\t\tdefault: () => ({}),\n\t},\n\tediting: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\nconst modelValue = ref<EnvironmentVariable>({ ...props.data });\n\nconst formValidationStatus = ref<Record<string, boolean>>({\n\tkey: false,\n\tvalue: false,\n});\nconst formValid = computed(() => {\n\treturn formValidationStatus.value.key && formValidationStatus.value.value;\n});\n\nconst keyInputRef = ref<ComponentPublicInstance & { inputRef?: HTMLElement }>();\nconst valueInputRef = ref<HTMLElement>();\n\nconst usage = ref(`$vars.${props.data.key}`);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\n);\n\nconst showActions = computed(\n\t() => isFeatureEnabled.value && (permissions.edit || permissions.delete),\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.key,\n\tasync () => {\n\t\tawait nextTick();\n\t\tif (formValidationStatus.value.key) {\n\t\t\tupdateUsageSyntax();\n\t\t}\n\t},\n);\n\nfunction updateUsageSyntax() {\n\tusage.value = `$vars.${modelValue.value.key || props.data.key}`;\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(key: string, value: boolean) {\n\tformValidationStatus.value[key] = 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.key }}</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.key\"\n\t\t\t\t\tlabel\n\t\t\t\t\tname=\"key\"\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) => onValidate('key', 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) => 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.key && 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.edit\" 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.edit\"\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.onlyOwnerCanSave') }}\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.onlyOwnerCanDelete') }}\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 ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport VariablesRow from '@/components/VariablesRow.vue';\n\nimport { EnterpriseEditionFeature, MODAL_CONFIRM } from '@/constants';\nimport type {\n\tDatatableColumn,\n\tEnvironmentVariable,\n\tTemporaryEnvironmentVariable,\n} from '@/Interface';\nimport { uid } from 'n8n-design-system/utils';\nimport { getVariablesPermissions } from '@/permissions';\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<Array<EnvironmentVariable | TemporaryEnvironmentVariable>>([]);\nconst editMode = ref<Record<string, boolean>>({});\n\nconst permissions = getVariablesPermissions(usersStore.currentUser);\n\nconst isFeatureEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables),\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<number[]>([]);\n\nconst nameSortFn = (a: EnvironmentVariable, b: EnvironmentVariable, 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: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'asc');\n\t},\n\tnameDesc: (a: EnvironmentVariable, b: EnvironmentVariable) => {\n\t\treturn nameSortFn(a, b, 'desc');\n\t},\n};\n\nfunction resetNewVariablesList() {\n\tnewlyAddedVariableIds.value = [];\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: TemporaryEnvironmentVariable = {\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\tlayoutRef.value.$refs.listWrapperRef.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: EnvironmentVariable | TemporaryEnvironmentVariable) {\n\tlet updatedVariable: EnvironmentVariable;\n\n\ttry {\n\t\tif (typeof data.id === 'string' && data.id.startsWith(TEMPORARY_VARIABLE_UID_BASE)) {\n\t\t\tconst { id, ...rest } = data;\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(data as EnvironmentVariable);\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 | TemporaryEnvironmentVariable) {\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 as EnvironmentVariable);\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: EnvironmentVariable) {\n\treturn resource.key;\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=\"allVariables\"\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 #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=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\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=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.title)\"\n\t\t\t\t:description=\"\n\t\t\t\t\t$locale.baseText(contextBasedTranslationKeys.variables.unavailable.description)\n\t\t\t\t\"\n\t\t\t\t:button-text=\"$locale.baseText(contextBasedTranslationKeys.variables.unavailable.button)\"\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","getVariablesPermissions","modelValue","ref","formValidationStatus","formValid","computed","keyInputRef","valueInputRef","usage","isFeatureEnabled","EnterpriseEditionFeature","onMounted","focusFirstInput","keyValidationRules","valueValidationRules","watch","nextTick","updateUsageSyntax","onCancel","onSave","onEdit","onDelete","onValidate","key","value","onUsageClick","_c","_b","_a","TEMPORARY_VARIABLE_UID_BASE","environmentsStore","useEnvironmentsStore","uiStore","useUIStore","telemetry","useTelemetry","message","useMessage","sourceControlStore","useSourceControlStore","sourceControlStoreUnsubscribe","layoutRef","showError","allVariables","editMode","canCreateVariables","datatableColumns","contextBasedTranslationKeys","newlyAddedVariableIds","nameSortFn","a","b","direction","displayName","sortFns","resetNewVariablesList","initialize","addTemporaryVariable","temporaryVariable","uid","saveVariable","data","updatedVariable","id","rest","variable","toggleEditing","error","cancelEditing","deleteVariable","MODAL_CONFIRM","goToUpgrade","resource","onBeforeMount","name","after","onBeforeUnmount"],"mappings":"qnDAYA,MAAMA,EAAOC,KACPC,EAAYC,KACZ,CAAE,YAAAC,GAAgBC,IAClBC,EAAgBC,KAChBC,EAAaC,KAEbC,EAAOC,EAEPC,EAAQC,EAWRC,EAAcC,GAAwBP,EAAW,WAAW,EAC5DQ,EAAaC,EAAyB,CAAE,GAAGL,EAAM,IAAM,CAAA,EAEvDM,EAAuBD,EAA6B,CACzD,IAAK,GACL,MAAO,EAAA,CACP,EACKE,EAAYC,EAAS,IACnBF,EAAqB,MAAM,KAAOA,EAAqB,MAAM,KACpE,EAEKG,EAAcJ,IACdK,EAAgBL,IAEhBM,EAAQN,EAAI,SAASL,EAAM,KAAK,GAAG,EAAE,EAErCY,EAAmBJ,EAAS,IACjCd,EAAc,2BAA2BmB,GAAyB,SAAS,CAAA,EAGxDL,EACnB,IAAMI,EAAiB,QAAUV,EAAY,MAAQA,EAAY,OAClE,EAEAY,GAAU,IAAM,CACCC,GAAA,CAChB,EAED,MAAMC,EAA8C,CACnD,CAAE,KAAM,UAAW,EACnB,CAAE,KAAM,aAAc,OAAQ,CAAE,QAAS,GAAK,EAC9C,CACC,KAAM,cACN,OAAQ,CACP,MAAO,YACP,QAAS5B,EAAK,SAAS,8CAA8C,CACtE,CACD,EACA,CACC,KAAM,cACN,OAAQ,CACP,MAAO,0BACP,QAASA,EAAK,SAAS,qCAAqC,CAC7D,CACD,CAAA,EAGK6B,EAAgD,CACrD,CAAE,KAAM,aAAc,OAAQ,CAAE,QAAS,IAAM,CAAA,EAGhDC,GACC,IAAMd,EAAW,MAAM,IACvB,SAAY,CACX,MAAMe,EAAS,EACXb,EAAqB,MAAM,KACZc,GAEpB,CAAA,EAGD,SAASA,GAAoB,CAC5BT,EAAM,MAAQ,SAASP,EAAW,MAAM,KAAOJ,EAAM,KAAK,GAAG,EAC9D,CAEA,eAAeqB,GAAW,CACzBjB,EAAW,MAAQ,CAAE,GAAGJ,EAAM,IAAK,EAC9BF,EAAA,SAAUM,EAAW,KAAK,CAChC,CAEA,eAAekB,GAAS,CAClBxB,EAAA,OAAQM,EAAW,KAAK,CAC9B,CAEA,eAAemB,GAAS,CAClBzB,EAAA,OAAQM,EAAW,KAAK,EAE7B,MAAMe,EAAS,EAECJ,GACjB,CAEA,eAAeS,GAAW,CACpB1B,EAAA,SAAUM,EAAW,KAAK,CAChC,CAES,SAAAqB,EAAWC,EAAaC,EAAgB,CAC3BrB,EAAA,MAAMoB,CAAG,EAAIC,CACnC,CAEA,SAASC,GAAe,CAClBtC,EAAU,KAAKqB,EAAM,KAAK,EACnBnB,EAAA,CACX,MAAOJ,EAAK,SAAS,uCAAuC,EAC5D,KAAM,SAAA,CACN,CACF,CAEA,SAAS2B,GAAkB,YACdc,GAAAC,GAAAC,EAAAtB,EAAA,QAAA,YAAAsB,EAAO,WAAP,YAAAD,EAAiB,QAAjB,MAAAD,EAAA,KAAAC,EACb,+xFC7FME,EAA8B,iDAdpC,MAAMtC,EAAgBC,KAChBsC,EAAoBC,KACpBtC,EAAaC,KACbsC,EAAUC,KACVC,EAAYC,KACZlD,EAAOC,KACPkD,EAAUC,KACVC,EAAqBC,KAC3B,IAAIC,EAAgC,IAAM,CAAA,EAEpC,MAAAC,EAAYvC,EAAqD,IAAI,EAErE,CAAE,UAAAwC,GAAcpD,IAIhBqD,EAAezC,EAA+D,CAAA,CAAE,EAChF0C,EAAW1C,EAA6B,CAAA,CAAE,EAE1CH,EAAcC,GAAwBP,EAAW,WAAW,EAE5DgB,EAAmBJ,EAAS,IACjCd,EAAc,2BAA2BmB,GAAyB,SAAS,CAAA,EAEtEmC,EAAqBxC,EAAS,IAAMI,EAAiB,OAASV,EAAY,MAAM,EAEhF+C,EAAmBzC,EAA4B,IAAM,CAC1D,CACC,GAAI,EACJ,KAAM,OACN,MAAOpB,EAAK,SAAS,qBAAqB,EAC1C,QAAS,CAAC,sBAAsB,CACjC,EACA,CACC,GAAI,EACJ,KAAM,QACN,MAAOA,EAAK,SAAS,uBAAuB,EAC5C,QAAS,CAAC,wBAAwB,CACnC,EACA,CACC,GAAI,EACJ,KAAM,QACN,MAAOA,EAAK,SAAS,uBAAuB,EAC5C,QAAS,CAAC,wBAAwB,CACnC,EACA,GAAIwB,EAAiB,MAClB,CACA,CACC,GAAI,EACJ,KAAM,UACN,MAAO,EACR,CAAA,EAEA,CAAC,CAAA,CACJ,EAEKsC,EAA8B1C,EAAS,IAAM2B,EAAQ,2BAA2B,EAEhFgB,EAAwB9C,EAAc,CAAA,CAAE,EAExC+C,EAAa,CAACC,EAAwBC,EAAwBC,IAC/D,GAAGF,EAAE,EAAE,GAAG,WAAWrB,CAA2B,EAC5C,GACG,GAAGsB,EAAE,EAAE,GAAG,WAAWtB,CAA2B,EACnD,EAEPmB,EAAsB,MAAM,SAASE,EAAE,EAAE,GACzCF,EAAsB,MAAM,SAASG,EAAE,EAAE,EAElCH,EAAsB,MAAM,QAAQE,EAAE,EAAE,EAAIF,EAAsB,MAAM,QAAQG,EAAE,EAAE,EACjFH,EAAsB,MAAM,SAASE,EAAE,EAAE,EAC5C,GACGF,EAAsB,MAAM,SAASG,EAAE,EAAE,EAC5C,EAGDC,IAAc,MAClBC,EAAYH,CAAC,EAAE,OAAO,cAAcG,EAAYF,CAAC,EAAE,KAAM,CAAA,EACzDE,EAAYF,CAAC,EAAE,KAAK,EAAE,cAAcE,EAAYH,CAAC,EAAE,KAAA,CAAM,EAEvDI,EAAU,CACf,QAAS,CAACJ,EAAwBC,IAC1BF,EAAWC,EAAGC,EAAG,KAAK,EAE9B,SAAU,CAACD,EAAwBC,IAC3BF,EAAWC,EAAGC,EAAG,MAAM,CAC/B,EAGD,SAASI,GAAwB,CAChCP,EAAsB,MAAQ,EAC/B,CAEA,eAAeQ,GAAa,CACtB/C,EAAiB,QACtB,MAAMqB,EAAkB,oBAExBa,EAAa,MAAQ,CAAC,GAAGb,EAAkB,SAAS,EACrD,CAEA,SAAS2B,GAAuB,CAC/B,MAAMC,EAAkD,CACvD,GAAIC,GAAI9B,CAA2B,EACnC,IAAK,GACL,MAAO,EAAA,EAGJY,EAAU,QAETA,EAAU,MAAM,MAAM,iBACfA,EAAA,MAAM,MAAM,eAAe,UAAY,GAI9CA,EAAU,MAAM,cAAgB,GACzBA,EAAA,MAAM,eAAe,CAAC,GAIrBE,EAAA,MAAM,QAAQe,CAAiB,EACnCd,EAAA,MAAMc,EAAkB,EAAE,EAAI,GAEvCxB,EAAU,MAAM,kCAAkC,CACnD,CAEA,eAAe0B,EAAaC,EAA0D,CACjF,IAAAC,EAEA,GAAA,CACC,GAAA,OAAOD,EAAK,IAAO,UAAYA,EAAK,GAAG,WAAWhC,CAA2B,EAAG,CACnF,KAAM,CAAE,GAAAkC,EAAI,GAAGC,CAAA,EAASH,EACNC,EAAA,MAAMhC,EAAkB,eAAekC,CAAI,EAChDrB,EAAA,MAAM,QAAQmB,CAAe,EAC7BnB,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,EAC9Db,EAAA,MAAM,QAAQc,EAAgB,EAAE,CAAA,MAEpCA,EAAA,MAAMhC,EAAkB,eAAe+B,CAA2B,EACvElB,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,EACvElB,EAAA,MAAM,KAAKmB,CAAe,EACvCI,EAAcJ,CAAe,QAEtBK,EAAO,CACfzB,EAAUyB,EAAOlF,EAAK,SAAS,uBAAuB,CAAC,CACxD,CACD,CAEA,SAASiF,EAAcL,EAA2B,CACjDjB,EAAS,MAAQ,CAChB,GAAGA,EAAS,MACZ,CAACiB,EAAK,EAAE,EAAG,CAACjB,EAAS,MAAMiB,EAAK,EAAE,CAAA,CAEpC,CAEA,SAASO,EAAcP,EAA0D,CAC5E,OAAOA,EAAK,IAAO,UAAYA,EAAK,GAAG,WAAWhC,CAA2B,EACnEc,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,EAEpFK,EAAcL,CAA2B,CAE3C,CAEA,eAAeQ,EAAeR,EAA2B,CACpD,GAAA,CAUH,GATkB,MAAMzB,EAAQ,QAC/BnD,EAAK,SAAS,yCAA0C,CAAE,YAAa,CAAE,KAAM4E,EAAK,GAAI,EAAG,EAC3F5E,EAAK,SAAS,sCAAsC,EACpD,CACC,kBAAmBA,EAAK,SAAS,8CAA8C,EAC/E,iBAAkBA,EAAK,SAAS,6CAA6C,CAC9E,CAAA,IAGiBqF,GACjB,OAGK,MAAAxC,EAAkB,eAAe+B,CAAI,EAC9BlB,EAAA,MAAQA,EAAa,MAAM,OAAQsB,GAAaA,EAAS,KAAOJ,EAAK,EAAE,QAC5EM,EAAO,CACfzB,EAAUyB,EAAOlF,EAAK,SAAS,yBAAyB,CAAC,CAC1D,CACD,CAEA,SAASsF,GAAc,CACjBvC,EAAQ,YAAY,YAAa,mBAAmB,CAC1D,CAEA,SAASqB,EAAYmB,EAA+B,CACnD,OAAOA,EAAS,GACjB,CAEA,OAAAC,GAAc,IAAM,CACnBjC,EAAgCF,EAAmB,UAAU,CAAC,CAAE,KAAAoC,EAAM,MAAAC,KAAY,CAC7ED,IAAS,kBAAoBC,GAChCA,EAAM,IAAM,CACNnB,EAAW,CAAA,CAChB,CACF,CACA,CAAA,CACD,EAEDoB,GAAgB,IAAM,CACSpC,GAAA,CAC9B"}
@@ -1,2 +1,2 @@
1
- import{m as oe}from"./pinia-28uZ5ZtB.js";import{P as se}from"./PushConnectionTracker-maNgu1SX.js";import{_ as I,e as X,x as Z,u as ee,m as re,g3 as ne,l as ae}from"./n8n-0pza0mdA.js";import{a as J,W as T,u as ce}from"./usePushConnection-YMVPmkf5.js";import{G as S,r as v,l,m as d,p as k,T as u,O as p,H as Y,I as c,Q as F,ag as g,M as L,S as w,R as s,F as E,a7 as N,u as f,e as q,b as ie,y as le,aG as de}from"./vendor-KLOX9vbo.js";import{l as ue}from"./index-Qw68KAhz.js";import{C as H}from"./vue-chartjs-r5IM7Z5G.js";import{a as pe}from"./collaboration.store-K1DgVBx5.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";function te(t){return t.reduce((a,r)=>a+r,0)/t.length}function me(t){return te(t).toFixed(2)}function U(t){return t/1024/1024/1024}const _e=S({__name:"WorkerAccordion.ee",props:{icon:{type:String,default:"tasks"},iconColor:{type:String,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:t.icon,color:t.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},we={$style:$e},O=I(_e,[["__cssModules",we]]),be=["href"],ve=["href"],Me=S({__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(()=>[w(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,be),u(m,{color:"text-base",size:"small",align:"left"},{default:p(()=>{var h;return[w(" | 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=I(Me,[["__cssModules",Le]]),Ae=["onClick"],We=S({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const a=t,r=Z(),i=ue(),{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(()=>[w(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)},[w(s(y.family)+": ",1),k("span",{class:c(e.$style.clickable)},s(y.address),3),w(" "+s(y.internal?"(internal)":""),1)],10,Ae))),128))],2)):F("",!0)]),_:1}))}}),Re="_accordionItems_10xds_1",Ue="_accordionItem_10xds_1",Be="_clickable_10xds_15",De={accordionItems:Re,accordionItem:Ue,clickable:Be},Pe={$style:De},He=I(We,[["__cssModules",Pe]]),Je=S({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var j,z,G;const a=t,r=(b,x,C=0)=>({datasets:[{label:b,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 _=U((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:b,store:x})=>{var C,Q;if(b==="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);(Q=x.workersHistory[a.workerId])==null||Q.forEach(R=>{var K;A.datasets[0].data.push(R.data.runningJobsSummary.length),(K=A.labels)==null||K.push(new Date(R.timestamp).toLocaleTimeString()),D.datasets[0].data.push(te(R.data.loadAvg)),D.labels=A.labels,P.datasets[0].data.push(_-U(R.data.freeMem)),P.labels=A.labels}),M.value=A,W.value=D,V.value=P}}),(b,x)=>(l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[w(s(b.$locale.baseText("workerList.item.chartsTitle")),1)]),content:p(()=>[k("div",{class:c(b.$style.charts)},[u(f(H),{ref_key:"chartRefJobs",ref:o,type:"line",data:M.value,options:f(y),class:c(b.$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(b.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefMemory",ref:e,type:"line",data:V.value,options:f($),class:c(b.$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=I(Je,[["__cssModules",je]]),Ge=k("br",null,null,-1),Qe=S({__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 ie(()=>{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)}),le(()=>{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(()=>[w(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),Ge,w(" Average Load: "+s(f(me)(e.value.loadAvg??[0]))+" | Free Memory: "+s(f(U)(e.value.freeMem).toFixed(2))+"GB / "+s(f(U)(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)}}}),Ke="_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:Ke,cardLink:Ye,cardHeading:qe,stale:Xe,cardDescription:Ze,cardActions:et},ot={$style:tt},st=I(Qe,[["__cssModules",ot]]),rt=S({name:"WorkerList",components:{PushConnectionTracker:se,WorkerCard:st},props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(){const t=de(),a=Z(),r=ce({router:t});return{i18n:a,pushConnection:r,...X()}},computed:{...oe(re,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(){ne(`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(()=>[w(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=I(rt,[["render",mt],["__cssModules",_t]]),kt=["href"],yt=S({__name:"WorkerView",setup(t){const a=ae(),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(()=>[w(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},Zt=I(yt,[["__cssModules",$t]]);export{Zt as default};
2
- //# sourceMappingURL=WorkerView-Du8mpTon.js.map
1
+ import{m as oe}from"./pinia-28uZ5ZtB.js";import{P as se}from"./PushConnectionTracker-maNgu1SX.js";import{_ as I,e as X,x as Z,u as ee,m as re,g3 as ne,l as ae}from"./n8n-0pza0mdA.js";import{a as J,W as T,u as ce}from"./usePushConnection-vhkd7pw_.js";import{G as S,r as v,l,m as d,p as k,T as u,O as p,H as Y,I as c,Q as F,ag as g,M as L,S as w,R as s,F as E,a7 as N,u as f,e as q,b as ie,y as le,aG as de}from"./vendor-KLOX9vbo.js";import{l as ue}from"./index-6M_Mo9yq.js";import{C as H}from"./vue-chartjs-r5IM7Z5G.js";import{a as pe}from"./collaboration.store-K1DgVBx5.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";function te(t){return t.reduce((a,r)=>a+r,0)/t.length}function me(t){return te(t).toFixed(2)}function U(t){return t/1024/1024/1024}const _e=S({__name:"WorkerAccordion.ee",props:{icon:{type:String,default:"tasks"},iconColor:{type:String,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:t.icon,color:t.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},we={$style:$e},O=I(_e,[["__cssModules",we]]),be=["href"],ve=["href"],Me=S({__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(()=>[w(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,be),u(m,{color:"text-base",size:"small",align:"left"},{default:p(()=>{var h;return[w(" | 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=I(Me,[["__cssModules",Le]]),Ae=["onClick"],We=S({__name:"WorkerNetAccordion.ee",props:{items:{}},setup(t){const a=t,r=Z(),i=ue(),{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(()=>[w(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)},[w(s(y.family)+": ",1),k("span",{class:c(e.$style.clickable)},s(y.address),3),w(" "+s(y.internal?"(internal)":""),1)],10,Ae))),128))],2)):F("",!0)]),_:1}))}}),Re="_accordionItems_10xds_1",Ue="_accordionItem_10xds_1",Be="_clickable_10xds_15",De={accordionItems:Re,accordionItem:Ue,clickable:Be},Pe={$style:De},He=I(We,[["__cssModules",Pe]]),Je=S({__name:"WorkerChartsAccordion.ee",props:{workerId:{}},setup(t){var j,z,G;const a=t,r=(b,x,C=0)=>({datasets:[{label:b,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 _=U((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:b,store:x})=>{var C,Q;if(b==="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);(Q=x.workersHistory[a.workerId])==null||Q.forEach(R=>{var K;A.datasets[0].data.push(R.data.runningJobsSummary.length),(K=A.labels)==null||K.push(new Date(R.timestamp).toLocaleTimeString()),D.datasets[0].data.push(te(R.data.loadAvg)),D.labels=A.labels,P.datasets[0].data.push(_-U(R.data.freeMem)),P.labels=A.labels}),M.value=A,W.value=D,V.value=P}}),(b,x)=>(l(),L(O,{icon:"tasks","icon-color":"black","initial-expanded":!1},{title:p(()=>[w(s(b.$locale.baseText("workerList.item.chartsTitle")),1)]),content:p(()=>[k("div",{class:c(b.$style.charts)},[u(f(H),{ref_key:"chartRefJobs",ref:o,type:"line",data:M.value,options:f(y),class:c(b.$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(b.$style.chart)},null,8,["data","options","class"]),u(f(H),{ref_key:"chartRefMemory",ref:e,type:"line",data:V.value,options:f($),class:c(b.$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=I(Je,[["__cssModules",je]]),Ge=k("br",null,null,-1),Qe=S({__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 ie(()=>{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)}),le(()=>{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(()=>[w(" Name: "+s(e.value.workerId)+" ("+s(e.value.hostname)+") ",1),Ge,w(" Average Load: "+s(f(me)(e.value.loadAvg??[0]))+" | Free Memory: "+s(f(U)(e.value.freeMem).toFixed(2))+"GB / "+s(f(U)(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)}}}),Ke="_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:Ke,cardLink:Ye,cardHeading:qe,stale:Xe,cardDescription:Ze,cardActions:et},ot={$style:tt},st=I(Qe,[["__cssModules",ot]]),rt=S({name:"WorkerList",components:{PushConnectionTracker:se,WorkerCard:st},props:{autoRefreshEnabled:{type:Boolean,default:!0}},setup(){const t=de(),a=Z(),r=ce({router:t});return{i18n:a,pushConnection:r,...X()}},computed:{...oe(re,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(){ne(`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(()=>[w(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=I(rt,[["render",mt],["__cssModules",_t]]),kt=["href"],yt=S({__name:"WorkerView",setup(t){const a=ae(),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(()=>[w(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},Zt=I(yt,[["__cssModules",$t]]);export{Zt as default};
2
+ //# sourceMappingURL=WorkerView-y-y5Q5E5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerView-Du8mpTon.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 = defineProps({\n\ticon: {\n\t\ttype: String,\n\t\tdefault: 'tasks',\n\t},\n\ticonColor: {\n\t\ttype: String,\n\t\tdefault: 'black',\n\t},\n\tinitialExpanded: {\n\t\ttype: Boolean,\n\t\tdefault: 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/n8nRoot.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
+ {"version":3,"file":"WorkerView-y-y5Q5E5.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 = defineProps({\n\ticon: {\n\t\ttype: String,\n\t\tdefault: 'tasks',\n\t},\n\ticonColor: {\n\t\ttype: String,\n\t\tdefault: 'black',\n\t},\n\tinitialExpanded: {\n\t\ttype: Boolean,\n\t\tdefault: 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/n8nRoot.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{e as A,v as T,u as b,dg as y,_ as S}from"./n8n-0pza0mdA.js";import{w as f}from"./workflowActivate-L9KnNQBb.js";import{m as W}from"./pinia-28uZ5ZtB.js";import{G as _,l as s,m as v,p as n,M as k,O as e,S as u,R as c,I as $,T as r,V as N,Q as C,ag as a,aq as I}from"./vendor-KLOX9vbo.js";const E=_({name:"WorkflowActivator",mixins:[f],props:["workflowActive","workflowId"],setup(o,t){var i,l;return{...A(),...(l=(i=f).setup)==null?void 0:l.call(i,o,t)}},computed:{...W(b,T),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 y(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})}}}),M="_activeStatusText_nj9sv_1",B={activeStatusText:M},V={class:"workflow-activator"},D={key:0,class:"could-not-be-started"},U=["innerHTML"];function x(o,t,i,l,z,L){const w=a("n8n-text"),p=a("el-switch"),d=a("n8n-tooltip"),g=a("font-awesome-icon"),h=I("loading");return s(),v("div",V,[n("div",{class:$(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(s(),k(w,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(s(),k(w,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),r(d,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[n("div",null,c(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[N(r(p,{"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"]),[[h,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(s(),v("div",D,[r(d,{placement:"top"},{content:e(()=>[n("div",{onClick:t[0]||(t[0]=(...m)=>o.displayActivationError&&o.displayActivationError(...m)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,U)]),default:e(()=>[r(g,{icon:"exclamation-triangle",onClick:o.displayActivationError},null,8,["onClick"])]),_:1})])):C("",!0)])}const H={$style:B},Q=S(E,[["render",x],["__cssModules",H],["__scopeId","data-v-62eed337"]]);export{Q as W};
2
- //# sourceMappingURL=WorkflowActivator-MuCzpXdv.js.map
1
+ import{e as A,v as T,u as b,dg as y,_ as S}from"./n8n-0pza0mdA.js";import{w as f}from"./workflowActivate-dwxhdtFU.js";import{m as W}from"./pinia-28uZ5ZtB.js";import{G as _,l as s,m as v,p as n,M as k,O as e,S as u,R as c,I as $,T as r,V as N,Q as C,ag as a,aq as I}from"./vendor-KLOX9vbo.js";const E=_({name:"WorkflowActivator",mixins:[f],props:["workflowActive","workflowId"],setup(o,t){var i,l;return{...A(),...(l=(i=f).setup)==null?void 0:l.call(i,o,t)}},computed:{...W(b,T),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 y(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})}}}),M="_activeStatusText_nj9sv_1",B={activeStatusText:M},V={class:"workflow-activator"},D={key:0,class:"could-not-be-started"},U=["innerHTML"];function x(o,t,i,l,z,L){const w=a("n8n-text"),p=a("el-switch"),d=a("n8n-tooltip"),g=a("font-awesome-icon"),h=I("loading");return s(),v("div",V,[n("div",{class:$(o.$style.activeStatusText),"data-test-id":"workflow-activator-status"},[o.workflowActive?(s(),k(w,{key:0,color:o.couldNotBeStarted?"danger":"success",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.active")),1)]),_:1},8,["color"])):(s(),k(w,{key:1,color:"text-base",size:"small",bold:""},{default:e(()=>[u(c(o.$locale.baseText("workflowActivator.inactive")),1)]),_:1}))],2),r(d,{disabled:!o.disabled,placement:"bottom"},{content:e(()=>[n("div",null,c(o.$locale.baseText("workflowActivator.thisWorkflowHasNoTriggerNodes")),1)]),default:e(()=>[N(r(p,{"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"]),[[h,o.updatingWorkflowActivation]])]),_:1},8,["disabled"]),o.couldNotBeStarted?(s(),v("div",D,[r(d,{placement:"top"},{content:e(()=>[n("div",{onClick:t[0]||(t[0]=(...m)=>o.displayActivationError&&o.displayActivationError(...m)),innerHTML:o.$locale.baseText("workflowActivator.theWorkflowIsSetToBeActiveBut")},null,8,U)]),default:e(()=>[r(g,{icon:"exclamation-triangle",onClick:o.displayActivationError},null,8,["onClick"])]),_:1})])):C("",!0)])}const H={$style:B},Q=S(E,[["render",x],["__cssModules",H],["__scopeId","data-v-62eed337"]]);export{Q as W};
2
+ //# sourceMappingURL=WorkflowActivator-vtOaSPI6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowActivator-MuCzpXdv.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 { workflowActivate } from '@/mixins/workflowActivate';\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\tmixins: [workflowActivate],\n\tprops: ['workflowActive', 'workflowId'],\n\tsetup(props, ctx) {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\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","workflowActivate","props","ctx","useToast","_b","_a","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-vtOaSPI6.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 { workflowActivate } from '@/mixins/workflowActivate';\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\tmixins: [workflowActivate],\n\tprops: ['workflowActive', 'workflowId'],\n\tsetup(props, ctx) {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\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","workflowActivate","props","ctx","useToast","_b","_a","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,2 +1,2 @@
1
- import{m as k}from"./pinia-28uZ5ZtB.js";import{G as h,aG as v,l as x,M as E,O as t,p as l,S as s,R as n,T as i,a2 as u,I as d,ag as a}from"./vendor-KLOX9vbo.js";import{v as g,u as m,l as T,m as W,o as I,a4 as f,dd as c,_ as C}from"./n8n-0pza0mdA.js";import{c as _}from"./index-Qw68KAhz.js";const y=h({name:"WorkflowExecutionsInfoAccordion",props:{initiallyExpanded:{type:Boolean,default:!1}},setup(){const e=v();return{workflowHelpers:_({router:e})}},data(){return{defaultValues:{saveFailedExecutions:"all",saveSuccessfulExecutions:"all",saveManualExecutions:!1},workflowSaveSettings:{saveFailedExecutions:!1,saveSuccessfulExecutions:!1,saveTestExecutions:!1}}},watch:{workflowSettings(e){this.updateSettings(e)}},mounted(){this.defaultValues.saveFailedExecutions=this.settingsStore.saveDataErrorExecution,this.defaultValues.saveSuccessfulExecutions=this.settingsStore.saveDataSuccessExecution,this.defaultValues.saveManualExecutions=this.settingsStore.saveManualExecutions,this.updateSettings(this.workflowSettings)},computed:{...k(W,T,m,g),accordionItems(){return[{id:"productionExecutions",label:this.$locale.baseText("executionsLandingPage.emptyState.accordion.productionExecutions"),icon:this.productionExecutionsIcon.icon,iconColor:this.productionExecutionsIcon.color,tooltip:this.productionExecutionsStatus==="unknown"?this.$locale.baseText("executionsLandingPage.emptyState.accordion.productionExecutionsWarningTooltip"):null},{id:"manualExecutions",label:this.$locale.baseText("executionsLandingPage.emptyState.accordion.testExecutions"),icon:this.workflowSaveSettings.saveTestExecutions?"check":"times",iconColor:this.workflowSaveSettings.saveTestExecutions?"success":"danger"}]},shouldExpandAccordion(){return this.initiallyExpanded?!this.workflowSaveSettings.saveFailedExecutions||!this.workflowSaveSettings.saveSuccessfulExecutions||!this.workflowSaveSettings.saveTestExecutions:!1},productionExecutionsIcon(){return this.productionExecutionsStatus==="saving"?{icon:"check",color:"success"}:this.productionExecutionsStatus==="not-saving"?{icon:"times",color:"danger"}:{icon:"exclamation-triangle",color:"warning"}},productionExecutionsStatus(){return this.workflowSaveSettings.saveSuccessfulExecutions===this.workflowSaveSettings.saveFailedExecutions?this.workflowSaveSettings.saveSuccessfulExecutions?"saving":"not-saving":"unknown"},workflowSettings(){return I(this.workflowsStore.workflowSettings)},accordionIcon(){return!this.workflowSaveSettings.saveTestExecutions||this.productionExecutionsStatus!=="saving"?{icon:"exclamation-triangle",color:"warning"}:null},currentWorkflowId(){return this.workflowsStore.workflowId},isNewWorkflow(){return!this.currentWorkflowId||this.currentWorkflowId===f||this.currentWorkflowId==="new"},workflowName(){return this.workflowsStore.workflowName},currentWorkflowTagIds(){return this.workflowsStore.workflowTags}},methods:{updateSettings(e){this.workflowSaveSettings.saveFailedExecutions=e.saveDataErrorExecution===void 0?this.defaultValues.saveFailedExecutions==="all":e.saveDataErrorExecution==="all",this.workflowSaveSettings.saveSuccessfulExecutions=e.saveDataSuccessExecution===void 0?this.defaultValues.saveSuccessfulExecutions==="all":e.saveDataSuccessExecution==="all",this.workflowSaveSettings.saveTestExecutions=e.saveManualExecutions===void 0?this.defaultValues.saveManualExecutions:e.saveManualExecutions},onAccordionClick(e){e.target instanceof HTMLAnchorElement&&(e.preventDefault(),this.uiStore.openModal(c))},onItemTooltipClick(e,o){e==="productionExecutions"&&o.target instanceof HTMLAnchorElement&&(o.preventDefault(),this.uiStore.openModal(c))},openWorkflowSettings(e){this.uiStore.openModal(c)},async onSaveWorkflowClick(e){let o;this.currentWorkflowId!==f?o=this.currentWorkflowId:this.$route.params.name&&this.$route.params.name!=="new"&&(o=this.$route.params.name),await this.workflowHelpers.saveCurrentWorkflow({id:o,name:this.workflowName,tags:this.currentWorkflowTagIds})&&await this.settingsStore.fetchPromptsData()}}}),b="_accordion_14pzb_1",$="_disabled_14pzb_27",L={accordion:b,disabled:$},M={class:"mt-2xs"};function D(e,o,w,A,N,V){const r=a("n8n-link"),p=a("n8n-tooltip"),S=a("n8n-info-accordion");return x(),E(S,{class:d([e.$style.accordion,"mt-2xl"]),title:e.$locale.baseText("executionsLandingPage.emptyState.accordion.title"),items:e.accordionItems,"initially-expanded":e.shouldExpandAccordion,"header-icon":e.accordionIcon,"onClick:body":e.onAccordionClick,onTooltipClick:e.onItemTooltipClick},{customContent:t(()=>[l("footer",M,[s(n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer"))+" ",1),i(p,{disabled:!e.isNewWorkflow},{content:t(()=>[l("div",null,[i(r,{onClick:u(e.onSaveWorkflowClick,["prevent"])},{default:t(()=>[s(n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer.tooltipLink")),1)]),_:1},8,["onClick"]),s(" "+n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer.tooltipText")),1)])]),default:t(()=>[i(r,{class:d({[e.$style.disabled]:e.isNewWorkflow}),size:"small",onClick:u(e.openWorkflowSettings,["prevent"])},{default:t(()=>[s(n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer.settingsLink")),1)]),_:1},8,["class","onClick"])]),_:1},8,["disabled"])])]),_:1},8,["class","title","items","initially-expanded","header-icon","onClick:body","onTooltipClick"])}const P={$style:L},z=C(y,[["render",D],["__cssModules",P]]);export{z as W};
2
- //# sourceMappingURL=WorkflowExecutionsInfoAccordion-9gkfchSQ.js.map
1
+ import{m as k}from"./pinia-28uZ5ZtB.js";import{G as h,aG as v,l as x,M as E,O as t,p as l,S as s,R as n,T as i,a2 as u,I as d,ag as a}from"./vendor-KLOX9vbo.js";import{v as g,u as m,l as T,m as W,o as I,a4 as f,dd as c,_ as C}from"./n8n-0pza0mdA.js";import{c as _}from"./index-6M_Mo9yq.js";const y=h({name:"WorkflowExecutionsInfoAccordion",props:{initiallyExpanded:{type:Boolean,default:!1}},setup(){const e=v();return{workflowHelpers:_({router:e})}},data(){return{defaultValues:{saveFailedExecutions:"all",saveSuccessfulExecutions:"all",saveManualExecutions:!1},workflowSaveSettings:{saveFailedExecutions:!1,saveSuccessfulExecutions:!1,saveTestExecutions:!1}}},watch:{workflowSettings(e){this.updateSettings(e)}},mounted(){this.defaultValues.saveFailedExecutions=this.settingsStore.saveDataErrorExecution,this.defaultValues.saveSuccessfulExecutions=this.settingsStore.saveDataSuccessExecution,this.defaultValues.saveManualExecutions=this.settingsStore.saveManualExecutions,this.updateSettings(this.workflowSettings)},computed:{...k(W,T,m,g),accordionItems(){return[{id:"productionExecutions",label:this.$locale.baseText("executionsLandingPage.emptyState.accordion.productionExecutions"),icon:this.productionExecutionsIcon.icon,iconColor:this.productionExecutionsIcon.color,tooltip:this.productionExecutionsStatus==="unknown"?this.$locale.baseText("executionsLandingPage.emptyState.accordion.productionExecutionsWarningTooltip"):null},{id:"manualExecutions",label:this.$locale.baseText("executionsLandingPage.emptyState.accordion.testExecutions"),icon:this.workflowSaveSettings.saveTestExecutions?"check":"times",iconColor:this.workflowSaveSettings.saveTestExecutions?"success":"danger"}]},shouldExpandAccordion(){return this.initiallyExpanded?!this.workflowSaveSettings.saveFailedExecutions||!this.workflowSaveSettings.saveSuccessfulExecutions||!this.workflowSaveSettings.saveTestExecutions:!1},productionExecutionsIcon(){return this.productionExecutionsStatus==="saving"?{icon:"check",color:"success"}:this.productionExecutionsStatus==="not-saving"?{icon:"times",color:"danger"}:{icon:"exclamation-triangle",color:"warning"}},productionExecutionsStatus(){return this.workflowSaveSettings.saveSuccessfulExecutions===this.workflowSaveSettings.saveFailedExecutions?this.workflowSaveSettings.saveSuccessfulExecutions?"saving":"not-saving":"unknown"},workflowSettings(){return I(this.workflowsStore.workflowSettings)},accordionIcon(){return!this.workflowSaveSettings.saveTestExecutions||this.productionExecutionsStatus!=="saving"?{icon:"exclamation-triangle",color:"warning"}:null},currentWorkflowId(){return this.workflowsStore.workflowId},isNewWorkflow(){return!this.currentWorkflowId||this.currentWorkflowId===f||this.currentWorkflowId==="new"},workflowName(){return this.workflowsStore.workflowName},currentWorkflowTagIds(){return this.workflowsStore.workflowTags}},methods:{updateSettings(e){this.workflowSaveSettings.saveFailedExecutions=e.saveDataErrorExecution===void 0?this.defaultValues.saveFailedExecutions==="all":e.saveDataErrorExecution==="all",this.workflowSaveSettings.saveSuccessfulExecutions=e.saveDataSuccessExecution===void 0?this.defaultValues.saveSuccessfulExecutions==="all":e.saveDataSuccessExecution==="all",this.workflowSaveSettings.saveTestExecutions=e.saveManualExecutions===void 0?this.defaultValues.saveManualExecutions:e.saveManualExecutions},onAccordionClick(e){e.target instanceof HTMLAnchorElement&&(e.preventDefault(),this.uiStore.openModal(c))},onItemTooltipClick(e,o){e==="productionExecutions"&&o.target instanceof HTMLAnchorElement&&(o.preventDefault(),this.uiStore.openModal(c))},openWorkflowSettings(e){this.uiStore.openModal(c)},async onSaveWorkflowClick(e){let o;this.currentWorkflowId!==f?o=this.currentWorkflowId:this.$route.params.name&&this.$route.params.name!=="new"&&(o=this.$route.params.name),await this.workflowHelpers.saveCurrentWorkflow({id:o,name:this.workflowName,tags:this.currentWorkflowTagIds})&&await this.settingsStore.fetchPromptsData()}}}),b="_accordion_14pzb_1",$="_disabled_14pzb_27",L={accordion:b,disabled:$},M={class:"mt-2xs"};function D(e,o,w,A,N,V){const r=a("n8n-link"),p=a("n8n-tooltip"),S=a("n8n-info-accordion");return x(),E(S,{class:d([e.$style.accordion,"mt-2xl"]),title:e.$locale.baseText("executionsLandingPage.emptyState.accordion.title"),items:e.accordionItems,"initially-expanded":e.shouldExpandAccordion,"header-icon":e.accordionIcon,"onClick:body":e.onAccordionClick,onTooltipClick:e.onItemTooltipClick},{customContent:t(()=>[l("footer",M,[s(n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer"))+" ",1),i(p,{disabled:!e.isNewWorkflow},{content:t(()=>[l("div",null,[i(r,{onClick:u(e.onSaveWorkflowClick,["prevent"])},{default:t(()=>[s(n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer.tooltipLink")),1)]),_:1},8,["onClick"]),s(" "+n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer.tooltipText")),1)])]),default:t(()=>[i(r,{class:d({[e.$style.disabled]:e.isNewWorkflow}),size:"small",onClick:u(e.openWorkflowSettings,["prevent"])},{default:t(()=>[s(n(e.$locale.baseText("executionsLandingPage.emptyState.accordion.footer.settingsLink")),1)]),_:1},8,["class","onClick"])]),_:1},8,["disabled"])])]),_:1},8,["class","title","items","initially-expanded","header-icon","onClick:body","onTooltipClick"])}const P={$style:L},z=C(y,[["render",D],["__cssModules",P]]);export{z as W};
2
+ //# sourceMappingURL=WorkflowExecutionsInfoAccordion-Gm7eM0Un.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowExecutionsInfoAccordion-9gkfchSQ.js","sources":["../../src/components/executions/workflow/WorkflowExecutionsInfoAccordion.vue"],"sourcesContent":["<template>\n\t<n8n-info-accordion\n\t\t:class=\"[$style.accordion, 'mt-2xl']\"\n\t\t:title=\"$locale.baseText('executionsLandingPage.emptyState.accordion.title')\"\n\t\t:items=\"accordionItems\"\n\t\t:initially-expanded=\"shouldExpandAccordion\"\n\t\t:header-icon=\"accordionIcon\"\n\t\t@click:body=\"onAccordionClick\"\n\t\t@tooltip-click=\"onItemTooltipClick\"\n\t>\n\t\t<template #customContent>\n\t\t\t<footer class=\"mt-2xs\">\n\t\t\t\t{{ $locale.baseText('executionsLandingPage.emptyState.accordion.footer') }}\n\t\t\t\t<n8n-tooltip :disabled=\"!isNewWorkflow\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<n8n-link @click.prevent=\"onSaveWorkflowClick\">{{\n\t\t\t\t\t\t\t\t$locale.baseText('executionsLandingPage.emptyState.accordion.footer.tooltipLink')\n\t\t\t\t\t\t\t}}</n8n-link>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('executionsLandingPage.emptyState.accordion.footer.tooltipText')\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-link\n\t\t\t\t\t\t:class=\"{ [$style.disabled]: isNewWorkflow }\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click.prevent=\"openWorkflowSettings\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('executionsLandingPage.emptyState.accordion.footer.settingsLink') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</footer>\n\t\t</template>\n\t</n8n-info-accordion>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useRouter } from 'vue-router';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { PLACEHOLDER_EMPTY_WORKFLOW_ID, WORKFLOW_SETTINGS_MODAL_KEY } from '@/constants';\nimport type { IWorkflowSettings } from 'n8n-workflow';\nimport { deepCopy } from 'n8n-workflow';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\ninterface IWorkflowSaveSettings {\n\tsaveFailedExecutions: boolean;\n\tsaveSuccessfulExecutions: boolean;\n\tsaveTestExecutions: boolean;\n}\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsInfoAccordion',\n\tprops: {\n\t\tinitiallyExpanded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\tworkflowHelpers,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdefaultValues: {\n\t\t\t\tsaveFailedExecutions: 'all',\n\t\t\t\tsaveSuccessfulExecutions: 'all',\n\t\t\t\tsaveManualExecutions: false,\n\t\t\t},\n\t\t\tworkflowSaveSettings: {\n\t\t\t\tsaveFailedExecutions: false,\n\t\t\t\tsaveSuccessfulExecutions: false,\n\t\t\t\tsaveTestExecutions: false,\n\t\t\t} as IWorkflowSaveSettings,\n\t\t};\n\t},\n\twatch: {\n\t\tworkflowSettings(newSettings: IWorkflowSettings) {\n\t\t\tthis.updateSettings(newSettings);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.defaultValues.saveFailedExecutions = this.settingsStore.saveDataErrorExecution;\n\t\tthis.defaultValues.saveSuccessfulExecutions = this.settingsStore.saveDataSuccessExecution;\n\t\tthis.defaultValues.saveManualExecutions = this.settingsStore.saveManualExecutions;\n\t\tthis.updateSettings(this.workflowSettings);\n\t},\n\tcomputed: {\n\t\t...mapStores(useRootStore, useSettingsStore, useUIStore, useWorkflowsStore),\n\t\taccordionItems(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'productionExecutions',\n\t\t\t\t\tlabel: this.$locale.baseText(\n\t\t\t\t\t\t'executionsLandingPage.emptyState.accordion.productionExecutions',\n\t\t\t\t\t),\n\t\t\t\t\ticon: this.productionExecutionsIcon.icon,\n\t\t\t\t\ticonColor: this.productionExecutionsIcon.color,\n\t\t\t\t\ttooltip:\n\t\t\t\t\t\tthis.productionExecutionsStatus === 'unknown'\n\t\t\t\t\t\t\t? this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t'executionsLandingPage.emptyState.accordion.productionExecutionsWarningTooltip',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'manualExecutions',\n\t\t\t\t\tlabel: this.$locale.baseText('executionsLandingPage.emptyState.accordion.testExecutions'),\n\t\t\t\t\ticon: this.workflowSaveSettings.saveTestExecutions ? 'check' : 'times',\n\t\t\t\t\ticonColor: this.workflowSaveSettings.saveTestExecutions ? 'success' : 'danger',\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tshouldExpandAccordion(): boolean {\n\t\t\tif (!this.initiallyExpanded) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t!this.workflowSaveSettings.saveFailedExecutions ||\n\t\t\t\t!this.workflowSaveSettings.saveSuccessfulExecutions ||\n\t\t\t\t!this.workflowSaveSettings.saveTestExecutions\n\t\t\t);\n\t\t},\n\t\tproductionExecutionsIcon(): { icon: string; color: string } {\n\t\t\tif (this.productionExecutionsStatus === 'saving') {\n\t\t\t\treturn { icon: 'check', color: 'success' };\n\t\t\t} else if (this.productionExecutionsStatus === 'not-saving') {\n\t\t\t\treturn { icon: 'times', color: 'danger' };\n\t\t\t}\n\t\t\treturn { icon: 'exclamation-triangle', color: 'warning' };\n\t\t},\n\t\tproductionExecutionsStatus(): string {\n\t\t\tif (\n\t\t\t\tthis.workflowSaveSettings.saveSuccessfulExecutions ===\n\t\t\t\tthis.workflowSaveSettings.saveFailedExecutions\n\t\t\t) {\n\t\t\t\tif (this.workflowSaveSettings.saveSuccessfulExecutions) {\n\t\t\t\t\treturn 'saving';\n\t\t\t\t}\n\t\t\t\treturn 'not-saving';\n\t\t\t} else {\n\t\t\t\treturn 'unknown';\n\t\t\t}\n\t\t},\n\t\tworkflowSettings(): IWorkflowSettings {\n\t\t\tconst workflowSettings = deepCopy(this.workflowsStore.workflowSettings);\n\t\t\treturn workflowSettings;\n\t\t},\n\t\taccordionIcon(): { icon: string; color: string } | null {\n\t\t\tif (\n\t\t\t\t!this.workflowSaveSettings.saveTestExecutions ||\n\t\t\t\tthis.productionExecutionsStatus !== 'saving'\n\t\t\t) {\n\t\t\t\treturn { icon: 'exclamation-triangle', color: 'warning' };\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tcurrentWorkflowId(): string {\n\t\t\treturn this.workflowsStore.workflowId;\n\t\t},\n\t\tisNewWorkflow(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.currentWorkflowId ||\n\t\t\t\tthis.currentWorkflowId === PLACEHOLDER_EMPTY_WORKFLOW_ID ||\n\t\t\t\tthis.currentWorkflowId === 'new'\n\t\t\t);\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tcurrentWorkflowTagIds(): string[] {\n\t\t\treturn this.workflowsStore.workflowTags;\n\t\t},\n\t},\n\tmethods: {\n\t\tupdateSettings(workflowSettings: IWorkflowSettings): void {\n\t\t\tthis.workflowSaveSettings.saveFailedExecutions =\n\t\t\t\tworkflowSettings.saveDataErrorExecution === undefined\n\t\t\t\t\t? this.defaultValues.saveFailedExecutions === 'all'\n\t\t\t\t\t: workflowSettings.saveDataErrorExecution === 'all';\n\t\t\tthis.workflowSaveSettings.saveSuccessfulExecutions =\n\t\t\t\tworkflowSettings.saveDataSuccessExecution === undefined\n\t\t\t\t\t? this.defaultValues.saveSuccessfulExecutions === 'all'\n\t\t\t\t\t: workflowSettings.saveDataSuccessExecution === 'all';\n\t\t\tthis.workflowSaveSettings.saveTestExecutions =\n\t\t\t\tworkflowSettings.saveManualExecutions === undefined\n\t\t\t\t\t? this.defaultValues.saveManualExecutions\n\t\t\t\t\t: (workflowSettings.saveManualExecutions as boolean);\n\t\t},\n\t\tonAccordionClick(event: MouseEvent): void {\n\t\t\tif (event.target instanceof HTMLAnchorElement) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t}\n\t\t},\n\t\tonItemTooltipClick(item: string, event: MouseEvent): void {\n\t\t\tif (item === 'productionExecutions' && event.target instanceof HTMLAnchorElement) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t}\n\t\t},\n\t\topenWorkflowSettings(event: MouseEvent): void {\n\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t},\n\t\tasync onSaveWorkflowClick(event: MouseEvent): void {\n\t\t\tlet currentId = undefined;\n\t\t\tif (this.currentWorkflowId !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {\n\t\t\t\tcurrentId = this.currentWorkflowId;\n\t\t\t} else if (this.$route.params.name && this.$route.params.name !== 'new') {\n\t\t\t\tcurrentId = this.$route.params.name;\n\t\t\t}\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({\n\t\t\t\tid: currentId,\n\t\t\t\tname: this.workflowName,\n\t\t\t\ttags: this.currentWorkflowTagIds,\n\t\t\t});\n\t\t\tif (saved) await this.settingsStore.fetchPromptsData();\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.accordion {\n\tbackground: none;\n\twidth: 320px;\n\n\t// Accordion header\n\t& > div:nth-child(1) {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tpadding: var(--spacing-xs);\n\t\twidth: 100%;\n\t\tuser-select: none;\n\t\tcolor: var(--color-text-base) !important;\n\t}\n\n\t// Accordion description\n\t& > div:nth-child(2) {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: 100%;\n\t\tpadding: 0 var(--spacing-l) var(--spacing-s) !important;\n\n\t\tspan {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\tfooter {\n\t\ttext-align: left;\n\t\twidth: 100%;\n\t\tfont-size: var(--font-size-2xs);\n\t}\n\n\t.disabled a {\n\t\tcolor: currentColor;\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t\ttext-decoration: none;\n\t}\n}\n</style>\n"],"names":["_sfc_main","defineComponent","router","useRouter","useWorkflowHelpers","newSettings","mapStores","useRootStore","useSettingsStore","useUIStore","useWorkflowsStore","deepCopy","PLACEHOLDER_EMPTY_WORKFLOW_ID","workflowSettings","event","WORKFLOW_SETTINGS_MODAL_KEY","item","currentId","_component_n8n_info_accordion","_resolveComponent","_openBlock","_createBlock","accordionItems","_ctx","shouldExpandAccordion","onAccordionClick","onItemTooltipClick","_withCtx","_createElementVNode","_hoisted_1","_createTextVNode","isNewWorkflow","_createVNode","_component_n8n_tooltip","onSaveWorkflowClick","_withModifiers","_toDisplayString","_component_n8n_link","_normalizeClass","openWorkflowSettings"],"mappings":"kSAwDA,MAAAA,EAAeC,EAAgB,CAC9B,KAAM,kCACN,MAAO,CACN,kBAAmB,CAClB,KAAM,QACN,QAAS,EACV,CACD,EACA,OAAQ,CACP,MAAMC,EAASC,IAGR,MAAA,CACN,gBAHuBC,EAAmB,CAAE,OAAAF,CAAQ,CAAA,CAGpD,CAEF,EACA,MAAO,CACC,MAAA,CACN,cAAe,CACd,qBAAsB,MACtB,yBAA0B,MAC1B,qBAAsB,EACvB,EACA,qBAAsB,CACrB,qBAAsB,GACtB,yBAA0B,GAC1B,mBAAoB,EACrB,CAAA,CAEF,EACA,MAAO,CACN,iBAAiBG,EAAgC,CAChD,KAAK,eAAeA,CAAW,CAChC,CACD,EACA,SAAU,CACJ,KAAA,cAAc,qBAAuB,KAAK,cAAc,uBACxD,KAAA,cAAc,yBAA2B,KAAK,cAAc,yBAC5D,KAAA,cAAc,qBAAuB,KAAK,cAAc,qBACxD,KAAA,eAAe,KAAK,gBAAgB,CAC1C,EACA,SAAU,CACT,GAAGC,EAAUC,EAAcC,EAAkBC,EAAYC,CAAiB,EAC1E,gBAA2B,CACnB,MAAA,CACN,CACC,GAAI,uBACJ,MAAO,KAAK,QAAQ,SACnB,iEACD,EACA,KAAM,KAAK,yBAAyB,KACpC,UAAW,KAAK,yBAAyB,MACzC,QACC,KAAK,6BAA+B,UACjC,KAAK,QAAQ,SACb,+EAAA,EAEA,IACL,EACA,CACC,GAAI,mBACJ,MAAO,KAAK,QAAQ,SAAS,2DAA2D,EACxF,KAAM,KAAK,qBAAqB,mBAAqB,QAAU,QAC/D,UAAW,KAAK,qBAAqB,mBAAqB,UAAY,QACvE,CAAA,CAEF,EACA,uBAAiC,CAC5B,OAAC,KAAK,kBAIT,CAAC,KAAK,qBAAqB,sBAC3B,CAAC,KAAK,qBAAqB,0BAC3B,CAAC,KAAK,qBAAqB,mBALpB,EAOT,EACA,0BAA4D,CACvD,OAAA,KAAK,6BAA+B,SAChC,CAAE,KAAM,QAAS,MAAO,SAAU,EAC/B,KAAK,6BAA+B,aACvC,CAAE,KAAM,QAAS,MAAO,QAAS,EAElC,CAAE,KAAM,uBAAwB,MAAO,SAAU,CACzD,EACA,4BAAqC,CACpC,OACC,KAAK,qBAAqB,2BAC1B,KAAK,qBAAqB,qBAEtB,KAAK,qBAAqB,yBACtB,SAED,aAEA,SAET,EACA,kBAAsC,CAE9B,OADkBC,EAAS,KAAK,eAAe,gBAAgB,CAEvE,EACA,eAAwD,CACvD,MACC,CAAC,KAAK,qBAAqB,oBAC3B,KAAK,6BAA+B,SAE7B,CAAE,KAAM,uBAAwB,MAAO,SAAU,EAElD,IACR,EACA,mBAA4B,CAC3B,OAAO,KAAK,eAAe,UAC5B,EACA,eAAyB,CACxB,MACC,CAAC,KAAK,mBACN,KAAK,oBAAsBC,GAC3B,KAAK,oBAAsB,KAE7B,EACA,cAAuB,CACtB,OAAO,KAAK,eAAe,YAC5B,EACA,uBAAkC,CACjC,OAAO,KAAK,eAAe,YAC5B,CACD,EACA,QAAS,CACR,eAAeC,EAA2C,CACpD,KAAA,qBAAqB,qBACzBA,EAAiB,yBAA2B,OACzC,KAAK,cAAc,uBAAyB,MAC5CA,EAAiB,yBAA2B,MAC3C,KAAA,qBAAqB,yBACzBA,EAAiB,2BAA6B,OAC3C,KAAK,cAAc,2BAA6B,MAChDA,EAAiB,2BAA6B,MAC7C,KAAA,qBAAqB,mBACzBA,EAAiB,uBAAyB,OACvC,KAAK,cAAc,qBAClBA,EAAiB,oBACvB,EACA,iBAAiBC,EAAyB,CACrCA,EAAM,kBAAkB,oBAC3BA,EAAM,eAAe,EAChB,KAAA,QAAQ,UAAUC,CAA2B,EAEpD,EACA,mBAAmBC,EAAcF,EAAyB,CACrDE,IAAS,wBAA0BF,EAAM,kBAAkB,oBAC9DA,EAAM,eAAe,EAChB,KAAA,QAAQ,UAAUC,CAA2B,EAEpD,EACA,qBAAqBD,EAAyB,CACxC,KAAA,QAAQ,UAAUC,CAA2B,CACnD,EACA,MAAM,oBAAoBD,EAAyB,CAClD,IAAIG,EACA,KAAK,oBAAsBL,EAC9BK,EAAY,KAAK,kBACP,KAAK,OAAO,OAAO,MAAQ,KAAK,OAAO,OAAO,OAAS,QACrDA,EAAA,KAAK,OAAO,OAAO,MAElB,MAAM,KAAK,gBAAgB,oBAAoB,CAC5D,GAAIA,EACJ,KAAM,KAAK,aACX,KAAM,KAAK,qBAAA,CACX,GACgB,MAAA,KAAK,cAAc,kBACrC,CACD,CACD,CAAC,+JAnMqBC,EAAAC,EAAA,oBAAA,EA/Bd,OAAAC,EAAA,EAAUC,EAAQH,EAAA,CACvB,MAAOI,EAAc,CAAAC,EAAA,OAAA,UAAA,QAAA,CAAA,EACrB,MAAAA,EAAA,QAAkB,SAAEC,kDAAqB,EACzC,MAAAD,EAAA,eACA,qBAAYE,EAAAA,sBACZ,cAAaF,EAAEG,cAAAA,eAAAA,EAAAA,iBAEL,eAAaH,EAAA,kBAAA,EAAA,CAV1B,cAAAI,EAAA,IAAA,CA+BkBC,EAAA,SAAAC,EAAA,CAAAC,EAlBWC,EAAaR,EAAA,QAAA,SAAA,mDAAA,CAAA,EAAA,IAAA,CAAA,EAAAS,EAAAC,EAAA,CAC1B,SAAO,CAAAV,EAAA,aAAA,EAAA,SAEhBI,EAEa,IAAA,CAAAC,EAlBpB,MAgBiCM,KAAAA,CAAAA,EAAAA,EAAAA,CAhBjC,QAkBSC,EAAAZ,EAAA,oBAAA,CAAA,SAAA,CAAA,CAAA,EAAA,gBAlBTO,EAAAM,EAAAb,EAAA,QAAA,SAAA,+DAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA,CAAA,SAAA,CAAA,iGAAA,CAAA,CAAA,CAAA,UAyBYI,EAzBZ,IAAA,CAAAK,EA0BWK,EAAO,CACX,MAAKC,EA3BZ,CA2BsBC,CAAoBhB,EAAA,OAAA,QAAA,EAAAA,EAAA,cAAA,EAAA,KAAA,QA3B1C,QA6B8FY,EAAAZ,EAAA,qBAAA,CAAA,SAAA,CAAA,CAAA,EAAA,gBA7B9FO,EAAAM,EAAAb,EAAA,QAAA,SAAA,gEAAA,CAAA,EAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,CAAA,QAAA,SAAA,CAAA,CAAA,CAAA,sBAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"WorkflowExecutionsInfoAccordion-Gm7eM0Un.js","sources":["../../src/components/executions/workflow/WorkflowExecutionsInfoAccordion.vue"],"sourcesContent":["<template>\n\t<n8n-info-accordion\n\t\t:class=\"[$style.accordion, 'mt-2xl']\"\n\t\t:title=\"$locale.baseText('executionsLandingPage.emptyState.accordion.title')\"\n\t\t:items=\"accordionItems\"\n\t\t:initially-expanded=\"shouldExpandAccordion\"\n\t\t:header-icon=\"accordionIcon\"\n\t\t@click:body=\"onAccordionClick\"\n\t\t@tooltip-click=\"onItemTooltipClick\"\n\t>\n\t\t<template #customContent>\n\t\t\t<footer class=\"mt-2xs\">\n\t\t\t\t{{ $locale.baseText('executionsLandingPage.emptyState.accordion.footer') }}\n\t\t\t\t<n8n-tooltip :disabled=\"!isNewWorkflow\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<n8n-link @click.prevent=\"onSaveWorkflowClick\">{{\n\t\t\t\t\t\t\t\t$locale.baseText('executionsLandingPage.emptyState.accordion.footer.tooltipLink')\n\t\t\t\t\t\t\t}}</n8n-link>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('executionsLandingPage.emptyState.accordion.footer.tooltipText')\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-link\n\t\t\t\t\t\t:class=\"{ [$style.disabled]: isNewWorkflow }\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click.prevent=\"openWorkflowSettings\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('executionsLandingPage.emptyState.accordion.footer.settingsLink') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</footer>\n\t\t</template>\n\t</n8n-info-accordion>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useRouter } from 'vue-router';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { PLACEHOLDER_EMPTY_WORKFLOW_ID, WORKFLOW_SETTINGS_MODAL_KEY } from '@/constants';\nimport type { IWorkflowSettings } from 'n8n-workflow';\nimport { deepCopy } from 'n8n-workflow';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\ninterface IWorkflowSaveSettings {\n\tsaveFailedExecutions: boolean;\n\tsaveSuccessfulExecutions: boolean;\n\tsaveTestExecutions: boolean;\n}\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsInfoAccordion',\n\tprops: {\n\t\tinitiallyExpanded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\tworkflowHelpers,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdefaultValues: {\n\t\t\t\tsaveFailedExecutions: 'all',\n\t\t\t\tsaveSuccessfulExecutions: 'all',\n\t\t\t\tsaveManualExecutions: false,\n\t\t\t},\n\t\t\tworkflowSaveSettings: {\n\t\t\t\tsaveFailedExecutions: false,\n\t\t\t\tsaveSuccessfulExecutions: false,\n\t\t\t\tsaveTestExecutions: false,\n\t\t\t} as IWorkflowSaveSettings,\n\t\t};\n\t},\n\twatch: {\n\t\tworkflowSettings(newSettings: IWorkflowSettings) {\n\t\t\tthis.updateSettings(newSettings);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.defaultValues.saveFailedExecutions = this.settingsStore.saveDataErrorExecution;\n\t\tthis.defaultValues.saveSuccessfulExecutions = this.settingsStore.saveDataSuccessExecution;\n\t\tthis.defaultValues.saveManualExecutions = this.settingsStore.saveManualExecutions;\n\t\tthis.updateSettings(this.workflowSettings);\n\t},\n\tcomputed: {\n\t\t...mapStores(useRootStore, useSettingsStore, useUIStore, useWorkflowsStore),\n\t\taccordionItems(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'productionExecutions',\n\t\t\t\t\tlabel: this.$locale.baseText(\n\t\t\t\t\t\t'executionsLandingPage.emptyState.accordion.productionExecutions',\n\t\t\t\t\t),\n\t\t\t\t\ticon: this.productionExecutionsIcon.icon,\n\t\t\t\t\ticonColor: this.productionExecutionsIcon.color,\n\t\t\t\t\ttooltip:\n\t\t\t\t\t\tthis.productionExecutionsStatus === 'unknown'\n\t\t\t\t\t\t\t? this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t'executionsLandingPage.emptyState.accordion.productionExecutionsWarningTooltip',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'manualExecutions',\n\t\t\t\t\tlabel: this.$locale.baseText('executionsLandingPage.emptyState.accordion.testExecutions'),\n\t\t\t\t\ticon: this.workflowSaveSettings.saveTestExecutions ? 'check' : 'times',\n\t\t\t\t\ticonColor: this.workflowSaveSettings.saveTestExecutions ? 'success' : 'danger',\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tshouldExpandAccordion(): boolean {\n\t\t\tif (!this.initiallyExpanded) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t!this.workflowSaveSettings.saveFailedExecutions ||\n\t\t\t\t!this.workflowSaveSettings.saveSuccessfulExecutions ||\n\t\t\t\t!this.workflowSaveSettings.saveTestExecutions\n\t\t\t);\n\t\t},\n\t\tproductionExecutionsIcon(): { icon: string; color: string } {\n\t\t\tif (this.productionExecutionsStatus === 'saving') {\n\t\t\t\treturn { icon: 'check', color: 'success' };\n\t\t\t} else if (this.productionExecutionsStatus === 'not-saving') {\n\t\t\t\treturn { icon: 'times', color: 'danger' };\n\t\t\t}\n\t\t\treturn { icon: 'exclamation-triangle', color: 'warning' };\n\t\t},\n\t\tproductionExecutionsStatus(): string {\n\t\t\tif (\n\t\t\t\tthis.workflowSaveSettings.saveSuccessfulExecutions ===\n\t\t\t\tthis.workflowSaveSettings.saveFailedExecutions\n\t\t\t) {\n\t\t\t\tif (this.workflowSaveSettings.saveSuccessfulExecutions) {\n\t\t\t\t\treturn 'saving';\n\t\t\t\t}\n\t\t\t\treturn 'not-saving';\n\t\t\t} else {\n\t\t\t\treturn 'unknown';\n\t\t\t}\n\t\t},\n\t\tworkflowSettings(): IWorkflowSettings {\n\t\t\tconst workflowSettings = deepCopy(this.workflowsStore.workflowSettings);\n\t\t\treturn workflowSettings;\n\t\t},\n\t\taccordionIcon(): { icon: string; color: string } | null {\n\t\t\tif (\n\t\t\t\t!this.workflowSaveSettings.saveTestExecutions ||\n\t\t\t\tthis.productionExecutionsStatus !== 'saving'\n\t\t\t) {\n\t\t\t\treturn { icon: 'exclamation-triangle', color: 'warning' };\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tcurrentWorkflowId(): string {\n\t\t\treturn this.workflowsStore.workflowId;\n\t\t},\n\t\tisNewWorkflow(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.currentWorkflowId ||\n\t\t\t\tthis.currentWorkflowId === PLACEHOLDER_EMPTY_WORKFLOW_ID ||\n\t\t\t\tthis.currentWorkflowId === 'new'\n\t\t\t);\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tcurrentWorkflowTagIds(): string[] {\n\t\t\treturn this.workflowsStore.workflowTags;\n\t\t},\n\t},\n\tmethods: {\n\t\tupdateSettings(workflowSettings: IWorkflowSettings): void {\n\t\t\tthis.workflowSaveSettings.saveFailedExecutions =\n\t\t\t\tworkflowSettings.saveDataErrorExecution === undefined\n\t\t\t\t\t? this.defaultValues.saveFailedExecutions === 'all'\n\t\t\t\t\t: workflowSettings.saveDataErrorExecution === 'all';\n\t\t\tthis.workflowSaveSettings.saveSuccessfulExecutions =\n\t\t\t\tworkflowSettings.saveDataSuccessExecution === undefined\n\t\t\t\t\t? this.defaultValues.saveSuccessfulExecutions === 'all'\n\t\t\t\t\t: workflowSettings.saveDataSuccessExecution === 'all';\n\t\t\tthis.workflowSaveSettings.saveTestExecutions =\n\t\t\t\tworkflowSettings.saveManualExecutions === undefined\n\t\t\t\t\t? this.defaultValues.saveManualExecutions\n\t\t\t\t\t: (workflowSettings.saveManualExecutions as boolean);\n\t\t},\n\t\tonAccordionClick(event: MouseEvent): void {\n\t\t\tif (event.target instanceof HTMLAnchorElement) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t}\n\t\t},\n\t\tonItemTooltipClick(item: string, event: MouseEvent): void {\n\t\t\tif (item === 'productionExecutions' && event.target instanceof HTMLAnchorElement) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t}\n\t\t},\n\t\topenWorkflowSettings(event: MouseEvent): void {\n\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t},\n\t\tasync onSaveWorkflowClick(event: MouseEvent): void {\n\t\t\tlet currentId = undefined;\n\t\t\tif (this.currentWorkflowId !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {\n\t\t\t\tcurrentId = this.currentWorkflowId;\n\t\t\t} else if (this.$route.params.name && this.$route.params.name !== 'new') {\n\t\t\t\tcurrentId = this.$route.params.name;\n\t\t\t}\n\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({\n\t\t\t\tid: currentId,\n\t\t\t\tname: this.workflowName,\n\t\t\t\ttags: this.currentWorkflowTagIds,\n\t\t\t});\n\t\t\tif (saved) await this.settingsStore.fetchPromptsData();\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.accordion {\n\tbackground: none;\n\twidth: 320px;\n\n\t// Accordion header\n\t& > div:nth-child(1) {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tpadding: var(--spacing-xs);\n\t\twidth: 100%;\n\t\tuser-select: none;\n\t\tcolor: var(--color-text-base) !important;\n\t}\n\n\t// Accordion description\n\t& > div:nth-child(2) {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: 100%;\n\t\tpadding: 0 var(--spacing-l) var(--spacing-s) !important;\n\n\t\tspan {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\tfooter {\n\t\ttext-align: left;\n\t\twidth: 100%;\n\t\tfont-size: var(--font-size-2xs);\n\t}\n\n\t.disabled a {\n\t\tcolor: currentColor;\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t\ttext-decoration: none;\n\t}\n}\n</style>\n"],"names":["_sfc_main","defineComponent","router","useRouter","useWorkflowHelpers","newSettings","mapStores","useRootStore","useSettingsStore","useUIStore","useWorkflowsStore","deepCopy","PLACEHOLDER_EMPTY_WORKFLOW_ID","workflowSettings","event","WORKFLOW_SETTINGS_MODAL_KEY","item","currentId","_component_n8n_info_accordion","_resolveComponent","_openBlock","_createBlock","accordionItems","_ctx","shouldExpandAccordion","onAccordionClick","onItemTooltipClick","_withCtx","_createElementVNode","_hoisted_1","_createTextVNode","isNewWorkflow","_createVNode","_component_n8n_tooltip","onSaveWorkflowClick","_withModifiers","_toDisplayString","_component_n8n_link","_normalizeClass","openWorkflowSettings"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{v as f,u as _,a4 as k,V as l,_ as w}from"./n8n-0pza0mdA.js";import{m as x}from"./pinia-28uZ5ZtB.js";import{W as h}from"./WorkflowExecutionsInfoAccordion-9gkfchSQ.js";import{G as S,l as t,m as n,I as p,T as o,O as s,S as r,R as a,Q as W,ag as i}from"./vendor-KLOX9vbo.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./index-Qw68KAhz.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const y=S({name:"ExecutionsLandingPage",components:{WorkflowExecutionsInfoAccordion:h},computed:{...x(_,f),executionCount(){return this.workflowsStore.currentWorkflowExecutions.length},containsTrigger(){return this.workflowsStore.workflowTriggerNodes.length>0}},methods:{onSetupFirstStep(e){this.uiStore.addFirstStepOnLoad=!0;const c=this.getWorkflowRoute();this.$router.push(c)},getWorkflowRoute(){const e=this.workflowsStore.workflowId||this.$route.params.name;return e===k?{name:l.NEW_WORKFLOW,params:{}}:{name:l.WORKFLOW,params:{name:e}}}}}),C="_container_acx6b_1",$="_messageContainer_acx6b_11",E="_icon_acx6b_22",T={container:C,messageContainer:$,icon:E},b={key:0},L={key:1};function I(e,c,v,P,R,F){const m=i("n8n-heading"),u=i("n8n-text"),d=i("n8n-button"),g=i("WorkflowExecutionsInfoAccordion");return t(),n("div",{class:p(["workflow-executions-container",e.$style.container])},[e.executionCount===0?(t(),n("div",{key:0,class:p([e.$style.messageContainer,e.$style.noExecutionsMessage])},[e.containsTrigger?(t(),n("div",L,[o(m,{tag:"h2",size:"xlarge",color:"text-dark",class:"mb-2xs"},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.heading")),1)]),_:1}),o(g)])):(t(),n("div",b,[o(m,{tag:"h2",size:"xlarge",color:"text-dark",class:"mb-2xs"},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.noTrigger.heading")),1)]),_:1}),o(u,{size:"medium"},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.message")),1)]),_:1}),o(d,{class:"mt-l",type:"tertiary",size:"large",onClick:e.onSetupFirstStep},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.noTrigger.buttonText")),1)]),_:1},8,["onClick"])]))],2)):W("",!0)],2)}const O={$style:T},pe=w(y,[["render",I],["__cssModules",O]]);export{pe as default};
2
- //# sourceMappingURL=WorkflowExecutionsLandingPage-g4QNNuc4.js.map
1
+ import{v as f,u as _,a4 as k,V as l,_ as w}from"./n8n-0pza0mdA.js";import{m as x}from"./pinia-28uZ5ZtB.js";import{W as h}from"./WorkflowExecutionsInfoAccordion-Gm7eM0Un.js";import{G as S,l as t,m as n,I as p,T as o,O as s,S as r,R as a,Q as W,ag as i}from"./vendor-KLOX9vbo.js";import"./lodash-es-wI9avrph.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-JpwZAlxf.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-Cb1fO4GA.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./index-6M_Mo9yq.js";import"./@n8n/codemirror-lang-sql-_W1-z7Mc.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-XiNuC5bg.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-tmVw-mwA.js";import"./codemirror-lang-n8n-expression-71F4KZSz.js";import"./fast-json-stable-stringify-QF2cL2qw.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-ohcdYkQS.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";const y=S({name:"ExecutionsLandingPage",components:{WorkflowExecutionsInfoAccordion:h},computed:{...x(_,f),executionCount(){return this.workflowsStore.currentWorkflowExecutions.length},containsTrigger(){return this.workflowsStore.workflowTriggerNodes.length>0}},methods:{onSetupFirstStep(e){this.uiStore.addFirstStepOnLoad=!0;const c=this.getWorkflowRoute();this.$router.push(c)},getWorkflowRoute(){const e=this.workflowsStore.workflowId||this.$route.params.name;return e===k?{name:l.NEW_WORKFLOW,params:{}}:{name:l.WORKFLOW,params:{name:e}}}}}),C="_container_acx6b_1",$="_messageContainer_acx6b_11",E="_icon_acx6b_22",T={container:C,messageContainer:$,icon:E},b={key:0},L={key:1};function I(e,c,v,P,R,F){const m=i("n8n-heading"),u=i("n8n-text"),d=i("n8n-button"),g=i("WorkflowExecutionsInfoAccordion");return t(),n("div",{class:p(["workflow-executions-container",e.$style.container])},[e.executionCount===0?(t(),n("div",{key:0,class:p([e.$style.messageContainer,e.$style.noExecutionsMessage])},[e.containsTrigger?(t(),n("div",L,[o(m,{tag:"h2",size:"xlarge",color:"text-dark",class:"mb-2xs"},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.heading")),1)]),_:1}),o(g)])):(t(),n("div",b,[o(m,{tag:"h2",size:"xlarge",color:"text-dark",class:"mb-2xs"},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.noTrigger.heading")),1)]),_:1}),o(u,{size:"medium"},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.message")),1)]),_:1}),o(d,{class:"mt-l",type:"tertiary",size:"large",onClick:e.onSetupFirstStep},{default:s(()=>[r(a(e.$locale.baseText("executionsLandingPage.emptyState.noTrigger.buttonText")),1)]),_:1},8,["onClick"])]))],2)):W("",!0)],2)}const O={$style:T},pe=w(y,[["render",I],["__cssModules",O]]);export{pe as default};
2
+ //# sourceMappingURL=WorkflowExecutionsLandingPage-C_oVBqy4.js.map