n8n-editor-ui 1.47.0 → 1.47.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/.turbo/turbo-build.log +79 -79
  2. package/dist/assets/{AuthView-BgFWzBDm.js → AuthView-B_jZMnGj.js} +2 -2
  3. package/dist/assets/{AuthView-BgFWzBDm.js.map → AuthView-B_jZMnGj.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-m_3acPPd.js → CanvasControls-ns1B0A0j.js} +2 -2
  5. package/dist/assets/{CanvasControls-m_3acPPd.js.map → CanvasControls-ns1B0A0j.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-CN6JWR-N.js → ChangePasswordView-BDsuHv0B.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-CN6JWR-N.js.map → ChangePasswordView-BDsuHv0B.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-DHmcKhO-.js → CollectionParameter-Br-xtutZ.js} +2 -2
  9. package/dist/assets/CollectionParameter-Br-xtutZ.js.map +1 -0
  10. package/dist/assets/{CredentialsView-D9TXjOnK.js → CredentialsView-DnJ_jhDo.js} +2 -2
  11. package/dist/assets/{CredentialsView-D9TXjOnK.js.map → CredentialsView-DnJ_jhDo.js.map} +1 -1
  12. package/dist/assets/{ErrorView-CYag8fsg.js → ErrorView-BfV5e5ko.js} +2 -2
  13. package/dist/assets/{ErrorView-CYag8fsg.js.map → ErrorView-BfV5e5ko.js.map} +1 -1
  14. package/dist/assets/{ExecutionsFilter-Cf35yNfd.js → ExecutionsFilter-0XcXH83H.js} +2 -2
  15. package/dist/assets/{ExecutionsFilter-Cf35yNfd.js.map → ExecutionsFilter-0XcXH83H.js.map} +1 -1
  16. package/dist/assets/{ExecutionsView-ztrgLYNP.js → ExecutionsView-aFiZuLVt.js} +2 -2
  17. package/dist/assets/{ExecutionsView-ztrgLYNP.js.map → ExecutionsView-aFiZuLVt.js.map} +1 -1
  18. package/dist/assets/{ForgotMyPasswordView-C-0yB-bx.js → ForgotMyPasswordView-64X9tXq4.js} +2 -2
  19. package/dist/assets/{ForgotMyPasswordView-C-0yB-bx.js.map → ForgotMyPasswordView-64X9tXq4.js.map} +1 -1
  20. package/dist/assets/MainHeader-Ch0Iz_7s.js +2 -0
  21. package/dist/assets/{MainHeader-CMxbwL4C.js.map → MainHeader-Ch0Iz_7s.js.map} +1 -1
  22. package/dist/assets/{MainSidebar-BuwaBgG9.js → MainSidebar-3ee-tTgz.js} +2 -2
  23. package/dist/assets/{MainSidebar-BuwaBgG9.js.map → MainSidebar-3ee-tTgz.js.map} +1 -1
  24. package/dist/assets/{NodeCreation-B7Uimsok.js → NodeCreation-PrQGENrl.js} +3 -3
  25. package/dist/assets/{NodeCreation-B7Uimsok.js.map → NodeCreation-PrQGENrl.js.map} +1 -1
  26. package/dist/assets/{NodeCreator-IRjqf3_R.js → NodeCreator-DlK1669m.js} +2 -2
  27. package/dist/assets/{NodeCreator-IRjqf3_R.js.map → NodeCreator-DlK1669m.js.map} +1 -1
  28. package/dist/assets/{NodeDetailsView-CSnjluIR.js → NodeDetailsView-DcV7LI-g.js} +4 -4
  29. package/dist/assets/{NodeDetailsView-CSnjluIR.js.map → NodeDetailsView-DcV7LI-g.js.map} +1 -1
  30. package/dist/assets/{NodeView-DMzj-gox.css → NodeView--67hs6V6.css} +1 -1
  31. package/dist/assets/NodeView-D_kbUfVN.js +3 -0
  32. package/dist/assets/NodeView-D_kbUfVN.js.map +1 -0
  33. package/dist/assets/{NodeView.v2-DyU_S0rY.js → NodeView.v2-D_Wbnl01.js} +3 -3
  34. package/dist/assets/{NodeView.v2-DyU_S0rY.js.map → NodeView.v2-D_Wbnl01.js.map} +1 -1
  35. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-C1N0EZCM.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js} +2 -2
  36. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-C1N0EZCM.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js.map} +1 -1
  37. package/dist/assets/{ProjectSettings-CbNlX27g.js → ProjectSettings-CfcplqBX.js} +2 -2
  38. package/dist/assets/{ProjectSettings-CbNlX27g.js.map → ProjectSettings-CfcplqBX.js.map} +1 -1
  39. package/dist/assets/{ProjectTabs-Cx2VWeba.js → ProjectTabs-5ZO9YR8J.js} +2 -2
  40. package/dist/assets/{ProjectTabs-Cx2VWeba.js.map → ProjectTabs-5ZO9YR8J.js.map} +1 -1
  41. package/dist/assets/{PushConnectionTracker-C_r8Zv-p.js → PushConnectionTracker-Bp-RjnYr.js} +2 -2
  42. package/dist/assets/{PushConnectionTracker-C_r8Zv-p.js.map → PushConnectionTracker-Bp-RjnYr.js.map} +1 -1
  43. package/dist/assets/{ResourcesListLayout-CKSHiUAP.js → ResourcesListLayout-B4W1PSHT.js} +2 -2
  44. package/dist/assets/{ResourcesListLayout-CKSHiUAP.js.map → ResourcesListLayout-B4W1PSHT.js.map} +1 -1
  45. package/dist/assets/{RunDataAi-BVqsN7UN.js → RunDataAi-C3XiqNZa.js} +2 -2
  46. package/dist/assets/{RunDataAi-BVqsN7UN.js.map → RunDataAi-C3XiqNZa.js.map} +1 -1
  47. package/dist/assets/{RunDataJson-6Yfwd78r.js → RunDataJson-CMcOD-78.js} +3 -3
  48. package/dist/assets/{RunDataJson-6Yfwd78r.js.map → RunDataJson-CMcOD-78.js.map} +1 -1
  49. package/dist/assets/{RunDataJsonActions-5ig3g4km.js → RunDataJsonActions-BQBpmtOi.js} +2 -2
  50. package/dist/assets/{RunDataJsonActions-5ig3g4km.js.map → RunDataJsonActions-BQBpmtOi.js.map} +1 -1
  51. package/dist/assets/{RunDataSchema-CrW957BW.js → RunDataSchema-CF4YH-8y.js} +3 -3
  52. package/dist/assets/{RunDataSchema-CrW957BW.js.map → RunDataSchema-CF4YH-8y.js.map} +1 -1
  53. package/dist/assets/{RunDataSearch-BrIWOZXO.js → RunDataSearch-DwB8g_cE.js} +2 -2
  54. package/dist/assets/{RunDataSearch-BrIWOZXO.js.map → RunDataSearch-DwB8g_cE.js.map} +1 -1
  55. package/dist/assets/RunDataTable-BVAuNDP9.js +2 -0
  56. package/dist/assets/{RunDataTable-B01U16vv.js.map → RunDataTable-BVAuNDP9.js.map} +1 -1
  57. package/dist/assets/{SamlOnboarding-CfbBlTNm.js → SamlOnboarding-Csd8l-7T.js} +2 -2
  58. package/dist/assets/{SamlOnboarding-CfbBlTNm.js.map → SamlOnboarding-Csd8l-7T.js.map} +1 -1
  59. package/dist/assets/{SettingsApiView-CuliNEKo.js → SettingsApiView-DnvdV7dx.js} +2 -2
  60. package/dist/assets/{SettingsApiView-CuliNEKo.js.map → SettingsApiView-DnvdV7dx.js.map} +1 -1
  61. package/dist/assets/{SettingsCommunityNodesView-CeY4uqH-.js → SettingsCommunityNodesView-C11a_Ybs.js} +2 -2
  62. package/dist/assets/{SettingsCommunityNodesView-CeY4uqH-.js.map → SettingsCommunityNodesView-C11a_Ybs.js.map} +1 -1
  63. package/dist/assets/{SettingsExternalSecrets-CE7ObFx_.js → SettingsExternalSecrets-IIReUcRG.js} +2 -2
  64. package/dist/assets/{SettingsExternalSecrets-CE7ObFx_.js.map → SettingsExternalSecrets-IIReUcRG.js.map} +1 -1
  65. package/dist/assets/{SettingsFakeDoorView-DQqNf_Q9.js → SettingsFakeDoorView-BOUfBJS8.js} +2 -2
  66. package/dist/assets/{SettingsFakeDoorView-DQqNf_Q9.js.map → SettingsFakeDoorView-BOUfBJS8.js.map} +1 -1
  67. package/dist/assets/{SettingsLdapView-9hy5C87y.js → SettingsLdapView-BaSjQ4cy.js} +2 -2
  68. package/dist/assets/{SettingsLdapView-9hy5C87y.js.map → SettingsLdapView-BaSjQ4cy.js.map} +1 -1
  69. package/dist/assets/{SettingsLogStreamingView-Cc0h5DhT.js → SettingsLogStreamingView-COGhA1hN.js} +2 -2
  70. package/dist/assets/{SettingsLogStreamingView-Cc0h5DhT.js.map → SettingsLogStreamingView-COGhA1hN.js.map} +1 -1
  71. package/dist/assets/{SettingsPersonalView-Cs82ezMX.js → SettingsPersonalView-BJGgPTwa.js} +2 -2
  72. package/dist/assets/{SettingsPersonalView-Cs82ezMX.js.map → SettingsPersonalView-BJGgPTwa.js.map} +1 -1
  73. package/dist/assets/{SettingsSourceControl-Dr7R-QpH.js → SettingsSourceControl-DkdSLuvp.js} +2 -2
  74. package/dist/assets/{SettingsSourceControl-Dr7R-QpH.js.map → SettingsSourceControl-DkdSLuvp.js.map} +1 -1
  75. package/dist/assets/{SettingsSso-Di6lHXV2.js → SettingsSso-DA9AOKH5.js} +2 -2
  76. package/dist/assets/{SettingsSso-Di6lHXV2.js.map → SettingsSso-DA9AOKH5.js.map} +1 -1
  77. package/dist/assets/{SettingsUsageAndPlan-g86Q7EQY.js → SettingsUsageAndPlan-BVPtlthH.js} +2 -2
  78. package/dist/assets/{SettingsUsageAndPlan-g86Q7EQY.js.map → SettingsUsageAndPlan-BVPtlthH.js.map} +1 -1
  79. package/dist/assets/{SettingsUsersView-dOWjUJTW.js → SettingsUsersView-BuKt4ZDO.js} +2 -2
  80. package/dist/assets/{SettingsUsersView-dOWjUJTW.js.map → SettingsUsersView-BuKt4ZDO.js.map} +1 -1
  81. package/dist/assets/{SettingsView-DQ0hQWFt.js → SettingsView-DJ78VuiY.js} +2 -2
  82. package/dist/assets/{SettingsView-DQ0hQWFt.js.map → SettingsView-DJ78VuiY.js.map} +1 -1
  83. package/dist/assets/{SetupView-CqT8d0D8.js → SetupView-C70Dkfed.js} +2 -2
  84. package/dist/assets/{SetupView-CqT8d0D8.js.map → SetupView-C70Dkfed.js.map} +1 -1
  85. package/dist/assets/{SetupWorkflowCredentialsButton-BR-ObOqw.js → SetupWorkflowCredentialsButton-CEQ1LrFl.js} +2 -2
  86. package/dist/assets/{SetupWorkflowCredentialsButton-BR-ObOqw.js.map → SetupWorkflowCredentialsButton-CEQ1LrFl.js.map} +1 -1
  87. package/dist/assets/{SetupWorkflowFromTemplateView-DHHtk6_-.js → SetupWorkflowFromTemplateView-BUzzXtBr.js} +2 -2
  88. package/dist/assets/{SetupWorkflowFromTemplateView-DHHtk6_-.js.map → SetupWorkflowFromTemplateView-BUzzXtBr.js.map} +1 -1
  89. package/dist/assets/{SigninView-2eLLF8DU.js → SigninView-B3CNL-yp.js} +2 -2
  90. package/dist/assets/{SigninView-2eLLF8DU.js.map → SigninView-B3CNL-yp.js.map} +1 -1
  91. package/dist/assets/{SignoutView-BQyCyjsK.js → SignoutView-svcLavkC.js} +2 -2
  92. package/dist/assets/{SignoutView-BQyCyjsK.js.map → SignoutView-svcLavkC.js.map} +1 -1
  93. package/dist/assets/{SignupView-ByYEkUpW.js → SignupView-DJWRTPKF.js} +2 -2
  94. package/dist/assets/{SignupView-ByYEkUpW.js.map → SignupView-DJWRTPKF.js.map} +1 -1
  95. package/dist/assets/{TemplateDetails-I6WMCxGm.js → TemplateDetails-BnbiWxo-.js} +2 -2
  96. package/dist/assets/{TemplateDetails-I6WMCxGm.js.map → TemplateDetails-BnbiWxo-.js.map} +1 -1
  97. package/dist/assets/{TemplateList-DRf0Cbhg.js → TemplateList-By-t2s0M.js} +2 -2
  98. package/dist/assets/{TemplateList-DRf0Cbhg.js.map → TemplateList-By-t2s0M.js.map} +1 -1
  99. package/dist/assets/{TemplatesCollectionView-BYkDe49v.js → TemplatesCollectionView-D2L1fmSc.js} +2 -2
  100. package/dist/assets/{TemplatesCollectionView-BYkDe49v.js.map → TemplatesCollectionView-D2L1fmSc.js.map} +1 -1
  101. package/dist/assets/{TemplatesSearchView-CiZ7aZcy.js → TemplatesSearchView-Bmr6Nd6g.js} +2 -2
  102. package/dist/assets/{TemplatesSearchView-CiZ7aZcy.js.map → TemplatesSearchView-Bmr6Nd6g.js.map} +1 -1
  103. package/dist/assets/{TemplatesView-zULLoEwu.js → TemplatesView-BbunSn-s.js} +2 -2
  104. package/dist/assets/{TemplatesView-zULLoEwu.js.map → TemplatesView-BbunSn-s.js.map} +1 -1
  105. package/dist/assets/{TemplatesWorkflowView-DptRLbdX.js → TemplatesWorkflowView-XxBIlMWY.js} +2 -2
  106. package/dist/assets/{TemplatesWorkflowView-DptRLbdX.js.map → TemplatesWorkflowView-XxBIlMWY.js.map} +1 -1
  107. package/dist/assets/{VariablesView-NcNcsjHY.js → VariablesView-ZY5xLmKI.js} +2 -2
  108. package/dist/assets/{VariablesView-NcNcsjHY.js.map → VariablesView-ZY5xLmKI.js.map} +1 -1
  109. package/dist/assets/{WorkerView-dtJzfgCM.js → WorkerView-DV19-i1-.js} +2 -2
  110. package/dist/assets/{WorkerView-dtJzfgCM.js.map → WorkerView-DV19-i1-.js.map} +1 -1
  111. package/dist/assets/{WorkflowActivator-D6Zad1X2.js → WorkflowActivator-BXWURYao.js} +2 -2
  112. package/dist/assets/{WorkflowActivator-D6Zad1X2.js.map → WorkflowActivator-BXWURYao.js.map} +1 -1
  113. package/dist/assets/{WorkflowExecutionsInfoAccordion-C86A1CHv.js → WorkflowExecutionsInfoAccordion-aldNazgt.js} +2 -2
  114. package/dist/assets/{WorkflowExecutionsInfoAccordion-C86A1CHv.js.map → WorkflowExecutionsInfoAccordion-aldNazgt.js.map} +1 -1
  115. package/dist/assets/{WorkflowExecutionsLandingPage-DAfHDMth.js → WorkflowExecutionsLandingPage-CaAameTk.js} +2 -2
  116. package/dist/assets/{WorkflowExecutionsLandingPage-DAfHDMth.js.map → WorkflowExecutionsLandingPage-CaAameTk.js.map} +1 -1
  117. package/dist/assets/{WorkflowExecutionsPreview-C_EBlNX6.js → WorkflowExecutionsPreview-Bb-wJtr-.js} +2 -2
  118. package/dist/assets/WorkflowExecutionsPreview-Bb-wJtr-.js.map +1 -0
  119. package/dist/assets/WorkflowExecutionsView-D7nlOP1-.js +2 -0
  120. package/dist/assets/WorkflowExecutionsView-D7nlOP1-.js.map +1 -0
  121. package/dist/assets/{WorkflowHistory-DkdQ1koF.js → WorkflowHistory-C6zCGFoY.js} +2 -2
  122. package/dist/assets/{WorkflowHistory-DkdQ1koF.js.map → WorkflowHistory-C6zCGFoY.js.map} +1 -1
  123. package/dist/assets/{WorkflowOnboardingView-BPMBW_hz.js → WorkflowOnboardingView-Bu_Oqtr7.js} +2 -2
  124. package/dist/assets/{WorkflowOnboardingView-BPMBW_hz.js.map → WorkflowOnboardingView-Bu_Oqtr7.js.map} +1 -1
  125. package/dist/assets/{WorkflowPreview-CLzyAzmJ.js → WorkflowPreview-CVwpKdpj.js} +2 -2
  126. package/dist/assets/{WorkflowPreview-CLzyAzmJ.js.map → WorkflowPreview-CVwpKdpj.js.map} +1 -1
  127. package/dist/assets/{WorkflowsView-CzJx_-P5.js → WorkflowsView-DVeAZ2zW.js} +2 -2
  128. package/dist/assets/{WorkflowsView-CzJx_-P5.js.map → WorkflowsView-DVeAZ2zW.js.map} +1 -1
  129. package/dist/assets/{cloud-CRMEbZfJ.js → cloud-BRhZDk2r.js} +2 -2
  130. package/dist/assets/{cloud-CRMEbZfJ.js.map → cloud-BRhZDk2r.js.map} +1 -1
  131. package/dist/assets/{collaboration.store-Co5wlk8y.js → collaboration.store-Ol7bcCFc.js} +2 -2
  132. package/dist/assets/{collaboration.store-Co5wlk8y.js.map → collaboration.store-Ol7bcCFc.js.map} +1 -1
  133. package/dist/assets/index-1OxaEeO3.js +341 -0
  134. package/dist/assets/index-1OxaEeO3.js.map +1 -0
  135. package/dist/assets/{nodeCreator.store-CTXKjjQB.js → nodeCreator.store-FIsc3SCx.js} +2 -2
  136. package/dist/assets/{nodeCreator.store-CTXKjjQB.js.map → nodeCreator.store-FIsc3SCx.js.map} +1 -1
  137. package/dist/assets/{templateActions-CIRsIG2W.js → templateActions-w_1vSarr.js} +2 -2
  138. package/dist/assets/{templateActions-CIRsIG2W.js.map → templateActions-w_1vSarr.js.map} +1 -1
  139. package/dist/assets/{useExecutionDebugging-BzC-1xF-.js → useExecutionDebugging-EHinBq_u.js} +2 -2
  140. package/dist/assets/{useExecutionDebugging-BzC-1xF-.js.map → useExecutionDebugging-EHinBq_u.js.map} +1 -1
  141. package/dist/assets/{useExecutionHelpers-C2K8pfbF.js → useExecutionHelpers-LeKoU_T-.js} +2 -2
  142. package/dist/assets/{useExecutionHelpers-C2K8pfbF.js.map → useExecutionHelpers-LeKoU_T-.js.map} +1 -1
  143. package/dist/assets/{usePushConnection-EMXpPhl-.js → usePushConnection-PQgFeT_8.js} +2 -2
  144. package/dist/assets/{usePushConnection-EMXpPhl-.js.map → usePushConnection-PQgFeT_8.js.map} +1 -1
  145. package/dist/assets/{useUserHelpers-Bn_ZV9Jv.js → useUserHelpers-DZtbUAMm.js} +2 -2
  146. package/dist/assets/{useUserHelpers-Bn_ZV9Jv.js.map → useUserHelpers-DZtbUAMm.js.map} +1 -1
  147. package/dist/assets/{useWorkflowActivate-BwVActuc.js → useWorkflowActivate-npf1npdP.js} +2 -2
  148. package/dist/assets/{useWorkflowActivate-BwVActuc.js.map → useWorkflowActivate-npf1npdP.js.map} +1 -1
  149. package/dist/index.html +1 -1
  150. package/package.json +1 -1
  151. package/dist/assets/CollectionParameter-DHmcKhO-.js.map +0 -1
  152. package/dist/assets/MainHeader-CMxbwL4C.js +0 -2
  153. package/dist/assets/NodeView-C-hQ3_xD.js +0 -3
  154. package/dist/assets/NodeView-C-hQ3_xD.js.map +0 -1
  155. package/dist/assets/RunDataTable-B01U16vv.js +0 -2
  156. package/dist/assets/WorkflowExecutionsPreview-C_EBlNX6.js.map +0 -1
  157. package/dist/assets/WorkflowExecutionsView-Nm1Oo9El.js +0 -2
  158. package/dist/assets/WorkflowExecutionsView-Nm1Oo9El.js.map +0 -1
  159. package/dist/assets/index-Dtri_pSJ.js +0 -341
  160. package/dist/assets/index-Dtri_pSJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowHistory-DkdQ1koF.js","sources":["../../src/components/WorkflowHistory/WorkflowHistoryListItem.vue","../../src/components/WorkflowHistory/WorkflowHistoryList.vue","../../src/components/WorkflowHistory/WorkflowHistoryContent.vue","../../src/api/workflowHistory.ts","../../src/stores/workflowHistory.store.ts","../../src/views/WorkflowHistory.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, onMounted } from 'vue';\nimport dateformat from 'dateformat';\nimport type { UserAction } from 'n8n-design-system';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n} from '@/types/workflowHistory';\nimport { useI18n } from '@/composables/useI18n';\n\nconst props = defineProps<{\n\titem: WorkflowHistory;\n\tindex: number;\n\tactions: UserAction[];\n\tisActive: boolean;\n}>();\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'mounted', value: { index: number; offsetTop: number; isActive: boolean }): void;\n}>();\n\nconst i18n = useI18n();\n\nconst actionsVisible = ref(false);\nconst itemElement = ref<HTMLElement | null>(null);\nconst authorElement = ref<HTMLElement | null>(null);\nconst isAuthorElementTruncated = ref(false);\n\nconst formattedCreatedAt = computed<string>(() => {\n\tconst currentYear = new Date().getFullYear().toString();\n\tconst [date, time] = dateformat(\n\t\tprops.item.createdAt,\n\t\t`${props.item.createdAt.startsWith(currentYear) ? '' : 'yyyy '}mmm d\"#\"HH:MM:ss`,\n\t).split('#');\n\n\treturn i18n.baseText('workflowHistory.item.createdAt', { interpolate: { date, time } });\n});\n\nconst authors = computed<{ size: number; label: string }>(() => {\n\tconst allAuthors = props.item.authors.split(', ');\n\tlet label = allAuthors[0];\n\n\tif (allAuthors.length > 1) {\n\t\tlabel = `${label} + ${allAuthors.length - 1}`;\n\t}\n\n\treturn {\n\t\tsize: allAuthors.length,\n\t\tlabel,\n\t};\n});\n\nconst idLabel = computed<string>(() =>\n\ti18n.baseText('workflowHistory.item.id', { interpolate: { id: props.item.versionId } }),\n);\n\nconst onAction = (action: WorkflowHistoryActionTypes[number]) => {\n\temit('action', {\n\t\taction,\n\t\tid: props.item.versionId,\n\t\tdata: { formattedCreatedAt: formattedCreatedAt.value },\n\t});\n};\n\nconst onVisibleChange = (visible: boolean) => {\n\tactionsVisible.value = visible;\n};\n\nconst onItemClick = (event: MouseEvent) => {\n\temit('preview', { event, id: props.item.versionId });\n};\n\nonMounted(() => {\n\temit('mounted', {\n\t\tindex: props.index,\n\t\toffsetTop: itemElement.value?.offsetTop ?? 0,\n\t\tisActive: props.isActive,\n\t});\n\tisAuthorElementTruncated.value =\n\t\t(authorElement.value?.scrollWidth ?? 0) > (authorElement.value?.clientWidth ?? 0);\n});\n</script>\n<template>\n\t<li\n\t\tref=\"itemElement\"\n\t\tdata-test-id=\"workflow-history-list-item\"\n\t\t:class=\"{\n\t\t\t[$style.item]: true,\n\t\t\t[$style.active]: props.isActive,\n\t\t\t[$style.actionsVisible]: actionsVisible,\n\t\t}\"\n\t>\n\t\t<slot :formatted-created-at=\"formattedCreatedAt\">\n\t\t\t<p @click=\"onItemClick\">\n\t\t\t\t<time :datetime=\"item.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t:disabled=\"authors.size < 2 && !isAuthorElementTruncated\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ props.item.authors }}</template>\n\t\t\t\t\t<span ref=\"authorElement\">{{ authors.label }}</span>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<data :value=\"item.versionId\">{{ idLabel }}</data>\n\t\t\t</p>\n\t\t</slot>\n\t\t<div :class=\"$style.tail\">\n\t\t\t<n8n-badge v-if=\"props.index === 0\">\n\t\t\t\t{{ i18n.baseText('workflowHistory.item.latest') }}\n\t\t\t</n8n-badge>\n\t\t\t<n8n-action-toggle\n\t\t\t\ttheme=\"dark\"\n\t\t\t\t:class=\"$style.actions\"\n\t\t\t\t:actions=\"props.actions\"\n\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@click.stop\n\t\t\t\t@visible-change=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<slot name=\"action-toggle-button\" />\n\t\t\t</n8n-action-toggle>\n\t\t</div>\n\t</li>\n</template>\n<style module lang=\"scss\">\n.item {\n\tdisplay: flex;\n\tposition: relative;\n\talign-items: center;\n\tjustify-content: space-between;\n\tborder-left: 2px var(--border-style-base) transparent;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-2xs);\n\n\tp {\n\t\tdisplay: grid;\n\t\tpadding: var(--spacing-s);\n\t\tcursor: pointer;\n\t\tflex: 1 1 auto;\n\n\t\ttime {\n\t\t\tpadding: 0 0 var(--spacing-5xs);\n\t\t\tcolor: var(--color-text-dark);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t}\n\n\t\tspan,\n\t\tdata {\n\t\t\tjustify-self: start;\n\t\t\tmax-width: 160px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tmargin-top: calc(var(--spacing-4xs) * -1);\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\t}\n\n\t.tail {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t}\n\n\t&.active {\n\t\tbackground-color: var(--color-background-base);\n\t\tborder-left-color: var(--color-primary);\n\n\t\tp {\n\t\t\tcursor: default;\n\t\t}\n\t}\n\n\t&:hover,\n\t&.actionsVisible {\n\t\tborder-left-color: var(--color-foreground-xdark);\n\t}\n}\n\n.actions {\n\tdisplay: block;\n\tpadding: var(--spacing-3xs);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { UserAction } from 'n8n-design-system';\nimport { useI18n } from '@/composables/useI18n';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\n\nconst props = defineProps<{\n\titems: WorkflowHistory[];\n\tactiveItem: WorkflowHistory | null;\n\tactions: UserAction[];\n\trequestNumberOfItems: number;\n\tlastReceivedItemsLength: number;\n\tevaluatedPruneTime: number;\n\tshouldUpgrade?: boolean;\n\tisListLoading?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'loadMore', value: WorkflowHistoryRequestParams): void;\n\t(event: 'upgrade'): void;\n}>();\n\nconst i18n = useI18n();\n\nconst listElement = ref<Element | null>(null);\nconst shouldAutoScroll = ref(true);\nconst observer = ref<IntersectionObserver | null>(null);\n\nconst getActions = (index: number) =>\n\tindex === 0 ? props.actions.filter((action) => action.value !== 'restore') : props.actions;\n\nconst observeElement = (element: Element) => {\n\tobserver.value = new IntersectionObserver(\n\t\t([entry]) => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tobserver.value?.unobserve(element);\n\t\t\t\tobserver.value?.disconnect();\n\t\t\t\tobserver.value = null;\n\t\t\t\temit('loadMore', { take: props.requestNumberOfItems, skip: props.items.length });\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: listElement.value,\n\t\t\tthreshold: 0.01,\n\t\t},\n\t);\n\n\tobserver.value.observe(element);\n};\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\tshouldAutoScroll.value = false;\n\temit('action', { action, id, data });\n};\n\nconst onPreview = ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tshouldAutoScroll.value = false;\n\temit('preview', { event, id });\n};\n\nconst onItemMounted = ({\n\tindex,\n\toffsetTop,\n\tisActive,\n}: {\n\tindex: number;\n\toffsetTop: number;\n\tisActive: boolean;\n}) => {\n\tif (isActive && shouldAutoScroll.value) {\n\t\tshouldAutoScroll.value = false;\n\t\tlistElement.value?.scrollTo({ top: offsetTop, behavior: 'smooth' });\n\t}\n\n\tif (\n\t\tindex === props.items.length - 1 &&\n\t\tprops.lastReceivedItemsLength === props.requestNumberOfItems\n\t) {\n\t\tobserveElement(listElement.value?.children[index] as Element);\n\t}\n};\n</script>\n\n<template>\n\t<ul ref=\"listElement\" :class=\"$style.list\" data-test-id=\"workflow-history-list\">\n\t\t<WorkflowHistoryListItem\n\t\t\tv-for=\"(item, index) in props.items\"\n\t\t\t:key=\"item.versionId\"\n\t\t\t:index=\"index\"\n\t\t\t:item=\"item\"\n\t\t\t:is-active=\"item.versionId === props.activeItem?.versionId\"\n\t\t\t:actions=\"getActions(index)\"\n\t\t\t@action=\"onAction\"\n\t\t\t@preview=\"onPreview\"\n\t\t\t@mounted=\"onItemMounted\"\n\t\t/>\n\t\t<li v-if=\"!props.items.length && !props.isListLoading\" :class=\"$style.empty\">\n\t\t\t{{ i18n.baseText('workflowHistory.empty') }}\n\t\t\t<br />\n\t\t\t{{ i18n.baseText('workflowHistory.hint') }}\n\t\t</li>\n\t\t<li\n\t\t\tv-if=\"props.isListLoading\"\n\t\t\t:class=\"$style.loader\"\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-busy=\"true\"\n\t\t\t:aria-label=\"i18n.baseText('generic.loading')\"\n\t\t>\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t</li>\n\t\t<li v-if=\"props.shouldUpgrade\" :class=\"$style.retention\">\n\t\t\t<span>\n\t\t\t\t{{\n\t\t\t\t\ti18n.baseText('workflowHistory.limit', {\n\t\t\t\t\t\tinterpolate: { evaluatedPruneTime: String(props.evaluatedPruneTime) },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</span>\n\t\t\t<i18n-t keypath=\"workflowHistory.upgrade\" tag=\"span\">\n\t\t\t\t<template #link>\n\t\t\t\t\t<a href=\"#\" @click=\"emit('upgrade')\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.upgrade.link') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</li>\n\t</ul>\n</template>\n\n<style module lang=\"scss\">\n.list {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.empty {\n\tdisplay: flex;\n\tposition: absolute;\n\theight: 100%;\n\tpadding: 0 25%;\n\tjustify-content: center;\n\talign-items: center;\n\ttext-align: center;\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-s);\n\tline-height: var(--font-line-height-loose);\n}\n\n.loader {\n\tpadding: 0 var(--spacing-s);\n}\n\n.retention {\n\tdisplay: grid;\n\tpadding: var(--spacing-s);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-loose);\n\ttext-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport type {\n\tWorkflowVersion,\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport WorkflowPreview from '@/components/WorkflowPreview.vue';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\n\nconst props = defineProps<{\n\tworkflow: IWorkflowDb | null;\n\tworkflowVersion: WorkflowVersion | null;\n\tactions: UserAction[];\n\tisListLoading?: boolean;\n\tisFirstItemShown?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n}>();\n\nconst workflowVersionPreview = computed<IWorkflowDb | undefined>(() => {\n\tif (!props.workflowVersion || !props.workflow) {\n\t\treturn;\n\t}\n\tconst { pinData, ...workflow } = props.workflow;\n\treturn {\n\t\t...workflow,\n\t\tnodes: props.workflowVersion.nodes,\n\t\tconnections: props.workflowVersion.connections,\n\t};\n});\n\nconst actions = computed(() =>\n\tprops.isFirstItemShown\n\t\t? props.actions.filter((action) => action.value !== 'restore')\n\t\t: props.actions,\n);\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\temit('action', { action, id, data });\n};\n</script>\n\n<template>\n\t<div :class=\"$style.content\">\n\t\t<WorkflowPreview\n\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t:workflow=\"workflowVersionPreview\"\n\t\t\t:loading=\"props.isListLoading\"\n\t\t\tloader-type=\"spinner\"\n\t\t/>\n\t\t<ul :class=\"$style.info\">\n\t\t\t<WorkflowHistoryListItem\n\t\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t\t:class=\"$style.card\"\n\t\t\t\t:index=\"-1\"\n\t\t\t\t:item=\"props.workflowVersion\"\n\t\t\t\t:is-active=\"false\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t>\n\t\t\t\t<template #default=\"{ formattedCreatedAt }\">\n\t\t\t\t\t<section :class=\"$style.text\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.title') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<time :datetime=\"props.workflowVersion.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.editedBy') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>{{ props.workflowVersion.authors }}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.versionId') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<data :value=\"props.workflowVersion.versionId\">{{\n\t\t\t\t\t\t\t\tprops.workflowVersion.versionId\n\t\t\t\t\t\t\t}}</data>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\t\t\t\t</template>\n\t\t\t\t<template #action-toggle-button>\n\t\t\t\t\t<n8n-button type=\"tertiary\" size=\"large\" data-test-id=\"action-toggle-button\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.actions') }}\n\t\t\t\t\t\t<n8n-icon class=\"ml-3xs\" icon=\"chevron-down\" size=\"small\" />\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</template>\n\t\t\t</WorkflowHistoryListItem>\n\t\t</ul>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.content {\n\tposition: absolute;\n\tdisplay: block;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.info {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n\n.card {\n\tpadding: var(--spacing-s) var(--spacing-l) 0 var(--spacing-xl);\n\tborder: 0;\n\talign-items: start;\n\n\t.text {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex: 1 1 auto;\n\n\t\tp {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tpadding: 0;\n\t\t\tcursor: default;\n\n\t\t\t&:first-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\t\t\t\tpadding-bottom: var(--spacing-4xs);\n\t\t\t\t* {\n\t\t\t\t\tmargin-top: auto;\n\t\t\t\t\tfont-size: var(--font-size-m);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:last-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\n\t\t\t\t* {\n\t\t\t\t\tfont-size: var(--font-size-2xs);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.label {\n\t\t\t\tcolor: var(--color-text-light);\n\t\t\t\tpadding-right: var(--spacing-4xs);\n\t\t\t}\n\n\t\t\t* {\n\t\t\t\tmax-width: unset;\n\t\t\t\tjustify-self: unset;\n\t\t\t\twhite-space: unset;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: unset;\n\t\t\t\tpadding: 0;\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\n\nexport const getWorkflowHistory = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tqueryParams: WorkflowHistoryRequestParams,\n): Promise<WorkflowHistory[]> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}`,\n\t\tqueryParams,\n\t);\n\treturn data;\n};\n\nexport const getWorkflowVersion = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tversionId: string,\n): Promise<WorkflowVersion> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}/version/${versionId}`,\n\t);\n\treturn data;\n};\n","import { computed } from 'vue';\nimport { defineStore } from 'pinia';\nimport { saveAs } from 'file-saver';\nimport type { IWorkflowDataUpdate, IWorkflowDb } from '@/Interface';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport * as whApi from '@/api/workflowHistory';\nimport { useRootStore } from '@/stores/root.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getNewWorkflow } from '@/api/workflows';\n\nexport const useWorkflowHistoryStore = defineStore('workflowHistory', () => {\n\tconst rootStore = useRootStore();\n\tconst settingsStore = useSettingsStore();\n\tconst workflowsStore = useWorkflowsStore();\n\n\tconst licensePruneTime = computed(() => settingsStore.settings.workflowHistory.licensePruneTime);\n\tconst pruneTime = computed(() => settingsStore.settings.workflowHistory.pruneTime);\n\tconst evaluatedPruneTime = computed(() => Math.min(pruneTime.value, licensePruneTime.value));\n\tconst shouldUpgrade = computed(\n\t\t() => licensePruneTime.value !== -1 && licensePruneTime.value === pruneTime.value,\n\t);\n\n\tconst getWorkflowHistory = async (\n\t\tworkflowId: string,\n\t\tqueryParams: WorkflowHistoryRequestParams,\n\t): Promise<WorkflowHistory[]> =>\n\t\tawait whApi.getWorkflowHistory(rootStore.restApiContext, workflowId, queryParams);\n\n\tconst getWorkflowVersion = async (\n\t\tworkflowId: string,\n\t\tversionId: string,\n\t): Promise<WorkflowVersion> =>\n\t\tawait whApi.getWorkflowVersion(rootStore.restApiContext, workflowId, versionId);\n\n\tconst downloadVersion = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: WorkflowVersionId,\n\t\tdata: { formattedCreatedAt: string },\n\t) => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst blob = new Blob([JSON.stringify({ ...workflow, nodes, connections }, null, 2)], {\n\t\t\ttype: 'application/json;charset=utf-8',\n\t\t});\n\t\tsaveAs(blob, `${workflow.name}(${data.formattedCreatedAt}).json`);\n\t};\n\n\tconst cloneIntoNewWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tdata: { formattedCreatedAt: string },\n\t): Promise<IWorkflowDb> => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst { name } = workflow;\n\t\tconst newWorkflow = await getNewWorkflow(rootStore.restApiContext, {\n\t\t\tname: `${name} (${data.formattedCreatedAt})`,\n\t\t});\n\t\tconst newWorkflowData: IWorkflowDataUpdate = {\n\t\t\tnodes,\n\t\t\tconnections,\n\t\t\tname: newWorkflow.name,\n\t\t};\n\t\treturn await workflowsStore.createNewWorkflow(newWorkflowData);\n\t};\n\n\tconst restoreWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tshouldDeactivate: boolean,\n\t): Promise<IWorkflowDb> => {\n\t\tconst workflowVersion = await getWorkflowVersion(workflowId, workflowVersionId);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst updateData: IWorkflowDataUpdate = { connections, nodes };\n\n\t\tif (shouldDeactivate) {\n\t\t\tupdateData.active = false;\n\t\t}\n\n\t\treturn await workflowsStore\n\t\t\t.updateWorkflow(workflowId, updateData, true)\n\t\t\t.catch(async (error) => {\n\t\t\t\tif (error.httpStatusCode === 400 && error.message.includes('can not be activated')) {\n\t\t\t\t\treturn await workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(error);\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\treturn {\n\t\tgetWorkflowHistory,\n\t\tgetWorkflowVersion,\n\t\tdownloadVersion,\n\t\tcloneIntoNewWorkflow,\n\t\trestoreWorkflow,\n\t\tevaluatedPruneTime,\n\t\tshouldUpgrade,\n\t};\n});\n","<script setup lang=\"ts\">\nimport { onBeforeMount, ref, watchEffect, computed, h } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport { VIEWS, WORKFLOW_HISTORY_VERSION_RESTORE } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type {\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n\tWorkflowHistoryRequestParams,\n\tWorkflowHistory,\n\tWorkflowVersion,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryList from '@/components/WorkflowHistory/WorkflowHistoryList.vue';\nimport WorkflowHistoryContent from '@/components/WorkflowHistory/WorkflowHistoryContent.vue';\nimport { useWorkflowHistoryStore } from '@/stores/workflowHistory.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { telemetry } from '@/plugins/telemetry';\nimport { useRootStore } from '@/stores/root.store';\n\ntype WorkflowHistoryActionRecord = {\n\t[K in Uppercase<WorkflowHistoryActionTypes[number]>]: Lowercase<K>;\n};\n\nconst enum WorkflowHistoryVersionRestoreModalActions {\n\trestore = 'restore',\n\tdeactivateAndRestore = 'deactivateAndRestore',\n\tcancel = 'cancel',\n}\n\nconst workflowHistoryActionTypes: WorkflowHistoryActionTypes = [\n\t'restore',\n\t'clone',\n\t'open',\n\t'download',\n];\nconst WORKFLOW_HISTORY_ACTIONS = workflowHistoryActionTypes.reduce(\n\t(record, key) => ({ ...record, [key.toUpperCase()]: key }),\n\t{} as WorkflowHistoryActionRecord,\n);\n\nconst route = useRoute();\nconst router = useRouter();\nconst i18n = useI18n();\nconst toast = useToast();\nconst workflowHistoryStore = useWorkflowHistoryStore();\nconst uiStore = useUIStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst canRender = ref(true);\nconst isListLoading = ref(true);\nconst requestNumberOfItems = ref(20);\nconst lastReceivedItemsLength = ref(0);\nconst activeWorkflow = ref<IWorkflowDb | null>(null);\nconst workflowHistory = ref<WorkflowHistory[]>([]);\nconst activeWorkflowVersion = ref<WorkflowVersion | null>(null);\n\nconst workflowId = computed(() => normalizeSingleRouteParam('workflowId'));\nconst versionId = computed(() => normalizeSingleRouteParam('versionId'));\nconst editorRoute = computed(() => ({\n\tname: VIEWS.WORKFLOW,\n\tparams: {\n\t\tname: workflowId.value,\n\t},\n}));\nconst actions = computed<UserAction[]>(() =>\n\tworkflowHistoryActionTypes.map((value) => ({\n\t\tlabel: i18n.baseText(`workflowHistory.item.actions.${value}`),\n\t\tdisabled: false,\n\t\tvalue,\n\t})),\n);\n\nconst isFirstItemShown = computed(() => workflowHistory.value[0]?.versionId === versionId.value);\nconst evaluatedPruneTime = computed(() => Math.floor(workflowHistoryStore.evaluatedPruneTime / 24));\n\nconst sendTelemetry = (event: string) => {\n\ttelemetry.track(event, {\n\t\tinstance_id: useRootStore().instanceId,\n\t\tworkflow_id: workflowId.value,\n\t});\n};\n\nconst loadMore = async (queryParams: WorkflowHistoryRequestParams) => {\n\tconst history = await workflowHistoryStore.getWorkflowHistory(workflowId.value, queryParams);\n\tlastReceivedItemsLength.value = history.length;\n\tworkflowHistory.value = workflowHistory.value.concat(history);\n};\n\nonBeforeMount(async () => {\n\tsendTelemetry('User opened workflow history');\n\ttry {\n\t\tconst [workflow] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId.value),\n\t\t\tloadMore({ take: requestNumberOfItems.value }),\n\t\t]);\n\t\tactiveWorkflow.value = workflow;\n\t\tisListLoading.value = false;\n\n\t\tif (!versionId.value && workflowHistory.value.length) {\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\t\tparams: {\n\t\t\t\t\tworkflowId: workflowId.value,\n\t\t\t\t\tversionId: workflowHistory.value[0].versionId,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n\nconst normalizeSingleRouteParam = (name: string): string => {\n\tconst param = route.params[name];\n\tif (typeof param === 'string') return param;\n\treturn param?.[0] ?? '';\n};\n\nconst openInNewTab = (id: WorkflowVersionId) => {\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: workflowId.value,\n\t\t\tversionId: id,\n\t\t},\n\t});\n\twindow.open(href, '_blank');\n};\n\nconst openRestorationModal = async (\n\tisWorkflowActivated: boolean,\n\tformattedCreatedAt: string,\n): Promise<WorkflowHistoryVersionRestoreModalActions> => {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst buttons = [\n\t\t\t{\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.cancel'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tif (isWorkflowActivated) {\n\t\t\tbuttons.push({\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.deactivateAndRestore'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tbuttons.push({\n\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.restore'),\n\t\t\ttype: 'primary',\n\t\t\taction: () => {\n\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.restore);\n\t\t\t},\n\t\t});\n\n\t\ttry {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: WORKFLOW_HISTORY_VERSION_RESTORE,\n\t\t\t\tdata: {\n\t\t\t\t\tbeforeClose: () => {\n\t\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t\t},\n\t\t\t\t\tisWorkflowActivated,\n\t\t\t\t\tformattedCreatedAt,\n\t\t\t\t\tbuttons,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n};\n\nconst cloneWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst clonedWorkflow = await workflowHistoryStore.cloneIntoNewWorkflow(\n\t\tworkflowId.value,\n\t\tid,\n\t\tdata,\n\t);\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW,\n\t\tparams: {\n\t\t\tname: clonedWorkflow.id,\n\t\t},\n\t});\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.clone.success.title'),\n\t\tmessage: h(\n\t\t\t'a',\n\t\t\t{ href, target: '_blank' },\n\t\t\ti18n.baseText('workflowHistory.action.clone.success.message'),\n\t\t),\n\t\ttype: 'success',\n\t\tduration: 10000,\n\t});\n};\n\nconst restoreWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst workflow = await workflowsStore.fetchWorkflow(workflowId.value);\n\tconst modalAction = await openRestorationModal(workflow.active, data.formattedCreatedAt);\n\tif (modalAction === WorkflowHistoryVersionRestoreModalActions.cancel) {\n\t\treturn;\n\t}\n\tactiveWorkflow.value = await workflowHistoryStore.restoreWorkflow(\n\t\tworkflowId.value,\n\t\tid,\n\t\tmodalAction === WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore,\n\t);\n\tconst history = await workflowHistoryStore.getWorkflowHistory(workflowId.value, {\n\t\ttake: 1,\n\t});\n\tworkflowHistory.value = history.concat(workflowHistory.value);\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.restore.success.title'),\n\t\ttype: 'success',\n\t});\n};\n\nconst onAction = async ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.OPEN:\n\t\t\t\topenInNewTab(id);\n\t\t\t\tsendTelemetry('User opened version in new tab');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.DOWNLOAD:\n\t\t\t\tawait workflowHistoryStore.downloadVersion(workflowId.value, id, data);\n\t\t\t\tsendTelemetry('User downloaded version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.CLONE:\n\t\t\t\tawait cloneWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User cloned version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.RESTORE:\n\t\t\t\tawait restoreWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User restored version');\n\t\t\t\tbreak;\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowHistory.action.error.title', {\n\t\t\t\tinterpolate: {\n\t\t\t\t\taction: i18n.baseText(`workflowHistory.item.actions.${action}`).toLowerCase(),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n};\n\nconst onPreview = async ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tif (event.metaKey || event.ctrlKey) {\n\t\topenInNewTab(id);\n\t\tsendTelemetry('User opened version in new tab');\n\t} else {\n\t\tawait router.push({\n\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\tparams: {\n\t\t\t\tworkflowId: workflowId.value,\n\t\t\t\tversionId: id,\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onUpgrade = () => {\n\tvoid uiStore.goToUpgrade('workflow-history', 'upgrade-workflow-history');\n};\n\nwatchEffect(async () => {\n\tif (!versionId.value) {\n\t\treturn;\n\t}\n\ttry {\n\t\tactiveWorkflowVersion.value = await workflowHistoryStore.getWorkflowVersion(\n\t\t\tworkflowId.value,\n\t\t\tversionId.value,\n\t\t);\n\t\tsendTelemetry('User selected version');\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\tnew Error(`${error.message} \"${versionId.value}\"&nbsp;`),\n\t\t\ti18n.baseText('workflowHistory.title'),\n\t\t);\n\t}\n\n\ttry {\n\t\tactiveWorkflow.value = await workflowsStore.fetchWorkflow(workflowId.value);\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n</script>\n<template>\n\t<div :class=\"$style.view\">\n\t\t<n8n-heading :class=\"$style.header\" tag=\"h2\" size=\"medium\">\n\t\t\t{{ activeWorkflow?.name }}\n\t\t</n8n-heading>\n\t\t<div :class=\"$style.corner\">\n\t\t\t<n8n-heading tag=\"h2\" size=\"medium\" bold>\n\t\t\t\t{{ i18n.baseText('workflowHistory.title') }}\n\t\t\t</n8n-heading>\n\t\t\t<router-link :to=\"editorRoute\" data-test-id=\"workflow-history-close-button\">\n\t\t\t\t<n8n-button type=\"tertiary\" icon=\"times\" size=\"small\" text square />\n\t\t\t</router-link>\n\t\t</div>\n\t\t<div :class=\"$style.listComponentWrapper\">\n\t\t\t<WorkflowHistoryList\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:items=\"workflowHistory\"\n\t\t\t\t:last-received-items-length=\"lastReceivedItemsLength\"\n\t\t\t\t:active-item=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:request-number-of-items=\"requestNumberOfItems\"\n\t\t\t\t:should-upgrade=\"workflowHistoryStore.shouldUpgrade\"\n\t\t\t\t:evaluated-prune-time=\"evaluatedPruneTime\"\n\t\t\t\t:is-list-loading=\"isListLoading\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@preview=\"onPreview\"\n\t\t\t\t@load-more=\"loadMore\"\n\t\t\t\t@upgrade=\"onUpgrade\"\n\t\t\t/>\n\t\t</div>\n\t\t<div :class=\"$style.contentComponentWrapper\">\n\t\t\t<WorkflowHistoryContent\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:workflow=\"activeWorkflow\"\n\t\t\t\t:workflow-version=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:is-list-loading=\"isListLoading\"\n\t\t\t\t:is-first-item-shown=\"isFirstItemShown\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n<style module lang=\"scss\">\n.view {\n\tposition: relative;\n\tdisplay: grid;\n\twidth: 100%;\n\tgrid-template-areas: 'header corner' 'content list';\n\tgrid-template-columns: auto 330px;\n\tgrid-template-rows: 65px auto;\n\tbackground-color: var(--color-background-xlight);\n}\n\n.header {\n\tgrid-area: header;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 var(--spacing-l);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.corner {\n\tgrid-area: corner;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 0 var(--spacing-3xs) 0 var(--spacing-s);\n\tbackground-color: var(--color-background-lighter);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-left: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.contentComponentWrapper {\n\tgrid-area: content;\n\tposition: relative;\n}\n\n.listComponentWrapper {\n\tgrid-area: list;\n\tposition: relative;\n\n\t&::before {\n\t\tcontent: '';\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\twidth: var(--border-width-base);\n\t\tbackground-color: var(--color-foreground-base);\n\t}\n}\n</style>\n"],"names":["props","__props","emit","__emit","i18n","useI18n","actionsVisible","ref","itemElement","authorElement","isAuthorElementTruncated","formattedCreatedAt","computed","currentYear","date","time","dateformat","authors","allAuthors","label","idLabel","onAction","action","onVisibleChange","visible","onItemClick","event","onMounted","_a","_b","_c","listElement","shouldAutoScroll","observer","getActions","index","observeElement","element","entry","id","data","onPreview","onItemMounted","offsetTop","isActive","workflowVersionPreview","pinData","workflow","actions","getWorkflowHistory","context","workflowId","queryParams","get","getWorkflowVersion","versionId","useWorkflowHistoryStore","defineStore","rootStore","useRootStore","settingsStore","useSettingsStore","workflowsStore","useWorkflowsStore","licensePruneTime","pruneTime","evaluatedPruneTime","shouldUpgrade","whApi.getWorkflowHistory","whApi.getWorkflowVersion","workflowVersionId","workflowVersion","connections","nodes","blob","saveAs","name","newWorkflow","getNewWorkflow","newWorkflowData","shouldDeactivate","updateData","error","workflowHistoryActionTypes","WORKFLOW_HISTORY_ACTIONS","record","key","route","useRoute","router","useRouter","toast","useToast","workflowHistoryStore","uiStore","useUIStore","canRender","isListLoading","requestNumberOfItems","lastReceivedItemsLength","activeWorkflow","workflowHistory","activeWorkflowVersion","normalizeSingleRouteParam","editorRoute","VIEWS","value","isFirstItemShown","sendTelemetry","telemetry","loadMore","history","onBeforeMount","param","openInNewTab","href","openRestorationModal","isWorkflowActivated","resolve","reject","buttons","WORKFLOW_HISTORY_VERSION_RESTORE","cloneWorkflowVersion","clonedWorkflow","h","restoreWorkflowVersion","modalAction","onUpgrade","watchEffect"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowHistory-C6zCGFoY.js","sources":["../../src/components/WorkflowHistory/WorkflowHistoryListItem.vue","../../src/components/WorkflowHistory/WorkflowHistoryList.vue","../../src/components/WorkflowHistory/WorkflowHistoryContent.vue","../../src/api/workflowHistory.ts","../../src/stores/workflowHistory.store.ts","../../src/views/WorkflowHistory.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, onMounted } from 'vue';\nimport dateformat from 'dateformat';\nimport type { UserAction } from 'n8n-design-system';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n} from '@/types/workflowHistory';\nimport { useI18n } from '@/composables/useI18n';\n\nconst props = defineProps<{\n\titem: WorkflowHistory;\n\tindex: number;\n\tactions: UserAction[];\n\tisActive: boolean;\n}>();\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'mounted', value: { index: number; offsetTop: number; isActive: boolean }): void;\n}>();\n\nconst i18n = useI18n();\n\nconst actionsVisible = ref(false);\nconst itemElement = ref<HTMLElement | null>(null);\nconst authorElement = ref<HTMLElement | null>(null);\nconst isAuthorElementTruncated = ref(false);\n\nconst formattedCreatedAt = computed<string>(() => {\n\tconst currentYear = new Date().getFullYear().toString();\n\tconst [date, time] = dateformat(\n\t\tprops.item.createdAt,\n\t\t`${props.item.createdAt.startsWith(currentYear) ? '' : 'yyyy '}mmm d\"#\"HH:MM:ss`,\n\t).split('#');\n\n\treturn i18n.baseText('workflowHistory.item.createdAt', { interpolate: { date, time } });\n});\n\nconst authors = computed<{ size: number; label: string }>(() => {\n\tconst allAuthors = props.item.authors.split(', ');\n\tlet label = allAuthors[0];\n\n\tif (allAuthors.length > 1) {\n\t\tlabel = `${label} + ${allAuthors.length - 1}`;\n\t}\n\n\treturn {\n\t\tsize: allAuthors.length,\n\t\tlabel,\n\t};\n});\n\nconst idLabel = computed<string>(() =>\n\ti18n.baseText('workflowHistory.item.id', { interpolate: { id: props.item.versionId } }),\n);\n\nconst onAction = (action: WorkflowHistoryActionTypes[number]) => {\n\temit('action', {\n\t\taction,\n\t\tid: props.item.versionId,\n\t\tdata: { formattedCreatedAt: formattedCreatedAt.value },\n\t});\n};\n\nconst onVisibleChange = (visible: boolean) => {\n\tactionsVisible.value = visible;\n};\n\nconst onItemClick = (event: MouseEvent) => {\n\temit('preview', { event, id: props.item.versionId });\n};\n\nonMounted(() => {\n\temit('mounted', {\n\t\tindex: props.index,\n\t\toffsetTop: itemElement.value?.offsetTop ?? 0,\n\t\tisActive: props.isActive,\n\t});\n\tisAuthorElementTruncated.value =\n\t\t(authorElement.value?.scrollWidth ?? 0) > (authorElement.value?.clientWidth ?? 0);\n});\n</script>\n<template>\n\t<li\n\t\tref=\"itemElement\"\n\t\tdata-test-id=\"workflow-history-list-item\"\n\t\t:class=\"{\n\t\t\t[$style.item]: true,\n\t\t\t[$style.active]: props.isActive,\n\t\t\t[$style.actionsVisible]: actionsVisible,\n\t\t}\"\n\t>\n\t\t<slot :formatted-created-at=\"formattedCreatedAt\">\n\t\t\t<p @click=\"onItemClick\">\n\t\t\t\t<time :datetime=\"item.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tplacement=\"right-end\"\n\t\t\t\t\t:disabled=\"authors.size < 2 && !isAuthorElementTruncated\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ props.item.authors }}</template>\n\t\t\t\t\t<span ref=\"authorElement\">{{ authors.label }}</span>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<data :value=\"item.versionId\">{{ idLabel }}</data>\n\t\t\t</p>\n\t\t</slot>\n\t\t<div :class=\"$style.tail\">\n\t\t\t<n8n-badge v-if=\"props.index === 0\">\n\t\t\t\t{{ i18n.baseText('workflowHistory.item.latest') }}\n\t\t\t</n8n-badge>\n\t\t\t<n8n-action-toggle\n\t\t\t\ttheme=\"dark\"\n\t\t\t\t:class=\"$style.actions\"\n\t\t\t\t:actions=\"props.actions\"\n\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@click.stop\n\t\t\t\t@visible-change=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<slot name=\"action-toggle-button\" />\n\t\t\t</n8n-action-toggle>\n\t\t</div>\n\t</li>\n</template>\n<style module lang=\"scss\">\n.item {\n\tdisplay: flex;\n\tposition: relative;\n\talign-items: center;\n\tjustify-content: space-between;\n\tborder-left: 2px var(--border-style-base) transparent;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-2xs);\n\n\tp {\n\t\tdisplay: grid;\n\t\tpadding: var(--spacing-s);\n\t\tcursor: pointer;\n\t\tflex: 1 1 auto;\n\n\t\ttime {\n\t\t\tpadding: 0 0 var(--spacing-5xs);\n\t\t\tcolor: var(--color-text-dark);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t}\n\n\t\tspan,\n\t\tdata {\n\t\t\tjustify-self: start;\n\t\t\tmax-width: 160px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tmargin-top: calc(var(--spacing-4xs) * -1);\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\t}\n\n\t.tail {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t}\n\n\t&.active {\n\t\tbackground-color: var(--color-background-base);\n\t\tborder-left-color: var(--color-primary);\n\n\t\tp {\n\t\t\tcursor: default;\n\t\t}\n\t}\n\n\t&:hover,\n\t&.actionsVisible {\n\t\tborder-left-color: var(--color-foreground-xdark);\n\t}\n}\n\n.actions {\n\tdisplay: block;\n\tpadding: var(--spacing-3xs);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { UserAction } from 'n8n-design-system';\nimport { useI18n } from '@/composables/useI18n';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersionId,\n\tWorkflowHistoryActionTypes,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\n\nconst props = defineProps<{\n\titems: WorkflowHistory[];\n\tactiveItem: WorkflowHistory | null;\n\tactions: UserAction[];\n\trequestNumberOfItems: number;\n\tlastReceivedItemsLength: number;\n\tevaluatedPruneTime: number;\n\tshouldUpgrade?: boolean;\n\tisListLoading?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n\t(event: 'preview', value: { event: MouseEvent; id: WorkflowVersionId }): void;\n\t(event: 'loadMore', value: WorkflowHistoryRequestParams): void;\n\t(event: 'upgrade'): void;\n}>();\n\nconst i18n = useI18n();\n\nconst listElement = ref<Element | null>(null);\nconst shouldAutoScroll = ref(true);\nconst observer = ref<IntersectionObserver | null>(null);\n\nconst getActions = (index: number) =>\n\tindex === 0 ? props.actions.filter((action) => action.value !== 'restore') : props.actions;\n\nconst observeElement = (element: Element) => {\n\tobserver.value = new IntersectionObserver(\n\t\t([entry]) => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tobserver.value?.unobserve(element);\n\t\t\t\tobserver.value?.disconnect();\n\t\t\t\tobserver.value = null;\n\t\t\t\temit('loadMore', { take: props.requestNumberOfItems, skip: props.items.length });\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: listElement.value,\n\t\t\tthreshold: 0.01,\n\t\t},\n\t);\n\n\tobserver.value.observe(element);\n};\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\tshouldAutoScroll.value = false;\n\temit('action', { action, id, data });\n};\n\nconst onPreview = ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tshouldAutoScroll.value = false;\n\temit('preview', { event, id });\n};\n\nconst onItemMounted = ({\n\tindex,\n\toffsetTop,\n\tisActive,\n}: {\n\tindex: number;\n\toffsetTop: number;\n\tisActive: boolean;\n}) => {\n\tif (isActive && shouldAutoScroll.value) {\n\t\tshouldAutoScroll.value = false;\n\t\tlistElement.value?.scrollTo({ top: offsetTop, behavior: 'smooth' });\n\t}\n\n\tif (\n\t\tindex === props.items.length - 1 &&\n\t\tprops.lastReceivedItemsLength === props.requestNumberOfItems\n\t) {\n\t\tobserveElement(listElement.value?.children[index] as Element);\n\t}\n};\n</script>\n\n<template>\n\t<ul ref=\"listElement\" :class=\"$style.list\" data-test-id=\"workflow-history-list\">\n\t\t<WorkflowHistoryListItem\n\t\t\tv-for=\"(item, index) in props.items\"\n\t\t\t:key=\"item.versionId\"\n\t\t\t:index=\"index\"\n\t\t\t:item=\"item\"\n\t\t\t:is-active=\"item.versionId === props.activeItem?.versionId\"\n\t\t\t:actions=\"getActions(index)\"\n\t\t\t@action=\"onAction\"\n\t\t\t@preview=\"onPreview\"\n\t\t\t@mounted=\"onItemMounted\"\n\t\t/>\n\t\t<li v-if=\"!props.items.length && !props.isListLoading\" :class=\"$style.empty\">\n\t\t\t{{ i18n.baseText('workflowHistory.empty') }}\n\t\t\t<br />\n\t\t\t{{ i18n.baseText('workflowHistory.hint') }}\n\t\t</li>\n\t\t<li\n\t\t\tv-if=\"props.isListLoading\"\n\t\t\t:class=\"$style.loader\"\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-busy=\"true\"\n\t\t\t:aria-label=\"i18n.baseText('generic.loading')\"\n\t\t>\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t\t<n8n-loading :rows=\"3\" class=\"mb-xs\" />\n\t\t</li>\n\t\t<li v-if=\"props.shouldUpgrade\" :class=\"$style.retention\">\n\t\t\t<span>\n\t\t\t\t{{\n\t\t\t\t\ti18n.baseText('workflowHistory.limit', {\n\t\t\t\t\t\tinterpolate: { evaluatedPruneTime: String(props.evaluatedPruneTime) },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</span>\n\t\t\t<i18n-t keypath=\"workflowHistory.upgrade\" tag=\"span\">\n\t\t\t\t<template #link>\n\t\t\t\t\t<a href=\"#\" @click=\"emit('upgrade')\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.upgrade.link') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</li>\n\t</ul>\n</template>\n\n<style module lang=\"scss\">\n.list {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.empty {\n\tdisplay: flex;\n\tposition: absolute;\n\theight: 100%;\n\tpadding: 0 25%;\n\tjustify-content: center;\n\talign-items: center;\n\ttext-align: center;\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-s);\n\tline-height: var(--font-line-height-loose);\n}\n\n.loader {\n\tpadding: 0 var(--spacing-s);\n}\n\n.retention {\n\tdisplay: grid;\n\tpadding: var(--spacing-s);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-loose);\n\ttext-align: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport type {\n\tWorkflowVersion,\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport WorkflowPreview from '@/components/WorkflowPreview.vue';\nimport WorkflowHistoryListItem from '@/components/WorkflowHistory/WorkflowHistoryListItem.vue';\nimport { useI18n } from '@/composables/useI18n';\n\nconst i18n = useI18n();\n\nconst props = defineProps<{\n\tworkflow: IWorkflowDb | null;\n\tworkflowVersion: WorkflowVersion | null;\n\tactions: UserAction[];\n\tisListLoading?: boolean;\n\tisFirstItemShown?: boolean;\n}>();\n\nconst emit = defineEmits<{\n\t(\n\t\tevent: 'action',\n\t\tvalue: {\n\t\t\taction: WorkflowHistoryActionTypes[number];\n\t\t\tid: WorkflowVersionId;\n\t\t\tdata: { formattedCreatedAt: string };\n\t\t},\n\t): void;\n}>();\n\nconst workflowVersionPreview = computed<IWorkflowDb | undefined>(() => {\n\tif (!props.workflowVersion || !props.workflow) {\n\t\treturn;\n\t}\n\tconst { pinData, ...workflow } = props.workflow;\n\treturn {\n\t\t...workflow,\n\t\tnodes: props.workflowVersion.nodes,\n\t\tconnections: props.workflowVersion.connections,\n\t};\n});\n\nconst actions = computed(() =>\n\tprops.isFirstItemShown\n\t\t? props.actions.filter((action) => action.value !== 'restore')\n\t\t: props.actions,\n);\n\nconst onAction = ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\temit('action', { action, id, data });\n};\n</script>\n\n<template>\n\t<div :class=\"$style.content\">\n\t\t<WorkflowPreview\n\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t:workflow=\"workflowVersionPreview\"\n\t\t\t:loading=\"props.isListLoading\"\n\t\t\tloader-type=\"spinner\"\n\t\t/>\n\t\t<ul :class=\"$style.info\">\n\t\t\t<WorkflowHistoryListItem\n\t\t\t\tv-if=\"props.workflowVersion\"\n\t\t\t\t:class=\"$style.card\"\n\t\t\t\t:index=\"-1\"\n\t\t\t\t:item=\"props.workflowVersion\"\n\t\t\t\t:is-active=\"false\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t>\n\t\t\t\t<template #default=\"{ formattedCreatedAt }\">\n\t\t\t\t\t<section :class=\"$style.text\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.title') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<time :datetime=\"props.workflowVersion.createdAt\">{{ formattedCreatedAt }}</time>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.editedBy') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>{{ props.workflowVersion.authors }}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.versionId') }}:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<data :value=\"props.workflowVersion.versionId\">{{\n\t\t\t\t\t\t\t\tprops.workflowVersion.versionId\n\t\t\t\t\t\t\t}}</data>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\t\t\t\t</template>\n\t\t\t\t<template #action-toggle-button>\n\t\t\t\t\t<n8n-button type=\"tertiary\" size=\"large\" data-test-id=\"action-toggle-button\">\n\t\t\t\t\t\t{{ i18n.baseText('workflowHistory.content.actions') }}\n\t\t\t\t\t\t<n8n-icon class=\"ml-3xs\" icon=\"chevron-down\" size=\"small\" />\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</template>\n\t\t\t</WorkflowHistoryListItem>\n\t\t</ul>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.content {\n\tposition: absolute;\n\tdisplay: block;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: auto;\n}\n\n.info {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n\n.card {\n\tpadding: var(--spacing-s) var(--spacing-l) 0 var(--spacing-xl);\n\tborder: 0;\n\talign-items: start;\n\n\t.text {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex: 1 1 auto;\n\n\t\tp {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tpadding: 0;\n\t\t\tcursor: default;\n\n\t\t\t&:first-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\t\t\t\tpadding-bottom: var(--spacing-4xs);\n\t\t\t\t* {\n\t\t\t\t\tmargin-top: auto;\n\t\t\t\t\tfont-size: var(--font-size-m);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:last-child {\n\t\t\t\tpadding-top: var(--spacing-3xs);\n\n\t\t\t\t* {\n\t\t\t\t\tfont-size: var(--font-size-2xs);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.label {\n\t\t\t\tcolor: var(--color-text-light);\n\t\t\t\tpadding-right: var(--spacing-4xs);\n\t\t\t}\n\n\t\t\t* {\n\t\t\t\tmax-width: unset;\n\t\t\t\tjustify-self: unset;\n\t\t\t\twhite-space: unset;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: unset;\n\t\t\t\tpadding: 0;\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","import type { IRestApiContext } from '@/Interface';\nimport { get } from '@/utils/apiUtils';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n} from '@/types/workflowHistory';\n\nexport const getWorkflowHistory = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tqueryParams: WorkflowHistoryRequestParams,\n): Promise<WorkflowHistory[]> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}`,\n\t\tqueryParams,\n\t);\n\treturn data;\n};\n\nexport const getWorkflowVersion = async (\n\tcontext: IRestApiContext,\n\tworkflowId: string,\n\tversionId: string,\n): Promise<WorkflowVersion> => {\n\tconst { data } = await get(\n\t\tcontext.baseUrl,\n\t\t`/workflow-history/workflow/${workflowId}/version/${versionId}`,\n\t);\n\treturn data;\n};\n","import { computed } from 'vue';\nimport { defineStore } from 'pinia';\nimport { saveAs } from 'file-saver';\nimport type { IWorkflowDataUpdate, IWorkflowDb } from '@/Interface';\nimport type {\n\tWorkflowHistory,\n\tWorkflowVersion,\n\tWorkflowHistoryRequestParams,\n\tWorkflowVersionId,\n} from '@/types/workflowHistory';\nimport * as whApi from '@/api/workflowHistory';\nimport { useRootStore } from '@/stores/root.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getNewWorkflow } from '@/api/workflows';\n\nexport const useWorkflowHistoryStore = defineStore('workflowHistory', () => {\n\tconst rootStore = useRootStore();\n\tconst settingsStore = useSettingsStore();\n\tconst workflowsStore = useWorkflowsStore();\n\n\tconst licensePruneTime = computed(() => settingsStore.settings.workflowHistory.licensePruneTime);\n\tconst pruneTime = computed(() => settingsStore.settings.workflowHistory.pruneTime);\n\tconst evaluatedPruneTime = computed(() => Math.min(pruneTime.value, licensePruneTime.value));\n\tconst shouldUpgrade = computed(\n\t\t() => licensePruneTime.value !== -1 && licensePruneTime.value === pruneTime.value,\n\t);\n\n\tconst getWorkflowHistory = async (\n\t\tworkflowId: string,\n\t\tqueryParams: WorkflowHistoryRequestParams,\n\t): Promise<WorkflowHistory[]> =>\n\t\tawait whApi.getWorkflowHistory(rootStore.restApiContext, workflowId, queryParams);\n\n\tconst getWorkflowVersion = async (\n\t\tworkflowId: string,\n\t\tversionId: string,\n\t): Promise<WorkflowVersion> =>\n\t\tawait whApi.getWorkflowVersion(rootStore.restApiContext, workflowId, versionId);\n\n\tconst downloadVersion = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: WorkflowVersionId,\n\t\tdata: { formattedCreatedAt: string },\n\t) => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst blob = new Blob([JSON.stringify({ ...workflow, nodes, connections }, null, 2)], {\n\t\t\ttype: 'application/json;charset=utf-8',\n\t\t});\n\t\tsaveAs(blob, `${workflow.name}(${data.formattedCreatedAt}).json`);\n\t};\n\n\tconst cloneIntoNewWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tdata: { formattedCreatedAt: string },\n\t): Promise<IWorkflowDb> => {\n\t\tconst [workflow, workflowVersion] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId),\n\t\t\tgetWorkflowVersion(workflowId, workflowVersionId),\n\t\t]);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst { name } = workflow;\n\t\tconst newWorkflow = await getNewWorkflow(rootStore.restApiContext, {\n\t\t\tname: `${name} (${data.formattedCreatedAt})`,\n\t\t});\n\t\tconst newWorkflowData: IWorkflowDataUpdate = {\n\t\t\tnodes,\n\t\t\tconnections,\n\t\t\tname: newWorkflow.name,\n\t\t};\n\t\treturn await workflowsStore.createNewWorkflow(newWorkflowData);\n\t};\n\n\tconst restoreWorkflow = async (\n\t\tworkflowId: string,\n\t\tworkflowVersionId: string,\n\t\tshouldDeactivate: boolean,\n\t): Promise<IWorkflowDb> => {\n\t\tconst workflowVersion = await getWorkflowVersion(workflowId, workflowVersionId);\n\t\tconst { connections, nodes } = workflowVersion;\n\t\tconst updateData: IWorkflowDataUpdate = { connections, nodes };\n\n\t\tif (shouldDeactivate) {\n\t\t\tupdateData.active = false;\n\t\t}\n\n\t\treturn await workflowsStore\n\t\t\t.updateWorkflow(workflowId, updateData, true)\n\t\t\t.catch(async (error) => {\n\t\t\t\tif (error.httpStatusCode === 400 && error.message.includes('can not be activated')) {\n\t\t\t\t\treturn await workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(error);\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\treturn {\n\t\tgetWorkflowHistory,\n\t\tgetWorkflowVersion,\n\t\tdownloadVersion,\n\t\tcloneIntoNewWorkflow,\n\t\trestoreWorkflow,\n\t\tevaluatedPruneTime,\n\t\tshouldUpgrade,\n\t};\n});\n","<script setup lang=\"ts\">\nimport { onBeforeMount, ref, watchEffect, computed, h } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { IWorkflowDb, UserAction } from '@/Interface';\nimport { VIEWS, WORKFLOW_HISTORY_VERSION_RESTORE } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type {\n\tWorkflowHistoryActionTypes,\n\tWorkflowVersionId,\n\tWorkflowHistoryRequestParams,\n\tWorkflowHistory,\n\tWorkflowVersion,\n} from '@/types/workflowHistory';\nimport WorkflowHistoryList from '@/components/WorkflowHistory/WorkflowHistoryList.vue';\nimport WorkflowHistoryContent from '@/components/WorkflowHistory/WorkflowHistoryContent.vue';\nimport { useWorkflowHistoryStore } from '@/stores/workflowHistory.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { telemetry } from '@/plugins/telemetry';\nimport { useRootStore } from '@/stores/root.store';\n\ntype WorkflowHistoryActionRecord = {\n\t[K in Uppercase<WorkflowHistoryActionTypes[number]>]: Lowercase<K>;\n};\n\nconst enum WorkflowHistoryVersionRestoreModalActions {\n\trestore = 'restore',\n\tdeactivateAndRestore = 'deactivateAndRestore',\n\tcancel = 'cancel',\n}\n\nconst workflowHistoryActionTypes: WorkflowHistoryActionTypes = [\n\t'restore',\n\t'clone',\n\t'open',\n\t'download',\n];\nconst WORKFLOW_HISTORY_ACTIONS = workflowHistoryActionTypes.reduce(\n\t(record, key) => ({ ...record, [key.toUpperCase()]: key }),\n\t{} as WorkflowHistoryActionRecord,\n);\n\nconst route = useRoute();\nconst router = useRouter();\nconst i18n = useI18n();\nconst toast = useToast();\nconst workflowHistoryStore = useWorkflowHistoryStore();\nconst uiStore = useUIStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst canRender = ref(true);\nconst isListLoading = ref(true);\nconst requestNumberOfItems = ref(20);\nconst lastReceivedItemsLength = ref(0);\nconst activeWorkflow = ref<IWorkflowDb | null>(null);\nconst workflowHistory = ref<WorkflowHistory[]>([]);\nconst activeWorkflowVersion = ref<WorkflowVersion | null>(null);\n\nconst workflowId = computed(() => normalizeSingleRouteParam('workflowId'));\nconst versionId = computed(() => normalizeSingleRouteParam('versionId'));\nconst editorRoute = computed(() => ({\n\tname: VIEWS.WORKFLOW,\n\tparams: {\n\t\tname: workflowId.value,\n\t},\n}));\nconst actions = computed<UserAction[]>(() =>\n\tworkflowHistoryActionTypes.map((value) => ({\n\t\tlabel: i18n.baseText(`workflowHistory.item.actions.${value}`),\n\t\tdisabled: false,\n\t\tvalue,\n\t})),\n);\n\nconst isFirstItemShown = computed(() => workflowHistory.value[0]?.versionId === versionId.value);\nconst evaluatedPruneTime = computed(() => Math.floor(workflowHistoryStore.evaluatedPruneTime / 24));\n\nconst sendTelemetry = (event: string) => {\n\ttelemetry.track(event, {\n\t\tinstance_id: useRootStore().instanceId,\n\t\tworkflow_id: workflowId.value,\n\t});\n};\n\nconst loadMore = async (queryParams: WorkflowHistoryRequestParams) => {\n\tconst history = await workflowHistoryStore.getWorkflowHistory(workflowId.value, queryParams);\n\tlastReceivedItemsLength.value = history.length;\n\tworkflowHistory.value = workflowHistory.value.concat(history);\n};\n\nonBeforeMount(async () => {\n\tsendTelemetry('User opened workflow history');\n\ttry {\n\t\tconst [workflow] = await Promise.all([\n\t\t\tworkflowsStore.fetchWorkflow(workflowId.value),\n\t\t\tloadMore({ take: requestNumberOfItems.value }),\n\t\t]);\n\t\tactiveWorkflow.value = workflow;\n\t\tisListLoading.value = false;\n\n\t\tif (!versionId.value && workflowHistory.value.length) {\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\t\tparams: {\n\t\t\t\t\tworkflowId: workflowId.value,\n\t\t\t\t\tversionId: workflowHistory.value[0].versionId,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n\nconst normalizeSingleRouteParam = (name: string): string => {\n\tconst param = route.params[name];\n\tif (typeof param === 'string') return param;\n\treturn param?.[0] ?? '';\n};\n\nconst openInNewTab = (id: WorkflowVersionId) => {\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: workflowId.value,\n\t\t\tversionId: id,\n\t\t},\n\t});\n\twindow.open(href, '_blank');\n};\n\nconst openRestorationModal = async (\n\tisWorkflowActivated: boolean,\n\tformattedCreatedAt: string,\n): Promise<WorkflowHistoryVersionRestoreModalActions> => {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst buttons = [\n\t\t\t{\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.cancel'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tif (isWorkflowActivated) {\n\t\t\tbuttons.push({\n\t\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.deactivateAndRestore'),\n\t\t\t\ttype: 'tertiary',\n\t\t\t\taction: () => {\n\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tbuttons.push({\n\t\t\ttext: i18n.baseText('workflowHistory.action.restore.modal.button.restore'),\n\t\t\ttype: 'primary',\n\t\t\taction: () => {\n\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.restore);\n\t\t\t},\n\t\t});\n\n\t\ttry {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: WORKFLOW_HISTORY_VERSION_RESTORE,\n\t\t\t\tdata: {\n\t\t\t\t\tbeforeClose: () => {\n\t\t\t\t\t\tresolve(WorkflowHistoryVersionRestoreModalActions.cancel);\n\t\t\t\t\t},\n\t\t\t\t\tisWorkflowActivated,\n\t\t\t\t\tformattedCreatedAt,\n\t\t\t\t\tbuttons,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n};\n\nconst cloneWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst clonedWorkflow = await workflowHistoryStore.cloneIntoNewWorkflow(\n\t\tworkflowId.value,\n\t\tid,\n\t\tdata,\n\t);\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW,\n\t\tparams: {\n\t\t\tname: clonedWorkflow.id,\n\t\t},\n\t});\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.clone.success.title'),\n\t\tmessage: h(\n\t\t\t'a',\n\t\t\t{ href, target: '_blank' },\n\t\t\ti18n.baseText('workflowHistory.action.clone.success.message'),\n\t\t),\n\t\ttype: 'success',\n\t\tduration: 10000,\n\t});\n};\n\nconst restoreWorkflowVersion = async (\n\tid: WorkflowVersionId,\n\tdata: { formattedCreatedAt: string },\n) => {\n\tconst workflow = await workflowsStore.fetchWorkflow(workflowId.value);\n\tconst modalAction = await openRestorationModal(workflow.active, data.formattedCreatedAt);\n\tif (modalAction === WorkflowHistoryVersionRestoreModalActions.cancel) {\n\t\treturn;\n\t}\n\tactiveWorkflow.value = await workflowHistoryStore.restoreWorkflow(\n\t\tworkflowId.value,\n\t\tid,\n\t\tmodalAction === WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore,\n\t);\n\tconst history = await workflowHistoryStore.getWorkflowHistory(workflowId.value, {\n\t\ttake: 1,\n\t});\n\tworkflowHistory.value = history.concat(workflowHistory.value);\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('workflowHistory.action.restore.success.title'),\n\t\ttype: 'success',\n\t});\n};\n\nconst onAction = async ({\n\taction,\n\tid,\n\tdata,\n}: {\n\taction: WorkflowHistoryActionTypes[number];\n\tid: WorkflowVersionId;\n\tdata: { formattedCreatedAt: string };\n}) => {\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.OPEN:\n\t\t\t\topenInNewTab(id);\n\t\t\t\tsendTelemetry('User opened version in new tab');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.DOWNLOAD:\n\t\t\t\tawait workflowHistoryStore.downloadVersion(workflowId.value, id, data);\n\t\t\t\tsendTelemetry('User downloaded version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.CLONE:\n\t\t\t\tawait cloneWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User cloned version');\n\t\t\t\tbreak;\n\t\t\tcase WORKFLOW_HISTORY_ACTIONS.RESTORE:\n\t\t\t\tawait restoreWorkflowVersion(id, data);\n\t\t\t\tsendTelemetry('User restored version');\n\t\t\t\tbreak;\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowHistory.action.error.title', {\n\t\t\t\tinterpolate: {\n\t\t\t\t\taction: i18n.baseText(`workflowHistory.item.actions.${action}`).toLowerCase(),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n};\n\nconst onPreview = async ({ event, id }: { event: MouseEvent; id: WorkflowVersionId }) => {\n\tif (event.metaKey || event.ctrlKey) {\n\t\topenInNewTab(id);\n\t\tsendTelemetry('User opened version in new tab');\n\t} else {\n\t\tawait router.push({\n\t\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\t\tparams: {\n\t\t\t\tworkflowId: workflowId.value,\n\t\t\t\tversionId: id,\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onUpgrade = () => {\n\tvoid uiStore.goToUpgrade('workflow-history', 'upgrade-workflow-history');\n};\n\nwatchEffect(async () => {\n\tif (!versionId.value) {\n\t\treturn;\n\t}\n\ttry {\n\t\tactiveWorkflowVersion.value = await workflowHistoryStore.getWorkflowVersion(\n\t\t\tworkflowId.value,\n\t\t\tversionId.value,\n\t\t);\n\t\tsendTelemetry('User selected version');\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\tnew Error(`${error.message} \"${versionId.value}\"&nbsp;`),\n\t\t\ti18n.baseText('workflowHistory.title'),\n\t\t);\n\t}\n\n\ttry {\n\t\tactiveWorkflow.value = await workflowsStore.fetchWorkflow(workflowId.value);\n\t} catch (error) {\n\t\tcanRender.value = false;\n\t\ttoast.showError(error, i18n.baseText('workflowHistory.title'));\n\t}\n});\n</script>\n<template>\n\t<div :class=\"$style.view\">\n\t\t<n8n-heading :class=\"$style.header\" tag=\"h2\" size=\"medium\">\n\t\t\t{{ activeWorkflow?.name }}\n\t\t</n8n-heading>\n\t\t<div :class=\"$style.corner\">\n\t\t\t<n8n-heading tag=\"h2\" size=\"medium\" bold>\n\t\t\t\t{{ i18n.baseText('workflowHistory.title') }}\n\t\t\t</n8n-heading>\n\t\t\t<router-link :to=\"editorRoute\" data-test-id=\"workflow-history-close-button\">\n\t\t\t\t<n8n-button type=\"tertiary\" icon=\"times\" size=\"small\" text square />\n\t\t\t</router-link>\n\t\t</div>\n\t\t<div :class=\"$style.listComponentWrapper\">\n\t\t\t<WorkflowHistoryList\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:items=\"workflowHistory\"\n\t\t\t\t:last-received-items-length=\"lastReceivedItemsLength\"\n\t\t\t\t:active-item=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:request-number-of-items=\"requestNumberOfItems\"\n\t\t\t\t:should-upgrade=\"workflowHistoryStore.shouldUpgrade\"\n\t\t\t\t:evaluated-prune-time=\"evaluatedPruneTime\"\n\t\t\t\t:is-list-loading=\"isListLoading\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t\t@preview=\"onPreview\"\n\t\t\t\t@load-more=\"loadMore\"\n\t\t\t\t@upgrade=\"onUpgrade\"\n\t\t\t/>\n\t\t</div>\n\t\t<div :class=\"$style.contentComponentWrapper\">\n\t\t\t<WorkflowHistoryContent\n\t\t\t\tv-if=\"canRender\"\n\t\t\t\t:workflow=\"activeWorkflow\"\n\t\t\t\t:workflow-version=\"activeWorkflowVersion\"\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:is-list-loading=\"isListLoading\"\n\t\t\t\t:is-first-item-shown=\"isFirstItemShown\"\n\t\t\t\t@action=\"onAction\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n<style module lang=\"scss\">\n.view {\n\tposition: relative;\n\tdisplay: grid;\n\twidth: 100%;\n\tgrid-template-areas: 'header corner' 'content list';\n\tgrid-template-columns: auto 330px;\n\tgrid-template-rows: 65px auto;\n\tbackground-color: var(--color-background-xlight);\n}\n\n.header {\n\tgrid-area: header;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 var(--spacing-l);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.corner {\n\tgrid-area: corner;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 0 var(--spacing-3xs) 0 var(--spacing-s);\n\tbackground-color: var(--color-background-lighter);\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n\tborder-left: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.contentComponentWrapper {\n\tgrid-area: content;\n\tposition: relative;\n}\n\n.listComponentWrapper {\n\tgrid-area: list;\n\tposition: relative;\n\n\t&::before {\n\t\tcontent: '';\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\twidth: var(--border-width-base);\n\t\tbackground-color: var(--color-foreground-base);\n\t}\n}\n</style>\n"],"names":["props","__props","emit","__emit","i18n","useI18n","actionsVisible","ref","itemElement","authorElement","isAuthorElementTruncated","formattedCreatedAt","computed","currentYear","date","time","dateformat","authors","allAuthors","label","idLabel","onAction","action","onVisibleChange","visible","onItemClick","event","onMounted","_a","_b","_c","listElement","shouldAutoScroll","observer","getActions","index","observeElement","element","entry","id","data","onPreview","onItemMounted","offsetTop","isActive","workflowVersionPreview","pinData","workflow","actions","getWorkflowHistory","context","workflowId","queryParams","get","getWorkflowVersion","versionId","useWorkflowHistoryStore","defineStore","rootStore","useRootStore","settingsStore","useSettingsStore","workflowsStore","useWorkflowsStore","licensePruneTime","pruneTime","evaluatedPruneTime","shouldUpgrade","whApi.getWorkflowHistory","whApi.getWorkflowVersion","workflowVersionId","workflowVersion","connections","nodes","blob","saveAs","name","newWorkflow","getNewWorkflow","newWorkflowData","shouldDeactivate","updateData","error","workflowHistoryActionTypes","WORKFLOW_HISTORY_ACTIONS","record","key","route","useRoute","router","useRouter","toast","useToast","workflowHistoryStore","uiStore","useUIStore","canRender","isListLoading","requestNumberOfItems","lastReceivedItemsLength","activeWorkflow","workflowHistory","activeWorkflowVersion","normalizeSingleRouteParam","editorRoute","VIEWS","value","isFirstItemShown","sendTelemetry","telemetry","loadMore","history","onBeforeMount","param","openInNewTab","href","openRestorationModal","isWorkflowActivated","resolve","reject","buttons","WORKFLOW_HISTORY_VERSION_RESTORE","cloneWorkflowVersion","clonedWorkflow","h","restoreWorkflowVersion","modalAction","onUpgrade","watchEffect"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{Y as w,$ as d,j as f,V as a,x as u}from"./index-Dtri_pSJ.js";import{G as g,aH as W,az as k,b as _,l as b,m as L}from"./vendor-Dv5OeN6t.js";import"./pinia-sugP77Im.js";import"./n8n-4UEsHtUL.js";import"./axios-Mm4CS0gO.js";import"./esprima-next-nhoSXAeq.js";import"./luxon-CLwAIbs0.js";import"./lodash-es-CZ1inz46.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const X=g({__name:"WorkflowOnboardingView",setup(O){const r=w(),i=d(),n=f(),e=W(),p=k(),s=u(),m=async o=>{try{r.startLoading();const t=await i.getFixedWorkflowTemplate(o);if(!t)throw new Error;const c=s.baseText("onboarding.title",{interpolate:{name:t.name}}),l=await n.createNewWorkflow({name:c,connections:t.workflow.connections,nodes:t.workflow.nodes.map(n.convertTemplateNodeToNodeUi),pinData:t.workflow.pinData,settings:t.workflow.settings,meta:{onboardingId:o}});await e.replace({name:a.WORKFLOW,params:{name:l.id},query:{onboardingId:o}}),r.stopLoading()}catch{throw await e.replace({name:a.NEW_WORKFLOW}),r.stopLoading(),new Error(`Could not load onboarding template ${o}`)}};return _(async()=>{const o=p.params.id;if(!o||typeof o!="string"){await e.replace({name:a.NEW_WORKFLOW});return}await m(o)}),(o,t)=>(b(),L("div"))}});export{X as default};
2
- //# sourceMappingURL=WorkflowOnboardingView-BPMBW_hz.js.map
1
+ import{Y as w,$ as d,j as f,V as a,x as u}from"./index-1OxaEeO3.js";import{G as g,aH as W,az as k,b as _,l as b,m as L}from"./vendor-Dv5OeN6t.js";import"./pinia-sugP77Im.js";import"./n8n-4UEsHtUL.js";import"./axios-Mm4CS0gO.js";import"./esprima-next-nhoSXAeq.js";import"./luxon-CLwAIbs0.js";import"./lodash-es-CZ1inz46.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const X=g({__name:"WorkflowOnboardingView",setup(O){const r=w(),i=d(),n=f(),e=W(),p=k(),s=u(),m=async o=>{try{r.startLoading();const t=await i.getFixedWorkflowTemplate(o);if(!t)throw new Error;const c=s.baseText("onboarding.title",{interpolate:{name:t.name}}),l=await n.createNewWorkflow({name:c,connections:t.workflow.connections,nodes:t.workflow.nodes.map(n.convertTemplateNodeToNodeUi),pinData:t.workflow.pinData,settings:t.workflow.settings,meta:{onboardingId:o}});await e.replace({name:a.WORKFLOW,params:{name:l.id},query:{onboardingId:o}}),r.stopLoading()}catch{throw await e.replace({name:a.NEW_WORKFLOW}),r.stopLoading(),new Error(`Could not load onboarding template ${o}`)}};return _(async()=>{const o=p.params.id;if(!o||typeof o!="string"){await e.replace({name:a.NEW_WORKFLOW});return}await m(o)}),(o,t)=>(b(),L("div"))}});export{X as default};
2
+ //# sourceMappingURL=WorkflowOnboardingView-Bu_Oqtr7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowOnboardingView-BPMBW_hz.js","sources":["../../src/views/WorkflowOnboardingView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS } from '@/constants';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { onMounted } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nconst loadingService = useLoadingService();\nconst templateStore = useTemplatesStore();\nconst workflowsStore = useWorkflowsStore();\nconst router = useRouter();\nconst route = useRoute();\nconst i18n = useI18n();\n\nconst openWorkflowTemplate = async (templateId: string) => {\n\ttry {\n\t\tloadingService.startLoading();\n\t\tconst template = await templateStore.getFixedWorkflowTemplate(templateId);\n\t\tif (!template) {\n\t\t\tthrow new Error();\n\t\t}\n\n\t\tconst name: string = i18n.baseText('onboarding.title', {\n\t\t\tinterpolate: { name: template.name },\n\t\t});\n\n\t\tconst workflow = await workflowsStore.createNewWorkflow({\n\t\t\tname,\n\t\t\tconnections: template.workflow.connections,\n\t\t\tnodes: template.workflow.nodes.map(workflowsStore.convertTemplateNodeToNodeUi),\n\t\t\tpinData: template.workflow.pinData,\n\t\t\tsettings: template.workflow.settings,\n\t\t\tmeta: {\n\t\t\t\tonboardingId: templateId,\n\t\t\t},\n\t\t});\n\n\t\tawait router.replace({\n\t\t\tname: VIEWS.WORKFLOW,\n\t\t\tparams: { name: workflow.id },\n\t\t\tquery: { onboardingId: templateId },\n\t\t});\n\n\t\tloadingService.stopLoading();\n\t} catch (e) {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\tloadingService.stopLoading();\n\n\t\tthrow new Error(`Could not load onboarding template ${templateId}`); // sentry reporing\n\t}\n};\n\nonMounted(async () => {\n\tconst templateId = route.params.id;\n\tif (!templateId || typeof templateId !== 'string') {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\treturn;\n\t}\n\n\tawait openWorkflowTemplate(templateId);\n});\n</script>\n\n<template>\n\t<div></div>\n</template>\n\n<style lang=\"scss\" module></style>\n"],"names":["loadingService","useLoadingService","templateStore","useTemplatesStore","workflowsStore","useWorkflowsStore","router","useRouter","route","useRoute","i18n","useI18n","openWorkflowTemplate","templateId","template","name","workflow","VIEWS","onMounted"],"mappings":"woCASA,MAAMA,EAAiBC,IACjBC,EAAgBC,IAChBC,EAAiBC,IACjBC,EAASC,IACTC,EAAQC,IACRC,EAAOC,IAEPC,EAAuB,MAAOC,GAAuB,CACtD,GAAA,CACHb,EAAe,aAAa,EAC5B,MAAMc,EAAW,MAAMZ,EAAc,yBAAyBW,CAAU,EACxE,GAAI,CAACC,EACJ,MAAM,IAAI,MAGL,MAAAC,EAAeL,EAAK,SAAS,mBAAoB,CACtD,YAAa,CAAE,KAAMI,EAAS,IAAK,CAAA,CACnC,EAEKE,EAAW,MAAMZ,EAAe,kBAAkB,CACvD,KAAAW,EACA,YAAaD,EAAS,SAAS,YAC/B,MAAOA,EAAS,SAAS,MAAM,IAAIV,EAAe,2BAA2B,EAC7E,QAASU,EAAS,SAAS,QAC3B,SAAUA,EAAS,SAAS,SAC5B,KAAM,CACL,aAAcD,CACf,CAAA,CACA,EAED,MAAMP,EAAO,QAAQ,CACpB,KAAMW,EAAM,SACZ,OAAQ,CAAE,KAAMD,EAAS,EAAG,EAC5B,MAAO,CAAE,aAAcH,CAAW,CAAA,CAClC,EAEDb,EAAe,YAAY,OAChB,CACX,YAAMM,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjDjB,EAAe,YAAY,EAErB,IAAI,MAAM,sCAAsCa,CAAU,EAAE,CACnE,CAAA,EAGD,OAAAK,EAAU,SAAY,CACf,MAAAL,EAAaL,EAAM,OAAO,GAChC,GAAI,CAACK,GAAc,OAAOA,GAAe,SAAU,CAClD,MAAMP,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjD,MACD,CAEA,MAAML,EAAqBC,CAAU,CAAA,CACrC"}
1
+ {"version":3,"file":"WorkflowOnboardingView-Bu_Oqtr7.js","sources":["../../src/views/WorkflowOnboardingView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS } from '@/constants';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { onMounted } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nconst loadingService = useLoadingService();\nconst templateStore = useTemplatesStore();\nconst workflowsStore = useWorkflowsStore();\nconst router = useRouter();\nconst route = useRoute();\nconst i18n = useI18n();\n\nconst openWorkflowTemplate = async (templateId: string) => {\n\ttry {\n\t\tloadingService.startLoading();\n\t\tconst template = await templateStore.getFixedWorkflowTemplate(templateId);\n\t\tif (!template) {\n\t\t\tthrow new Error();\n\t\t}\n\n\t\tconst name: string = i18n.baseText('onboarding.title', {\n\t\t\tinterpolate: { name: template.name },\n\t\t});\n\n\t\tconst workflow = await workflowsStore.createNewWorkflow({\n\t\t\tname,\n\t\t\tconnections: template.workflow.connections,\n\t\t\tnodes: template.workflow.nodes.map(workflowsStore.convertTemplateNodeToNodeUi),\n\t\t\tpinData: template.workflow.pinData,\n\t\t\tsettings: template.workflow.settings,\n\t\t\tmeta: {\n\t\t\t\tonboardingId: templateId,\n\t\t\t},\n\t\t});\n\n\t\tawait router.replace({\n\t\t\tname: VIEWS.WORKFLOW,\n\t\t\tparams: { name: workflow.id },\n\t\t\tquery: { onboardingId: templateId },\n\t\t});\n\n\t\tloadingService.stopLoading();\n\t} catch (e) {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\tloadingService.stopLoading();\n\n\t\tthrow new Error(`Could not load onboarding template ${templateId}`); // sentry reporing\n\t}\n};\n\nonMounted(async () => {\n\tconst templateId = route.params.id;\n\tif (!templateId || typeof templateId !== 'string') {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\treturn;\n\t}\n\n\tawait openWorkflowTemplate(templateId);\n});\n</script>\n\n<template>\n\t<div></div>\n</template>\n\n<style lang=\"scss\" module></style>\n"],"names":["loadingService","useLoadingService","templateStore","useTemplatesStore","workflowsStore","useWorkflowsStore","router","useRouter","route","useRoute","i18n","useI18n","openWorkflowTemplate","templateId","template","name","workflow","VIEWS","onMounted"],"mappings":"woCASA,MAAMA,EAAiBC,IACjBC,EAAgBC,IAChBC,EAAiBC,IACjBC,EAASC,IACTC,EAAQC,IACRC,EAAOC,IAEPC,EAAuB,MAAOC,GAAuB,CACtD,GAAA,CACHb,EAAe,aAAa,EAC5B,MAAMc,EAAW,MAAMZ,EAAc,yBAAyBW,CAAU,EACxE,GAAI,CAACC,EACJ,MAAM,IAAI,MAGL,MAAAC,EAAeL,EAAK,SAAS,mBAAoB,CACtD,YAAa,CAAE,KAAMI,EAAS,IAAK,CAAA,CACnC,EAEKE,EAAW,MAAMZ,EAAe,kBAAkB,CACvD,KAAAW,EACA,YAAaD,EAAS,SAAS,YAC/B,MAAOA,EAAS,SAAS,MAAM,IAAIV,EAAe,2BAA2B,EAC7E,QAASU,EAAS,SAAS,QAC3B,SAAUA,EAAS,SAAS,SAC5B,KAAM,CACL,aAAcD,CACf,CAAA,CACA,EAED,MAAMP,EAAO,QAAQ,CACpB,KAAMW,EAAM,SACZ,OAAQ,CAAE,KAAMD,EAAS,EAAG,EAC5B,MAAO,CAAE,aAAcH,CAAW,CAAA,CAClC,EAEDb,EAAe,YAAY,OAChB,CACX,YAAMM,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjDjB,EAAe,YAAY,EAErB,IAAI,MAAM,sCAAsCa,CAAU,EAAE,CACnE,CAAA,EAGD,OAAAK,EAAU,SAAY,CACf,MAAAL,EAAaL,EAAM,OAAO,GAChC,GAAI,CAACK,GAAc,OAAOA,GAAe,SAAU,CAClD,MAAMP,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjD,MACD,CAEA,MAAML,EAAqBC,CAAU,CAAA,CACrC"}
@@ -1,2 +1,2 @@
1
- import{u as $,K as b,x as B}from"./index-Dtri_pSJ.js";import{G as A,r as a,e as M,b as C,y as J,d as f,ag as P,l as m,m as v,I as d,U as V,R,p as U}from"./vendor-Dv5OeN6t.js";import{_ as X}from"./n8n-4UEsHtUL.js";const Y=["src"],j=A({__name:"WorkflowPreview",props:{loading:{type:Boolean,default:!1},mode:{default:"workflow"},workflow:{default:void 0},executionId:{default:void 0},executionMode:{default:void 0},loaderType:{default:"image"},canOpenNDV:{type:Boolean,default:!0},hideNodeIssues:{type:Boolean,default:!1}},emits:["close"],setup(I,{emit:D}){const e=I,T=D,s=B(),p=$(),k=b(),l=a(null),c=a(!1),y=a(!1),u=a(!1),_=a(0),E=a(0),O=M(()=>`${window.BASE_PATH??"/"}workflows/demo`),t=M(()=>!e.loading&&(e.mode==="workflow"&&!!e.workflow||e.mode==="execution"&&!!e.executionId)&&y.value),x=()=>{var o,n,r;try{if(!e.workflow)throw new Error(s.baseText("workflowPreview.showError.missingWorkflow"));if(!e.workflow.nodes||!Array.isArray(e.workflow.nodes))throw new Error(s.baseText("workflowPreview.showError.arrayEmpty"));(r=(n=(o=l.value)==null?void 0:o.contentWindow)==null?void 0:n.postMessage)==null||r.call(n,JSON.stringify({command:"openWorkflow",workflow:e.workflow,canOpenNDV:e.canOpenNDV,hideNodeIssues:e.hideNodeIssues}),"*")}catch(i){p.showError(i,s.baseText("workflowPreview.showError.previewError.title"),s.baseText("workflowPreview.showError.previewError.message"))}},g=()=>{var o,n,r,i,w,z;try{if(!e.executionId)throw new Error(s.baseText("workflowPreview.showError.missingExecution"));(r=(n=(o=l.value)==null?void 0:o.contentWindow)==null?void 0:n.postMessage)==null||r.call(n,JSON.stringify({command:"openExecution",executionId:e.executionId,executionMode:e.executionMode??"",canOpenNDV:e.canOpenNDV}),"*"),k.activeExecution&&((z=(w=(i=l.value)==null?void 0:i.contentWindow)==null?void 0:w.postMessage)==null||z.call(w,JSON.stringify({command:"setActiveExecution",executionId:k.activeExecution.id}),"*"))}catch(W){p.showError(W,s.baseText("workflowPreview.showError.previewError.title"),s.baseText("workflowPreview.executionMode.showError.previewError.message"))}},L=()=>{u.value=!0,_.value=window.scrollX,E.value=window.scrollY},S=()=>{u.value=!1},h=({data:o})=>{var n;if((n=o==null?void 0:o.includes)!=null&&n.call(o,'"command"'))try{const r=JSON.parse(o);r.command==="n8nReady"?y.value=!0:r.command==="openNDV"?c.value=!0:r.command==="closeNDV"?c.value=!1:r.command==="error"&&T("close")}catch(r){console.error(r)}},N=()=>{u.value&&window.scrollTo(_.value,E.value)};return C(()=>{window.addEventListener("message",h),document.addEventListener("scroll",N)}),J(()=>{window.removeEventListener("message",h),document.removeEventListener("scroll",N)}),f(()=>t.value,()=>{t.value&&(e.mode==="workflow"?x():e.mode==="execution"&&g())}),f(()=>e.executionId,()=>{e.mode==="execution"&&e.executionId&&g()}),f(()=>e.workflow,()=>{e.mode==="workflow"&&e.workflow&&x()}),(o,n)=>{const r=P("n8n-loading"),i=P("n8n-spinner");return m(),v("div",{class:d(o.$style.container)},[o.loaderType==="image"&&!t.value?(m(),v("div",{key:0,class:d(o.$style.imageLoader)},[V(r,{loading:!t.value,rows:1,variant:"image"},null,8,["loading"])],2)):o.loaderType==="spinner"&&!t.value?(m(),v("div",{key:1,class:d(o.$style.spinner)},[V(i,{type:"dots"})],2)):R("",!0),U("iframe",{ref_key:"iframeRef",ref:l,class:d({[o.$style.workflow]:!c.value,[o.$style.executionPreview]:o.mode==="execution",[o.$style.openNDV]:c.value,[o.$style.show]:t.value}),src:O.value,"data-test-id":"workflow-preview-iframe",onMouseenter:L,onMouseleave:S},null,42,Y)],2)}}}),G="_container_tdzzv_1",H="_workflow_tdzzv_8",K="_show_tdzzv_14",q="_openNDV_tdzzv_20",F="_spinner_tdzzv_29",Q="_imageLoader_tdzzv_37",Z="_executionPreview_tdzzv_45",ee={container:G,workflow:H,show:K,openNDV:q,spinner:F,imageLoader:Q,executionPreview:Z},oe={$style:ee},te=X(j,[["__cssModules",oe]]);export{te as W};
2
- //# sourceMappingURL=WorkflowPreview-CLzyAzmJ.js.map
1
+ import{u as $,L as b,x as B}from"./index-1OxaEeO3.js";import{G as A,r as a,e as M,b as C,y as J,d as f,ag as P,l as m,m as v,I as d,U as V,R,p as U}from"./vendor-Dv5OeN6t.js";import{_ as X}from"./n8n-4UEsHtUL.js";const Y=["src"],j=A({__name:"WorkflowPreview",props:{loading:{type:Boolean,default:!1},mode:{default:"workflow"},workflow:{default:void 0},executionId:{default:void 0},executionMode:{default:void 0},loaderType:{default:"image"},canOpenNDV:{type:Boolean,default:!0},hideNodeIssues:{type:Boolean,default:!1}},emits:["close"],setup(I,{emit:D}){const e=I,T=D,s=B(),p=$(),k=b(),l=a(null),c=a(!1),y=a(!1),u=a(!1),_=a(0),E=a(0),L=M(()=>`${window.BASE_PATH??"/"}workflows/demo`),t=M(()=>!e.loading&&(e.mode==="workflow"&&!!e.workflow||e.mode==="execution"&&!!e.executionId)&&y.value),x=()=>{var o,n,r;try{if(!e.workflow)throw new Error(s.baseText("workflowPreview.showError.missingWorkflow"));if(!e.workflow.nodes||!Array.isArray(e.workflow.nodes))throw new Error(s.baseText("workflowPreview.showError.arrayEmpty"));(r=(n=(o=l.value)==null?void 0:o.contentWindow)==null?void 0:n.postMessage)==null||r.call(n,JSON.stringify({command:"openWorkflow",workflow:e.workflow,canOpenNDV:e.canOpenNDV,hideNodeIssues:e.hideNodeIssues}),"*")}catch(i){p.showError(i,s.baseText("workflowPreview.showError.previewError.title"),s.baseText("workflowPreview.showError.previewError.message"))}},g=()=>{var o,n,r,i,w,z;try{if(!e.executionId)throw new Error(s.baseText("workflowPreview.showError.missingExecution"));(r=(n=(o=l.value)==null?void 0:o.contentWindow)==null?void 0:n.postMessage)==null||r.call(n,JSON.stringify({command:"openExecution",executionId:e.executionId,executionMode:e.executionMode??"",canOpenNDV:e.canOpenNDV}),"*"),k.activeExecution&&((z=(w=(i=l.value)==null?void 0:i.contentWindow)==null?void 0:w.postMessage)==null||z.call(w,JSON.stringify({command:"setActiveExecution",executionId:k.activeExecution.id}),"*"))}catch(W){p.showError(W,s.baseText("workflowPreview.showError.previewError.title"),s.baseText("workflowPreview.executionMode.showError.previewError.message"))}},O=()=>{u.value=!0,_.value=window.scrollX,E.value=window.scrollY},S=()=>{u.value=!1},h=({data:o})=>{var n;if((n=o==null?void 0:o.includes)!=null&&n.call(o,'"command"'))try{const r=JSON.parse(o);r.command==="n8nReady"?y.value=!0:r.command==="openNDV"?c.value=!0:r.command==="closeNDV"?c.value=!1:r.command==="error"&&T("close")}catch(r){console.error(r)}},N=()=>{u.value&&window.scrollTo(_.value,E.value)};return C(()=>{window.addEventListener("message",h),document.addEventListener("scroll",N)}),J(()=>{window.removeEventListener("message",h),document.removeEventListener("scroll",N)}),f(()=>t.value,()=>{t.value&&(e.mode==="workflow"?x():e.mode==="execution"&&g())}),f(()=>e.executionId,()=>{e.mode==="execution"&&e.executionId&&g()}),f(()=>e.workflow,()=>{e.mode==="workflow"&&e.workflow&&x()}),(o,n)=>{const r=P("n8n-loading"),i=P("n8n-spinner");return m(),v("div",{class:d(o.$style.container)},[o.loaderType==="image"&&!t.value?(m(),v("div",{key:0,class:d(o.$style.imageLoader)},[V(r,{loading:!t.value,rows:1,variant:"image"},null,8,["loading"])],2)):o.loaderType==="spinner"&&!t.value?(m(),v("div",{key:1,class:d(o.$style.spinner)},[V(i,{type:"dots"})],2)):R("",!0),U("iframe",{ref_key:"iframeRef",ref:l,class:d({[o.$style.workflow]:!c.value,[o.$style.executionPreview]:o.mode==="execution",[o.$style.openNDV]:c.value,[o.$style.show]:t.value}),src:L.value,"data-test-id":"workflow-preview-iframe",onMouseenter:O,onMouseleave:S},null,42,Y)],2)}}}),G="_container_tdzzv_1",H="_workflow_tdzzv_8",q="_show_tdzzv_14",F="_openNDV_tdzzv_20",K="_spinner_tdzzv_29",Q="_imageLoader_tdzzv_37",Z="_executionPreview_tdzzv_45",ee={container:G,workflow:H,show:q,openNDV:F,spinner:K,imageLoader:Q,executionPreview:Z},oe={$style:ee},te=X(j,[["__cssModules",oe]]);export{te as W};
2
+ //# sourceMappingURL=WorkflowPreview-CVwpKdpj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowPreview-CLzyAzmJ.js","sources":["../../src/components/WorkflowPreview.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.container\">\n\t\t<div v-if=\"loaderType === 'image' && !showPreview\" :class=\"$style.imageLoader\">\n\t\t\t<n8n-loading :loading=\"!showPreview\" :rows=\"1\" variant=\"image\" />\n\t\t</div>\n\t\t<div v-else-if=\"loaderType === 'spinner' && !showPreview\" :class=\"$style.spinner\">\n\t\t\t<n8n-spinner type=\"dots\" />\n\t\t</div>\n\t\t<iframe\n\t\t\tref=\"iframeRef\"\n\t\t\t:class=\"{\n\t\t\t\t[$style.workflow]: !nodeViewDetailsOpened,\n\t\t\t\t[$style.executionPreview]: mode === 'execution',\n\t\t\t\t[$style.openNDV]: nodeViewDetailsOpened,\n\t\t\t\t[$style.show]: showPreview,\n\t\t\t}\"\n\t\t\t:src=\"iframeSrc\"\n\t\t\tdata-test-id=\"workflow-preview-iframe\"\n\t\t\t@mouseenter=\"onMouseEnter\"\n\t\t\t@mouseleave=\"onMouseLeave\"\n\t\t/>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, onBeforeUnmount, ref, computed, watch } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type { IWorkflowDb, IWorkflowTemplate } from '@/Interface';\nimport { useExecutionsStore } from '@/stores/executions.store';\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tloading?: boolean;\n\t\tmode?: 'workflow' | 'execution';\n\t\tworkflow?: IWorkflowDb | IWorkflowTemplate['workflow'];\n\t\texecutionId?: string;\n\t\texecutionMode?: string;\n\t\tloaderType?: 'image' | 'spinner';\n\t\tcanOpenNDV?: boolean;\n\t\thideNodeIssues?: boolean;\n\t}>(),\n\t{\n\t\tloading: false,\n\t\tmode: 'workflow',\n\t\tworkflow: undefined,\n\t\texecutionId: undefined,\n\t\texecutionMode: undefined,\n\t\tloaderType: 'image',\n\t\tcanOpenNDV: true,\n\t\thideNodeIssues: false,\n\t},\n);\n\nconst emit = defineEmits<{\n\t(event: 'close'): void;\n}>();\n\nconst i18n = useI18n();\nconst toast = useToast();\nconst executionsStore = useExecutionsStore();\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null);\nconst nodeViewDetailsOpened = ref(false);\nconst ready = ref(false);\nconst insideIframe = ref(false);\nconst scrollX = ref(0);\nconst scrollY = ref(0);\n\nconst iframeSrc = computed(() => {\n\treturn `${window.BASE_PATH ?? '/'}workflows/demo`;\n});\n\nconst showPreview = computed(() => {\n\treturn (\n\t\t!props.loading &&\n\t\t((props.mode === 'workflow' && !!props.workflow) ||\n\t\t\t(props.mode === 'execution' && !!props.executionId)) &&\n\t\tready.value\n\t);\n});\n\nconst loadWorkflow = () => {\n\ttry {\n\t\tif (!props.workflow) {\n\t\t\tthrow new Error(i18n.baseText('workflowPreview.showError.missingWorkflow'));\n\t\t}\n\t\tif (!props.workflow.nodes || !Array.isArray(props.workflow.nodes)) {\n\t\t\tthrow new Error(i18n.baseText('workflowPreview.showError.arrayEmpty'));\n\t\t}\n\t\tiframeRef.value?.contentWindow?.postMessage?.(\n\t\t\tJSON.stringify({\n\t\t\t\tcommand: 'openWorkflow',\n\t\t\t\tworkflow: props.workflow,\n\t\t\t\tcanOpenNDV: props.canOpenNDV,\n\t\t\t\thideNodeIssues: props.hideNodeIssues,\n\t\t\t}),\n\t\t\t'*',\n\t\t);\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowPreview.showError.previewError.title'),\n\t\t\ti18n.baseText('workflowPreview.showError.previewError.message'),\n\t\t);\n\t}\n};\n\nconst loadExecution = () => {\n\ttry {\n\t\tif (!props.executionId) {\n\t\t\tthrow new Error(i18n.baseText('workflowPreview.showError.missingExecution'));\n\t\t}\n\t\tiframeRef.value?.contentWindow?.postMessage?.(\n\t\t\tJSON.stringify({\n\t\t\t\tcommand: 'openExecution',\n\t\t\t\texecutionId: props.executionId,\n\t\t\t\texecutionMode: props.executionMode ?? '',\n\t\t\t\tcanOpenNDV: props.canOpenNDV,\n\t\t\t}),\n\t\t\t'*',\n\t\t);\n\n\t\tif (executionsStore.activeExecution) {\n\t\t\tiframeRef.value?.contentWindow?.postMessage?.(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tcommand: 'setActiveExecution',\n\t\t\t\t\texecutionId: executionsStore.activeExecution.id,\n\t\t\t\t}),\n\t\t\t\t'*',\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowPreview.showError.previewError.title'),\n\t\t\ti18n.baseText('workflowPreview.executionMode.showError.previewError.message'),\n\t\t);\n\t}\n};\n\nconst onMouseEnter = () => {\n\tinsideIframe.value = true;\n\tscrollX.value = window.scrollX;\n\tscrollY.value = window.scrollY;\n};\nconst onMouseLeave = () => {\n\tinsideIframe.value = false;\n};\n\nconst receiveMessage = ({ data }: MessageEvent) => {\n\tif (!data?.includes?.('\"command\"')) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst json = JSON.parse(data);\n\t\tif (json.command === 'n8nReady') {\n\t\t\tready.value = true;\n\t\t} else if (json.command === 'openNDV') {\n\t\t\tnodeViewDetailsOpened.value = true;\n\t\t} else if (json.command === 'closeNDV') {\n\t\t\tnodeViewDetailsOpened.value = false;\n\t\t} else if (json.command === 'error') {\n\t\t\temit('close');\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\nconst onDocumentScroll = () => {\n\tif (insideIframe.value) {\n\t\twindow.scrollTo(scrollX.value, scrollY.value);\n\t}\n};\n\nonMounted(() => {\n\twindow.addEventListener('message', receiveMessage);\n\tdocument.addEventListener('scroll', onDocumentScroll);\n});\n\nonBeforeUnmount(() => {\n\twindow.removeEventListener('message', receiveMessage);\n\tdocument.removeEventListener('scroll', onDocumentScroll);\n});\n\nwatch(\n\t() => showPreview.value,\n\t() => {\n\t\tif (showPreview.value) {\n\t\t\tif (props.mode === 'workflow') {\n\t\t\t\tloadWorkflow();\n\t\t\t} else if (props.mode === 'execution') {\n\t\t\t\tloadExecution();\n\t\t\t}\n\t\t}\n\t},\n);\n\nwatch(\n\t() => props.executionId,\n\t() => {\n\t\tif (props.mode === 'execution' && props.executionId) {\n\t\t\tloadExecution();\n\t\t}\n\t},\n);\n\nwatch(\n\t() => props.workflow,\n\t() => {\n\t\tif (props.mode === 'workflow' && props.workflow) {\n\t\t\tloadWorkflow();\n\t\t}\n\t},\n);\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.workflow {\n\t// firefox bug requires loading iframe as such\n\tvisibility: hidden;\n\theight: 0;\n\twidth: 0;\n}\n\n.show {\n\tvisibility: visible;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.openNDV {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\theight: 100%;\n\twidth: 100%;\n\tz-index: 9999999;\n}\n\n.spinner {\n\tcolor: var(--color-primary);\n\tposition: absolute;\n\ttop: 50% !important;\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY(-50%);\n}\n\n.imageLoader {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 100%;\n}\n\n.executionPreview {\n\theight: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","i18n","useI18n","toast","useToast","executionsStore","useExecutionsStore","iframeRef","ref","nodeViewDetailsOpened","ready","insideIframe","scrollX","scrollY","iframeSrc","computed","showPreview","loadWorkflow","_c","_b","_a","error","loadExecution","_f","_e","_d","onMouseEnter","onMouseLeave","receiveMessage","data","json","e","onDocumentScroll","onMounted","onBeforeUnmount","watch"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowPreview-CVwpKdpj.js","sources":["../../src/components/WorkflowPreview.vue"],"sourcesContent":["<template>\n\t<div :class=\"$style.container\">\n\t\t<div v-if=\"loaderType === 'image' && !showPreview\" :class=\"$style.imageLoader\">\n\t\t\t<n8n-loading :loading=\"!showPreview\" :rows=\"1\" variant=\"image\" />\n\t\t</div>\n\t\t<div v-else-if=\"loaderType === 'spinner' && !showPreview\" :class=\"$style.spinner\">\n\t\t\t<n8n-spinner type=\"dots\" />\n\t\t</div>\n\t\t<iframe\n\t\t\tref=\"iframeRef\"\n\t\t\t:class=\"{\n\t\t\t\t[$style.workflow]: !nodeViewDetailsOpened,\n\t\t\t\t[$style.executionPreview]: mode === 'execution',\n\t\t\t\t[$style.openNDV]: nodeViewDetailsOpened,\n\t\t\t\t[$style.show]: showPreview,\n\t\t\t}\"\n\t\t\t:src=\"iframeSrc\"\n\t\t\tdata-test-id=\"workflow-preview-iframe\"\n\t\t\t@mouseenter=\"onMouseEnter\"\n\t\t\t@mouseleave=\"onMouseLeave\"\n\t\t/>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, onBeforeUnmount, ref, computed, watch } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport type { IWorkflowDb, IWorkflowTemplate } from '@/Interface';\nimport { useExecutionsStore } from '@/stores/executions.store';\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tloading?: boolean;\n\t\tmode?: 'workflow' | 'execution';\n\t\tworkflow?: IWorkflowDb | IWorkflowTemplate['workflow'];\n\t\texecutionId?: string;\n\t\texecutionMode?: string;\n\t\tloaderType?: 'image' | 'spinner';\n\t\tcanOpenNDV?: boolean;\n\t\thideNodeIssues?: boolean;\n\t}>(),\n\t{\n\t\tloading: false,\n\t\tmode: 'workflow',\n\t\tworkflow: undefined,\n\t\texecutionId: undefined,\n\t\texecutionMode: undefined,\n\t\tloaderType: 'image',\n\t\tcanOpenNDV: true,\n\t\thideNodeIssues: false,\n\t},\n);\n\nconst emit = defineEmits<{\n\t(event: 'close'): void;\n}>();\n\nconst i18n = useI18n();\nconst toast = useToast();\nconst executionsStore = useExecutionsStore();\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null);\nconst nodeViewDetailsOpened = ref(false);\nconst ready = ref(false);\nconst insideIframe = ref(false);\nconst scrollX = ref(0);\nconst scrollY = ref(0);\n\nconst iframeSrc = computed(() => {\n\treturn `${window.BASE_PATH ?? '/'}workflows/demo`;\n});\n\nconst showPreview = computed(() => {\n\treturn (\n\t\t!props.loading &&\n\t\t((props.mode === 'workflow' && !!props.workflow) ||\n\t\t\t(props.mode === 'execution' && !!props.executionId)) &&\n\t\tready.value\n\t);\n});\n\nconst loadWorkflow = () => {\n\ttry {\n\t\tif (!props.workflow) {\n\t\t\tthrow new Error(i18n.baseText('workflowPreview.showError.missingWorkflow'));\n\t\t}\n\t\tif (!props.workflow.nodes || !Array.isArray(props.workflow.nodes)) {\n\t\t\tthrow new Error(i18n.baseText('workflowPreview.showError.arrayEmpty'));\n\t\t}\n\t\tiframeRef.value?.contentWindow?.postMessage?.(\n\t\t\tJSON.stringify({\n\t\t\t\tcommand: 'openWorkflow',\n\t\t\t\tworkflow: props.workflow,\n\t\t\t\tcanOpenNDV: props.canOpenNDV,\n\t\t\t\thideNodeIssues: props.hideNodeIssues,\n\t\t\t}),\n\t\t\t'*',\n\t\t);\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowPreview.showError.previewError.title'),\n\t\t\ti18n.baseText('workflowPreview.showError.previewError.message'),\n\t\t);\n\t}\n};\n\nconst loadExecution = () => {\n\ttry {\n\t\tif (!props.executionId) {\n\t\t\tthrow new Error(i18n.baseText('workflowPreview.showError.missingExecution'));\n\t\t}\n\t\tiframeRef.value?.contentWindow?.postMessage?.(\n\t\t\tJSON.stringify({\n\t\t\t\tcommand: 'openExecution',\n\t\t\t\texecutionId: props.executionId,\n\t\t\t\texecutionMode: props.executionMode ?? '',\n\t\t\t\tcanOpenNDV: props.canOpenNDV,\n\t\t\t}),\n\t\t\t'*',\n\t\t);\n\n\t\tif (executionsStore.activeExecution) {\n\t\t\tiframeRef.value?.contentWindow?.postMessage?.(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tcommand: 'setActiveExecution',\n\t\t\t\t\texecutionId: executionsStore.activeExecution.id,\n\t\t\t\t}),\n\t\t\t\t'*',\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('workflowPreview.showError.previewError.title'),\n\t\t\ti18n.baseText('workflowPreview.executionMode.showError.previewError.message'),\n\t\t);\n\t}\n};\n\nconst onMouseEnter = () => {\n\tinsideIframe.value = true;\n\tscrollX.value = window.scrollX;\n\tscrollY.value = window.scrollY;\n};\nconst onMouseLeave = () => {\n\tinsideIframe.value = false;\n};\n\nconst receiveMessage = ({ data }: MessageEvent) => {\n\tif (!data?.includes?.('\"command\"')) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst json = JSON.parse(data);\n\t\tif (json.command === 'n8nReady') {\n\t\t\tready.value = true;\n\t\t} else if (json.command === 'openNDV') {\n\t\t\tnodeViewDetailsOpened.value = true;\n\t\t} else if (json.command === 'closeNDV') {\n\t\t\tnodeViewDetailsOpened.value = false;\n\t\t} else if (json.command === 'error') {\n\t\t\temit('close');\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\nconst onDocumentScroll = () => {\n\tif (insideIframe.value) {\n\t\twindow.scrollTo(scrollX.value, scrollY.value);\n\t}\n};\n\nonMounted(() => {\n\twindow.addEventListener('message', receiveMessage);\n\tdocument.addEventListener('scroll', onDocumentScroll);\n});\n\nonBeforeUnmount(() => {\n\twindow.removeEventListener('message', receiveMessage);\n\tdocument.removeEventListener('scroll', onDocumentScroll);\n});\n\nwatch(\n\t() => showPreview.value,\n\t() => {\n\t\tif (showPreview.value) {\n\t\t\tif (props.mode === 'workflow') {\n\t\t\t\tloadWorkflow();\n\t\t\t} else if (props.mode === 'execution') {\n\t\t\t\tloadExecution();\n\t\t\t}\n\t\t}\n\t},\n);\n\nwatch(\n\t() => props.executionId,\n\t() => {\n\t\tif (props.mode === 'execution' && props.executionId) {\n\t\t\tloadExecution();\n\t\t}\n\t},\n);\n\nwatch(\n\t() => props.workflow,\n\t() => {\n\t\tif (props.mode === 'workflow' && props.workflow) {\n\t\t\tloadWorkflow();\n\t\t}\n\t},\n);\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.workflow {\n\t// firefox bug requires loading iframe as such\n\tvisibility: hidden;\n\theight: 0;\n\twidth: 0;\n}\n\n.show {\n\tvisibility: visible;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.openNDV {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\theight: 100%;\n\twidth: 100%;\n\tz-index: 9999999;\n}\n\n.spinner {\n\tcolor: var(--color-primary);\n\tposition: absolute;\n\ttop: 50% !important;\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY(-50%);\n}\n\n.imageLoader {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 100%;\n}\n\n.executionPreview {\n\theight: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","i18n","useI18n","toast","useToast","executionsStore","useExecutionsStore","iframeRef","ref","nodeViewDetailsOpened","ready","insideIframe","scrollX","scrollY","iframeSrc","computed","showPreview","loadWorkflow","_c","_b","_a","error","loadExecution","_f","_e","_d","onMouseEnter","onMouseLeave","receiveMessage","data","json","e","onDocumentScroll","onMounted","onBeforeUnmount","watch"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{R as se}from"./ResourcesListLayout-CKSHiUAP.js";import{G as N,aH as oe,e as L,ag as l,l as w,M as j,O as n,U as r,I as h,S as k,T as p,p as g,a2 as ae,u as z,P as R,V as F,m as T,R as v,F as re,a7 as ne}from"./vendor-Dv5OeN6t.js";import{u as le,b as x,e as B,a as H,j as K,o as q,r as ie,db as de,x as ce,V as M,y as ue,F as me,A as pe,e8 as fe,H as we,G as he,w as ke,$ as ge,c as be,n as ye,E as Se}from"./index-Dtri_pSJ.js";import{d as _e}from"./dateformat-CIxnBJXX.js";import{W as Te}from"./WorkflowActivator-D6Zad1X2.js";import{_ as ve}from"./ProjectCardBadge.vue_vue_type_script_setup_true_lang-C1N0EZCM.js";import{_ as Q}from"./n8n-4UEsHtUL.js";import{m as Ce}from"./pinia-sugP77Im.js";import{P as Ee}from"./ProjectTabs-Cx2VWeba.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";import"./useWorkflowActivate-BwVActuc.js";const $e={key:0},We=N({__name:"WorkflowCard",props:{data:{default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWithProjects:[],homeProject:{},versionId:""})},readOnly:{type:Boolean,default:!1}},emits:["expand:tags","click:tag"],setup(e,{emit:s}){const a={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete",MOVE:"move"},o=e,c=s,f=le(),b=we(),i=ce(),C=oe(),U=he(),D=x(),S=B(),_=H(),E=K(),$=q(),W=L(()=>_.currentUser??{}),O=L(()=>ie(o.data)),P=L(()=>{const t=[{label:i.baseText("workflows.item.open"),value:a.OPEN},{label:i.baseText("workflows.item.share"),value:a.SHARE}];return o.readOnly||t.push({label:i.baseText("workflows.item.duplicate"),value:a.DUPLICATE}),O.value.move&&t.push({label:i.baseText("workflows.item.move"),value:a.MOVE}),O.value.delete&&!o.readOnly&&t.push({label:i.baseText("workflows.item.delete"),value:a.DELETE}),t}),I=L(()=>{const t=new Date().getFullYear().toString();return _e(o.data.createdAt,`d mmmm${String(o.data.createdAt).startsWith(t)?"":", yyyy"}`)});async function A(t){if(t!=null&&t.ctrlKey||t!=null&&t.metaKey){const d=C.resolve({name:M.WORKFLOW,params:{name:o.data.id}});window.open(d.href,"_blank");return}await C.push({name:M.WORKFLOW,params:{name:o.data.id}})}function m(t,d){d.stopPropagation(),c("click:tag",t,d)}function u(){c("expand:tags")}async function V(t){switch(t){case a.OPEN:await A();break;case a.DUPLICATE:S.openModalWithData({name:me,data:{id:o.data.id,name:o.data.name,tags:(o.data.tags??[]).map(d=>typeof d!="string"&&"id"in d?d.id:d)}});break;case a.SHARE:S.openModalWithData({name:ue,data:{id:o.data.id}}),U.track("User opened sharing modal",{workflow_id:o.data.id,user_id_sharer:W.value.id,sub_view:"Workflows listing"});break;case a.DELETE:await Y();break;case a.MOVE:G();break}}async function Y(){if(await b.confirm(i.baseText("mainSidebar.confirmMessage.workflowDelete.message",{interpolate:{workflowName:o.data.name}}),i.baseText("mainSidebar.confirmMessage.workflowDelete.headline"),{type:"warning",confirmButtonText:i.baseText("mainSidebar.confirmMessage.workflowDelete.confirmButtonText"),cancelButtonText:i.baseText("mainSidebar.confirmMessage.workflowDelete.cancelButtonText")})===pe){try{await E.deleteWorkflow(o.data.id)}catch(d){f.showError(d,i.baseText("generic.deleteWorkflowError"));return}f.showMessage({title:i.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}function G(){S.openModalWithData({name:fe,data:{resource:o.data,resourceType:i.baseText("generic.workflow").toLocaleLowerCase()}})}return(t,d)=>{const J=l("n8n-heading"),X=l("n8n-tags"),Z=l("n8n-text"),ee=l("n8n-action-toggle"),te=l("n8n-card");return w(),j(te,{class:h(t.$style.cardLink),onClick:A},{header:n(()=>[r(J,{tag:"h2",bold:"",class:h(t.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:n(()=>[k(p(t.data.name),1)]),_:1},8,["class"])]),append:n(()=>[g("div",{class:h(t.$style.cardActions),onClick:d[0]||(d[0]=ae(()=>{},["stop"]))},[r(ve,{resource:t.data,"personal-project":z($).personalProject},null,8,["resource","personal-project"]),r(Te,{class:"mr-s","workflow-active":t.data.active,"workflow-id":t.data.id,"data-test-id":"workflow-card-activator"},null,8,["workflow-active","workflow-id"]),r(ee,{actions:P.value,theme:"dark","data-test-id":"workflow-card-actions",onAction:V},null,8,["actions"])],2)]),default:n(()=>[g("div",{class:h(t.$style.cardDescription)},[r(Z,{color:"text-light",size:"small"},{default:n(()=>[R(g("span",null,[k(p(t.$locale.baseText("workflows.item.updated"))+" ",1),r(de,{date:String(t.data.updatedAt)},null,8,["date"]),k(" | ")],512),[[F,t.data]]),R(g("span",{class:"mr-2xs"},p(t.$locale.baseText("workflows.item.created"))+" "+p(I.value),513),[[F,t.data]]),z(D).areTagsEnabled&&t.data.tags&&t.data.tags.length>0?R((w(),T("span",$e,[r(X,{tags:t.data.tags,"truncate-at":3,truncate:"","data-test-id":"workflow-card-tags","onClick:tag":m,onExpand:u},null,8,["tags"])],512)),[[F,t.data]]):v("",!0)]),_:1})],2)]),_:1},8,["class"])}}}),Oe="_cardLink_1ahnz_1",Ae="_cardHeading_1ahnz_11",Le="_cardDescription_1ahnz_20",je="_cardActions_1ahnz_27",Ue={cardLink:Oe,cardHeading:Ae,cardDescription:Le,cardActions:je},De={$style:Ue},Pe=Q(We,[["__cssModules",De]]),y={ACTIVE:!0,DEACTIVATED:!1,ALL:""},Ie=N({name:"WorkflowsView",components:{ResourcesListLayout:se,WorkflowCard:Pe,TagsDropdown:ke,ProjectTabs:Ee},data(){return{filters:{search:"",homeProject:"",status:y.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...Ce(x,B,H,K,ye,be,q,ge),readOnlyEnv(){return this.sourceControlStore.preferences.branchReadOnly},currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(Se.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:y.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:y.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:y.DEACTIVATED}]},userRole(){var a,o;const e=(a=this.usersStore.currentUserCloudInfo)==null?void 0:a.role;if(e)return e;const s=(o=this.usersStore.currentUser)==null?void 0:o.personalizationAnswers;if(s&&"role"in s)return s.role},isSalesUser(){return this.userRole?["Sales","sales-and-marketing"].includes(this.userRole):!1},showProjectTabs(){return!!this.$route.params.projectId||!!this.allWorkflows.length||this.projectsStore.myProjects.length>1},addWorkflowButtonText(){return this.projectsStore.currentProject?this.$locale.baseText("workflows.project.add"):this.$locale.baseText("workflows.add")}},watch:{filters:{deep:!0,handler(){this.saveFiltersOnQueryString()}},"filters.tags"(){this.sendFiltersTelemetry("tags")},"$route.params.projectId"(){this.initialize()}},async mounted(){await this.setFiltersFromQueryString(),this.usersStore.showPersonalizationSurvey(),this.sourceControlStoreUnsubscribe=this.sourceControlStore.$onAction(({name:e,after:s})=>{e==="pullWorkfolder"&&s&&s(()=>{this.initialize()})})},beforeUnmount(){this.sourceControlStoreUnsubscribe()},methods:{onFiltersUpdated(e){this.filters=e},addWorkflow(){var e,s;this.uiStore.nodeViewInitialized=!1,this.$router.push({name:M.NEW_WORKFLOW,query:{projectId:(s=(e=this.$route)==null?void 0:e.params)==null?void 0:s.projectId}}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},getTemplateRepositoryURL(){return this.templatesStore.websiteTemplateRepositoryURL},trackCategoryLinkClick(e){var s;this.$telemetry.track(`User clicked Browse ${e} Templates`,{role:(s=this.usersStore.currentUserCloudInfo)==null?void 0:s.role,active_workflow_count:this.workflowsStore.activeWorkflows.length})},async initialize(){var e,s;await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows((s=(e=this.$route)==null?void 0:e.params)==null?void 0:s.projectId),this.workflowsStore.fetchActiveWorkflows()])},onClickTag(e){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,s,a){return this.settingsStore.areTagsEnabled&&s.tags.length>0&&(a=a&&s.tags.every(o=>{var c;return(c=e.tags)==null?void 0:c.find(f=>typeof f=="object"?`${f.id}`==`${o}`:`${f}`==`${o}`)})),s.status!==""&&(a=a&&e.active===s.status),a},sendFiltersTelemetry(e){this.$refs.layout.sendFiltersTelemetry(e)},saveFiltersOnQueryString(){const e={};this.filters.search&&(e.search=this.filters.search),typeof this.filters.status!="string"&&(e.status=this.filters.status.toString()),this.filters.tags.length&&(e.tags=this.filters.tags.join(",")),this.filters.homeProject&&(e.homeProject=this.filters.homeProject),this.$router.replace({query:Object.keys(e).length?e:void 0})},isValidProjectId(e){return this.projectsStore.projects.some(s=>s.id===e)},async setFiltersFromQueryString(){const{tags:e,status:s,search:a,homeProject:o}=this.$route.query,c={};if(o&&typeof o=="string"&&(await this.projectsStore.getAllProjects(),this.isValidProjectId(o)&&(c.homeProject=o)),a&&typeof a=="string"&&(c.search=a),e&&typeof e=="string"){const f=this.tagsStore.allTags.map(i=>i.id),b=e.split(",").filter(i=>f.includes(i));b.length&&(c.tags=b)}s&&typeof s=="string"&&[y.ACTIVE.toString(),y.DEACTIVATED.toString()].includes(s)&&(c.status=s==="true"),Object.keys(c).length&&(this.filters={...this.filters,...c})}}}),Re=Ie,Fe="_actionsContainer_1gv00_1",Me="_emptyStateCard_1gv00_6",Ve="_emptyStateCardIcon_1gv00_19",ze={actionsContainer:Fe,emptyStateCard:Me,emptyStateCardIcon:Ve},Ne={target:"_blank",href:"https://docs.n8n.io/source-control-environments/"},xe={class:"text-center mt-s"},Be=["href"],He={key:0,class:"mb-s"},Ke={class:"mb-s"};function qe(e,s,a,o,c,f){const b=l("ProjectTabs"),i=l("n8n-button"),C=l("i18n-t"),U=l("n8n-tooltip"),D=l("WorkflowCard"),S=l("n8n-heading"),_=l("n8n-text"),E=l("n8n-icon"),$=l("n8n-card"),W=l("n8n-input-label"),O=l("TagsDropdown"),P=l("n8n-option"),I=l("n8n-select"),A=l("ResourcesListLayout");return w(),j(A,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":e.onFiltersUpdated},{header:n(()=>[e.showProjectTabs?(w(),j(b,{key:0})):v("",!0)]),"add-button":n(({disabled:m})=>[r(U,{disabled:!e.readOnlyEnv},{content:n(()=>[r(C,{tag:"span",keypath:"mainSidebar.workflows.readOnlyEnv.tooltip"},{link:n(()=>[g("a",Ne,p(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip.link")),1)]),_:1})]),default:n(()=>[g("div",null,[r(i,{size:"large",block:"",disabled:m,"data-test-id":"resources-list-add",onClick:e.addWorkflow},{default:n(()=>[k(p(e.addWorkflowButtonText),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:n(({data:m,updateItemSize:u})=>[r(D,{"data-test-id":"resources-list-item",class:"mb-2xs",data:m,"read-only":e.readOnlyEnv,"onExpand:tags":V=>u(m),"onClick:tag":e.onClickTag},null,8,["data","read-only","onExpand:tags","onClick:tag"])]),empty:n(()=>[g("div",xe,[r(S,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:n(()=>[k(p(e.currentUser.firstName?e.$locale.baseText("workflows.empty.heading",{interpolate:{name:e.currentUser.firstName}}):e.$locale.baseText("workflows.empty.heading.userNotSetup")),1)]),_:1}),r(_,{size:"large",color:"text-base"},{default:n(()=>[k(p(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?v("",!0):(w(),T("div",{key:0,class:h(["text-center","mt-2xl",e.$style.actionsContainer])},[e.isSalesUser?(w(),T("a",{key:0,href:e.getTemplateRepositoryURL(),class:h(e.$style.emptyStateCard),target:"_blank"},[r($,{hoverable:"","data-test-id":"browse-sales-templates-card",onClick:s[0]||(s[0]=m=>e.trackCategoryLinkClick("Sales"))},{default:n(()=>[r(E,{class:h(e.$style.emptyStateCardIcon),icon:"box-open"},null,8,["class"]),r(_,{size:"large",class:"mt-xs",color:"text-base"},{default:n(()=>[k(p(e.$locale.baseText("workflows.empty.browseTemplates")),1)]),_:1})]),_:1})],10,Be)):v("",!0),r($,{class:h(e.$style.emptyStateCard),hoverable:"","data-test-id":"new-workflow-card",onClick:e.addWorkflow},{default:n(()=>[r(E,{class:h(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),r(_,{size:"large",class:"mt-xs",color:"text-base"},{default:n(()=>[k(p(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]),filters:n(({setKeyValue:m})=>[e.settingsStore.areTagsEnabled?(w(),T("div",He,[r(W,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),r(O,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),"model-value":e.filters.tags,"create-enabled":!1,"onUpdate:modelValue":u=>m("tags",u)},null,8,["placeholder","model-value","onUpdate:modelValue"])])):v("",!0),g("div",Ke,[r(W,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),r(I,{"data-test-id":"status-dropdown","model-value":e.filters.status,"onUpdate:modelValue":u=>m("status",u)},{default:n(()=>[(w(!0),T(re,null,ne(e.statusFilterOptions,u=>(w(),j(P,{key:u.label,label:u.label,value:u.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","shareable","initialize","disabled","onClick:add","onUpdate:filters"])}const Qe={$style:ze},Ot=Q(Re,[["render",qe],["__cssModules",Qe]]);export{Ot as default};
2
- //# sourceMappingURL=WorkflowsView-CzJx_-P5.js.map
1
+ import{R as se}from"./ResourcesListLayout-B4W1PSHT.js";import{G as N,aH as oe,e as L,ag as l,l as w,M as j,O as n,U as r,I as h,S as k,T as p,p as g,a2 as ae,u as z,P as R,V as F,m as T,R as v,F as re,a7 as ne}from"./vendor-Dv5OeN6t.js";import{u as le,b as x,e as B,a as H,j as K,o as q,r as ie,d9 as de,x as ce,V as M,y as ue,F as me,A as pe,e6 as fe,H as we,G as he,w as ke,$ as ge,c as be,n as ye,E as Se}from"./index-1OxaEeO3.js";import{d as _e}from"./dateformat-CIxnBJXX.js";import{W as Te}from"./WorkflowActivator-BXWURYao.js";import{_ as ve}from"./ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js";import{_ as Q}from"./n8n-4UEsHtUL.js";import{m as Ce}from"./pinia-sugP77Im.js";import{P as Ee}from"./ProjectTabs-5ZO9YR8J.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./lodash-es-CZ1inz46.js";import"./@n8n/permissions-BxxteU-C.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";import"./useWorkflowActivate-npf1npdP.js";const $e={key:0},We=N({__name:"WorkflowCard",props:{data:{default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWithProjects:[],homeProject:{},versionId:""})},readOnly:{type:Boolean,default:!1}},emits:["expand:tags","click:tag"],setup(e,{emit:s}){const a={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete",MOVE:"move"},o=e,c=s,f=le(),b=we(),i=ce(),C=oe(),U=he(),D=x(),S=B(),_=H(),E=K(),$=q(),W=L(()=>_.currentUser??{}),O=L(()=>ie(o.data)),P=L(()=>{const t=[{label:i.baseText("workflows.item.open"),value:a.OPEN},{label:i.baseText("workflows.item.share"),value:a.SHARE}];return o.readOnly||t.push({label:i.baseText("workflows.item.duplicate"),value:a.DUPLICATE}),O.value.move&&t.push({label:i.baseText("workflows.item.move"),value:a.MOVE}),O.value.delete&&!o.readOnly&&t.push({label:i.baseText("workflows.item.delete"),value:a.DELETE}),t}),I=L(()=>{const t=new Date().getFullYear().toString();return _e(o.data.createdAt,`d mmmm${String(o.data.createdAt).startsWith(t)?"":", yyyy"}`)});async function A(t){if(t!=null&&t.ctrlKey||t!=null&&t.metaKey){const d=C.resolve({name:M.WORKFLOW,params:{name:o.data.id}});window.open(d.href,"_blank");return}await C.push({name:M.WORKFLOW,params:{name:o.data.id}})}function m(t,d){d.stopPropagation(),c("click:tag",t,d)}function u(){c("expand:tags")}async function V(t){switch(t){case a.OPEN:await A();break;case a.DUPLICATE:S.openModalWithData({name:me,data:{id:o.data.id,name:o.data.name,tags:(o.data.tags??[]).map(d=>typeof d!="string"&&"id"in d?d.id:d)}});break;case a.SHARE:S.openModalWithData({name:ue,data:{id:o.data.id}}),U.track("User opened sharing modal",{workflow_id:o.data.id,user_id_sharer:W.value.id,sub_view:"Workflows listing"});break;case a.DELETE:await Y();break;case a.MOVE:G();break}}async function Y(){if(await b.confirm(i.baseText("mainSidebar.confirmMessage.workflowDelete.message",{interpolate:{workflowName:o.data.name}}),i.baseText("mainSidebar.confirmMessage.workflowDelete.headline"),{type:"warning",confirmButtonText:i.baseText("mainSidebar.confirmMessage.workflowDelete.confirmButtonText"),cancelButtonText:i.baseText("mainSidebar.confirmMessage.workflowDelete.cancelButtonText")})===pe){try{await E.deleteWorkflow(o.data.id)}catch(d){f.showError(d,i.baseText("generic.deleteWorkflowError"));return}f.showMessage({title:i.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}function G(){S.openModalWithData({name:fe,data:{resource:o.data,resourceType:i.baseText("generic.workflow").toLocaleLowerCase()}})}return(t,d)=>{const J=l("n8n-heading"),X=l("n8n-tags"),Z=l("n8n-text"),ee=l("n8n-action-toggle"),te=l("n8n-card");return w(),j(te,{class:h(t.$style.cardLink),onClick:A},{header:n(()=>[r(J,{tag:"h2",bold:"",class:h(t.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:n(()=>[k(p(t.data.name),1)]),_:1},8,["class"])]),append:n(()=>[g("div",{class:h(t.$style.cardActions),onClick:d[0]||(d[0]=ae(()=>{},["stop"]))},[r(ve,{resource:t.data,"personal-project":z($).personalProject},null,8,["resource","personal-project"]),r(Te,{class:"mr-s","workflow-active":t.data.active,"workflow-id":t.data.id,"data-test-id":"workflow-card-activator"},null,8,["workflow-active","workflow-id"]),r(ee,{actions:P.value,theme:"dark","data-test-id":"workflow-card-actions",onAction:V},null,8,["actions"])],2)]),default:n(()=>[g("div",{class:h(t.$style.cardDescription)},[r(Z,{color:"text-light",size:"small"},{default:n(()=>[R(g("span",null,[k(p(t.$locale.baseText("workflows.item.updated"))+" ",1),r(de,{date:String(t.data.updatedAt)},null,8,["date"]),k(" | ")],512),[[F,t.data]]),R(g("span",{class:"mr-2xs"},p(t.$locale.baseText("workflows.item.created"))+" "+p(I.value),513),[[F,t.data]]),z(D).areTagsEnabled&&t.data.tags&&t.data.tags.length>0?R((w(),T("span",$e,[r(X,{tags:t.data.tags,"truncate-at":3,truncate:"","data-test-id":"workflow-card-tags","onClick:tag":m,onExpand:u},null,8,["tags"])],512)),[[F,t.data]]):v("",!0)]),_:1})],2)]),_:1},8,["class"])}}}),Oe="_cardLink_1ahnz_1",Ae="_cardHeading_1ahnz_11",Le="_cardDescription_1ahnz_20",je="_cardActions_1ahnz_27",Ue={cardLink:Oe,cardHeading:Ae,cardDescription:Le,cardActions:je},De={$style:Ue},Pe=Q(We,[["__cssModules",De]]),y={ACTIVE:!0,DEACTIVATED:!1,ALL:""},Ie=N({name:"WorkflowsView",components:{ResourcesListLayout:se,WorkflowCard:Pe,TagsDropdown:ke,ProjectTabs:Ee},data(){return{filters:{search:"",homeProject:"",status:y.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...Ce(x,B,H,K,ye,be,q,ge),readOnlyEnv(){return this.sourceControlStore.preferences.branchReadOnly},currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(Se.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:y.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:y.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:y.DEACTIVATED}]},userRole(){var a,o;const e=(a=this.usersStore.currentUserCloudInfo)==null?void 0:a.role;if(e)return e;const s=(o=this.usersStore.currentUser)==null?void 0:o.personalizationAnswers;if(s&&"role"in s)return s.role},isSalesUser(){return this.userRole?["Sales","sales-and-marketing"].includes(this.userRole):!1},showProjectTabs(){return!!this.$route.params.projectId||!!this.allWorkflows.length||this.projectsStore.myProjects.length>1},addWorkflowButtonText(){return this.projectsStore.currentProject?this.$locale.baseText("workflows.project.add"):this.$locale.baseText("workflows.add")}},watch:{filters:{deep:!0,handler(){this.saveFiltersOnQueryString()}},"filters.tags"(){this.sendFiltersTelemetry("tags")},"$route.params.projectId"(){this.initialize()}},async mounted(){await this.setFiltersFromQueryString(),this.usersStore.showPersonalizationSurvey(),this.sourceControlStoreUnsubscribe=this.sourceControlStore.$onAction(({name:e,after:s})=>{e==="pullWorkfolder"&&s&&s(()=>{this.initialize()})})},beforeUnmount(){this.sourceControlStoreUnsubscribe()},methods:{onFiltersUpdated(e){this.filters=e},addWorkflow(){var e,s;this.uiStore.nodeViewInitialized=!1,this.$router.push({name:M.NEW_WORKFLOW,query:{projectId:(s=(e=this.$route)==null?void 0:e.params)==null?void 0:s.projectId}}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},getTemplateRepositoryURL(){return this.templatesStore.websiteTemplateRepositoryURL},trackCategoryLinkClick(e){var s;this.$telemetry.track(`User clicked Browse ${e} Templates`,{role:(s=this.usersStore.currentUserCloudInfo)==null?void 0:s.role,active_workflow_count:this.workflowsStore.activeWorkflows.length})},async initialize(){var e,s;await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows((s=(e=this.$route)==null?void 0:e.params)==null?void 0:s.projectId),this.workflowsStore.fetchActiveWorkflows()])},onClickTag(e){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,s,a){return this.settingsStore.areTagsEnabled&&s.tags.length>0&&(a=a&&s.tags.every(o=>{var c;return(c=e.tags)==null?void 0:c.find(f=>typeof f=="object"?`${f.id}`==`${o}`:`${f}`==`${o}`)})),s.status!==""&&(a=a&&e.active===s.status),a},sendFiltersTelemetry(e){this.$refs.layout.sendFiltersTelemetry(e)},saveFiltersOnQueryString(){const e={};this.filters.search&&(e.search=this.filters.search),typeof this.filters.status!="string"&&(e.status=this.filters.status.toString()),this.filters.tags.length&&(e.tags=this.filters.tags.join(",")),this.filters.homeProject&&(e.homeProject=this.filters.homeProject),this.$router.replace({query:Object.keys(e).length?e:void 0})},isValidProjectId(e){return this.projectsStore.projects.some(s=>s.id===e)},async setFiltersFromQueryString(){const{tags:e,status:s,search:a,homeProject:o}=this.$route.query,c={};if(o&&typeof o=="string"&&(await this.projectsStore.getAllProjects(),this.isValidProjectId(o)&&(c.homeProject=o)),a&&typeof a=="string"&&(c.search=a),e&&typeof e=="string"){const f=this.tagsStore.allTags.map(i=>i.id),b=e.split(",").filter(i=>f.includes(i));b.length&&(c.tags=b)}s&&typeof s=="string"&&[y.ACTIVE.toString(),y.DEACTIVATED.toString()].includes(s)&&(c.status=s==="true"),Object.keys(c).length&&(this.filters={...this.filters,...c})}}}),Re=Ie,Fe="_actionsContainer_1gv00_1",Me="_emptyStateCard_1gv00_6",Ve="_emptyStateCardIcon_1gv00_19",ze={actionsContainer:Fe,emptyStateCard:Me,emptyStateCardIcon:Ve},Ne={target:"_blank",href:"https://docs.n8n.io/source-control-environments/"},xe={class:"text-center mt-s"},Be=["href"],He={key:0,class:"mb-s"},Ke={class:"mb-s"};function qe(e,s,a,o,c,f){const b=l("ProjectTabs"),i=l("n8n-button"),C=l("i18n-t"),U=l("n8n-tooltip"),D=l("WorkflowCard"),S=l("n8n-heading"),_=l("n8n-text"),E=l("n8n-icon"),$=l("n8n-card"),W=l("n8n-input-label"),O=l("TagsDropdown"),P=l("n8n-option"),I=l("n8n-select"),A=l("ResourcesListLayout");return w(),j(A,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":e.onFiltersUpdated},{header:n(()=>[e.showProjectTabs?(w(),j(b,{key:0})):v("",!0)]),"add-button":n(({disabled:m})=>[r(U,{disabled:!e.readOnlyEnv},{content:n(()=>[r(C,{tag:"span",keypath:"mainSidebar.workflows.readOnlyEnv.tooltip"},{link:n(()=>[g("a",Ne,p(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip.link")),1)]),_:1})]),default:n(()=>[g("div",null,[r(i,{size:"large",block:"",disabled:m,"data-test-id":"resources-list-add",onClick:e.addWorkflow},{default:n(()=>[k(p(e.addWorkflowButtonText),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:n(({data:m,updateItemSize:u})=>[r(D,{"data-test-id":"resources-list-item",class:"mb-2xs",data:m,"read-only":e.readOnlyEnv,"onExpand:tags":V=>u(m),"onClick:tag":e.onClickTag},null,8,["data","read-only","onExpand:tags","onClick:tag"])]),empty:n(()=>[g("div",xe,[r(S,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:n(()=>[k(p(e.currentUser.firstName?e.$locale.baseText("workflows.empty.heading",{interpolate:{name:e.currentUser.firstName}}):e.$locale.baseText("workflows.empty.heading.userNotSetup")),1)]),_:1}),r(_,{size:"large",color:"text-base"},{default:n(()=>[k(p(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?v("",!0):(w(),T("div",{key:0,class:h(["text-center","mt-2xl",e.$style.actionsContainer])},[e.isSalesUser?(w(),T("a",{key:0,href:e.getTemplateRepositoryURL(),class:h(e.$style.emptyStateCard),target:"_blank"},[r($,{hoverable:"","data-test-id":"browse-sales-templates-card",onClick:s[0]||(s[0]=m=>e.trackCategoryLinkClick("Sales"))},{default:n(()=>[r(E,{class:h(e.$style.emptyStateCardIcon),icon:"box-open"},null,8,["class"]),r(_,{size:"large",class:"mt-xs",color:"text-base"},{default:n(()=>[k(p(e.$locale.baseText("workflows.empty.browseTemplates")),1)]),_:1})]),_:1})],10,Be)):v("",!0),r($,{class:h(e.$style.emptyStateCard),hoverable:"","data-test-id":"new-workflow-card",onClick:e.addWorkflow},{default:n(()=>[r(E,{class:h(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),r(_,{size:"large",class:"mt-xs",color:"text-base"},{default:n(()=>[k(p(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]),filters:n(({setKeyValue:m})=>[e.settingsStore.areTagsEnabled?(w(),T("div",He,[r(W,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),r(O,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),"model-value":e.filters.tags,"create-enabled":!1,"onUpdate:modelValue":u=>m("tags",u)},null,8,["placeholder","model-value","onUpdate:modelValue"])])):v("",!0),g("div",Ke,[r(W,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),r(I,{"data-test-id":"status-dropdown","model-value":e.filters.status,"onUpdate:modelValue":u=>m("status",u)},{default:n(()=>[(w(!0),T(re,null,ne(e.statusFilterOptions,u=>(w(),j(P,{key:u.label,label:u.label,value:u.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","shareable","initialize","disabled","onClick:add","onUpdate:filters"])}const Qe={$style:ze},Ot=Q(Re,[["render",qe],["__cssModules",Qe]]);export{Ot as default};
2
+ //# sourceMappingURL=WorkflowsView-DVeAZ2zW.js.map