n8n-editor-ui 1.45.0 → 1.45.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.turbo/turbo-build.log +75 -75
  2. package/dist/assets/{AuthView-sBgr4ab5.js → AuthView-Bpw90ooz.js} +2 -2
  3. package/dist/assets/{AuthView-sBgr4ab5.js.map → AuthView-Bpw90ooz.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-WQFq3IW7.js → CanvasControls-CQPytmej.js} +2 -2
  5. package/dist/assets/{CanvasControls-WQFq3IW7.js.map → CanvasControls-CQPytmej.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-RoWelfJE.js → ChangePasswordView-tMFb4WIn.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-RoWelfJE.js.map → ChangePasswordView-tMFb4WIn.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-o9-pyF-D.js → CollectionParameter-CwgJAh2M.js} +2 -2
  9. package/dist/assets/CollectionParameter-CwgJAh2M.js.map +1 -0
  10. package/dist/assets/{CredentialsView-loSi714I.js → CredentialsView-lvIyWvdA.js} +2 -2
  11. package/dist/assets/{CredentialsView-loSi714I.js.map → CredentialsView-lvIyWvdA.js.map} +1 -1
  12. package/dist/assets/{ExecutionsFilter-BwFUjELc.js → ExecutionsFilter-BSWo4-vK.js} +2 -2
  13. package/dist/assets/{ExecutionsFilter-BwFUjELc.js.map → ExecutionsFilter-BSWo4-vK.js.map} +1 -1
  14. package/dist/assets/{ExecutionsView-ClvBwy6K.js → ExecutionsView-Bztejjur.js} +2 -2
  15. package/dist/assets/{ExecutionsView-ClvBwy6K.js.map → ExecutionsView-Bztejjur.js.map} +1 -1
  16. package/dist/assets/{ForgotMyPasswordView-Da9ejE05.js → ForgotMyPasswordView-n_x-L3AV.js} +2 -2
  17. package/dist/assets/{ForgotMyPasswordView-Da9ejE05.js.map → ForgotMyPasswordView-n_x-L3AV.js.map} +1 -1
  18. package/dist/assets/{MainHeader-DCqd1GFf.js → MainHeader-P2afzgJI.js} +2 -2
  19. package/dist/assets/{MainHeader-DCqd1GFf.js.map → MainHeader-P2afzgJI.js.map} +1 -1
  20. package/dist/assets/{MainSidebar-D0hPq1hI.js → MainSidebar-CAwsaKp9.js} +2 -2
  21. package/dist/assets/{MainSidebar-D0hPq1hI.js.map → MainSidebar-CAwsaKp9.js.map} +1 -1
  22. package/dist/assets/{NodeCreation-Dv1vHhp7.js → NodeCreation-DHuCOx3T.js} +3 -3
  23. package/dist/assets/{NodeCreation-Dv1vHhp7.js.map → NodeCreation-DHuCOx3T.js.map} +1 -1
  24. package/dist/assets/{NodeCreator-CTyp0oWz.js → NodeCreator-CRVECYnB.js} +2 -2
  25. package/dist/assets/{NodeCreator-CTyp0oWz.js.map → NodeCreator-CRVECYnB.js.map} +1 -1
  26. package/dist/assets/{NodeView-D7js-jl0.js → NodeView-_cMwqhWw.js} +4 -4
  27. package/dist/assets/{NodeView-D7js-jl0.js.map → NodeView-_cMwqhWw.js.map} +1 -1
  28. package/dist/assets/{NodeView.v2-Db0N2ZpD.js → NodeView.v2-B5Hn0oJ1.js} +3 -3
  29. package/dist/assets/{NodeView.v2-Db0N2ZpD.js.map → NodeView.v2-B5Hn0oJ1.js.map} +1 -1
  30. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-kI8CSFPH.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-BzALVLd6.js} +2 -2
  31. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-kI8CSFPH.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-BzALVLd6.js.map} +1 -1
  32. package/dist/assets/{ProjectSettings-DV97_QgF.js → ProjectSettings-D3HQdHi6.js} +2 -2
  33. package/dist/assets/{ProjectSettings-DV97_QgF.js.map → ProjectSettings-D3HQdHi6.js.map} +1 -1
  34. package/dist/assets/{ProjectTabs-BiGImjZC.js → ProjectTabs-BjpVZIIc.js} +2 -2
  35. package/dist/assets/{ProjectTabs-BiGImjZC.js.map → ProjectTabs-BjpVZIIc.js.map} +1 -1
  36. package/dist/assets/{PushConnectionTracker-DzVbTLAw.js → PushConnectionTracker-Dt9-l7zj.js} +2 -2
  37. package/dist/assets/{PushConnectionTracker-DzVbTLAw.js.map → PushConnectionTracker-Dt9-l7zj.js.map} +1 -1
  38. package/dist/assets/{ResourcesListLayout-__5Cg0A9.js → ResourcesListLayout-CjzGJ-eS.js} +2 -2
  39. package/dist/assets/{ResourcesListLayout-__5Cg0A9.js.map → ResourcesListLayout-CjzGJ-eS.js.map} +1 -1
  40. package/dist/assets/{RunDataAi-BbEWhRis.js → RunDataAi-D3971Kwm.js} +2 -2
  41. package/dist/assets/{RunDataAi-BbEWhRis.js.map → RunDataAi-D3971Kwm.js.map} +1 -1
  42. package/dist/assets/{RunDataJson-7eRqOET2.js → RunDataJson-BLrjtyKU.js} +3 -3
  43. package/dist/assets/{RunDataJson-7eRqOET2.js.map → RunDataJson-BLrjtyKU.js.map} +1 -1
  44. package/dist/assets/{RunDataJsonActions-MHoSLGDw.js → RunDataJsonActions-CucOcrrR.js} +2 -2
  45. package/dist/assets/{RunDataJsonActions-MHoSLGDw.js.map → RunDataJsonActions-CucOcrrR.js.map} +1 -1
  46. package/dist/assets/{RunDataSchema-C2mrihIi.js → RunDataSchema-B-52gDNr.js} +2 -2
  47. package/dist/assets/{RunDataSchema-C2mrihIi.js.map → RunDataSchema-B-52gDNr.js.map} +1 -1
  48. package/dist/assets/{RunDataSearch-CzdgZA0H.js → RunDataSearch-ZA9rLECQ.js} +2 -2
  49. package/dist/assets/{RunDataSearch-CzdgZA0H.js.map → RunDataSearch-ZA9rLECQ.js.map} +1 -1
  50. package/dist/assets/{RunDataTable-DmxJXvGM.js → RunDataTable-DQx4IB1X.js} +2 -2
  51. package/dist/assets/{RunDataTable-DmxJXvGM.js.map → RunDataTable-DQx4IB1X.js.map} +1 -1
  52. package/dist/assets/{SamlOnboarding-c0vvdXcj.js → SamlOnboarding-DS2hMTul.js} +2 -2
  53. package/dist/assets/{SamlOnboarding-c0vvdXcj.js.map → SamlOnboarding-DS2hMTul.js.map} +1 -1
  54. package/dist/assets/{SettingsApiView-BSPOTc-1.js → SettingsApiView-BEBQwqa4.js} +2 -2
  55. package/dist/assets/{SettingsApiView-BSPOTc-1.js.map → SettingsApiView-BEBQwqa4.js.map} +1 -1
  56. package/dist/assets/{SettingsCommunityNodesView-3uiMscEF.js → SettingsCommunityNodesView-Zb5NN5TR.js} +2 -2
  57. package/dist/assets/{SettingsCommunityNodesView-3uiMscEF.js.map → SettingsCommunityNodesView-Zb5NN5TR.js.map} +1 -1
  58. package/dist/assets/{SettingsExternalSecrets-C5fphQOi.js → SettingsExternalSecrets-BrQz9Rn5.js} +2 -2
  59. package/dist/assets/{SettingsExternalSecrets-C5fphQOi.js.map → SettingsExternalSecrets-BrQz9Rn5.js.map} +1 -1
  60. package/dist/assets/{SettingsFakeDoorView-Df4Rs6o0.js → SettingsFakeDoorView-BEtA0RJZ.js} +2 -2
  61. package/dist/assets/{SettingsFakeDoorView-Df4Rs6o0.js.map → SettingsFakeDoorView-BEtA0RJZ.js.map} +1 -1
  62. package/dist/assets/{SettingsLdapView-C4lLeRwF.js → SettingsLdapView-BCqjlrE9.js} +2 -2
  63. package/dist/assets/{SettingsLdapView-C4lLeRwF.js.map → SettingsLdapView-BCqjlrE9.js.map} +1 -1
  64. package/dist/assets/{SettingsLogStreamingView-bLlhacNh.js → SettingsLogStreamingView-B3vDd25l.js} +2 -2
  65. package/dist/assets/{SettingsLogStreamingView-bLlhacNh.js.map → SettingsLogStreamingView-B3vDd25l.js.map} +1 -1
  66. package/dist/assets/{SettingsPersonalView-BgQQgYy0.js → SettingsPersonalView-BxS-VIeh.js} +2 -2
  67. package/dist/assets/{SettingsPersonalView-BgQQgYy0.js.map → SettingsPersonalView-BxS-VIeh.js.map} +1 -1
  68. package/dist/assets/{SettingsSourceControl-C2BP11mH.js → SettingsSourceControl-BBk56DIZ.js} +2 -2
  69. package/dist/assets/{SettingsSourceControl-C2BP11mH.js.map → SettingsSourceControl-BBk56DIZ.js.map} +1 -1
  70. package/dist/assets/{SettingsSso-CK7JB3Vy.js → SettingsSso-c-njHRi9.js} +2 -2
  71. package/dist/assets/{SettingsSso-CK7JB3Vy.js.map → SettingsSso-c-njHRi9.js.map} +1 -1
  72. package/dist/assets/{SettingsUsageAndPlan-Cwa-TbVs.js → SettingsUsageAndPlan-DEnejDAt.js} +2 -2
  73. package/dist/assets/{SettingsUsageAndPlan-Cwa-TbVs.js.map → SettingsUsageAndPlan-DEnejDAt.js.map} +1 -1
  74. package/dist/assets/{SettingsUsersView-CbWtmro6.js → SettingsUsersView-CGkw80Ef.js} +2 -2
  75. package/dist/assets/{SettingsUsersView-CbWtmro6.js.map → SettingsUsersView-CGkw80Ef.js.map} +1 -1
  76. package/dist/assets/{SettingsView-Big9eFwZ.js → SettingsView-DGukO3mQ.js} +2 -2
  77. package/dist/assets/{SettingsView-Big9eFwZ.js.map → SettingsView-DGukO3mQ.js.map} +1 -1
  78. package/dist/assets/{SetupView-fjlw9brZ.js → SetupView-kY1bAskX.js} +2 -2
  79. package/dist/assets/{SetupView-fjlw9brZ.js.map → SetupView-kY1bAskX.js.map} +1 -1
  80. package/dist/assets/{SetupWorkflowCredentialsButton-Q123cR2R.js → SetupWorkflowCredentialsButton-DkvMQv2u.js} +2 -2
  81. package/dist/assets/{SetupWorkflowCredentialsButton-Q123cR2R.js.map → SetupWorkflowCredentialsButton-DkvMQv2u.js.map} +1 -1
  82. package/dist/assets/{SetupWorkflowFromTemplateView-BcaIdEbq.js → SetupWorkflowFromTemplateView-M7-z0Ko5.js} +2 -2
  83. package/dist/assets/{SetupWorkflowFromTemplateView-BcaIdEbq.js.map → SetupWorkflowFromTemplateView-M7-z0Ko5.js.map} +1 -1
  84. package/dist/assets/{SigninView-BqRZRDIW.js → SigninView-CsK0r98m.js} +2 -2
  85. package/dist/assets/{SigninView-BqRZRDIW.js.map → SigninView-CsK0r98m.js.map} +1 -1
  86. package/dist/assets/{SignoutView-Ds-XMHbB.js → SignoutView-BST1uR2G.js} +2 -2
  87. package/dist/assets/{SignoutView-Ds-XMHbB.js.map → SignoutView-BST1uR2G.js.map} +1 -1
  88. package/dist/assets/{SignupView-Du4cZWtz.js → SignupView-BKYxxBni.js} +2 -2
  89. package/dist/assets/{SignupView-Du4cZWtz.js.map → SignupView-BKYxxBni.js.map} +1 -1
  90. package/dist/assets/{TemplateDetails-DYa2o-Sg.js → TemplateDetails-D0r_U1xF.js} +2 -2
  91. package/dist/assets/{TemplateDetails-DYa2o-Sg.js.map → TemplateDetails-D0r_U1xF.js.map} +1 -1
  92. package/dist/assets/{TemplateList-BMaBMl6x.js → TemplateList-CDA5KNLL.js} +2 -2
  93. package/dist/assets/{TemplateList-BMaBMl6x.js.map → TemplateList-CDA5KNLL.js.map} +1 -1
  94. package/dist/assets/{TemplatesCollectionView-g5_48W2g.js → TemplatesCollectionView-Sd-VkM2v.js} +2 -2
  95. package/dist/assets/{TemplatesCollectionView-g5_48W2g.js.map → TemplatesCollectionView-Sd-VkM2v.js.map} +1 -1
  96. package/dist/assets/{TemplatesSearchView-CUEpPGLS.js → TemplatesSearchView-H6B_YHdj.js} +2 -2
  97. package/dist/assets/{TemplatesSearchView-CUEpPGLS.js.map → TemplatesSearchView-H6B_YHdj.js.map} +1 -1
  98. package/dist/assets/{TemplatesView-Dt7Yj05N.js → TemplatesView-C1e1VOA1.js} +2 -2
  99. package/dist/assets/{TemplatesView-Dt7Yj05N.js.map → TemplatesView-C1e1VOA1.js.map} +1 -1
  100. package/dist/assets/{TemplatesWorkflowView-NUQng_ec.js → TemplatesWorkflowView-EDlr8NNs.js} +2 -2
  101. package/dist/assets/{TemplatesWorkflowView-NUQng_ec.js.map → TemplatesWorkflowView-EDlr8NNs.js.map} +1 -1
  102. package/dist/assets/{VariablesView-CNbX7qiw.js → VariablesView-uUyY5gqA.js} +2 -2
  103. package/dist/assets/{VariablesView-CNbX7qiw.js.map → VariablesView-uUyY5gqA.js.map} +1 -1
  104. package/dist/assets/{WorkerView-6sYjvVRB.js → WorkerView-f9W1Yivk.js} +2 -2
  105. package/dist/assets/{WorkerView-6sYjvVRB.js.map → WorkerView-f9W1Yivk.js.map} +1 -1
  106. package/dist/assets/{WorkflowActivator-BofJdorM.js → WorkflowActivator-Bh0oXchL.js} +2 -2
  107. package/dist/assets/{WorkflowActivator-BofJdorM.js.map → WorkflowActivator-Bh0oXchL.js.map} +1 -1
  108. package/dist/assets/{WorkflowExecutionsInfoAccordion-QgKEaHPH.js → WorkflowExecutionsInfoAccordion-DvgpWxaO.js} +2 -2
  109. package/dist/assets/{WorkflowExecutionsInfoAccordion-QgKEaHPH.js.map → WorkflowExecutionsInfoAccordion-DvgpWxaO.js.map} +1 -1
  110. package/dist/assets/{WorkflowExecutionsLandingPage-C8PoBPw1.js → WorkflowExecutionsLandingPage-DiqNejyi.js} +2 -2
  111. package/dist/assets/{WorkflowExecutionsLandingPage-C8PoBPw1.js.map → WorkflowExecutionsLandingPage-DiqNejyi.js.map} +1 -1
  112. package/dist/assets/{WorkflowExecutionsPreview-DXRMfRl4.js → WorkflowExecutionsPreview-BJqdf9CJ.js} +2 -2
  113. package/dist/assets/{WorkflowExecutionsPreview-DXRMfRl4.js.map → WorkflowExecutionsPreview-BJqdf9CJ.js.map} +1 -1
  114. package/dist/assets/{WorkflowExecutionsView-BFIJLItj.js → WorkflowExecutionsView-CY5alI5S.js} +2 -2
  115. package/dist/assets/{WorkflowExecutionsView-BFIJLItj.js.map → WorkflowExecutionsView-CY5alI5S.js.map} +1 -1
  116. package/dist/assets/{WorkflowHistory-DrJO6HE6.js → WorkflowHistory-BCAvzdJ2.js} +2 -2
  117. package/dist/assets/{WorkflowHistory-DrJO6HE6.js.map → WorkflowHistory-BCAvzdJ2.js.map} +1 -1
  118. package/dist/assets/{WorkflowOnboardingView-CWudc9OX.js → WorkflowOnboardingView-CZaNfPmP.js} +2 -2
  119. package/dist/assets/{WorkflowOnboardingView-CWudc9OX.js.map → WorkflowOnboardingView-CZaNfPmP.js.map} +1 -1
  120. package/dist/assets/{WorkflowPreview-CP6H-zD6.js → WorkflowPreview-CLfcNQ-Q.js} +2 -2
  121. package/dist/assets/{WorkflowPreview-CP6H-zD6.js.map → WorkflowPreview-CLfcNQ-Q.js.map} +1 -1
  122. package/dist/assets/{WorkflowsView-B8hr4JdS.js → WorkflowsView-BMDRVCFf.js} +2 -2
  123. package/dist/assets/{WorkflowsView-B8hr4JdS.js.map → WorkflowsView-BMDRVCFf.js.map} +1 -1
  124. package/dist/assets/{cloud-Nipuweza.js → cloud-D1wkxTEm.js} +2 -2
  125. package/dist/assets/{cloud-Nipuweza.js.map → cloud-D1wkxTEm.js.map} +1 -1
  126. package/dist/assets/{collaboration.store-CeJXF3gO.js → collaboration.store-zz8xH0zY.js} +2 -2
  127. package/dist/assets/{collaboration.store-CeJXF3gO.js.map → collaboration.store-zz8xH0zY.js.map} +1 -1
  128. package/dist/assets/{index-DeNtBxiT.js → index-DEwaaDne.js} +4 -4
  129. package/dist/assets/{index-DeNtBxiT.js.map → index-DEwaaDne.js.map} +1 -1
  130. package/dist/assets/{nodeCreator.store-D1MAzn2w.js → nodeCreator.store-DR3dfsvW.js} +2 -2
  131. package/dist/assets/{nodeCreator.store-D1MAzn2w.js.map → nodeCreator.store-DR3dfsvW.js.map} +1 -1
  132. package/dist/assets/{templateActions-DLB6SLyS.js → templateActions-DTyOnhvj.js} +2 -2
  133. package/dist/assets/{templateActions-DLB6SLyS.js.map → templateActions-DTyOnhvj.js.map} +1 -1
  134. package/dist/assets/{useExecutionDebugging-B_eoI-oc.js → useExecutionDebugging-vMuoV-iO.js} +2 -2
  135. package/dist/assets/{useExecutionDebugging-B_eoI-oc.js.map → useExecutionDebugging-vMuoV-iO.js.map} +1 -1
  136. package/dist/assets/{useExecutionHelpers-BAwOWjv8.js → useExecutionHelpers-C0lzavRV.js} +2 -2
  137. package/dist/assets/{useExecutionHelpers-BAwOWjv8.js.map → useExecutionHelpers-C0lzavRV.js.map} +1 -1
  138. package/dist/assets/{usePushConnection-1-1myIro.js → usePushConnection-3xfZ5wSJ.js} +2 -2
  139. package/dist/assets/{usePushConnection-1-1myIro.js.map → usePushConnection-3xfZ5wSJ.js.map} +1 -1
  140. package/dist/assets/{useViewStacks-D8rg90P0.js → useViewStacks-BSagsijV.js} +2 -2
  141. package/dist/assets/{useViewStacks-D8rg90P0.js.map → useViewStacks-BSagsijV.js.map} +1 -1
  142. package/dist/assets/{useWorkflowActivate-DrsL0BLR.js → useWorkflowActivate-BLjS7M0I.js} +2 -2
  143. package/dist/assets/{useWorkflowActivate-DrsL0BLR.js.map → useWorkflowActivate-BLjS7M0I.js.map} +1 -1
  144. package/dist/index.html +1 -1
  145. package/package.json +1 -1
  146. package/dist/assets/CollectionParameter-o9-pyF-D.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowExecutionsView-BFIJLItj.js","sources":["../../src/components/executions/workflow/WorkflowExecutionsCard.vue","../../src/components/executions/workflow/WorkflowExecutionsSidebar.vue","../../src/components/executions/workflow/WorkflowExecutionsList.vue","../../src/views/WorkflowExecutionsView.vue"],"sourcesContent":["<template>\n\t<div\n\t\t:class=\"{\n\t\t\t['execution-card']: true,\n\t\t\t[$style.WorkflowExecutionsCard]: true,\n\t\t\t[$style.active]: isActive,\n\t\t\t[$style[executionUIDetails.name]]: true,\n\t\t\t[$style.highlight]: highlight,\n\t\t\t[$style.showGap]: showGap,\n\t\t}\"\n\t>\n\t\t<router-link\n\t\t\t:class=\"$style.executionLink\"\n\t\t\t:to=\"{\n\t\t\t\tname: executionPreviewViewName,\n\t\t\t\tparams: { name: currentWorkflow, executionId: execution.id },\n\t\t\t}\"\n\t\t\t:data-test-execution-status=\"executionUIDetails.name\"\n\t\t>\n\t\t\t<div :class=\"$style.description\">\n\t\t\t\t<n8n-text color=\"text-dark\" :bold=\"true\" size=\"medium\" data-test-id=\"execution-time\">\n\t\t\t\t\t{{ executionUIDetails.startTime }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<div :class=\"$style.executionStatus\">\n\t\t\t\t\t<n8n-spinner\n\t\t\t\t\t\tv-if=\"executionUIDetails.name === 'running'\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:class=\"[$style.spinner, 'mr-4xs']\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-text :class=\"$style.statusLabel\" size=\"small\">{{\n\t\t\t\t\t\texecutionUIDetails.label\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t{{ ' ' }}\n\t\t\t\t\t<n8n-text\n\t\t\t\t\t\tv-if=\"executionUIDetails.name === 'running'\"\n\t\t\t\t\t\t:color=\"isActive ? 'text-dark' : 'text-base'\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('executionDetails.runningTimeRunning') }}\n\t\t\t\t\t\t<ExecutionsTime :start-time=\"execution.startedAt\" />\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<n8n-text\n\t\t\t\t\t\tv-else-if=\"executionUIDetails.runningTime !== ''\"\n\t\t\t\t\t\t:color=\"isActive ? 'text-dark' : 'text-base'\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText('executionDetails.runningTimeFinished', {\n\t\t\t\t\t\t\t\tinterpolate: { time: executionUIDetails?.runningTime },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"execution.mode === 'retry'\">\n\t\t\t\t\t<n8n-text :color=\"isActive ? 'text-dark' : 'text-base'\" size=\"small\">\n\t\t\t\t\t\t{{ $locale.baseText('executionDetails.retry') }} #{{ execution.retryOf }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.icons\">\n\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\tv-if=\"isRetriable\"\n\t\t\t\t\t:class=\"[$style.icon, $style.retry]\"\n\t\t\t\t\t:items=\"retryExecutionActions\"\n\t\t\t\t\tactivator-icon=\"redo\"\n\t\t\t\t\tdata-test-id=\"retry-execution-button\"\n\t\t\t\t\t@select=\"onRetryMenuItemSelect\"\n\t\t\t\t/>\n\t\t\t\t<n8n-tooltip v-if=\"execution.mode === 'manual'\" placement=\"top\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<span>{{ $locale.baseText('executionsList.test') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<font-awesome-icon\n\t\t\t\t\t\tv-if=\"execution.mode === 'manual'\"\n\t\t\t\t\t\t:class=\"[$style.icon, $style.manual]\"\n\t\t\t\t\t\ticon=\"flask\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</router-link>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IExecutionUIData } from '@/composables/useExecutionHelpers';\nimport { VIEWS } from '@/constants';\nimport ExecutionsTime from '@/components/executions/ExecutionsTime.vue';\nimport { useExecutionHelpers } from '@/composables/useExecutionHelpers';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { mapStores } from 'pinia';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsCard',\n\tcomponents: {\n\t\tExecutionsTime,\n\t},\n\tprops: {\n\t\texecution: {\n\t\t\ttype: Object as () => ExecutionSummary,\n\t\t\trequired: true,\n\t\t},\n\t\thighlight: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tshowGap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\temits: ['retryExecution', 'mounted'],\n\tsetup() {\n\t\tconst executionHelpers = useExecutionHelpers();\n\n\t\treturn {\n\t\t\texecutionHelpers,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t\tcurrentWorkflow(): string {\n\t\t\treturn (this.$route.params.name as string) || this.workflowsStore.workflowId;\n\t\t},\n\t\tretryExecutionActions(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'current-workflow',\n\t\t\t\t\tlabel: this.$locale.baseText('executionsList.retryWithCurrentlySavedWorkflow'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'original-workflow',\n\t\t\t\t\tlabel: this.$locale.baseText('executionsList.retryWithOriginalWorkflow'),\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\texecutionUIDetails(): IExecutionUIData {\n\t\t\treturn this.executionHelpers.getUIDetails(this.execution);\n\t\t},\n\t\tisActive(): boolean {\n\t\t\treturn this.execution.id === this.$route.params.executionId;\n\t\t},\n\t\tisRetriable(): boolean {\n\t\t\treturn this.executionHelpers.isExecutionRetriable(this.execution);\n\t\t},\n\t\texecutionPreviewViewName() {\n\t\t\treturn VIEWS.EXECUTION_PREVIEW;\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$emit('mounted', this.execution.id);\n\t},\n\tmethods: {\n\t\tonRetryMenuItemSelect(action: string): void {\n\t\t\tthis.$emit('retryExecution', { execution: this.execution, command: action });\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n@import '@/styles/variables';\n\n.WorkflowExecutionsCard {\n\t--execution-list-item-background: var(--color-foreground-xlight);\n\t--execution-list-item-highlight-background: var(--color-warning-tint-1);\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-right: var(--spacing-m);\n\n\t&.active {\n\t\tborder-left: var(--spacing-4xs) var(--border-style-base) transparent !important;\n\n\t\t.executionStatus {\n\t\t\tcolor: var(--color-text-dark) !important;\n\t\t}\n\t}\n\n\t&:hover,\n\t&.active {\n\t\t.executionLink {\n\t\t\t--execution-list-item-background: var(--color-foreground-light);\n\t\t}\n\t}\n\n\t&.new,\n\t&.running {\n\t\t.spinner {\n\t\t\tposition: relative;\n\t\t\ttop: 1px;\n\t\t}\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-running);\n\t\t}\n\t\t.statusLabel,\n\t\t.spinner {\n\t\t\tcolor: var(--color-warning);\n\t\t}\n\t}\n\n\t&.success {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-success);\n\t\t}\n\t}\n\n\t&.waiting {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-waiting);\n\t\t}\n\t\t.statusLabel {\n\t\t\tcolor: var(--color-secondary);\n\t\t}\n\t}\n\n\t&.error {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-error);\n\t\t}\n\t\t.statusLabel {\n\t\t\tcolor: var(--color-danger);\n\t\t}\n\t}\n\n\t&.unknown {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-unknown);\n\t\t}\n\t}\n}\n\n.executionLink {\n\tbackground: var(--execution-list-item-background);\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-xs);\n\tpadding: var(--spacing-xs);\n\tpadding-right: var(--spacing-s);\n\tposition: relative;\n\tleft: calc(\n\t\t-1 * var(--spacing-4xs)\n\t); // Hide link border under card border so it's not visible when not hovered\n\n\t&:active {\n\t\t.icon,\n\t\t.statusLabel {\n\t\t\tcolor: var(--color-text-base);\n\t\t}\n\t}\n}\n\n.icons {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.icon {\n\tfont-size: var(--font-size-s);\n\n\t&.retry {\n\t\tsvg {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n\n\t&.manual {\n\t\tposition: relative;\n\t\ttop: 1px;\n\t}\n\n\t& + & {\n\t\tmargin-left: var(--spacing-2xs);\n\t}\n}\n.showGap {\n\tmargin-bottom: var(--spacing-2xs);\n\t.executionLink {\n\t\tborder-bottom: 1px solid var(--color-foreground-dark);\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tref=\"container\"\n\t\t:class=\"['executions-sidebar', $style.container]\"\n\t\tdata-test-id=\"executions-sidebar\"\n\t>\n\t\t<div :class=\"$style.heading\">\n\t\t\t<n8n-heading tag=\"h2\" size=\"medium\" color=\"text-dark\">\n\t\t\t\t{{ $locale.baseText('generic.executions') }}\n\t\t\t</n8n-heading>\n\t\t</div>\n\t\t<div :class=\"$style.controls\">\n\t\t\t<el-checkbox\n\t\t\t\tv-model=\"executionsStore.autoRefresh\"\n\t\t\t\tdata-test-id=\"auto-refresh-checkbox\"\n\t\t\t\t@update:model-value=\"$emit('update:autoRefresh', $event)\"\n\t\t\t>\n\t\t\t\t{{ $locale.baseText('executionsList.autoRefresh') }}\n\t\t\t</el-checkbox>\n\t\t\t<ExecutionsFilter popover-placement=\"left-start\" @filter-changed=\"onFilterChanged\" />\n\t\t</div>\n\t\t<div\n\t\t\tref=\"executionList\"\n\t\t\t:class=\"$style.executionList\"\n\t\t\tdata-test-id=\"current-executions-list\"\n\t\t\t@scroll=\"loadMore(20)\"\n\t\t>\n\t\t\t<div v-if=\"loading\" class=\"mr-l\">\n\t\t\t\t<n8n-loading variant=\"rect\" />\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"!loading && executions.length === 0\"\n\t\t\t\t:class=\"$style.noResultsContainer\"\n\t\t\t\tdata-test-id=\"execution-list-empty\"\n\t\t\t>\n\t\t\t\t<n8n-text color=\"text-base\" size=\"medium\" align=\"center\">\n\t\t\t\t\t{{ $locale.baseText('executionsLandingPage.noResults') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<WorkflowExecutionsCard\n\t\t\t\tv-else-if=\"temporaryExecution\"\n\t\t\t\t:ref=\"`execution-${temporaryExecution.id}`\"\n\t\t\t\t:execution=\"temporaryExecution\"\n\t\t\t\t:data-test-id=\"`execution-details-${temporaryExecution.id}`\"\n\t\t\t\t:show-gap=\"true\"\n\t\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t\t/>\n\t\t\t<TransitionGroup name=\"executions-list\">\n\t\t\t\t<WorkflowExecutionsCard\n\t\t\t\t\tv-for=\"execution in executions\"\n\t\t\t\t\t:key=\"execution.id\"\n\t\t\t\t\t:ref=\"`execution-${execution.id}`\"\n\t\t\t\t\t:execution=\"execution\"\n\t\t\t\t\t:data-test-id=\"`execution-details-${execution.id}`\"\n\t\t\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t\t\t\t@mounted=\"onItemMounted\"\n\t\t\t\t/>\n\t\t\t</TransitionGroup>\n\t\t\t<div v-if=\"loadingMore\" class=\"mr-m\">\n\t\t\t\t<n8n-loading variant=\"p\" :rows=\"1\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div :class=\"$style.infoAccordion\">\n\t\t\t<WorkflowExecutionsInfoAccordion :initially-expanded=\"false\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport WorkflowExecutionsCard from '@/components/executions/workflow/WorkflowExecutionsCard.vue';\nimport WorkflowExecutionsInfoAccordion from '@/components/executions/workflow/WorkflowExecutionsInfoAccordion.vue';\nimport ExecutionsFilter from '@/components/executions/ExecutionsFilter.vue';\nimport { VIEWS } from '@/constants';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport type { RouteRecord } from 'vue-router';\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { ExecutionFilterType } from '@/Interface';\n\ntype WorkflowExecutionsCardRef = InstanceType<typeof WorkflowExecutionsCard>;\ntype AutoScrollDeps = { activeExecutionSet: boolean; cardsMounted: boolean; scroll: boolean };\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsSidebar',\n\tcomponents: {\n\t\tWorkflowExecutionsCard,\n\t\tWorkflowExecutionsInfoAccordion,\n\t\tExecutionsFilter,\n\t},\n\tprops: {\n\t\texecutions: {\n\t\t\ttype: Array as PropType<ExecutionSummary[]>,\n\t\t\trequired: true,\n\t\t},\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tloadingMore: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttemporaryExecution: {\n\t\t\ttype: Object as PropType<ExecutionSummary>,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\temits: {\n\t\tretryExecution: null,\n\t\tloadMore: null,\n\t\trefresh: null,\n\t\tfilterUpdated: null,\n\t\treloadExecutions: null,\n\t\t'update:autoRefresh': null,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfilter: {} as ExecutionFilterType,\n\t\t\tmountedItems: [] as string[],\n\t\t\tautoScrollDeps: {\n\t\t\t\tactiveExecutionSet: false,\n\t\t\t\tcardsMounted: false,\n\t\t\t\tscroll: true,\n\t\t\t} as AutoScrollDeps,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useExecutionsStore, useWorkflowsStore),\n\t},\n\twatch: {\n\t\t$route(to: RouteRecord, from: RouteRecord) {\n\t\t\tif (from.name === VIEWS.EXECUTION_PREVIEW && to.name === VIEWS.EXECUTION_HOME) {\n\t\t\t\t// Skip parent route when navigating through executions with back button\n\t\t\t\tthis.$router.go(-1);\n\t\t\t}\n\t\t},\n\t\t'executionsStore.activeExecution'(\n\t\t\tnewValue: ExecutionSummary | null,\n\t\t\toldValue: ExecutionSummary | null,\n\t\t) {\n\t\t\tif (newValue && newValue.id !== oldValue?.id) {\n\t\t\t\tthis.autoScrollDeps.activeExecutionSet = true;\n\t\t\t}\n\t\t},\n\t\tautoScrollDeps: {\n\t\t\thandler(updatedDeps: AutoScrollDeps) {\n\t\t\t\tif (Object.values(updatedDeps).every(Boolean)) {\n\t\t\t\t\tthis.scrollToActiveCard();\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeep: true,\n\t\t},\n\t},\n\tmethods: {\n\t\tonItemMounted(id: string): void {\n\t\t\tthis.mountedItems.push(id);\n\t\t\tif (this.mountedItems.length === this.executions.length) {\n\t\t\t\tthis.autoScrollDeps.cardsMounted = true;\n\t\t\t\tthis.checkListSize();\n\t\t\t}\n\n\t\t\tif (this.executionsStore.activeExecution?.id === id) {\n\t\t\t\tthis.autoScrollDeps.activeExecutionSet = true;\n\t\t\t}\n\t\t},\n\t\tloadMore(limit = 20): void {\n\t\t\tif (!this.loading) {\n\t\t\t\tconst executionsListRef = this.$refs.executionList as HTMLElement | undefined;\n\t\t\t\tif (executionsListRef) {\n\t\t\t\t\tconst diff =\n\t\t\t\t\t\texecutionsListRef.offsetHeight -\n\t\t\t\t\t\t(executionsListRef.scrollHeight - executionsListRef.scrollTop);\n\t\t\t\t\tif (diff > -10 && diff < 10) {\n\t\t\t\t\t\tthis.$emit('loadMore', limit);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonRetryExecution(payload: object) {\n\t\t\tthis.$emit('retryExecution', payload);\n\t\t},\n\t\tonRefresh(): void {\n\t\t\tthis.$emit('refresh');\n\t\t},\n\t\tonFilterChanged(filter: ExecutionFilterType) {\n\t\t\tthis.$emit('filterUpdated', filter);\n\t\t},\n\t\treloadExecutions(): void {\n\t\t\tthis.$emit('reloadExecutions');\n\t\t},\n\t\tcheckListSize(): void {\n\t\t\tconst sidebarContainerRef = this.$refs.container as HTMLElement | undefined;\n\t\t\tconst currentWorkflowExecutionsCardRefs = this.$refs[\n\t\t\t\t`execution-${this.mountedItems[this.mountedItems.length - 1]}`\n\t\t\t] as WorkflowExecutionsCardRef[] | undefined;\n\n\t\t\t// Find out how many execution card can fit into list\n\t\t\t// and load more if needed\n\t\t\tif (sidebarContainerRef && currentWorkflowExecutionsCardRefs?.length) {\n\t\t\t\tconst cardElement = currentWorkflowExecutionsCardRefs[0].$el as HTMLElement;\n\t\t\t\tconst listCapacity = Math.ceil(sidebarContainerRef.clientHeight / cardElement.clientHeight);\n\n\t\t\t\tif (listCapacity > this.executions.length) {\n\t\t\t\t\tthis.$emit('loadMore', listCapacity - this.executions.length);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tscrollToActiveCard(): void {\n\t\t\tconst executionsListRef = this.$refs.executionList as HTMLElement | undefined;\n\t\t\tconst currentWorkflowExecutionsCardRefs = this.$refs[\n\t\t\t\t`execution-${this.executionsStore.activeExecution?.id}`\n\t\t\t] as WorkflowExecutionsCardRef[] | undefined;\n\n\t\t\tif (\n\t\t\t\texecutionsListRef &&\n\t\t\t\tcurrentWorkflowExecutionsCardRefs?.length &&\n\t\t\t\tthis.executionsStore.activeExecution\n\t\t\t) {\n\t\t\t\tconst cardElement = currentWorkflowExecutionsCardRefs[0].$el as HTMLElement;\n\t\t\t\tconst cardRect = cardElement.getBoundingClientRect();\n\t\t\t\tconst LIST_HEADER_OFFSET = 200;\n\t\t\t\tif (cardRect.top > executionsListRef.offsetHeight) {\n\t\t\t\t\tthis.autoScrollDeps.scroll = false;\n\t\t\t\t\texecutionsListRef.scrollTo({\n\t\t\t\t\t\ttop: cardRect.top - LIST_HEADER_OFFSET,\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tflex: 310px 0 0;\n\tbackground-color: var(--color-background-xlight);\n\tborder-right: var(--border-base);\n\tpadding: var(--spacing-l) 0 var(--spacing-l) var(--spacing-l);\n\tz-index: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n}\n\n.heading {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: baseline;\n\tpadding-right: var(--spacing-l);\n}\n\n.controls {\n\tpadding: var(--spacing-s) 0 var(--spacing-xs);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding-right: var(--spacing-m);\n\n\tbutton {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n}\n\n.executionList {\n\tflex: 1;\n\toverflow: auto;\n\tmargin-bottom: var(--spacing-m);\n\tbackground-color: var(--color-background-xlight) !important;\n\n\t// Scrolling fader\n\t&::before {\n\t\tposition: absolute;\n\t\tdisplay: block;\n\t\twidth: 270px;\n\t\theight: 6px;\n\t\tbackground: linear-gradient(to bottom, rgba(251, 251, 251, 1) 0%, rgba(251, 251, 251, 0) 100%);\n\t\tz-index: 999;\n\t}\n\n\t// Lower first execution card so fader is not visible when not scrolled\n\t& > div:first-child {\n\t\tmargin-top: 3px;\n\t}\n}\n\n.infoAccordion {\n\tposition: absolute;\n\tbottom: 0;\n\tmargin-left: calc(-1 * var(--spacing-l));\n\tborder-top: var(--border-base);\n\n\t& > div {\n\t\twidth: 309px;\n\t\tbackground-color: var(--color-background-light);\n\t\tmargin-top: 0 !important;\n\t}\n}\n\n.noResultsContainer {\n\twidth: 100%;\n\tmargin-top: var(--spacing-2xl);\n\ttext-align: center;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.executions-sidebar {\n\t:deep(.el-skeleton__item) {\n\t\theight: 60px;\n\t\tborder-radius: 0;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<WorkflowExecutionsSidebar\n\t\t\t:executions=\"executions\"\n\t\t\t:loading=\"loading && !executions.length\"\n\t\t\t:loading-more=\"loadingMore\"\n\t\t\t:temporary-execution=\"temporaryExecution\"\n\t\t\t@update:auto-refresh=\"$emit('update:auto-refresh', $event)\"\n\t\t\t@reload-executions=\"$emit('reload')\"\n\t\t\t@filter-updated=\"$emit('update:filters', $event)\"\n\t\t\t@load-more=\"$emit('load-more')\"\n\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t/>\n\t\t<div v-if=\"!hidePreview\" :class=\"$style.content\">\n\t\t\t<router-view\n\t\t\t\tname=\"executionPreview\"\n\t\t\t\t:execution=\"execution\"\n\t\t\t\t@delete-current-execution=\"onDeleteCurrentExecution\"\n\t\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useRouter } from 'vue-router';\nimport WorkflowExecutionsSidebar from '@/components/executions/workflow/WorkflowExecutionsSidebar.vue';\nimport {\n\tMAIN_HEADER_TABS,\n\tMODAL_CANCEL,\n\tMODAL_CONFIRM,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tVIEWS,\n} from '@/constants';\nimport type { ExecutionFilterType, IWorkflowDb } from '@/Interface';\nimport type { ExecutionSummary, IDataObject } from 'n8n-workflow';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { getNodeViewTab } from '@/utils/canvasUtils';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { executionFilterToQueryFilter } from '@/utils/executionUtils';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsList',\n\tcomponents: {\n\t\tWorkflowExecutionsSidebar,\n\t},\n\tasync beforeRouteLeave(to, _, next) {\n\t\tif (getNodeViewTab(to) === MAIN_HEADER_TABS.WORKFLOW) {\n\t\t\tnext();\n\t\t\treturn;\n\t\t}\n\t\tif (this.uiStore.stateIsDirty) {\n\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({}, false);\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t}\n\t\t} else {\n\t\t\tnext();\n\t\t}\n\t},\n\tprops: {\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tworkflow: {\n\t\t\ttype: Object as PropType<IWorkflowDb>,\n\t\t\trequired: true,\n\t\t},\n\t\texecutions: {\n\t\t\ttype: Array as PropType<ExecutionSummary[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tfilters: {\n\t\t\ttype: Object as PropType<ExecutionFilterType>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\texecution: {\n\t\t\ttype: Object as PropType<ExecutionSummary>,\n\t\t\tdefault: null,\n\t\t},\n\t\tloadingMore: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\temits: [\n\t\t'execution:delete',\n\t\t'execution:stop',\n\t\t'execution:retry',\n\t\t'update:auto-refresh',\n\t\t'update:filters',\n\t\t'load-more',\n\t\t'reload',\n\t],\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tworkflowHelpers,\n\t\t\tcallDebounced,\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useTagsStore, useNodeTypesStore, useSettingsStore, useUIStore),\n\t\ttemporaryExecution(): ExecutionSummary | undefined {\n\t\t\tconst isTemporary = !this.executions.find((execution) => execution.id === this.execution?.id);\n\t\t\treturn isTemporary ? this.execution : undefined;\n\t\t},\n\t\thidePreview(): boolean {\n\t\t\treturn this.loading || (!this.execution && this.executions.length);\n\t\t},\n\t\tfilterApplied(): boolean {\n\t\t\treturn this.filters.status !== 'all';\n\t\t},\n\t\tworkflowDataNotLoaded(): boolean {\n\t\t\treturn this.workflow.id === PLACEHOLDER_EMPTY_WORKFLOW_ID && this.workflow.name === '';\n\t\t},\n\t\trequestFilter(): IDataObject {\n\t\t\treturn executionFilterToQueryFilter({\n\t\t\t\t...this.filters,\n\t\t\t\tworkflowId: this.workflow.id,\n\t\t\t});\n\t\t},\n\t},\n\twatch: {\n\t\texecution(value: ExecutionSummary) {\n\t\t\tif (!value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$router\n\t\t\t\t.push({\n\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\tparams: { name: this.workflow.id, executionId: value.id },\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onDeleteCurrentExecution(): Promise<void> {\n\t\t\tthis.$emit('execution:delete', this.execution.id);\n\t\t},\n\t\tasync onStopExecution(): Promise<void> {\n\t\t\tthis.$emit('execution:stop', this.execution.id);\n\t\t},\n\t\tasync onRetryExecution(payload: { execution: ExecutionSummary; command: string }) {\n\t\t\tconst loadWorkflow = payload.command === 'current-workflow';\n\n\t\t\tthis.$emit('execution:retry', {\n\t\t\t\tid: payload.execution.id,\n\t\t\t\tloadWorkflow,\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.content {\n\tflex: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport WorkflowExecutionsList from '@/components/executions/workflow/WorkflowExecutionsList.vue';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useI18n } from '@/composables/useI18n';\nimport type { ExecutionFilterType, ITag, IWorkflowDb } from '@/Interface';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { NO_NETWORK_ERROR_CODE } from '@/utils/apiUtils';\nimport { useToast } from '@/composables/useToast';\nimport { VIEWS } from '@/constants';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { storeToRefs } from 'pinia';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useTagsStore } from '@/stores/tags.store';\n\nconst executionsStore = useExecutionsStore();\nconst workflowsStore = useWorkflowsStore();\nconst tagsStore = useTagsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst route = useRoute();\nconst router = useRouter();\nconst toast = useToast();\nconst { callDebounced } = useDebounce();\n\nconst { filters } = storeToRefs(executionsStore);\n\nconst loading = ref(false);\nconst loadingMore = ref(false);\n\nconst workflow = ref<IWorkflowDb | undefined>();\n\nconst workflowId = computed(() => {\n\treturn (route.params.name as string) || workflowsStore.workflowId;\n});\n\nconst executionId = computed(() => route.params.executionId as string);\n\nconst executions = computed(() => [\n\t...(executionsStore.currentExecutionsByWorkflowId[workflowId.value] ?? []),\n\t...(executionsStore.executionsByWorkflowId[workflowId.value] ?? []),\n]);\n\nconst execution = computed(() => {\n\treturn executions.value.find((e) => e.id === executionId.value) ?? currentExecution.value;\n});\n\nconst currentExecution = ref<ExecutionSummary | undefined>();\n\nwatch(\n\t() => workflowId.value,\n\tasync () => {\n\t\tawait fetchWorkflow();\n\t},\n);\n\nwatch(\n\t() => executionId.value,\n\tasync () => {\n\t\tawait fetchExecution();\n\t},\n);\n\nonMounted(async () => {\n\tawait nodeTypesStore.loadNodeTypesIfNotLoaded();\n\tawait Promise.all([\n\t\tnodeTypesStore.loadNodeTypesIfNotLoaded(),\n\t\tfetchWorkflow(),\n\t\texecutionsStore.initialize(workflowId.value),\n\t]);\n\tawait fetchExecution();\n\tawait initializeRoute();\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nonBeforeUnmount(() => {\n\texecutionsStore.reset();\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nasync function fetchExecution() {\n\tif (!executionId.value) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcurrentExecution.value = (await executionsStore.fetchExecution(\n\t\t\texecutionId.value,\n\t\t)) as ExecutionSummary;\n\t\texecutionsStore.activeExecution = currentExecution.value;\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('nodeView.showError.openExecution.title'));\n\t}\n}\n\nfunction onDocumentVisibilityChange() {\n\tif (document.visibilityState === 'hidden') {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t} else {\n\t\tvoid executionsStore.startAutoRefreshInterval(workflowId.value);\n\t}\n}\n\nasync function initializeRoute() {\n\tif (route.name === VIEWS.EXECUTION_HOME && executions.value.length > 0 && workflow.value) {\n\t\tawait router\n\t\t\t.push({\n\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\tparams: { name: workflow.value.id, executionId: executions.value[0].id },\n\t\t\t})\n\t\t\t.catch(() => {});\n\t}\n}\n\nasync function fetchWorkflow() {\n\tlet data: IWorkflowDb | undefined = workflowsStore.workflowsById[workflowId.value];\n\tif (!data) {\n\t\ttry {\n\t\t\tdata = await workflowsStore.fetchWorkflow(workflowId.value);\n\t\t} catch (error) {\n\t\t\ttoast.showError(error, i18n.baseText('nodeView.showError.openWorkflow.title'));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (!data) {\n\t\tthrow new Error(\n\t\t\ti18n.baseText('nodeView.workflowWithIdCouldNotBeFound', {\n\t\t\t\tinterpolate: { workflowId: workflowId.value },\n\t\t\t}),\n\t\t);\n\t}\n\n\tconst tags = (data.tags ?? []) as ITag[];\n\tworkflow.value = data;\n\tworkflowsStore.setWorkflowName({ newName: data.name, setStateDirty: false });\n\tworkflowsStore.setWorkflowTagIds(tags.map(({ id }) => id) ?? []);\n\ttagsStore.upsertTags(tags);\n}\n\nasync function onAutoRefreshToggle(value: boolean) {\n\tif (value) {\n\t\tawait executionsStore.startAutoRefreshInterval(workflowId.value);\n\t} else {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t}\n}\n\nasync function onRefreshData() {\n\tif (!workflowId.value) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait executionsStore.fetchExecutions({\n\t\t\t...executionsStore.executionsFilters,\n\t\t\tworkflowId: workflowId.value,\n\t\t});\n\t} catch (error) {\n\t\tif (error.errorCode === NO_NETWORK_ERROR_CODE) {\n\t\t\ttoast.showMessage(\n\t\t\t\t{\n\t\t\t\t\ttitle: i18n.baseText('executionsList.showError.refreshData.title'),\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\tduration: 3500,\n\t\t\t\t},\n\t\t\t\tfalse,\n\t\t\t);\n\t\t} else {\n\t\t\ttoast.showError(error, i18n.baseText('executionsList.showError.refreshData.title'));\n\t\t}\n\t}\n}\n\nasync function onUpdateFilters(newFilters: ExecutionFilterType) {\n\texecutionsStore.reset();\n\texecutionsStore.setFilters(newFilters);\n\tawait executionsStore.initialize(workflowId.value);\n}\n\nasync function onExecutionStop(id: string) {\n\ttry {\n\t\tawait executionsStore.stopCurrentExecution(id);\n\n\t\ttoast.showMessage({\n\t\t\ttitle: i18n.baseText('executionsList.showMessage.stopExecution.title'),\n\t\t\tmessage: i18n.baseText('executionsList.showMessage.stopExecution.message', {\n\t\t\t\tinterpolate: { activeExecutionId: id },\n\t\t\t}),\n\t\t\ttype: 'success',\n\t\t});\n\n\t\tawait onRefreshData();\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.stopExecution.title'));\n\t}\n}\n\nasync function onExecutionDelete(id: string) {\n\tloading.value = true;\n\ttry {\n\t\tconst executionIndex = executions.value.findIndex((e: ExecutionSummary) => e.id === id);\n\n\t\tconst nextExecution =\n\t\t\texecutions.value[executionIndex + 1] ||\n\t\t\texecutions.value[executionIndex - 1] ||\n\t\t\texecutions.value[0];\n\n\t\tawait executionsStore.deleteExecutions({\n\t\t\tids: [id],\n\t\t});\n\n\t\tif (workflow.value) {\n\t\t\tif (executions.value.length > 0) {\n\t\t\t\tawait router\n\t\t\t\t\t.replace({\n\t\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\t\tparams: { name: workflow.value.id, executionId: nextExecution.id },\n\t\t\t\t\t})\n\t\t\t\t\t.catch(() => {});\n\t\t\t} else {\n\t\t\t\t// If there are no executions left, show empty state\n\t\t\t\tawait router.replace({\n\t\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\t\tparams: { name: workflow.value.id },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tloading.value = false;\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.handleDeleteSelected.title'));\n\t\treturn;\n\t}\n\tloading.value = false;\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('executionsList.showMessage.handleDeleteSelected.title'),\n\t\ttype: 'success',\n\t});\n}\n\nasync function onExecutionRetry(payload: { id: string; loadWorkflow: boolean }) {\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('executionDetails.runningMessage'),\n\t\ttype: 'info',\n\t\tduration: 2000,\n\t});\n\n\tawait retryExecution(payload);\n\tawait onRefreshData();\n\n\ttelemetry.track('User clicked retry execution button', {\n\t\tworkflow_id: workflow.value?.id,\n\t\texecution_id: payload.id,\n\t\tretry_type: payload.loadWorkflow ? 'current' : 'original',\n\t});\n}\n\nasync function retryExecution(payload: { id: string; loadWorkflow: boolean }) {\n\ttry {\n\t\tconst retrySuccessful = await executionsStore.retryExecution(payload.id, payload.loadWorkflow);\n\n\t\tif (retrySuccessful) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulTrue.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulFalse.title'),\n\t\t\t\ttype: 'error',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.retryExecution.title'));\n\t}\n}\n\nasync function onLoadMore(): Promise<void> {\n\tif (!loadingMore.value) {\n\t\tawait callDebounced(loadMore, { debounceTime: 1000 });\n\t}\n}\n\nasync function loadMore(): Promise<void> {\n\tif (\n\t\t!!executionsStore.executionsFilters.status?.includes('running') ||\n\t\texecutions.value.length >= executionsStore.executionsCount\n\t) {\n\t\treturn;\n\t}\n\n\tloadingMore.value = true;\n\n\tlet lastId: string | undefined;\n\tif (executions.value.length !== 0) {\n\t\tconst lastItem = executions.value.slice(-1)[0];\n\t\tlastId = lastItem.id;\n\t}\n\n\ttry {\n\t\tawait executionsStore.fetchExecutions(executionsStore.executionsFilters, lastId);\n\t} catch (error) {\n\t\tloadingMore.value = false;\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.loadMore.title'));\n\t\treturn;\n\t}\n\n\tloadingMore.value = false;\n}\n</script>\n<template>\n\t<WorkflowExecutionsList\n\t\tv-if=\"workflow\"\n\t\t:executions=\"executions\"\n\t\t:execution=\"execution\"\n\t\t:filters=\"filters\"\n\t\t:workflow=\"workflow\"\n\t\t:loading=\"loading\"\n\t\t:loading-more=\"loadingMore\"\n\t\t@execution:stop=\"onExecutionStop\"\n\t\t@execution:delete=\"onExecutionDelete\"\n\t\t@execution:retry=\"onExecutionRetry\"\n\t\t@update:filters=\"onUpdateFilters\"\n\t\t@update:auto-refresh=\"onAutoRefreshToggle\"\n\t\t@load-more=\"onLoadMore\"\n\t\t@reload=\"onRefreshData\"\n\t/>\n</template>\n"],"names":["_sfc_main$3","defineComponent","ExecutionsTime","useExecutionHelpers","mapStores","useWorkflowsStore","VIEWS","action","_resolveComponent","$style","_normalizeClass","executionUIDetails","_ctx","highlight","_createVNode","_component_router_link","executionPreviewViewName","_withCtx","_createElementVNode","_component_n8n_text","_createTextVNode","_toDisplayString","_openBlock","_createBlock","_component_n8n_spinner","_createCommentVNode","execution","_component_ExecutionsTime","_createElementBlock","_hoisted_1","isRetriable","onRetryMenuItemSelect","_component_n8n_tooltip","_sfc_main$2","WorkflowExecutionsCard","WorkflowExecutionsInfoAccordion","ExecutionsFilter","useExecutionsStore","to","from","newValue","oldValue","updatedDeps","id","_a","limit","executionsListRef","diff","payload","filter","sidebarContainerRef","currentWorkflowExecutionsCardRefs","cardElement","listCapacity","cardRect","LIST_HEADER_OFFSET","_hoisted_2","_component_WorkflowExecutionsInfoAccordion","_component_n8n_heading","_component_el_checkbox","_cache","$event","_component_ExecutionsFilter","loadMore","loading","_component_n8n_loading","temporaryExecution","onRetryExecution","_TransitionGroup","_Fragment","_renderList","_component_WorkflowExecutionsCard","onItemMounted","loadingMore","_sfc_main$1","WorkflowExecutionsSidebar","_","next","getNodeViewTab","MAIN_HEADER_TABS","confirmModal","MODAL_CONFIRM","MODAL_CANCEL","externalHooks","useExternalHooks","router","useRouter","workflowHelpers","useWorkflowHelpers","callDebounced","useDebounce","useToast","useMessage","useTagsStore","useNodeTypesStore","useSettingsStore","useUIStore","PLACEHOLDER_EMPTY_WORKFLOW_ID","executionFilterToQueryFilter","value","loadWorkflow","$emit","hidePreview","onStopExecution","executionsStore","workflowsStore","tagsStore","nodeTypesStore","i18n","useI18n","telemetry","useTelemetry","route","useRoute","toast","filters","storeToRefs","ref","workflow","workflowId","computed","executionId","executions","e","currentExecution","watch","fetchWorkflow","fetchExecution","onMounted","initializeRoute","onDocumentVisibilityChange","onBeforeUnmount","error","data","tags","onAutoRefreshToggle","onRefreshData","NO_NETWORK_ERROR_CODE","onUpdateFilters","newFilters","onExecutionStop","onExecutionDelete","executionIndex","nextExecution","onExecutionRetry","retryExecution","onLoadMore","lastId"],"mappings":"mlDA6FA,MAAAA,GAAeC,EAAgB,CAC9B,KAAM,yBACN,WAAY,CACX,eAAAC,EACD,EACA,MAAO,CACN,UAAW,CACV,KAAM,OACN,SAAU,EACX,EACA,UAAW,CACV,KAAM,QACN,QAAS,EACV,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CAAC,iBAAkB,SAAS,EACnC,OAAQ,CAGA,MAAA,CACN,iBAHwBC,IAGxB,CAEF,EACA,SAAU,CACT,GAAGC,EAAUC,CAAiB,EAC9B,iBAA0B,CACzB,OAAQ,KAAK,OAAO,OAAO,MAAmB,KAAK,eAAe,UACnE,EACA,uBAAkC,CAC1B,MAAA,CACN,CACC,GAAI,mBACJ,MAAO,KAAK,QAAQ,SAAS,gDAAgD,CAC9E,EACA,CACC,GAAI,oBACJ,MAAO,KAAK,QAAQ,SAAS,0CAA0C,CACxE,CAAA,CAEF,EACA,oBAAuC,CACtC,OAAO,KAAK,iBAAiB,aAAa,KAAK,SAAS,CACzD,EACA,UAAoB,CACnB,OAAO,KAAK,UAAU,KAAO,KAAK,OAAO,OAAO,WACjD,EACA,aAAuB,CACtB,OAAO,KAAK,iBAAiB,qBAAqB,KAAK,SAAS,CACjE,EACA,0BAA2B,CAC1B,OAAOC,EAAM,iBACd,CACD,EACA,SAAU,CACT,KAAK,MAAM,UAAW,KAAK,UAAU,EAAE,CACxC,EACA,QAAS,CACR,sBAAsBC,EAAsB,CACtC,KAAA,MAAM,iBAAkB,CAAE,UAAW,KAAK,UAAW,QAASA,EAAQ,CAC5E,CACD,CACD,CAAC,ixBA7JAC,EA+EM,aAAA,sBA9EsCC,MAAOC,EAAA,CAAmCD,iBAAa,GAAA,CAAiBA,SAAOE,sBAAmB,EAAA,GAAkBF,CAAAA,EAAAA,OAAO,QAASG,EAAGC,SAAAA,CAAeJ,SAAOG,EAAiB,mBAAA,IAAA,CAAA,EAAA,GAAA,CAAAA,EAAA,OAAA,SAAA,EAAAA,EAAA,2CAWrNE,EAAAC,EAAA,CAAA,MAAcC,EAAwBJ,EAAA,OAAA,aAAA,EAAA,GAAA,iCAIxC,OAAA,CAAA,KAAAA,EAAA,gBAA4BD,cAAmB,UAAI,EAAA,CAAA,EAjBvD,6BA0DSC,EAAA,mBAAA,IAAA,EAAA,SAvCKK,EAnBd,IAAA,CAAAC,EAAA,MAAA,CAoBI,MAEWR,EAAAE,EAAA,OAAA,WAAA,CAAA,EAAA,CAF4BE,EAAAK,EAAA,CAAE,MAAK,YAAS,KAAA,GAAA,KAAA,SApB3D,eAAA,gBAAA,EAAA,gBAAAC,EAAAC,EAAAT,EAAA,mBAAA,SAAA,EAAA,CAAA,CAAA,CAAA,EAuBI,EAAA,CAAA,CAAA,WAEQD,MAAAA,EAAAA,EAAmB,OAAI,eAAA,CAAA,EAAA,CAzBnCC,EAAA,mBAAA,OAAA,WAAAU,EA0BkB,EAAAC,EAAAC,EAAA,CACX,IAAK,EAAA,KAAA,QA3BZ,MAAAd,EAAA,CAAAE,EAAA,OAAA,QAAA,QAAA,CAAA,CAAA,EA6BK,KAEa,EAFF,CAAA,OAAA,CAAA,GAAAa,EA7BhB,GA6BuBhB,EAAAA,EAAAA,EAAyBU,EAAO,CAAA,MAAAT,EAAAE,EAAA,OAAA,WAAA,EA7BvD,KAAA,OAAA,EAAA,gBAAAQ,EAAAC,EAAAT,EAAA,mBAAA,KAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,EAkCYD,EAAAA,CAAAA,OAAAA,CAAAA,EAAAA,EAAAA,IADPU,EAOW,GAAA,EAAA,GAAA,EAAAT,EAxChB,uCAmCsB,EAAAW,EAAAJ,EAAA,CAChB,IAAI,EAAA,MAAAP,EAAA,SAAA,YAAA,YApCV,KAAA,OAAA,EAAA,SAuCMK,EAAoD,IAAA,CAAAG,EAAvBM,EAAUd,EAAS,QAAA,SAAA,qCAAA,CAAA,EAAA,IAAA,CAAA,EAAAE,EAAAa,EAAA,mCAvCtD,EAAA,KAAA,EAAA,CAAA,YAAA,CAAA,CAAA,CAAA,EA0CiBhB,EAAAA,CAAAA,EAAAA,EAAAA,CAAAA,OAAAA,CAAAA,GAAAA,EA1CjB,yCA2CsBY,EAAAJ,EAAA,CAChB,IAAI,EAAA,MAAAP,EAAA,SAAA,YAAA,YA5CV,KAAA,OAAA,EAAA,CA+C+FD,QAAAA,EAAAA,IAAAA,OAAAA,OAAAA,EAAAA,EAAAA,EAAAA,QAAAA,SAAAA,uCAAAA,iFA/C/F,EAAA,CAAA,EAAA,EAAA,CAAA,OAAA,CAAA,GAqDee,EAAc,GAAA,EAAA,CAAA,EAAA,CAAA,EACxBd,EAAA,UAAA,OAEW,aAFegB,EAAA,MAAAC,GAAA,CAAAf,EAAmCK,EAAO,CAAA,MAAAP,EAAA,SAAA,YAAA,YAtDzE,KAAA,OAAA,EAAA,gBAAAQ,EAAAC,EAAAT,EAAA,QAAA,SAAA,wBAAA,CAAA,EAAA,KAAAS,EAAAT,EAAA,UAAA,OAAA,EAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,CAAA,OAAA,CAAA,CAAA,CAAA,GA2DGa,EAmBM,GAAA,EAAA,CAnBA,EAAA,CAAA,EAAAP,EAAA,MAAA,OAEEY,EAAWlB,EAAA,OAAA,KAAA,CAAA,EAAA,CA7DtBA,EAAA,aAAAU,IAAAC,EA8Dcd,EAAoB,CAC5B,IAAK,EACN,QAAe,CAAMG,EAAA,OAAA,KAAAA,EAAA,OAAA,KAAA,CAAA,EACrB,MAAAA,EAAA,sBACC,iBAAQmB,OAAAA,eAAAA,yBAlEd,SAAAnB,EAAA,qBAAA,EAoEuBc,KAAAA,EAAU,CAAI,QAAA,QAAA,UAAA,CAAA,GAAAD,EAAjC,GASc,EAAA,EA7ElBb,EAAA,UAAA,OAAA,UAAAU,IAoE8DC,EAAKS,EAAA,CAAA,IAAA,EACnD,UAAO,KAAA,EAAA,gBArEvBd,EA4EO,OAAA,KAAAG,EAAAT,EAAA,QAAA,SAAA,qBAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAJF,QAAAK,EAAA,IAAA,CAAAL,EAxEL,iCA0EeH,EAAoB,CAC7B,IAAI,EAAA,MAAAC,EAAA,CAAAE,EAAA,OAAA,KAAAA,EAAA,OAAA,MAAA,CAAA,EA3EV,KAAA,OAAA,EAAA,KAAA,EAAA,CAAA,OAAA,CAAA,GAAAa,EAAA,GAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,GAAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,4HCqFAQ,GAAehC,EAAgB,CAC9B,KAAM,4BACN,WAAY,CACX,uBAAAiC,GACA,gCAAAC,GACA,iBAAAC,EACD,EACA,MAAO,CACN,WAAY,CACX,KAAM,MACN,SAAU,EACX,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,YAAa,CACZ,KAAM,QACN,QAAS,EACV,EACA,mBAAoB,CACnB,KAAM,OACN,QAAS,IACV,CACD,EACA,MAAO,CACN,eAAgB,KAChB,SAAU,KACV,QAAS,KACT,cAAe,KACf,iBAAkB,KAClB,qBAAsB,IACvB,EACA,MAAO,CACC,MAAA,CACN,OAAQ,CAAC,EACT,aAAc,CAAC,EACf,eAAgB,CACf,mBAAoB,GACpB,aAAc,GACd,OAAQ,EACT,CAAA,CAEF,EACA,SAAU,CACT,GAAGhC,EAAUiC,EAAoBhC,CAAiB,CACnD,EACA,MAAO,CACN,OAAOiC,EAAiBC,EAAmB,CACtCA,EAAK,OAASjC,EAAM,mBAAqBgC,EAAG,OAAShC,EAAM,gBAEzD,KAAA,QAAQ,GAAG,EAAE,CAEpB,EACA,kCACCkC,EACAC,EACC,CACGD,GAAYA,EAAS,MAAOC,GAAA,YAAAA,EAAU,MACzC,KAAK,eAAe,mBAAqB,GAE3C,EACA,eAAgB,CACf,QAAQC,EAA6B,CAChC,OAAO,OAAOA,CAAW,EAAE,MAAM,OAAO,GAC3C,KAAK,mBAAmB,CAE1B,EACA,KAAM,EACP,CACD,EACA,QAAS,CACR,cAAcC,EAAkB,OAC1B,KAAA,aAAa,KAAKA,CAAE,EACrB,KAAK,aAAa,SAAW,KAAK,WAAW,SAChD,KAAK,eAAe,aAAe,GACnC,KAAK,cAAc,KAGhBC,EAAA,KAAK,gBAAgB,kBAArB,YAAAA,EAAsC,MAAOD,IAChD,KAAK,eAAe,mBAAqB,GAE3C,EACA,SAASE,EAAQ,GAAU,CACtB,GAAA,CAAC,KAAK,QAAS,CACZ,MAAAC,EAAoB,KAAK,MAAM,cACrC,GAAIA,EAAmB,CACtB,MAAMC,EACLD,EAAkB,cACjBA,EAAkB,aAAeA,EAAkB,WACjDC,EAAO,KAAOA,EAAO,IACnB,KAAA,MAAM,WAAYF,CAAK,CAE9B,CACD,CACD,EACA,iBAAiBG,EAAiB,CAC5B,KAAA,MAAM,iBAAkBA,CAAO,CACrC,EACA,WAAkB,CACjB,KAAK,MAAM,SAAS,CACrB,EACA,gBAAgBC,EAA6B,CACvC,KAAA,MAAM,gBAAiBA,CAAM,CACnC,EACA,kBAAyB,CACxB,KAAK,MAAM,kBAAkB,CAC9B,EACA,eAAsB,CACf,MAAAC,EAAsB,KAAK,MAAM,UACjCC,EAAoC,KAAK,MAC9C,aAAa,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,CAAC,EAC7D,EAII,GAAAD,IAAuBC,GAAA,MAAAA,EAAmC,QAAQ,CAC/D,MAAAC,EAAcD,EAAkC,CAAC,EAAE,IACnDE,EAAe,KAAK,KAAKH,EAAoB,aAAeE,EAAY,YAAY,EAEtFC,EAAe,KAAK,WAAW,QAClC,KAAK,MAAM,WAAYA,EAAe,KAAK,WAAW,MAAM,CAE9D,CACD,EACA,oBAA2B,OACpB,MAAAP,EAAoB,KAAK,MAAM,cAC/BK,EAAoC,KAAK,MAC9C,cAAaP,EAAA,KAAK,gBAAgB,kBAArB,YAAAA,EAAsC,EAAE,EACtD,EAEA,GACCE,IACAK,GAAA,MAAAA,EAAmC,SACnC,KAAK,gBAAgB,gBACpB,CAEK,MAAAG,EADcH,EAAkC,CAAC,EAAE,IAC5B,wBACvBI,EAAqB,IACvBD,EAAS,IAAMR,EAAkB,eACpC,KAAK,eAAe,OAAS,GAC7BA,EAAkB,SAAS,CAC1B,IAAKQ,EAAS,IAAMC,EACpB,SAAU,QAAA,CACV,EAEH,CACD,CACD,CACD,CAAC,sQA/MsB1B,GAAY,CAAA,IAAA,gBA+BR2B,GAAY,CAAA,IAAA,8KAOhCC,EAAAjD,EAAA,iCAAA,EA9DC,OAAAc,EAAA,EAAyBb,EAAAA,MAAAA,CAC/B,IAAA,YAAA,MAAAC,EAAA,CAAA,qBAAAE,EAAA,OAAA,SAAA,CAAA,EAEA,eAAA,oBAAA,EAAA,UACC,MAEcF,EAAAE,EAAA,OAAA,OAAA,CAAA,EAAA,GAFa8C,EAAQ,CAAC,IAAK,KAAA,KAAA,SAP5C,MAAA,WAAA,EAAA,gBAAAtC,EAAAC,EAAAT,EAAA,QAAA,SAAA,oBAAA,CAAA,EAAA,CAAA,CAAA,CAAA,KAWE,CAAA,CAAM,EAAA,CAAA,EAAAM,EAAA,MAAA,CACL,MAMcR,EAAAE,EAAA,OAAA,QAAA,CAAA,EAAA,CAlBjBE,EAAA6C,EAAA,CAAA,WAAA/C,EAAA,gBAAA,mFAcIgD,EAAA,CAAA,IAAaA,EAAuB,CAAA,EAAAC,GAAAjD,EAAA,MAAA,qBAAAiD,CAAA,EAAA,EAdxC,eAAA,uBAAA,EAAA,gBAAAzC,EAAAC,EAAAT,EAAA,QAAA,SAAA,4BAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAmBG,EAAA,CAAA,EAAkB,EAAA,CAAA,YAAA,CAAA,EAAAE,EAAgCgD,EAA+B,CAAA,oBAAA,8CA0C5E,EAAA,KAAA,EAAA,CAAA,iBAAA,CAAA,CAvCL,EAAA,CAAA,EAAA5C,EAtBH,MAuBWT,CACR,IAAA,gBACC,QAAMG,EAAEmD,OAAAA,aAAAA,EAAAA,eAAAA,mCAEEC,EAAO,CAAA,IAAAJ,EAAA,CAAA,EAAAC,GAAAjD,EAAA,SAAA,EAAA,EAAA,EAAA,CACjBA,EAAA,SAAAU,EAAA,EAAAM,EAAA,MAAAC,GAAA,CA5BJf,EAAAmD,EAAA,CAAA,QAAA,MAAA,CAAA,CAAA,CA8BG,GAAAxC,EAAA,GAAA,EAAA,EAAA,CAAAb,EA9BH,wCAgCYH,MAAO,CACf,IAAA,EAAA,MAAAC,EAAAE,EAAA,OAAA,kBAAA,EAEA,eAEW,sBAAA,EAAA,GAFsBO,EAAQ,CAAC,MAAM,YAAA,KAAA,SAnCpD,MAAA,QAAA,EAAA,gBAAAC,EAAAC,EAAAT,EAAA,QAAA,SAAA,iCAAA,CAAA,EAAA,CAAA,CAAA,CAAA,KAwCesD,CAAAA,CAAAA,EAxCf,CAAA,GAAAtD,EAAA,oBAAAU,MAyCuB4C,EAAqB,CACvC,IAAA,EACA,iBAAYtD,EAAuBsD,mBAAAA,EAAAA,GACnC,UAAQtD,EAAM,mBACd,eAAe,qBAAEuD,EAAgB,mBAAA,EAAA,GAAA,WAAA,GA7CtC,iBAAAvD,EAAA,gBAAA,EAyDqB,KAAA,EAAA,CAAA,YAAA,eAVI,kBAAiB,CAAA,GA/C1Ca,EAiDoC,GAAA,EAAA,EAAAX,EAAAsD,GADhC,yBAhDJ,CAAA,QAAAnD,EAAA,IAAA,EAkDWK,EAAA,EAAA,EAAUM,EAAEyC,GAAA,KAAAC,GAAA1D,EAAA,WAAAc,IAlDvBJ,EAAA,EAAAC,EAAAgD,EAAA,CAmDM,IAAG7C,EAAA,GACH,QAAS,GACT,IAAY,aAAAA,EAAA,EAAA,GACZ,UAAAA,EACA,eAAS8C,qBAAa9C,EAAA,EAAA,GAAA,iBAAAd,EAAA,gHAvD5B,EAAA,GAAA,EAAA,CAAA,EA0Dc6D,EAAAA,CAAAA,CAAAA,EACV7D,EAAA,aAAAU,EAAA,EAAqBM,EAAG,MAAA4B,GAAA,CAAS1C,EAAAmD,EAAA,CAAA,QAAA,UA3DrC,CAAA,CAAA,CAAA,GA8DExC,EAEM,GAAA,EAAA,CAFA,EAAA,EAAA,EAAAP,EAAA,MAAA,CACL,MAA+DR,EAAAE,EAAA,OAAA,aAAA,CAAA,EAAA,0ICXlE8D,GAAezE,EAAgB,CAC9B,KAAM,yBACN,WAAY,CACX,0BAAA0E,EACD,EACA,MAAM,iBAAiBrC,EAAIsC,EAAGC,EAAM,CACnC,GAAIC,GAAexC,CAAE,IAAMyC,GAAiB,SAAU,CAChDF,IACL,MACD,CACI,GAAA,KAAK,QAAQ,aAAc,CACxB,MAAAG,EAAe,MAAM,KAAK,QAC/B,KAAK,QAAQ,SAAS,4CAA4C,EAClE,CACC,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,sDACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,qDACD,EACA,UAAW,EACZ,CAAA,EAGGA,IAAiBC,IACN,MAAM,KAAK,gBAAgB,oBAAoB,CAAA,EAAI,EAAK,GAE/D,MAAA,KAAK,cAAc,mBAE1B,KAAK,QAAQ,aAAe,GACvBJ,KACKG,IAAiBE,KAC3B,KAAK,QAAQ,aAAe,GACvBL,IACN,MAEKA,GAEP,EACA,MAAO,CACN,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,MACN,QAAS,IAAM,CAAC,CACjB,EACA,QAAS,CACR,KAAM,OACN,QAAS,KAAO,CAAA,EACjB,EACA,UAAW,CACV,KAAM,OACN,QAAS,IACV,EACA,YAAa,CACZ,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACN,mBACA,iBACA,kBACA,sBACA,iBACA,YACA,QACD,EACA,OAAQ,CACP,MAAMM,EAAgBC,KAChBC,EAASC,IACTC,EAAkBC,GAAmB,CAAE,OAAAH,CAAQ,CAAA,EAC/C,CAAE,cAAAI,GAAkBC,IAEnB,MAAA,CACN,cAAAP,EACA,gBAAAI,EACA,cAAAE,EACA,GAAGE,EAAS,EACZ,GAAGC,GAAW,CAAA,CAEhB,EACA,SAAU,CACT,GAAGxF,EAAUyF,EAAcC,EAAmBC,GAAkBC,EAAU,EAC1E,oBAAmD,CAE3C,MADa,CAAC,KAAK,WAAW,KAAMtE,GAAc,OAAA,OAAAA,EAAU,OAAOkB,EAAA,KAAK,YAAL,YAAAA,EAAgB,IAAE,EACvE,KAAK,UAAY,MACvC,EACA,aAAuB,CACtB,OAAO,KAAK,SAAY,CAAC,KAAK,WAAa,KAAK,WAAW,MAC5D,EACA,eAAyB,CACjB,OAAA,KAAK,QAAQ,SAAW,KAChC,EACA,uBAAiC,CAChC,OAAO,KAAK,SAAS,KAAOqD,IAAiC,KAAK,SAAS,OAAS,EACrF,EACA,eAA6B,CAC5B,OAAOC,GAA6B,CACnC,GAAG,KAAK,QACR,WAAY,KAAK,SAAS,EAAA,CAC1B,CACF,CACD,EACA,MAAO,CACN,UAAUC,EAAyB,CAC7BA,GAIL,KAAK,QACH,KAAK,CACL,KAAM7F,EAAM,kBACZ,OAAQ,CAAE,KAAM,KAAK,SAAS,GAAI,YAAa6F,EAAM,EAAG,CAAA,CACxD,EACA,MAAM,IAAM,CAAA,CAAE,CACjB,CACD,EACA,QAAS,CACR,MAAM,0BAA0C,CAC/C,KAAK,MAAM,mBAAoB,KAAK,UAAU,EAAE,CACjD,EACA,MAAM,iBAAiC,CACtC,KAAK,MAAM,iBAAkB,KAAK,UAAU,EAAE,CAC/C,EACA,MAAM,iBAAiBnD,EAA2D,CAC3E,MAAAoD,EAAepD,EAAQ,UAAY,mBAEzC,KAAK,MAAM,kBAAmB,CAC7B,GAAIA,EAAQ,UAAU,GACtB,aAAAoD,CAAA,CACA,CACF,CACD,CACD,CAAC,+IAjMA5F,EAqBM,aAAA,sBApBL,MAUEE,EAAAE,EAAA,OAAA,SAAA,CAAA,EAAA,GARSoD,EAA6B,CACtC,WAAcS,EAAAA,WACd,QAAqBP,EAAAA,SAAAA,CAAAA,EAAAA,WAAAA,OACrB,eAAAtD,EAAA,YACA,sBAAiBA,EAAA,mBACjB,uBAAcgD,EAAEyC,CAAAA,IAAAA,EAAAA,CAAAA,EAAAA,GAAAA,EAAK,MAAyB,sBAAAxC,CAAA,GAC9C,mBAASD,eAAEyC,EAAK,MAAA,QAAA,GAChB,gBAAezC,EAAEO,CAAgB,IAAAP,EAAA,CAAA,EAAAC,GAAAjD,EAAA,MAAA,iBAAAiD,CAAA,GAAA,WAAAD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAAjD,EAAA,MAAA,WAAA,GAEvB0F,iBAAW1F,EAAA,gBAAA,EAAA,KAAA,EAAA,CAAA,aAAvB,UAQM,eAAA,sBAAA,kBAAA,CAAA,EAAAA,EArBR,YAAAa,EAAA,GAAA,EAAA,SAamChB,MAAO,CAAA,IAAA,EACvC,MAMEC,EAAAE,EAAA,OAAA,OAAA,CAAA,EAAA,GAJWc,EAAS,CACpB,KAAA,mBACA,UAAed,EAAA,UACf,yBAAgB2F,EAAAA,yBAAAA,iBAAAA,EAAAA,kDAnBrB,EAAA,KAAA,EAAA,CAAA,YAAA,2BAAA,mBAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,wHCkBA,MAAMC,EAAkBnE,IAClBoE,EAAiBpG,IACjBqG,EAAYb,IACZc,EAAiBb,IACjBc,EAAOC,KACPC,EAAYC,KACZC,EAAQC,KACR5B,EAASC,IACT4B,EAAQvB,IACR,CAAE,cAAAF,GAAkBC,IAEpB,CAAE,QAAAyB,CAAA,EAAYC,GAAYZ,CAAe,EAEzCxC,EAAUqD,EAAI,EAAK,EACnB5C,EAAc4C,EAAI,EAAK,EAEvBC,EAAWD,IAEXE,EAAaC,EAAS,IACnBR,EAAM,OAAO,MAAmBP,EAAe,UACvD,EAEKgB,EAAcD,EAAS,IAAMR,EAAM,OAAO,WAAqB,EAE/DU,EAAaF,EAAS,IAAM,CACjC,GAAIhB,EAAgB,8BAA8Be,EAAW,KAAK,GAAK,CAAC,EACxE,GAAIf,EAAgB,uBAAuBe,EAAW,KAAK,GAAK,CAAC,CAAA,CACjE,EAEK7F,EAAY8F,EAAS,IACnBE,EAAW,MAAM,KAAMC,GAAMA,EAAE,KAAOF,EAAY,KAAK,GAAKG,EAAiB,KACpF,EAEKA,EAAmBP,IAEzBQ,EACC,IAAMN,EAAW,MACjB,SAAY,CACX,MAAMO,EAAc,CACrB,CAAA,EAGDD,EACC,IAAMJ,EAAY,MAClB,SAAY,CACX,MAAMM,EAAe,CACtB,CAAA,EAGDC,GAAU,SAAY,CACrB,MAAMrB,EAAe,2BACrB,MAAM,QAAQ,IAAI,CACjBA,EAAe,yBAAyB,EACxCmB,EAAc,EACdtB,EAAgB,WAAWe,EAAW,KAAK,CAAA,CAC3C,EACD,MAAMQ,EAAe,EACrB,MAAME,EAAgB,EACb,SAAA,iBAAiB,mBAAoBC,CAA0B,CAAA,CACxE,EAEDC,GAAgB,IAAM,CACrB3B,EAAgB,MAAM,EACb,SAAA,oBAAoB,mBAAoB0B,CAA0B,CAAA,CAC3E,EAED,eAAeH,GAAiB,CAC3B,GAACN,EAAY,MAIb,GAAA,CACcG,EAAA,MAAS,MAAMpB,EAAgB,eAC/CiB,EAAY,KAAA,EAEbjB,EAAgB,gBAAkBoB,EAAiB,YAC3CQ,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,wCAAwC,CAAC,CAC/E,CACD,CAEA,SAASsB,GAA6B,CACjC,SAAS,kBAAoB,SAChC1B,EAAgB,wBAAwB,EAEnCA,EAAgB,yBAAyBe,EAAW,KAAK,CAEhE,CAEA,eAAeU,GAAkB,CAC5BjB,EAAM,OAAS1G,EAAM,gBAAkBoH,EAAW,MAAM,OAAS,GAAKJ,EAAS,OAClF,MAAMjC,EACJ,KAAK,CACL,KAAM/E,EAAM,kBACZ,OAAQ,CAAE,KAAMgH,EAAS,MAAM,GAAI,YAAaI,EAAW,MAAM,CAAC,EAAE,EAAG,CAAA,CACvE,EACA,MAAM,IAAM,CAAA,CAAE,CAElB,CAEA,eAAeI,GAAgB,CAC9B,IAAIO,EAAgC5B,EAAe,cAAcc,EAAW,KAAK,EACjF,GAAI,CAACc,EACA,GAAA,CACHA,EAAO,MAAM5B,EAAe,cAAcc,EAAW,KAAK,QAClDa,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,uCAAuC,CAAC,EAC7E,MACD,CAGD,GAAI,CAACyB,EACJ,MAAM,IAAI,MACTzB,EAAK,SAAS,yCAA0C,CACvD,YAAa,CAAE,WAAYW,EAAW,KAAM,CAAA,CAC5C,CAAA,EAIG,MAAAe,EAAQD,EAAK,MAAQ,GAC3Bf,EAAS,MAAQe,EACjB5B,EAAe,gBAAgB,CAAE,QAAS4B,EAAK,KAAM,cAAe,GAAO,EAC5D5B,EAAA,kBAAkB6B,EAAK,IAAI,CAAC,CAAE,GAAA3F,KAASA,CAAE,GAAK,CAAA,CAAE,EAC/D+D,EAAU,WAAW4B,CAAI,CAC1B,CAEA,eAAeC,EAAoBpC,EAAgB,CAC9CA,EACG,MAAAK,EAAgB,yBAAyBe,EAAW,KAAK,EAE/Df,EAAgB,wBAAwB,CAE1C,CAEA,eAAegC,GAAgB,CAC1B,GAACjB,EAAW,MAIZ,GAAA,CACH,MAAMf,EAAgB,gBAAgB,CACrC,GAAGA,EAAgB,kBACnB,WAAYe,EAAW,KAAA,CACvB,QACOa,EAAO,CACXA,EAAM,YAAcK,GACjBvB,EAAA,YACL,CACC,MAAON,EAAK,SAAS,4CAA4C,EACjE,QAASwB,EAAM,QACf,KAAM,QACN,SAAU,IACX,EACA,EAAA,EAGDlB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,4CAA4C,CAAC,CAEpF,CACD,CAEA,eAAe8B,GAAgBC,EAAiC,CAC/DnC,EAAgB,MAAM,EACtBA,EAAgB,WAAWmC,CAAU,EAC/B,MAAAnC,EAAgB,WAAWe,EAAW,KAAK,CAClD,CAEA,eAAeqB,GAAgBjG,EAAY,CACtC,GAAA,CACG,MAAA6D,EAAgB,qBAAqB7D,CAAE,EAE7CuE,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,gDAAgD,EACrE,QAASA,EAAK,SAAS,mDAAoD,CAC1E,YAAa,CAAE,kBAAmBjE,CAAG,CAAA,CACrC,EACD,KAAM,SAAA,CACN,EAED,MAAM6F,EAAc,QACZJ,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,8CAA8C,CAAC,CACrF,CACD,CAEA,eAAeiC,GAAkBlG,EAAY,CAC5CqB,EAAQ,MAAQ,GACZ,GAAA,CACG,MAAA8E,EAAiBpB,EAAW,MAAM,UAAWC,IAAwBA,GAAE,KAAOhF,CAAE,EAEhFoG,EACLrB,EAAW,MAAMoB,EAAiB,CAAC,GACnCpB,EAAW,MAAMoB,EAAiB,CAAC,GACnCpB,EAAW,MAAM,CAAC,EAEnB,MAAMlB,EAAgB,iBAAiB,CACtC,IAAK,CAAC7D,CAAE,CAAA,CACR,EAEG2E,EAAS,QACRI,EAAW,MAAM,OAAS,EAC7B,MAAMrC,EACJ,QAAQ,CACR,KAAM/E,EAAM,kBACZ,OAAQ,CAAE,KAAMgH,EAAS,MAAM,GAAI,YAAayB,EAAc,EAAG,CAAA,CACjE,EACA,MAAM,IAAM,CAAA,CAAE,EAGhB,MAAM1D,EAAO,QAAQ,CACpB,KAAM/E,EAAM,eACZ,OAAQ,CAAE,KAAMgH,EAAS,MAAM,EAAG,CAAA,CAClC,SAGKc,EAAO,CACfpE,EAAQ,MAAQ,GAChBkD,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,qDAAqD,CAAC,EAC3F,MACD,CACA5C,EAAQ,MAAQ,GAEhBkD,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,uDAAuD,EAC5E,KAAM,SAAA,CACN,CACF,CAEA,eAAeoC,GAAiBhG,EAAgD,OAC/EkE,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,iCAAiC,EACtD,KAAM,OACN,SAAU,GAAA,CACV,EAED,MAAMqC,GAAejG,CAAO,EAC5B,MAAMwF,EAAc,EAEpB1B,EAAU,MAAM,sCAAuC,CACtD,aAAalE,EAAA0E,EAAS,QAAT,YAAA1E,EAAgB,GAC7B,aAAcI,EAAQ,GACtB,WAAYA,EAAQ,aAAe,UAAY,UAAA,CAC/C,CACF,CAEA,eAAeiG,GAAejG,EAAgD,CACzE,GAAA,CACqB,MAAMwD,EAAgB,eAAexD,EAAQ,GAAIA,EAAQ,YAAY,EAG5FkE,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,sDAAsD,EAC3E,KAAM,SAAA,CACN,EAEDM,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,uDAAuD,EAC5E,KAAM,OAAA,CACN,QAEMwB,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,+CAA+C,CAAC,CACtF,CACD,CAEA,eAAesC,IAA4B,CACrCzE,EAAY,OAChB,MAAMgB,EAAc1B,GAAU,CAAE,aAAc,GAAM,CAAA,CAEtD,CAEA,eAAeA,IAA0B,OACxC,IACGnB,EAAA4D,EAAgB,kBAAkB,SAAlC,MAAA5D,EAA0C,SAAS,YACrD8E,EAAW,MAAM,QAAUlB,EAAgB,gBAE3C,OAGD/B,EAAY,MAAQ,GAEhB,IAAA0E,EACAzB,EAAW,MAAM,SAAW,IAE/ByB,EADiBzB,EAAW,MAAM,MAAM,EAAE,EAAE,CAAC,EAC3B,IAGf,GAAA,CACH,MAAMlB,EAAgB,gBAAgBA,EAAgB,kBAAmB2C,CAAM,QACvEf,EAAO,CACf3D,EAAY,MAAQ,GACpByC,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,yCAAyC,CAAC,EAC/E,MACD,CAEAnC,EAAY,MAAQ,EACrB"}
1
+ {"version":3,"file":"WorkflowExecutionsView-CY5alI5S.js","sources":["../../src/components/executions/workflow/WorkflowExecutionsCard.vue","../../src/components/executions/workflow/WorkflowExecutionsSidebar.vue","../../src/components/executions/workflow/WorkflowExecutionsList.vue","../../src/views/WorkflowExecutionsView.vue"],"sourcesContent":["<template>\n\t<div\n\t\t:class=\"{\n\t\t\t['execution-card']: true,\n\t\t\t[$style.WorkflowExecutionsCard]: true,\n\t\t\t[$style.active]: isActive,\n\t\t\t[$style[executionUIDetails.name]]: true,\n\t\t\t[$style.highlight]: highlight,\n\t\t\t[$style.showGap]: showGap,\n\t\t}\"\n\t>\n\t\t<router-link\n\t\t\t:class=\"$style.executionLink\"\n\t\t\t:to=\"{\n\t\t\t\tname: executionPreviewViewName,\n\t\t\t\tparams: { name: currentWorkflow, executionId: execution.id },\n\t\t\t}\"\n\t\t\t:data-test-execution-status=\"executionUIDetails.name\"\n\t\t>\n\t\t\t<div :class=\"$style.description\">\n\t\t\t\t<n8n-text color=\"text-dark\" :bold=\"true\" size=\"medium\" data-test-id=\"execution-time\">\n\t\t\t\t\t{{ executionUIDetails.startTime }}\n\t\t\t\t</n8n-text>\n\t\t\t\t<div :class=\"$style.executionStatus\">\n\t\t\t\t\t<n8n-spinner\n\t\t\t\t\t\tv-if=\"executionUIDetails.name === 'running'\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:class=\"[$style.spinner, 'mr-4xs']\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-text :class=\"$style.statusLabel\" size=\"small\">{{\n\t\t\t\t\t\texecutionUIDetails.label\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t{{ ' ' }}\n\t\t\t\t\t<n8n-text\n\t\t\t\t\t\tv-if=\"executionUIDetails.name === 'running'\"\n\t\t\t\t\t\t:color=\"isActive ? 'text-dark' : 'text-base'\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('executionDetails.runningTimeRunning') }}\n\t\t\t\t\t\t<ExecutionsTime :start-time=\"execution.startedAt\" />\n\t\t\t\t\t</n8n-text>\n\t\t\t\t\t<n8n-text\n\t\t\t\t\t\tv-else-if=\"executionUIDetails.runningTime !== ''\"\n\t\t\t\t\t\t:color=\"isActive ? 'text-dark' : 'text-base'\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText('executionDetails.runningTimeFinished', {\n\t\t\t\t\t\t\t\tinterpolate: { time: executionUIDetails?.runningTime },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"execution.mode === 'retry'\">\n\t\t\t\t\t<n8n-text :color=\"isActive ? 'text-dark' : 'text-base'\" size=\"small\">\n\t\t\t\t\t\t{{ $locale.baseText('executionDetails.retry') }} #{{ execution.retryOf }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.icons\">\n\t\t\t\t<n8n-action-dropdown\n\t\t\t\t\tv-if=\"isRetriable\"\n\t\t\t\t\t:class=\"[$style.icon, $style.retry]\"\n\t\t\t\t\t:items=\"retryExecutionActions\"\n\t\t\t\t\tactivator-icon=\"redo\"\n\t\t\t\t\tdata-test-id=\"retry-execution-button\"\n\t\t\t\t\t@select=\"onRetryMenuItemSelect\"\n\t\t\t\t/>\n\t\t\t\t<n8n-tooltip v-if=\"execution.mode === 'manual'\" placement=\"top\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<span>{{ $locale.baseText('executionsList.test') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<font-awesome-icon\n\t\t\t\t\t\tv-if=\"execution.mode === 'manual'\"\n\t\t\t\t\t\t:class=\"[$style.icon, $style.manual]\"\n\t\t\t\t\t\ticon=\"flask\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</router-link>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IExecutionUIData } from '@/composables/useExecutionHelpers';\nimport { VIEWS } from '@/constants';\nimport ExecutionsTime from '@/components/executions/ExecutionsTime.vue';\nimport { useExecutionHelpers } from '@/composables/useExecutionHelpers';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { mapStores } from 'pinia';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsCard',\n\tcomponents: {\n\t\tExecutionsTime,\n\t},\n\tprops: {\n\t\texecution: {\n\t\t\ttype: Object as () => ExecutionSummary,\n\t\t\trequired: true,\n\t\t},\n\t\thighlight: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tshowGap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\temits: ['retryExecution', 'mounted'],\n\tsetup() {\n\t\tconst executionHelpers = useExecutionHelpers();\n\n\t\treturn {\n\t\t\texecutionHelpers,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t\tcurrentWorkflow(): string {\n\t\t\treturn (this.$route.params.name as string) || this.workflowsStore.workflowId;\n\t\t},\n\t\tretryExecutionActions(): object[] {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'current-workflow',\n\t\t\t\t\tlabel: this.$locale.baseText('executionsList.retryWithCurrentlySavedWorkflow'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'original-workflow',\n\t\t\t\t\tlabel: this.$locale.baseText('executionsList.retryWithOriginalWorkflow'),\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\texecutionUIDetails(): IExecutionUIData {\n\t\t\treturn this.executionHelpers.getUIDetails(this.execution);\n\t\t},\n\t\tisActive(): boolean {\n\t\t\treturn this.execution.id === this.$route.params.executionId;\n\t\t},\n\t\tisRetriable(): boolean {\n\t\t\treturn this.executionHelpers.isExecutionRetriable(this.execution);\n\t\t},\n\t\texecutionPreviewViewName() {\n\t\t\treturn VIEWS.EXECUTION_PREVIEW;\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$emit('mounted', this.execution.id);\n\t},\n\tmethods: {\n\t\tonRetryMenuItemSelect(action: string): void {\n\t\t\tthis.$emit('retryExecution', { execution: this.execution, command: action });\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n@import '@/styles/variables';\n\n.WorkflowExecutionsCard {\n\t--execution-list-item-background: var(--color-foreground-xlight);\n\t--execution-list-item-highlight-background: var(--color-warning-tint-1);\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-right: var(--spacing-m);\n\n\t&.active {\n\t\tborder-left: var(--spacing-4xs) var(--border-style-base) transparent !important;\n\n\t\t.executionStatus {\n\t\t\tcolor: var(--color-text-dark) !important;\n\t\t}\n\t}\n\n\t&:hover,\n\t&.active {\n\t\t.executionLink {\n\t\t\t--execution-list-item-background: var(--color-foreground-light);\n\t\t}\n\t}\n\n\t&.new,\n\t&.running {\n\t\t.spinner {\n\t\t\tposition: relative;\n\t\t\ttop: 1px;\n\t\t}\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-running);\n\t\t}\n\t\t.statusLabel,\n\t\t.spinner {\n\t\t\tcolor: var(--color-warning);\n\t\t}\n\t}\n\n\t&.success {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-success);\n\t\t}\n\t}\n\n\t&.waiting {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-waiting);\n\t\t}\n\t\t.statusLabel {\n\t\t\tcolor: var(--color-secondary);\n\t\t}\n\t}\n\n\t&.error {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-error);\n\t\t}\n\t\t.statusLabel {\n\t\t\tcolor: var(--color-danger);\n\t\t}\n\t}\n\n\t&.unknown {\n\t\t&,\n\t\t& .executionLink {\n\t\t\tborder-left: var(--spacing-4xs) var(--border-style-base) var(--execution-card-border-unknown);\n\t\t}\n\t}\n}\n\n.executionLink {\n\tbackground: var(--execution-list-item-background);\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n\tcolor: var(--color-text-base);\n\tfont-size: var(--font-size-xs);\n\tpadding: var(--spacing-xs);\n\tpadding-right: var(--spacing-s);\n\tposition: relative;\n\tleft: calc(\n\t\t-1 * var(--spacing-4xs)\n\t); // Hide link border under card border so it's not visible when not hovered\n\n\t&:active {\n\t\t.icon,\n\t\t.statusLabel {\n\t\t\tcolor: var(--color-text-base);\n\t\t}\n\t}\n}\n\n.icons {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.icon {\n\tfont-size: var(--font-size-s);\n\n\t&.retry {\n\t\tsvg {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n\n\t&.manual {\n\t\tposition: relative;\n\t\ttop: 1px;\n\t}\n\n\t& + & {\n\t\tmargin-left: var(--spacing-2xs);\n\t}\n}\n.showGap {\n\tmargin-bottom: var(--spacing-2xs);\n\t.executionLink {\n\t\tborder-bottom: 1px solid var(--color-foreground-dark);\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tref=\"container\"\n\t\t:class=\"['executions-sidebar', $style.container]\"\n\t\tdata-test-id=\"executions-sidebar\"\n\t>\n\t\t<div :class=\"$style.heading\">\n\t\t\t<n8n-heading tag=\"h2\" size=\"medium\" color=\"text-dark\">\n\t\t\t\t{{ $locale.baseText('generic.executions') }}\n\t\t\t</n8n-heading>\n\t\t</div>\n\t\t<div :class=\"$style.controls\">\n\t\t\t<el-checkbox\n\t\t\t\tv-model=\"executionsStore.autoRefresh\"\n\t\t\t\tdata-test-id=\"auto-refresh-checkbox\"\n\t\t\t\t@update:model-value=\"$emit('update:autoRefresh', $event)\"\n\t\t\t>\n\t\t\t\t{{ $locale.baseText('executionsList.autoRefresh') }}\n\t\t\t</el-checkbox>\n\t\t\t<ExecutionsFilter popover-placement=\"left-start\" @filter-changed=\"onFilterChanged\" />\n\t\t</div>\n\t\t<div\n\t\t\tref=\"executionList\"\n\t\t\t:class=\"$style.executionList\"\n\t\t\tdata-test-id=\"current-executions-list\"\n\t\t\t@scroll=\"loadMore(20)\"\n\t\t>\n\t\t\t<div v-if=\"loading\" class=\"mr-l\">\n\t\t\t\t<n8n-loading variant=\"rect\" />\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"!loading && executions.length === 0\"\n\t\t\t\t:class=\"$style.noResultsContainer\"\n\t\t\t\tdata-test-id=\"execution-list-empty\"\n\t\t\t>\n\t\t\t\t<n8n-text color=\"text-base\" size=\"medium\" align=\"center\">\n\t\t\t\t\t{{ $locale.baseText('executionsLandingPage.noResults') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<WorkflowExecutionsCard\n\t\t\t\tv-else-if=\"temporaryExecution\"\n\t\t\t\t:ref=\"`execution-${temporaryExecution.id}`\"\n\t\t\t\t:execution=\"temporaryExecution\"\n\t\t\t\t:data-test-id=\"`execution-details-${temporaryExecution.id}`\"\n\t\t\t\t:show-gap=\"true\"\n\t\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t\t/>\n\t\t\t<TransitionGroup name=\"executions-list\">\n\t\t\t\t<WorkflowExecutionsCard\n\t\t\t\t\tv-for=\"execution in executions\"\n\t\t\t\t\t:key=\"execution.id\"\n\t\t\t\t\t:ref=\"`execution-${execution.id}`\"\n\t\t\t\t\t:execution=\"execution\"\n\t\t\t\t\t:data-test-id=\"`execution-details-${execution.id}`\"\n\t\t\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t\t\t\t@mounted=\"onItemMounted\"\n\t\t\t\t/>\n\t\t\t</TransitionGroup>\n\t\t\t<div v-if=\"loadingMore\" class=\"mr-m\">\n\t\t\t\t<n8n-loading variant=\"p\" :rows=\"1\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div :class=\"$style.infoAccordion\">\n\t\t\t<WorkflowExecutionsInfoAccordion :initially-expanded=\"false\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport WorkflowExecutionsCard from '@/components/executions/workflow/WorkflowExecutionsCard.vue';\nimport WorkflowExecutionsInfoAccordion from '@/components/executions/workflow/WorkflowExecutionsInfoAccordion.vue';\nimport ExecutionsFilter from '@/components/executions/ExecutionsFilter.vue';\nimport { VIEWS } from '@/constants';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport type { RouteRecord } from 'vue-router';\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { ExecutionFilterType } from '@/Interface';\n\ntype WorkflowExecutionsCardRef = InstanceType<typeof WorkflowExecutionsCard>;\ntype AutoScrollDeps = { activeExecutionSet: boolean; cardsMounted: boolean; scroll: boolean };\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsSidebar',\n\tcomponents: {\n\t\tWorkflowExecutionsCard,\n\t\tWorkflowExecutionsInfoAccordion,\n\t\tExecutionsFilter,\n\t},\n\tprops: {\n\t\texecutions: {\n\t\t\ttype: Array as PropType<ExecutionSummary[]>,\n\t\t\trequired: true,\n\t\t},\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tloadingMore: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttemporaryExecution: {\n\t\t\ttype: Object as PropType<ExecutionSummary>,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\temits: {\n\t\tretryExecution: null,\n\t\tloadMore: null,\n\t\trefresh: null,\n\t\tfilterUpdated: null,\n\t\treloadExecutions: null,\n\t\t'update:autoRefresh': null,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfilter: {} as ExecutionFilterType,\n\t\t\tmountedItems: [] as string[],\n\t\t\tautoScrollDeps: {\n\t\t\t\tactiveExecutionSet: false,\n\t\t\t\tcardsMounted: false,\n\t\t\t\tscroll: true,\n\t\t\t} as AutoScrollDeps,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useExecutionsStore, useWorkflowsStore),\n\t},\n\twatch: {\n\t\t$route(to: RouteRecord, from: RouteRecord) {\n\t\t\tif (from.name === VIEWS.EXECUTION_PREVIEW && to.name === VIEWS.EXECUTION_HOME) {\n\t\t\t\t// Skip parent route when navigating through executions with back button\n\t\t\t\tthis.$router.go(-1);\n\t\t\t}\n\t\t},\n\t\t'executionsStore.activeExecution'(\n\t\t\tnewValue: ExecutionSummary | null,\n\t\t\toldValue: ExecutionSummary | null,\n\t\t) {\n\t\t\tif (newValue && newValue.id !== oldValue?.id) {\n\t\t\t\tthis.autoScrollDeps.activeExecutionSet = true;\n\t\t\t}\n\t\t},\n\t\tautoScrollDeps: {\n\t\t\thandler(updatedDeps: AutoScrollDeps) {\n\t\t\t\tif (Object.values(updatedDeps).every(Boolean)) {\n\t\t\t\t\tthis.scrollToActiveCard();\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeep: true,\n\t\t},\n\t},\n\tmethods: {\n\t\tonItemMounted(id: string): void {\n\t\t\tthis.mountedItems.push(id);\n\t\t\tif (this.mountedItems.length === this.executions.length) {\n\t\t\t\tthis.autoScrollDeps.cardsMounted = true;\n\t\t\t\tthis.checkListSize();\n\t\t\t}\n\n\t\t\tif (this.executionsStore.activeExecution?.id === id) {\n\t\t\t\tthis.autoScrollDeps.activeExecutionSet = true;\n\t\t\t}\n\t\t},\n\t\tloadMore(limit = 20): void {\n\t\t\tif (!this.loading) {\n\t\t\t\tconst executionsListRef = this.$refs.executionList as HTMLElement | undefined;\n\t\t\t\tif (executionsListRef) {\n\t\t\t\t\tconst diff =\n\t\t\t\t\t\texecutionsListRef.offsetHeight -\n\t\t\t\t\t\t(executionsListRef.scrollHeight - executionsListRef.scrollTop);\n\t\t\t\t\tif (diff > -10 && diff < 10) {\n\t\t\t\t\t\tthis.$emit('loadMore', limit);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonRetryExecution(payload: object) {\n\t\t\tthis.$emit('retryExecution', payload);\n\t\t},\n\t\tonRefresh(): void {\n\t\t\tthis.$emit('refresh');\n\t\t},\n\t\tonFilterChanged(filter: ExecutionFilterType) {\n\t\t\tthis.$emit('filterUpdated', filter);\n\t\t},\n\t\treloadExecutions(): void {\n\t\t\tthis.$emit('reloadExecutions');\n\t\t},\n\t\tcheckListSize(): void {\n\t\t\tconst sidebarContainerRef = this.$refs.container as HTMLElement | undefined;\n\t\t\tconst currentWorkflowExecutionsCardRefs = this.$refs[\n\t\t\t\t`execution-${this.mountedItems[this.mountedItems.length - 1]}`\n\t\t\t] as WorkflowExecutionsCardRef[] | undefined;\n\n\t\t\t// Find out how many execution card can fit into list\n\t\t\t// and load more if needed\n\t\t\tif (sidebarContainerRef && currentWorkflowExecutionsCardRefs?.length) {\n\t\t\t\tconst cardElement = currentWorkflowExecutionsCardRefs[0].$el as HTMLElement;\n\t\t\t\tconst listCapacity = Math.ceil(sidebarContainerRef.clientHeight / cardElement.clientHeight);\n\n\t\t\t\tif (listCapacity > this.executions.length) {\n\t\t\t\t\tthis.$emit('loadMore', listCapacity - this.executions.length);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tscrollToActiveCard(): void {\n\t\t\tconst executionsListRef = this.$refs.executionList as HTMLElement | undefined;\n\t\t\tconst currentWorkflowExecutionsCardRefs = this.$refs[\n\t\t\t\t`execution-${this.executionsStore.activeExecution?.id}`\n\t\t\t] as WorkflowExecutionsCardRef[] | undefined;\n\n\t\t\tif (\n\t\t\t\texecutionsListRef &&\n\t\t\t\tcurrentWorkflowExecutionsCardRefs?.length &&\n\t\t\t\tthis.executionsStore.activeExecution\n\t\t\t) {\n\t\t\t\tconst cardElement = currentWorkflowExecutionsCardRefs[0].$el as HTMLElement;\n\t\t\t\tconst cardRect = cardElement.getBoundingClientRect();\n\t\t\t\tconst LIST_HEADER_OFFSET = 200;\n\t\t\t\tif (cardRect.top > executionsListRef.offsetHeight) {\n\t\t\t\t\tthis.autoScrollDeps.scroll = false;\n\t\t\t\t\texecutionsListRef.scrollTo({\n\t\t\t\t\t\ttop: cardRect.top - LIST_HEADER_OFFSET,\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tflex: 310px 0 0;\n\tbackground-color: var(--color-background-xlight);\n\tborder-right: var(--border-base);\n\tpadding: var(--spacing-l) 0 var(--spacing-l) var(--spacing-l);\n\tz-index: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n}\n\n.heading {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: baseline;\n\tpadding-right: var(--spacing-l);\n}\n\n.controls {\n\tpadding: var(--spacing-s) 0 var(--spacing-xs);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding-right: var(--spacing-m);\n\n\tbutton {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n}\n\n.executionList {\n\tflex: 1;\n\toverflow: auto;\n\tmargin-bottom: var(--spacing-m);\n\tbackground-color: var(--color-background-xlight) !important;\n\n\t// Scrolling fader\n\t&::before {\n\t\tposition: absolute;\n\t\tdisplay: block;\n\t\twidth: 270px;\n\t\theight: 6px;\n\t\tbackground: linear-gradient(to bottom, rgba(251, 251, 251, 1) 0%, rgba(251, 251, 251, 0) 100%);\n\t\tz-index: 999;\n\t}\n\n\t// Lower first execution card so fader is not visible when not scrolled\n\t& > div:first-child {\n\t\tmargin-top: 3px;\n\t}\n}\n\n.infoAccordion {\n\tposition: absolute;\n\tbottom: 0;\n\tmargin-left: calc(-1 * var(--spacing-l));\n\tborder-top: var(--border-base);\n\n\t& > div {\n\t\twidth: 309px;\n\t\tbackground-color: var(--color-background-light);\n\t\tmargin-top: 0 !important;\n\t}\n}\n\n.noResultsContainer {\n\twidth: 100%;\n\tmargin-top: var(--spacing-2xl);\n\ttext-align: center;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.executions-sidebar {\n\t:deep(.el-skeleton__item) {\n\t\theight: 60px;\n\t\tborder-radius: 0;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<WorkflowExecutionsSidebar\n\t\t\t:executions=\"executions\"\n\t\t\t:loading=\"loading && !executions.length\"\n\t\t\t:loading-more=\"loadingMore\"\n\t\t\t:temporary-execution=\"temporaryExecution\"\n\t\t\t@update:auto-refresh=\"$emit('update:auto-refresh', $event)\"\n\t\t\t@reload-executions=\"$emit('reload')\"\n\t\t\t@filter-updated=\"$emit('update:filters', $event)\"\n\t\t\t@load-more=\"$emit('load-more')\"\n\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t/>\n\t\t<div v-if=\"!hidePreview\" :class=\"$style.content\">\n\t\t\t<router-view\n\t\t\t\tname=\"executionPreview\"\n\t\t\t\t:execution=\"execution\"\n\t\t\t\t@delete-current-execution=\"onDeleteCurrentExecution\"\n\t\t\t\t@retry-execution=\"onRetryExecution\"\n\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useRouter } from 'vue-router';\nimport WorkflowExecutionsSidebar from '@/components/executions/workflow/WorkflowExecutionsSidebar.vue';\nimport {\n\tMAIN_HEADER_TABS,\n\tMODAL_CANCEL,\n\tMODAL_CONFIRM,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tVIEWS,\n} from '@/constants';\nimport type { ExecutionFilterType, IWorkflowDb } from '@/Interface';\nimport type { ExecutionSummary, IDataObject } from 'n8n-workflow';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { getNodeViewTab } from '@/utils/canvasUtils';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { executionFilterToQueryFilter } from '@/utils/executionUtils';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'WorkflowExecutionsList',\n\tcomponents: {\n\t\tWorkflowExecutionsSidebar,\n\t},\n\tasync beforeRouteLeave(to, _, next) {\n\t\tif (getNodeViewTab(to) === MAIN_HEADER_TABS.WORKFLOW) {\n\t\t\tnext();\n\t\t\treturn;\n\t\t}\n\t\tif (this.uiStore.stateIsDirty) {\n\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({}, false);\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t}\n\t\t} else {\n\t\t\tnext();\n\t\t}\n\t},\n\tprops: {\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tworkflow: {\n\t\t\ttype: Object as PropType<IWorkflowDb>,\n\t\t\trequired: true,\n\t\t},\n\t\texecutions: {\n\t\t\ttype: Array as PropType<ExecutionSummary[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tfilters: {\n\t\t\ttype: Object as PropType<ExecutionFilterType>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\texecution: {\n\t\t\ttype: Object as PropType<ExecutionSummary>,\n\t\t\tdefault: null,\n\t\t},\n\t\tloadingMore: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\temits: [\n\t\t'execution:delete',\n\t\t'execution:stop',\n\t\t'execution:retry',\n\t\t'update:auto-refresh',\n\t\t'update:filters',\n\t\t'load-more',\n\t\t'reload',\n\t],\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tworkflowHelpers,\n\t\t\tcallDebounced,\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useTagsStore, useNodeTypesStore, useSettingsStore, useUIStore),\n\t\ttemporaryExecution(): ExecutionSummary | undefined {\n\t\t\tconst isTemporary = !this.executions.find((execution) => execution.id === this.execution?.id);\n\t\t\treturn isTemporary ? this.execution : undefined;\n\t\t},\n\t\thidePreview(): boolean {\n\t\t\treturn this.loading || (!this.execution && this.executions.length);\n\t\t},\n\t\tfilterApplied(): boolean {\n\t\t\treturn this.filters.status !== 'all';\n\t\t},\n\t\tworkflowDataNotLoaded(): boolean {\n\t\t\treturn this.workflow.id === PLACEHOLDER_EMPTY_WORKFLOW_ID && this.workflow.name === '';\n\t\t},\n\t\trequestFilter(): IDataObject {\n\t\t\treturn executionFilterToQueryFilter({\n\t\t\t\t...this.filters,\n\t\t\t\tworkflowId: this.workflow.id,\n\t\t\t});\n\t\t},\n\t},\n\twatch: {\n\t\texecution(value: ExecutionSummary) {\n\t\t\tif (!value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$router\n\t\t\t\t.push({\n\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\tparams: { name: this.workflow.id, executionId: value.id },\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onDeleteCurrentExecution(): Promise<void> {\n\t\t\tthis.$emit('execution:delete', this.execution.id);\n\t\t},\n\t\tasync onStopExecution(): Promise<void> {\n\t\t\tthis.$emit('execution:stop', this.execution.id);\n\t\t},\n\t\tasync onRetryExecution(payload: { execution: ExecutionSummary; command: string }) {\n\t\t\tconst loadWorkflow = payload.command === 'current-workflow';\n\n\t\t\tthis.$emit('execution:retry', {\n\t\t\t\tid: payload.execution.id,\n\t\t\t\tloadWorkflow,\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tdisplay: flex;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.content {\n\tflex: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport WorkflowExecutionsList from '@/components/executions/workflow/WorkflowExecutionsList.vue';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useI18n } from '@/composables/useI18n';\nimport type { ExecutionFilterType, ITag, IWorkflowDb } from '@/Interface';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { NO_NETWORK_ERROR_CODE } from '@/utils/apiUtils';\nimport { useToast } from '@/composables/useToast';\nimport { VIEWS } from '@/constants';\nimport { useRoute, useRouter } from 'vue-router';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { storeToRefs } from 'pinia';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useTagsStore } from '@/stores/tags.store';\n\nconst executionsStore = useExecutionsStore();\nconst workflowsStore = useWorkflowsStore();\nconst tagsStore = useTagsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst route = useRoute();\nconst router = useRouter();\nconst toast = useToast();\nconst { callDebounced } = useDebounce();\n\nconst { filters } = storeToRefs(executionsStore);\n\nconst loading = ref(false);\nconst loadingMore = ref(false);\n\nconst workflow = ref<IWorkflowDb | undefined>();\n\nconst workflowId = computed(() => {\n\treturn (route.params.name as string) || workflowsStore.workflowId;\n});\n\nconst executionId = computed(() => route.params.executionId as string);\n\nconst executions = computed(() => [\n\t...(executionsStore.currentExecutionsByWorkflowId[workflowId.value] ?? []),\n\t...(executionsStore.executionsByWorkflowId[workflowId.value] ?? []),\n]);\n\nconst execution = computed(() => {\n\treturn executions.value.find((e) => e.id === executionId.value) ?? currentExecution.value;\n});\n\nconst currentExecution = ref<ExecutionSummary | undefined>();\n\nwatch(\n\t() => workflowId.value,\n\tasync () => {\n\t\tawait fetchWorkflow();\n\t},\n);\n\nwatch(\n\t() => executionId.value,\n\tasync () => {\n\t\tawait fetchExecution();\n\t},\n);\n\nonMounted(async () => {\n\tawait nodeTypesStore.loadNodeTypesIfNotLoaded();\n\tawait Promise.all([\n\t\tnodeTypesStore.loadNodeTypesIfNotLoaded(),\n\t\tfetchWorkflow(),\n\t\texecutionsStore.initialize(workflowId.value),\n\t]);\n\tawait fetchExecution();\n\tawait initializeRoute();\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nonBeforeUnmount(() => {\n\texecutionsStore.reset();\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nasync function fetchExecution() {\n\tif (!executionId.value) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcurrentExecution.value = (await executionsStore.fetchExecution(\n\t\t\texecutionId.value,\n\t\t)) as ExecutionSummary;\n\t\texecutionsStore.activeExecution = currentExecution.value;\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('nodeView.showError.openExecution.title'));\n\t}\n}\n\nfunction onDocumentVisibilityChange() {\n\tif (document.visibilityState === 'hidden') {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t} else {\n\t\tvoid executionsStore.startAutoRefreshInterval(workflowId.value);\n\t}\n}\n\nasync function initializeRoute() {\n\tif (route.name === VIEWS.EXECUTION_HOME && executions.value.length > 0 && workflow.value) {\n\t\tawait router\n\t\t\t.push({\n\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\tparams: { name: workflow.value.id, executionId: executions.value[0].id },\n\t\t\t})\n\t\t\t.catch(() => {});\n\t}\n}\n\nasync function fetchWorkflow() {\n\tlet data: IWorkflowDb | undefined = workflowsStore.workflowsById[workflowId.value];\n\tif (!data) {\n\t\ttry {\n\t\t\tdata = await workflowsStore.fetchWorkflow(workflowId.value);\n\t\t} catch (error) {\n\t\t\ttoast.showError(error, i18n.baseText('nodeView.showError.openWorkflow.title'));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (!data) {\n\t\tthrow new Error(\n\t\t\ti18n.baseText('nodeView.workflowWithIdCouldNotBeFound', {\n\t\t\t\tinterpolate: { workflowId: workflowId.value },\n\t\t\t}),\n\t\t);\n\t}\n\n\tconst tags = (data.tags ?? []) as ITag[];\n\tworkflow.value = data;\n\tworkflowsStore.setWorkflowName({ newName: data.name, setStateDirty: false });\n\tworkflowsStore.setWorkflowTagIds(tags.map(({ id }) => id) ?? []);\n\ttagsStore.upsertTags(tags);\n}\n\nasync function onAutoRefreshToggle(value: boolean) {\n\tif (value) {\n\t\tawait executionsStore.startAutoRefreshInterval(workflowId.value);\n\t} else {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t}\n}\n\nasync function onRefreshData() {\n\tif (!workflowId.value) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait executionsStore.fetchExecutions({\n\t\t\t...executionsStore.executionsFilters,\n\t\t\tworkflowId: workflowId.value,\n\t\t});\n\t} catch (error) {\n\t\tif (error.errorCode === NO_NETWORK_ERROR_CODE) {\n\t\t\ttoast.showMessage(\n\t\t\t\t{\n\t\t\t\t\ttitle: i18n.baseText('executionsList.showError.refreshData.title'),\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\tduration: 3500,\n\t\t\t\t},\n\t\t\t\tfalse,\n\t\t\t);\n\t\t} else {\n\t\t\ttoast.showError(error, i18n.baseText('executionsList.showError.refreshData.title'));\n\t\t}\n\t}\n}\n\nasync function onUpdateFilters(newFilters: ExecutionFilterType) {\n\texecutionsStore.reset();\n\texecutionsStore.setFilters(newFilters);\n\tawait executionsStore.initialize(workflowId.value);\n}\n\nasync function onExecutionStop(id: string) {\n\ttry {\n\t\tawait executionsStore.stopCurrentExecution(id);\n\n\t\ttoast.showMessage({\n\t\t\ttitle: i18n.baseText('executionsList.showMessage.stopExecution.title'),\n\t\t\tmessage: i18n.baseText('executionsList.showMessage.stopExecution.message', {\n\t\t\t\tinterpolate: { activeExecutionId: id },\n\t\t\t}),\n\t\t\ttype: 'success',\n\t\t});\n\n\t\tawait onRefreshData();\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.stopExecution.title'));\n\t}\n}\n\nasync function onExecutionDelete(id: string) {\n\tloading.value = true;\n\ttry {\n\t\tconst executionIndex = executions.value.findIndex((e: ExecutionSummary) => e.id === id);\n\n\t\tconst nextExecution =\n\t\t\texecutions.value[executionIndex + 1] ||\n\t\t\texecutions.value[executionIndex - 1] ||\n\t\t\texecutions.value[0];\n\n\t\tawait executionsStore.deleteExecutions({\n\t\t\tids: [id],\n\t\t});\n\n\t\tif (workflow.value) {\n\t\t\tif (executions.value.length > 0) {\n\t\t\t\tawait router\n\t\t\t\t\t.replace({\n\t\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\t\tparams: { name: workflow.value.id, executionId: nextExecution.id },\n\t\t\t\t\t})\n\t\t\t\t\t.catch(() => {});\n\t\t\t} else {\n\t\t\t\t// If there are no executions left, show empty state\n\t\t\t\tawait router.replace({\n\t\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\t\tparams: { name: workflow.value.id },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tloading.value = false;\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.handleDeleteSelected.title'));\n\t\treturn;\n\t}\n\tloading.value = false;\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('executionsList.showMessage.handleDeleteSelected.title'),\n\t\ttype: 'success',\n\t});\n}\n\nasync function onExecutionRetry(payload: { id: string; loadWorkflow: boolean }) {\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('executionDetails.runningMessage'),\n\t\ttype: 'info',\n\t\tduration: 2000,\n\t});\n\n\tawait retryExecution(payload);\n\tawait onRefreshData();\n\n\ttelemetry.track('User clicked retry execution button', {\n\t\tworkflow_id: workflow.value?.id,\n\t\texecution_id: payload.id,\n\t\tretry_type: payload.loadWorkflow ? 'current' : 'original',\n\t});\n}\n\nasync function retryExecution(payload: { id: string; loadWorkflow: boolean }) {\n\ttry {\n\t\tconst retrySuccessful = await executionsStore.retryExecution(payload.id, payload.loadWorkflow);\n\n\t\tif (retrySuccessful) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulTrue.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulFalse.title'),\n\t\t\t\ttype: 'error',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.retryExecution.title'));\n\t}\n}\n\nasync function onLoadMore(): Promise<void> {\n\tif (!loadingMore.value) {\n\t\tawait callDebounced(loadMore, { debounceTime: 1000 });\n\t}\n}\n\nasync function loadMore(): Promise<void> {\n\tif (\n\t\t!!executionsStore.executionsFilters.status?.includes('running') ||\n\t\texecutions.value.length >= executionsStore.executionsCount\n\t) {\n\t\treturn;\n\t}\n\n\tloadingMore.value = true;\n\n\tlet lastId: string | undefined;\n\tif (executions.value.length !== 0) {\n\t\tconst lastItem = executions.value.slice(-1)[0];\n\t\tlastId = lastItem.id;\n\t}\n\n\ttry {\n\t\tawait executionsStore.fetchExecutions(executionsStore.executionsFilters, lastId);\n\t} catch (error) {\n\t\tloadingMore.value = false;\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.loadMore.title'));\n\t\treturn;\n\t}\n\n\tloadingMore.value = false;\n}\n</script>\n<template>\n\t<WorkflowExecutionsList\n\t\tv-if=\"workflow\"\n\t\t:executions=\"executions\"\n\t\t:execution=\"execution\"\n\t\t:filters=\"filters\"\n\t\t:workflow=\"workflow\"\n\t\t:loading=\"loading\"\n\t\t:loading-more=\"loadingMore\"\n\t\t@execution:stop=\"onExecutionStop\"\n\t\t@execution:delete=\"onExecutionDelete\"\n\t\t@execution:retry=\"onExecutionRetry\"\n\t\t@update:filters=\"onUpdateFilters\"\n\t\t@update:auto-refresh=\"onAutoRefreshToggle\"\n\t\t@load-more=\"onLoadMore\"\n\t\t@reload=\"onRefreshData\"\n\t/>\n</template>\n"],"names":["_sfc_main$3","defineComponent","ExecutionsTime","useExecutionHelpers","mapStores","useWorkflowsStore","VIEWS","action","_resolveComponent","$style","_normalizeClass","executionUIDetails","_ctx","highlight","_createVNode","_component_router_link","executionPreviewViewName","_withCtx","_createElementVNode","_component_n8n_text","_createTextVNode","_toDisplayString","_openBlock","_createBlock","_component_n8n_spinner","_createCommentVNode","execution","_component_ExecutionsTime","_createElementBlock","_hoisted_1","isRetriable","onRetryMenuItemSelect","_component_n8n_tooltip","_sfc_main$2","WorkflowExecutionsCard","WorkflowExecutionsInfoAccordion","ExecutionsFilter","useExecutionsStore","to","from","newValue","oldValue","updatedDeps","id","_a","limit","executionsListRef","diff","payload","filter","sidebarContainerRef","currentWorkflowExecutionsCardRefs","cardElement","listCapacity","cardRect","LIST_HEADER_OFFSET","_hoisted_2","_component_WorkflowExecutionsInfoAccordion","_component_n8n_heading","_component_el_checkbox","_cache","$event","_component_ExecutionsFilter","loadMore","loading","_component_n8n_loading","temporaryExecution","onRetryExecution","_TransitionGroup","_Fragment","_renderList","_component_WorkflowExecutionsCard","onItemMounted","loadingMore","_sfc_main$1","WorkflowExecutionsSidebar","_","next","getNodeViewTab","MAIN_HEADER_TABS","confirmModal","MODAL_CONFIRM","MODAL_CANCEL","externalHooks","useExternalHooks","router","useRouter","workflowHelpers","useWorkflowHelpers","callDebounced","useDebounce","useToast","useMessage","useTagsStore","useNodeTypesStore","useSettingsStore","useUIStore","PLACEHOLDER_EMPTY_WORKFLOW_ID","executionFilterToQueryFilter","value","loadWorkflow","$emit","hidePreview","onStopExecution","executionsStore","workflowsStore","tagsStore","nodeTypesStore","i18n","useI18n","telemetry","useTelemetry","route","useRoute","toast","filters","storeToRefs","ref","workflow","workflowId","computed","executionId","executions","e","currentExecution","watch","fetchWorkflow","fetchExecution","onMounted","initializeRoute","onDocumentVisibilityChange","onBeforeUnmount","error","data","tags","onAutoRefreshToggle","onRefreshData","NO_NETWORK_ERROR_CODE","onUpdateFilters","newFilters","onExecutionStop","onExecutionDelete","executionIndex","nextExecution","onExecutionRetry","retryExecution","onLoadMore","lastId"],"mappings":"mlDA6FA,MAAAA,GAAeC,EAAgB,CAC9B,KAAM,yBACN,WAAY,CACX,eAAAC,EACD,EACA,MAAO,CACN,UAAW,CACV,KAAM,OACN,SAAU,EACX,EACA,UAAW,CACV,KAAM,QACN,QAAS,EACV,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CAAC,iBAAkB,SAAS,EACnC,OAAQ,CAGA,MAAA,CACN,iBAHwBC,IAGxB,CAEF,EACA,SAAU,CACT,GAAGC,EAAUC,CAAiB,EAC9B,iBAA0B,CACzB,OAAQ,KAAK,OAAO,OAAO,MAAmB,KAAK,eAAe,UACnE,EACA,uBAAkC,CAC1B,MAAA,CACN,CACC,GAAI,mBACJ,MAAO,KAAK,QAAQ,SAAS,gDAAgD,CAC9E,EACA,CACC,GAAI,oBACJ,MAAO,KAAK,QAAQ,SAAS,0CAA0C,CACxE,CAAA,CAEF,EACA,oBAAuC,CACtC,OAAO,KAAK,iBAAiB,aAAa,KAAK,SAAS,CACzD,EACA,UAAoB,CACnB,OAAO,KAAK,UAAU,KAAO,KAAK,OAAO,OAAO,WACjD,EACA,aAAuB,CACtB,OAAO,KAAK,iBAAiB,qBAAqB,KAAK,SAAS,CACjE,EACA,0BAA2B,CAC1B,OAAOC,EAAM,iBACd,CACD,EACA,SAAU,CACT,KAAK,MAAM,UAAW,KAAK,UAAU,EAAE,CACxC,EACA,QAAS,CACR,sBAAsBC,EAAsB,CACtC,KAAA,MAAM,iBAAkB,CAAE,UAAW,KAAK,UAAW,QAASA,EAAQ,CAC5E,CACD,CACD,CAAC,ixBA7JAC,EA+EM,aAAA,sBA9EsCC,MAAOC,EAAA,CAAmCD,iBAAa,GAAA,CAAiBA,SAAOE,sBAAmB,EAAA,GAAkBF,CAAAA,EAAAA,OAAO,QAASG,EAAGC,SAAAA,CAAeJ,SAAOG,EAAiB,mBAAA,IAAA,CAAA,EAAA,GAAA,CAAAA,EAAA,OAAA,SAAA,EAAAA,EAAA,2CAWrNE,EAAAC,EAAA,CAAA,MAAcC,EAAwBJ,EAAA,OAAA,aAAA,EAAA,GAAA,iCAIxC,OAAA,CAAA,KAAAA,EAAA,gBAA4BD,cAAmB,UAAI,EAAA,CAAA,EAjBvD,6BA0DSC,EAAA,mBAAA,IAAA,EAAA,SAvCKK,EAnBd,IAAA,CAAAC,EAAA,MAAA,CAoBI,MAEWR,EAAAE,EAAA,OAAA,WAAA,CAAA,EAAA,CAF4BE,EAAAK,EAAA,CAAE,MAAK,YAAS,KAAA,GAAA,KAAA,SApB3D,eAAA,gBAAA,EAAA,gBAAAC,EAAAC,EAAAT,EAAA,mBAAA,SAAA,EAAA,CAAA,CAAA,CAAA,EAuBI,EAAA,CAAA,CAAA,WAEQD,MAAAA,EAAAA,EAAmB,OAAI,eAAA,CAAA,EAAA,CAzBnCC,EAAA,mBAAA,OAAA,WAAAU,EA0BkB,EAAAC,EAAAC,EAAA,CACX,IAAK,EAAA,KAAA,QA3BZ,MAAAd,EAAA,CAAAE,EAAA,OAAA,QAAA,QAAA,CAAA,CAAA,EA6BK,KAEa,EAFF,CAAA,OAAA,CAAA,GAAAa,EA7BhB,GA6BuBhB,EAAAA,EAAAA,EAAyBU,EAAO,CAAA,MAAAT,EAAAE,EAAA,OAAA,WAAA,EA7BvD,KAAA,OAAA,EAAA,gBAAAQ,EAAAC,EAAAT,EAAA,mBAAA,KAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,EAkCYD,EAAAA,CAAAA,OAAAA,CAAAA,EAAAA,EAAAA,IADPU,EAOW,GAAA,EAAA,GAAA,EAAAT,EAxChB,uCAmCsB,EAAAW,EAAAJ,EAAA,CAChB,IAAI,EAAA,MAAAP,EAAA,SAAA,YAAA,YApCV,KAAA,OAAA,EAAA,SAuCMK,EAAoD,IAAA,CAAAG,EAAvBM,EAAUd,EAAS,QAAA,SAAA,qCAAA,CAAA,EAAA,IAAA,CAAA,EAAAE,EAAAa,EAAA,mCAvCtD,EAAA,KAAA,EAAA,CAAA,YAAA,CAAA,CAAA,CAAA,EA0CiBhB,EAAAA,CAAAA,EAAAA,EAAAA,CAAAA,OAAAA,CAAAA,GAAAA,EA1CjB,yCA2CsBY,EAAAJ,EAAA,CAChB,IAAI,EAAA,MAAAP,EAAA,SAAA,YAAA,YA5CV,KAAA,OAAA,EAAA,CA+C+FD,QAAAA,EAAAA,IAAAA,OAAAA,OAAAA,EAAAA,EAAAA,EAAAA,QAAAA,SAAAA,uCAAAA,iFA/C/F,EAAA,CAAA,EAAA,EAAA,CAAA,OAAA,CAAA,GAqDee,EAAc,GAAA,EAAA,CAAA,EAAA,CAAA,EACxBd,EAAA,UAAA,OAEW,aAFegB,EAAA,MAAAC,GAAA,CAAAf,EAAmCK,EAAO,CAAA,MAAAP,EAAA,SAAA,YAAA,YAtDzE,KAAA,OAAA,EAAA,gBAAAQ,EAAAC,EAAAT,EAAA,QAAA,SAAA,wBAAA,CAAA,EAAA,KAAAS,EAAAT,EAAA,UAAA,OAAA,EAAA,CAAA,CAAA,CAAA,KAAA,EAAA,EAAA,CAAA,OAAA,CAAA,CAAA,CAAA,GA2DGa,EAmBM,GAAA,EAAA,CAnBA,EAAA,CAAA,EAAAP,EAAA,MAAA,OAEEY,EAAWlB,EAAA,OAAA,KAAA,CAAA,EAAA,CA7DtBA,EAAA,aAAAU,IAAAC,EA8Dcd,EAAoB,CAC5B,IAAK,EACN,QAAe,CAAMG,EAAA,OAAA,KAAAA,EAAA,OAAA,KAAA,CAAA,EACrB,MAAAA,EAAA,sBACC,iBAAQmB,OAAAA,eAAAA,yBAlEd,SAAAnB,EAAA,qBAAA,EAoEuBc,KAAAA,EAAU,CAAI,QAAA,QAAA,UAAA,CAAA,GAAAD,EAAjC,GASc,EAAA,EA7ElBb,EAAA,UAAA,OAAA,UAAAU,IAoE8DC,EAAKS,EAAA,CAAA,IAAA,EACnD,UAAO,KAAA,EAAA,gBArEvBd,EA4EO,OAAA,KAAAG,EAAAT,EAAA,QAAA,SAAA,qBAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAJF,QAAAK,EAAA,IAAA,CAAAL,EAxEL,iCA0EeH,EAAoB,CAC7B,IAAI,EAAA,MAAAC,EAAA,CAAAE,EAAA,OAAA,KAAAA,EAAA,OAAA,MAAA,CAAA,EA3EV,KAAA,OAAA,EAAA,KAAA,EAAA,CAAA,OAAA,CAAA,GAAAa,EAAA,GAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,GAAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,4HCqFAQ,GAAehC,EAAgB,CAC9B,KAAM,4BACN,WAAY,CACX,uBAAAiC,GACA,gCAAAC,GACA,iBAAAC,EACD,EACA,MAAO,CACN,WAAY,CACX,KAAM,MACN,SAAU,EACX,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,YAAa,CACZ,KAAM,QACN,QAAS,EACV,EACA,mBAAoB,CACnB,KAAM,OACN,QAAS,IACV,CACD,EACA,MAAO,CACN,eAAgB,KAChB,SAAU,KACV,QAAS,KACT,cAAe,KACf,iBAAkB,KAClB,qBAAsB,IACvB,EACA,MAAO,CACC,MAAA,CACN,OAAQ,CAAC,EACT,aAAc,CAAC,EACf,eAAgB,CACf,mBAAoB,GACpB,aAAc,GACd,OAAQ,EACT,CAAA,CAEF,EACA,SAAU,CACT,GAAGhC,EAAUiC,EAAoBhC,CAAiB,CACnD,EACA,MAAO,CACN,OAAOiC,EAAiBC,EAAmB,CACtCA,EAAK,OAASjC,EAAM,mBAAqBgC,EAAG,OAAShC,EAAM,gBAEzD,KAAA,QAAQ,GAAG,EAAE,CAEpB,EACA,kCACCkC,EACAC,EACC,CACGD,GAAYA,EAAS,MAAOC,GAAA,YAAAA,EAAU,MACzC,KAAK,eAAe,mBAAqB,GAE3C,EACA,eAAgB,CACf,QAAQC,EAA6B,CAChC,OAAO,OAAOA,CAAW,EAAE,MAAM,OAAO,GAC3C,KAAK,mBAAmB,CAE1B,EACA,KAAM,EACP,CACD,EACA,QAAS,CACR,cAAcC,EAAkB,OAC1B,KAAA,aAAa,KAAKA,CAAE,EACrB,KAAK,aAAa,SAAW,KAAK,WAAW,SAChD,KAAK,eAAe,aAAe,GACnC,KAAK,cAAc,KAGhBC,EAAA,KAAK,gBAAgB,kBAArB,YAAAA,EAAsC,MAAOD,IAChD,KAAK,eAAe,mBAAqB,GAE3C,EACA,SAASE,EAAQ,GAAU,CACtB,GAAA,CAAC,KAAK,QAAS,CACZ,MAAAC,EAAoB,KAAK,MAAM,cACrC,GAAIA,EAAmB,CACtB,MAAMC,EACLD,EAAkB,cACjBA,EAAkB,aAAeA,EAAkB,WACjDC,EAAO,KAAOA,EAAO,IACnB,KAAA,MAAM,WAAYF,CAAK,CAE9B,CACD,CACD,EACA,iBAAiBG,EAAiB,CAC5B,KAAA,MAAM,iBAAkBA,CAAO,CACrC,EACA,WAAkB,CACjB,KAAK,MAAM,SAAS,CACrB,EACA,gBAAgBC,EAA6B,CACvC,KAAA,MAAM,gBAAiBA,CAAM,CACnC,EACA,kBAAyB,CACxB,KAAK,MAAM,kBAAkB,CAC9B,EACA,eAAsB,CACf,MAAAC,EAAsB,KAAK,MAAM,UACjCC,EAAoC,KAAK,MAC9C,aAAa,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,CAAC,EAC7D,EAII,GAAAD,IAAuBC,GAAA,MAAAA,EAAmC,QAAQ,CAC/D,MAAAC,EAAcD,EAAkC,CAAC,EAAE,IACnDE,EAAe,KAAK,KAAKH,EAAoB,aAAeE,EAAY,YAAY,EAEtFC,EAAe,KAAK,WAAW,QAClC,KAAK,MAAM,WAAYA,EAAe,KAAK,WAAW,MAAM,CAE9D,CACD,EACA,oBAA2B,OACpB,MAAAP,EAAoB,KAAK,MAAM,cAC/BK,EAAoC,KAAK,MAC9C,cAAaP,EAAA,KAAK,gBAAgB,kBAArB,YAAAA,EAAsC,EAAE,EACtD,EAEA,GACCE,IACAK,GAAA,MAAAA,EAAmC,SACnC,KAAK,gBAAgB,gBACpB,CAEK,MAAAG,EADcH,EAAkC,CAAC,EAAE,IAC5B,wBACvBI,EAAqB,IACvBD,EAAS,IAAMR,EAAkB,eACpC,KAAK,eAAe,OAAS,GAC7BA,EAAkB,SAAS,CAC1B,IAAKQ,EAAS,IAAMC,EACpB,SAAU,QAAA,CACV,EAEH,CACD,CACD,CACD,CAAC,sQA/MsB1B,GAAY,CAAA,IAAA,gBA+BR2B,GAAY,CAAA,IAAA,8KAOhCC,EAAAjD,EAAA,iCAAA,EA9DC,OAAAc,EAAA,EAAyBb,EAAAA,MAAAA,CAC/B,IAAA,YAAA,MAAAC,EAAA,CAAA,qBAAAE,EAAA,OAAA,SAAA,CAAA,EAEA,eAAA,oBAAA,EAAA,UACC,MAEcF,EAAAE,EAAA,OAAA,OAAA,CAAA,EAAA,GAFa8C,EAAQ,CAAC,IAAK,KAAA,KAAA,SAP5C,MAAA,WAAA,EAAA,gBAAAtC,EAAAC,EAAAT,EAAA,QAAA,SAAA,oBAAA,CAAA,EAAA,CAAA,CAAA,CAAA,KAWE,CAAA,CAAM,EAAA,CAAA,EAAAM,EAAA,MAAA,CACL,MAMcR,EAAAE,EAAA,OAAA,QAAA,CAAA,EAAA,CAlBjBE,EAAA6C,EAAA,CAAA,WAAA/C,EAAA,gBAAA,mFAcIgD,EAAA,CAAA,IAAaA,EAAuB,CAAA,EAAAC,GAAAjD,EAAA,MAAA,qBAAAiD,CAAA,EAAA,EAdxC,eAAA,uBAAA,EAAA,gBAAAzC,EAAAC,EAAAT,EAAA,QAAA,SAAA,4BAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAmBG,EAAA,CAAA,EAAkB,EAAA,CAAA,YAAA,CAAA,EAAAE,EAAgCgD,EAA+B,CAAA,oBAAA,8CA0C5E,EAAA,KAAA,EAAA,CAAA,iBAAA,CAAA,CAvCL,EAAA,CAAA,EAAA5C,EAtBH,MAuBWT,CACR,IAAA,gBACC,QAAMG,EAAEmD,OAAAA,aAAAA,EAAAA,eAAAA,mCAEEC,EAAO,CAAA,IAAAJ,EAAA,CAAA,EAAAC,GAAAjD,EAAA,SAAA,EAAA,EAAA,EAAA,CACjBA,EAAA,SAAAU,EAAA,EAAAM,EAAA,MAAAC,GAAA,CA5BJf,EAAAmD,EAAA,CAAA,QAAA,MAAA,CAAA,CAAA,CA8BG,GAAAxC,EAAA,GAAA,EAAA,EAAA,CAAAb,EA9BH,wCAgCYH,MAAO,CACf,IAAA,EAAA,MAAAC,EAAAE,EAAA,OAAA,kBAAA,EAEA,eAEW,sBAAA,EAAA,GAFsBO,EAAQ,CAAC,MAAM,YAAA,KAAA,SAnCpD,MAAA,QAAA,EAAA,gBAAAC,EAAAC,EAAAT,EAAA,QAAA,SAAA,iCAAA,CAAA,EAAA,CAAA,CAAA,CAAA,KAwCesD,CAAAA,CAAAA,EAxCf,CAAA,GAAAtD,EAAA,oBAAAU,MAyCuB4C,EAAqB,CACvC,IAAA,EACA,iBAAYtD,EAAuBsD,mBAAAA,EAAAA,GACnC,UAAQtD,EAAM,mBACd,eAAe,qBAAEuD,EAAgB,mBAAA,EAAA,GAAA,WAAA,GA7CtC,iBAAAvD,EAAA,gBAAA,EAyDqB,KAAA,EAAA,CAAA,YAAA,eAVI,kBAAiB,CAAA,GA/C1Ca,EAiDoC,GAAA,EAAA,EAAAX,EAAAsD,GADhC,yBAhDJ,CAAA,QAAAnD,EAAA,IAAA,EAkDWK,EAAA,EAAA,EAAUM,EAAEyC,GAAA,KAAAC,GAAA1D,EAAA,WAAAc,IAlDvBJ,EAAA,EAAAC,EAAAgD,EAAA,CAmDM,IAAG7C,EAAA,GACH,QAAS,GACT,IAAY,aAAAA,EAAA,EAAA,GACZ,UAAAA,EACA,eAAS8C,qBAAa9C,EAAA,EAAA,GAAA,iBAAAd,EAAA,gHAvD5B,EAAA,GAAA,EAAA,CAAA,EA0Dc6D,EAAAA,CAAAA,CAAAA,EACV7D,EAAA,aAAAU,EAAA,EAAqBM,EAAG,MAAA4B,GAAA,CAAS1C,EAAAmD,EAAA,CAAA,QAAA,UA3DrC,CAAA,CAAA,CAAA,GA8DExC,EAEM,GAAA,EAAA,CAFA,EAAA,EAAA,EAAAP,EAAA,MAAA,CACL,MAA+DR,EAAAE,EAAA,OAAA,aAAA,CAAA,EAAA,0ICXlE8D,GAAezE,EAAgB,CAC9B,KAAM,yBACN,WAAY,CACX,0BAAA0E,EACD,EACA,MAAM,iBAAiBrC,EAAIsC,EAAGC,EAAM,CACnC,GAAIC,GAAexC,CAAE,IAAMyC,GAAiB,SAAU,CAChDF,IACL,MACD,CACI,GAAA,KAAK,QAAQ,aAAc,CACxB,MAAAG,EAAe,MAAM,KAAK,QAC/B,KAAK,QAAQ,SAAS,4CAA4C,EAClE,CACC,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,sDACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,qDACD,EACA,UAAW,EACZ,CAAA,EAGGA,IAAiBC,IACN,MAAM,KAAK,gBAAgB,oBAAoB,CAAA,EAAI,EAAK,GAE/D,MAAA,KAAK,cAAc,mBAE1B,KAAK,QAAQ,aAAe,GACvBJ,KACKG,IAAiBE,KAC3B,KAAK,QAAQ,aAAe,GACvBL,IACN,MAEKA,GAEP,EACA,MAAO,CACN,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,MACN,QAAS,IAAM,CAAC,CACjB,EACA,QAAS,CACR,KAAM,OACN,QAAS,KAAO,CAAA,EACjB,EACA,UAAW,CACV,KAAM,OACN,QAAS,IACV,EACA,YAAa,CACZ,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACN,mBACA,iBACA,kBACA,sBACA,iBACA,YACA,QACD,EACA,OAAQ,CACP,MAAMM,EAAgBC,KAChBC,EAASC,IACTC,EAAkBC,GAAmB,CAAE,OAAAH,CAAQ,CAAA,EAC/C,CAAE,cAAAI,GAAkBC,IAEnB,MAAA,CACN,cAAAP,EACA,gBAAAI,EACA,cAAAE,EACA,GAAGE,EAAS,EACZ,GAAGC,GAAW,CAAA,CAEhB,EACA,SAAU,CACT,GAAGxF,EAAUyF,EAAcC,EAAmBC,GAAkBC,EAAU,EAC1E,oBAAmD,CAE3C,MADa,CAAC,KAAK,WAAW,KAAMtE,GAAc,OAAA,OAAAA,EAAU,OAAOkB,EAAA,KAAK,YAAL,YAAAA,EAAgB,IAAE,EACvE,KAAK,UAAY,MACvC,EACA,aAAuB,CACtB,OAAO,KAAK,SAAY,CAAC,KAAK,WAAa,KAAK,WAAW,MAC5D,EACA,eAAyB,CACjB,OAAA,KAAK,QAAQ,SAAW,KAChC,EACA,uBAAiC,CAChC,OAAO,KAAK,SAAS,KAAOqD,IAAiC,KAAK,SAAS,OAAS,EACrF,EACA,eAA6B,CAC5B,OAAOC,GAA6B,CACnC,GAAG,KAAK,QACR,WAAY,KAAK,SAAS,EAAA,CAC1B,CACF,CACD,EACA,MAAO,CACN,UAAUC,EAAyB,CAC7BA,GAIL,KAAK,QACH,KAAK,CACL,KAAM7F,EAAM,kBACZ,OAAQ,CAAE,KAAM,KAAK,SAAS,GAAI,YAAa6F,EAAM,EAAG,CAAA,CACxD,EACA,MAAM,IAAM,CAAA,CAAE,CACjB,CACD,EACA,QAAS,CACR,MAAM,0BAA0C,CAC/C,KAAK,MAAM,mBAAoB,KAAK,UAAU,EAAE,CACjD,EACA,MAAM,iBAAiC,CACtC,KAAK,MAAM,iBAAkB,KAAK,UAAU,EAAE,CAC/C,EACA,MAAM,iBAAiBnD,EAA2D,CAC3E,MAAAoD,EAAepD,EAAQ,UAAY,mBAEzC,KAAK,MAAM,kBAAmB,CAC7B,GAAIA,EAAQ,UAAU,GACtB,aAAAoD,CAAA,CACA,CACF,CACD,CACD,CAAC,+IAjMA5F,EAqBM,aAAA,sBApBL,MAUEE,EAAAE,EAAA,OAAA,SAAA,CAAA,EAAA,GARSoD,EAA6B,CACtC,WAAcS,EAAAA,WACd,QAAqBP,EAAAA,SAAAA,CAAAA,EAAAA,WAAAA,OACrB,eAAAtD,EAAA,YACA,sBAAiBA,EAAA,mBACjB,uBAAcgD,EAAEyC,CAAAA,IAAAA,EAAAA,CAAAA,EAAAA,GAAAA,EAAK,MAAyB,sBAAAxC,CAAA,GAC9C,mBAASD,eAAEyC,EAAK,MAAA,QAAA,GAChB,gBAAezC,EAAEO,CAAgB,IAAAP,EAAA,CAAA,EAAAC,GAAAjD,EAAA,MAAA,iBAAAiD,CAAA,GAAA,WAAAD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAAjD,EAAA,MAAA,WAAA,GAEvB0F,iBAAW1F,EAAA,gBAAA,EAAA,KAAA,EAAA,CAAA,aAAvB,UAQM,eAAA,sBAAA,kBAAA,CAAA,EAAAA,EArBR,YAAAa,EAAA,GAAA,EAAA,SAamChB,MAAO,CAAA,IAAA,EACvC,MAMEC,EAAAE,EAAA,OAAA,OAAA,CAAA,EAAA,GAJWc,EAAS,CACpB,KAAA,mBACA,UAAed,EAAA,UACf,yBAAgB2F,EAAAA,yBAAAA,iBAAAA,EAAAA,kDAnBrB,EAAA,KAAA,EAAA,CAAA,YAAA,2BAAA,mBAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,wHCkBA,MAAMC,EAAkBnE,IAClBoE,EAAiBpG,IACjBqG,EAAYb,IACZc,EAAiBb,IACjBc,EAAOC,KACPC,EAAYC,KACZC,EAAQC,KACR5B,EAASC,IACT4B,EAAQvB,IACR,CAAE,cAAAF,GAAkBC,IAEpB,CAAE,QAAAyB,CAAA,EAAYC,GAAYZ,CAAe,EAEzCxC,EAAUqD,EAAI,EAAK,EACnB5C,EAAc4C,EAAI,EAAK,EAEvBC,EAAWD,IAEXE,EAAaC,EAAS,IACnBR,EAAM,OAAO,MAAmBP,EAAe,UACvD,EAEKgB,EAAcD,EAAS,IAAMR,EAAM,OAAO,WAAqB,EAE/DU,EAAaF,EAAS,IAAM,CACjC,GAAIhB,EAAgB,8BAA8Be,EAAW,KAAK,GAAK,CAAC,EACxE,GAAIf,EAAgB,uBAAuBe,EAAW,KAAK,GAAK,CAAC,CAAA,CACjE,EAEK7F,EAAY8F,EAAS,IACnBE,EAAW,MAAM,KAAMC,GAAMA,EAAE,KAAOF,EAAY,KAAK,GAAKG,EAAiB,KACpF,EAEKA,EAAmBP,IAEzBQ,EACC,IAAMN,EAAW,MACjB,SAAY,CACX,MAAMO,EAAc,CACrB,CAAA,EAGDD,EACC,IAAMJ,EAAY,MAClB,SAAY,CACX,MAAMM,EAAe,CACtB,CAAA,EAGDC,GAAU,SAAY,CACrB,MAAMrB,EAAe,2BACrB,MAAM,QAAQ,IAAI,CACjBA,EAAe,yBAAyB,EACxCmB,EAAc,EACdtB,EAAgB,WAAWe,EAAW,KAAK,CAAA,CAC3C,EACD,MAAMQ,EAAe,EACrB,MAAME,EAAgB,EACb,SAAA,iBAAiB,mBAAoBC,CAA0B,CAAA,CACxE,EAEDC,GAAgB,IAAM,CACrB3B,EAAgB,MAAM,EACb,SAAA,oBAAoB,mBAAoB0B,CAA0B,CAAA,CAC3E,EAED,eAAeH,GAAiB,CAC3B,GAACN,EAAY,MAIb,GAAA,CACcG,EAAA,MAAS,MAAMpB,EAAgB,eAC/CiB,EAAY,KAAA,EAEbjB,EAAgB,gBAAkBoB,EAAiB,YAC3CQ,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,wCAAwC,CAAC,CAC/E,CACD,CAEA,SAASsB,GAA6B,CACjC,SAAS,kBAAoB,SAChC1B,EAAgB,wBAAwB,EAEnCA,EAAgB,yBAAyBe,EAAW,KAAK,CAEhE,CAEA,eAAeU,GAAkB,CAC5BjB,EAAM,OAAS1G,EAAM,gBAAkBoH,EAAW,MAAM,OAAS,GAAKJ,EAAS,OAClF,MAAMjC,EACJ,KAAK,CACL,KAAM/E,EAAM,kBACZ,OAAQ,CAAE,KAAMgH,EAAS,MAAM,GAAI,YAAaI,EAAW,MAAM,CAAC,EAAE,EAAG,CAAA,CACvE,EACA,MAAM,IAAM,CAAA,CAAE,CAElB,CAEA,eAAeI,GAAgB,CAC9B,IAAIO,EAAgC5B,EAAe,cAAcc,EAAW,KAAK,EACjF,GAAI,CAACc,EACA,GAAA,CACHA,EAAO,MAAM5B,EAAe,cAAcc,EAAW,KAAK,QAClDa,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,uCAAuC,CAAC,EAC7E,MACD,CAGD,GAAI,CAACyB,EACJ,MAAM,IAAI,MACTzB,EAAK,SAAS,yCAA0C,CACvD,YAAa,CAAE,WAAYW,EAAW,KAAM,CAAA,CAC5C,CAAA,EAIG,MAAAe,EAAQD,EAAK,MAAQ,GAC3Bf,EAAS,MAAQe,EACjB5B,EAAe,gBAAgB,CAAE,QAAS4B,EAAK,KAAM,cAAe,GAAO,EAC5D5B,EAAA,kBAAkB6B,EAAK,IAAI,CAAC,CAAE,GAAA3F,KAASA,CAAE,GAAK,CAAA,CAAE,EAC/D+D,EAAU,WAAW4B,CAAI,CAC1B,CAEA,eAAeC,EAAoBpC,EAAgB,CAC9CA,EACG,MAAAK,EAAgB,yBAAyBe,EAAW,KAAK,EAE/Df,EAAgB,wBAAwB,CAE1C,CAEA,eAAegC,GAAgB,CAC1B,GAACjB,EAAW,MAIZ,GAAA,CACH,MAAMf,EAAgB,gBAAgB,CACrC,GAAGA,EAAgB,kBACnB,WAAYe,EAAW,KAAA,CACvB,QACOa,EAAO,CACXA,EAAM,YAAcK,GACjBvB,EAAA,YACL,CACC,MAAON,EAAK,SAAS,4CAA4C,EACjE,QAASwB,EAAM,QACf,KAAM,QACN,SAAU,IACX,EACA,EAAA,EAGDlB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,4CAA4C,CAAC,CAEpF,CACD,CAEA,eAAe8B,GAAgBC,EAAiC,CAC/DnC,EAAgB,MAAM,EACtBA,EAAgB,WAAWmC,CAAU,EAC/B,MAAAnC,EAAgB,WAAWe,EAAW,KAAK,CAClD,CAEA,eAAeqB,GAAgBjG,EAAY,CACtC,GAAA,CACG,MAAA6D,EAAgB,qBAAqB7D,CAAE,EAE7CuE,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,gDAAgD,EACrE,QAASA,EAAK,SAAS,mDAAoD,CAC1E,YAAa,CAAE,kBAAmBjE,CAAG,CAAA,CACrC,EACD,KAAM,SAAA,CACN,EAED,MAAM6F,EAAc,QACZJ,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,8CAA8C,CAAC,CACrF,CACD,CAEA,eAAeiC,GAAkBlG,EAAY,CAC5CqB,EAAQ,MAAQ,GACZ,GAAA,CACG,MAAA8E,EAAiBpB,EAAW,MAAM,UAAWC,IAAwBA,GAAE,KAAOhF,CAAE,EAEhFoG,EACLrB,EAAW,MAAMoB,EAAiB,CAAC,GACnCpB,EAAW,MAAMoB,EAAiB,CAAC,GACnCpB,EAAW,MAAM,CAAC,EAEnB,MAAMlB,EAAgB,iBAAiB,CACtC,IAAK,CAAC7D,CAAE,CAAA,CACR,EAEG2E,EAAS,QACRI,EAAW,MAAM,OAAS,EAC7B,MAAMrC,EACJ,QAAQ,CACR,KAAM/E,EAAM,kBACZ,OAAQ,CAAE,KAAMgH,EAAS,MAAM,GAAI,YAAayB,EAAc,EAAG,CAAA,CACjE,EACA,MAAM,IAAM,CAAA,CAAE,EAGhB,MAAM1D,EAAO,QAAQ,CACpB,KAAM/E,EAAM,eACZ,OAAQ,CAAE,KAAMgH,EAAS,MAAM,EAAG,CAAA,CAClC,SAGKc,EAAO,CACfpE,EAAQ,MAAQ,GAChBkD,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,qDAAqD,CAAC,EAC3F,MACD,CACA5C,EAAQ,MAAQ,GAEhBkD,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,uDAAuD,EAC5E,KAAM,SAAA,CACN,CACF,CAEA,eAAeoC,GAAiBhG,EAAgD,OAC/EkE,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,iCAAiC,EACtD,KAAM,OACN,SAAU,GAAA,CACV,EAED,MAAMqC,GAAejG,CAAO,EAC5B,MAAMwF,EAAc,EAEpB1B,EAAU,MAAM,sCAAuC,CACtD,aAAalE,EAAA0E,EAAS,QAAT,YAAA1E,EAAgB,GAC7B,aAAcI,EAAQ,GACtB,WAAYA,EAAQ,aAAe,UAAY,UAAA,CAC/C,CACF,CAEA,eAAeiG,GAAejG,EAAgD,CACzE,GAAA,CACqB,MAAMwD,EAAgB,eAAexD,EAAQ,GAAIA,EAAQ,YAAY,EAG5FkE,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,sDAAsD,EAC3E,KAAM,SAAA,CACN,EAEDM,EAAM,YAAY,CACjB,MAAON,EAAK,SAAS,uDAAuD,EAC5E,KAAM,OAAA,CACN,QAEMwB,EAAO,CACflB,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,+CAA+C,CAAC,CACtF,CACD,CAEA,eAAesC,IAA4B,CACrCzE,EAAY,OAChB,MAAMgB,EAAc1B,GAAU,CAAE,aAAc,GAAM,CAAA,CAEtD,CAEA,eAAeA,IAA0B,OACxC,IACGnB,EAAA4D,EAAgB,kBAAkB,SAAlC,MAAA5D,EAA0C,SAAS,YACrD8E,EAAW,MAAM,QAAUlB,EAAgB,gBAE3C,OAGD/B,EAAY,MAAQ,GAEhB,IAAA0E,EACAzB,EAAW,MAAM,SAAW,IAE/ByB,EADiBzB,EAAW,MAAM,MAAM,EAAE,EAAE,CAAC,EAC3B,IAGf,GAAA,CACH,MAAMlB,EAAgB,gBAAgBA,EAAgB,kBAAmB2C,CAAM,QACvEf,EAAO,CACf3D,EAAY,MAAQ,GACpByC,EAAM,UAAUkB,EAAOxB,EAAK,SAAS,yCAAyC,CAAC,EAC/E,MACD,CAEAnC,EAAY,MAAQ,EACrB"}
@@ -1,2 +1,2 @@
1
- import{G as B,r as T,e as b,b as le,l as I,m as L,H as Q,p as m,M as P,O as C,S as N,T as k,u as V,R as x,U as S,I as p,a2 as ce,ag as A,F as ue,a7 as we,az as de,aH as me,D as fe,w as pe,af as ve}from"./vendor-Dv5OeN6t.js";import{w as D,O as X,l as Z,b as ke,j as ee,d3 as ye,u as _e,i as he,V as U,d9 as ge,e4 as be}from"./index-DeNtBxiT.js";import{d as We}from"./dateformat-B9ocXky7.js";import{_ as K}from"./n8n-B6cfQsVX.js";import{W as $e}from"./WorkflowPreview-CP6H-zD6.js";import{d as He}from"./pinia-BAhPp3pQ.js";import{F as Te}from"./file-saver-B3jMAULB.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-9E8Shwsg.js";import"./lodash-es-BxV-E8rt.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-x14jMqbG.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-DcTmlMkf.js";import"./@n8n/codemirror-lang-Qkdx7NoQ.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-LluJPcs3.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const Ie=["datetime"],Ve=["value"],Se=B({__name:"WorkflowHistoryListItem",props:{item:{},index:{},actions:{},isActive:{type:Boolean}},emits:["action","preview","mounted"],setup(W,{emit:_}){const t=W,s=_,f=D(),c=T(!1),v=T(null),w=T(null),u=T(!1),h=b(()=>{const e=new Date().getFullYear().toString(),[r,n]=We(t.item.createdAt,`${t.item.createdAt.startsWith(e)?"":"yyyy "}mmm d"#"HH:MM:ss`).split("#");return f.baseText("workflowHistory.item.createdAt",{interpolate:{date:r,time:n}})}),$=b(()=>{const e=t.item.authors.split(", ");let r=e[0];return e.length>1&&(r=`${r} + ${e.length-1}`),{size:e.length,label:r}}),O=b(()=>f.baseText("workflowHistory.item.id",{interpolate:{id:t.item.versionId}})),d=e=>{s("action",{action:e,id:t.item.versionId,data:{formattedCreatedAt:h.value}})},a=e=>{c.value=e},l=e=>{s("preview",{event:e,id:t.item.versionId})};return le(()=>{var e,r,n;s("mounted",{index:t.index,offsetTop:((e=v.value)==null?void 0:e.offsetTop)??0,isActive:t.isActive}),u.value=(((r=w.value)==null?void 0:r.scrollWidth)??0)>(((n=w.value)==null?void 0:n.clientWidth)??0)}),(e,r)=>{const n=A("n8n-tooltip"),y=A("n8n-badge"),H=A("n8n-action-toggle");return I(),L("li",{ref_key:"itemElement",ref:v,"data-test-id":"workflow-history-list-item",class:p({[e.$style.item]:!0,[e.$style.active]:t.isActive,[e.$style.actionsVisible]:c.value})},[Q(e.$slots,"default",{formattedCreatedAt:h.value},()=>[m("p",{onClick:l},[m("time",{datetime:e.item.createdAt},k(h.value),9,Ie),S(n,{placement:"right-end",disabled:$.value.size<2&&!u.value},{content:C(()=>[N(k(t.item.authors),1)]),default:C(()=>[m("span",{ref_key:"authorElement",ref:w},k($.value.label),513)]),_:1},8,["disabled"]),m("data",{value:e.item.versionId},k(O.value),9,Ve)])]),m("div",{class:p(e.$style.tail)},[t.index===0?(I(),P(y,{key:0},{default:C(()=>[N(k(V(f).baseText("workflowHistory.item.latest")),1)]),_:1})):x("",!0),S(H,{theme:"dark",class:p(e.$style.actions),actions:t.actions,placement:"bottom-end",onAction:d,onClick:r[0]||(r[0]=ce(()=>{},["stop"])),onVisibleChange:a},{default:C(()=>[Q(e.$slots,"action-toggle-button")]),_:3},8,["class","actions"])],2)],2)}}}),Ce="_item_1a4du_1",Oe="_tail_1a4du_33",Re="_active_1a4du_38",Ae="_actionsVisible_1a4du_45",Le="_actions_1a4du_45",xe={item:Ce,tail:Oe,active:Re,actionsVisible:Ae,actions:Le},Me={$style:xe},te=K(Se,[["__cssModules",Me]]),Ee=m("br",null,null,-1),Ne=["aria-label"],Pe=B({__name:"WorkflowHistoryList",props:{items:{},activeItem:{},actions:{},requestNumberOfItems:{},lastReceivedItemsLength:{},evaluatedPruneTime:{},shouldUpgrade:{type:Boolean},isListLoading:{type:Boolean}},emits:["action","preview","loadMore","upgrade"],setup(W,{emit:_}){const t=W,s=_,f=D(),c=T(null),v=T(!0),w=T(null),u=a=>a===0?t.actions.filter(l=>l.value!=="restore"):t.actions,h=a=>{w.value=new IntersectionObserver(([l])=>{var e,r;l.isIntersecting&&((e=w.value)==null||e.unobserve(a),(r=w.value)==null||r.disconnect(),w.value=null,s("loadMore",{take:t.requestNumberOfItems,skip:t.items.length}))},{root:c.value,threshold:.01}),w.value.observe(a)},$=({action:a,id:l,data:e})=>{v.value=!1,s("action",{action:a,id:l,data:e})},O=({event:a,id:l})=>{v.value=!1,s("preview",{event:a,id:l})},d=({index:a,offsetTop:l,isActive:e})=>{var r,n;e&&v.value&&(v.value=!1,(r=c.value)==null||r.scrollTo({top:l,behavior:"smooth"})),a===t.items.length-1&&t.lastReceivedItemsLength===t.requestNumberOfItems&&h((n=c.value)==null?void 0:n.children[a])};return(a,l)=>{const e=A("n8n-loading"),r=A("i18n-t");return I(),L("ul",{ref_key:"listElement",ref:c,class:p(a.$style.list),"data-test-id":"workflow-history-list"},[(I(!0),L(ue,null,we(t.items,(n,y)=>{var H;return I(),P(te,{key:n.versionId,index:y,item:n,"is-active":n.versionId===((H=t.activeItem)==null?void 0:H.versionId),actions:u(y),onAction:$,onPreview:O,onMounted:d},null,8,["index","item","is-active","actions"])}),128)),!t.items.length&&!t.isListLoading?(I(),L("li",{key:0,class:p(a.$style.empty)},[N(k(V(f).baseText("workflowHistory.empty"))+" ",1),Ee,N(" "+k(V(f).baseText("workflowHistory.hint")),1)],2)):x("",!0),t.isListLoading?(I(),L("li",{key:1,class:p(a.$style.loader),role:"status","aria-live":"polite","aria-busy":"true","aria-label":V(f).baseText("generic.loading")},[S(e,{rows:3,class:"mb-xs"}),S(e,{rows:3,class:"mb-xs"}),S(e,{rows:3,class:"mb-xs"})],10,Ne)):x("",!0),t.shouldUpgrade?(I(),L("li",{key:2,class:p(a.$style.retention)},[m("span",null,k(V(f).baseText("workflowHistory.limit",{interpolate:{evaluatedPruneTime:String(t.evaluatedPruneTime)}})),1),S(r,{keypath:"workflowHistory.upgrade",tag:"span"},{link:C(()=>[m("a",{href:"#",onClick:l[0]||(l[0]=n=>s("upgrade"))},k(V(f).baseText("workflowHistory.upgrade.link")),1)]),_:1})],2)):x("",!0)],2)}}}),Ue="_list_undzg_1",Fe="_empty_undzg_10",ze="_loader_undzg_23",Be="_retention_undzg_27",De={list:Ue,empty:Fe,loader:ze,retention:Be},Ke={$style:De},qe=K(Pe,[["__cssModules",Ke]]),Ye=["datetime"],je=["value"],Ge=B({__name:"WorkflowHistoryContent",props:{workflow:{},workflowVersion:{},actions:{},isListLoading:{type:Boolean},isFirstItemShown:{type:Boolean}},emits:["action"],setup(W,{emit:_}){const t=D(),s=W,f=_,c=b(()=>{if(!s.workflowVersion||!s.workflow)return;const{pinData:u,...h}=s.workflow;return{...h,nodes:s.workflowVersion.nodes,connections:s.workflowVersion.connections}}),v=b(()=>s.isFirstItemShown?s.actions.filter(u=>u.value!=="restore"):s.actions),w=({action:u,id:h,data:$})=>{f("action",{action:u,id:h,data:$})};return(u,h)=>{const $=A("n8n-icon"),O=A("n8n-button");return I(),L("div",{class:p(u.$style.content)},[s.workflowVersion?(I(),P($e,{key:0,workflow:c.value,loading:s.isListLoading,"loader-type":"spinner"},null,8,["workflow","loading"])):x("",!0),m("ul",{class:p(u.$style.info)},[s.workflowVersion?(I(),P(te,{key:0,class:p(u.$style.card),index:-1,item:s.workflowVersion,"is-active":!1,actions:v.value,onAction:w},{default:C(({formattedCreatedAt:d})=>[m("section",{class:p(u.$style.text)},[m("p",null,[m("span",{class:p(u.$style.label)},k(V(t).baseText("workflowHistory.content.title"))+": ",3),m("time",{datetime:s.workflowVersion.createdAt},k(d),9,Ye)]),m("p",null,[m("span",{class:p(u.$style.label)},k(V(t).baseText("workflowHistory.content.editedBy"))+": ",3),m("span",null,k(s.workflowVersion.authors),1)]),m("p",null,[m("span",{class:p(u.$style.label)},k(V(t).baseText("workflowHistory.content.versionId"))+": ",3),m("data",{value:s.workflowVersion.versionId},k(s.workflowVersion.versionId),9,je)])],2)]),"action-toggle-button":C(()=>[S(O,{type:"tertiary",size:"large","data-test-id":"action-toggle-button"},{default:C(()=>[N(k(V(t).baseText("workflowHistory.content.actions"))+" ",1),S($,{class:"ml-3xs",icon:"chevron-down",size:"small"})]),_:1})]),_:1},8,["class","item","actions"])):x("",!0)],2)],2)}}}),Je="_content_2kwc4_1",Qe="_info_2kwc4_11",Xe="_card_2kwc4_19",Ze="_text_2kwc4_24",et="_label_2kwc4_49",tt={content:Je,info:Qe,card:Xe,text:Ze,label:et},ot={$style:tt},st=K(Ge,[["__cssModules",ot]]),nt=async(W,_,t)=>{const{data:s}=await X(W.baseUrl,`/workflow-history/workflow/${_}`,t);return s},at=async(W,_,t)=>{const{data:s}=await X(W.baseUrl,`/workflow-history/workflow/${_}/version/${t}`);return s},rt=He("workflowHistory",()=>{const W=Z(),_=ke(),t=ee(),s=b(()=>_.settings.workflowHistory.licensePruneTime),f=b(()=>_.settings.workflowHistory.pruneTime),c=b(()=>Math.min(f.value,s.value)),v=b(()=>s.value!==-1&&s.value===f.value),w=async(d,a)=>await nt(W.getRestApiContext,d,a),u=async(d,a)=>await at(W.getRestApiContext,d,a);return{getWorkflowHistory:w,getWorkflowVersion:u,downloadVersion:async(d,a,l)=>{const[e,r]=await Promise.all([t.fetchWorkflow(d),u(d,a)]),{connections:n,nodes:y}=r,H=new Blob([JSON.stringify({...e,nodes:y,connections:n},null,2)],{type:"application/json;charset=utf-8"});Te.saveAs(H,`${e.name}(${l.formattedCreatedAt}).json`)},cloneIntoNewWorkflow:async(d,a,l)=>{const[e,r]=await Promise.all([t.fetchWorkflow(d),u(d,a)]),{connections:n,nodes:y}=r,{name:H}=e,F=await ye(W.getRestApiContext,{name:`${H} (${l.formattedCreatedAt})`}),q={nodes:y,connections:n,name:F.name};return await t.createNewWorkflow(q)},restoreWorkflow:async(d,a,l)=>{const e=await u(d,a),{connections:r,nodes:n}=e,y={connections:r,nodes:n};return l&&(y.active=!1),await t.updateWorkflow(d,y,!0).catch(async H=>{if(H.httpStatusCode===400&&H.message.includes("can not be activated"))return await t.fetchWorkflow(d);throw new Error(H)})},evaluatedPruneTime:c,shouldUpgrade:v}}),it=B({__name:"WorkflowHistory",setup(W){const _=["restore","clone","open","download"],t=_.reduce((o,i)=>({...o,[i.toUpperCase()]:i}),{}),s=de(),f=me(),c=D(),v=_e(),w=rt(),u=he(),h=ee(),$=T(!0),O=T(!0),d=T(20),a=T(0),l=T(null),e=T([]),r=T(null),n=b(()=>j("workflowId")),y=b(()=>j("versionId")),H=b(()=>({name:U.WORKFLOW,params:{name:n.value}})),F=b(()=>_.map(o=>({label:c.baseText(`workflowHistory.item.actions.${o}`),disabled:!1,value:o}))),q=b(()=>{var o;return((o=e.value[0])==null?void 0:o.versionId)===y.value}),oe=b(()=>Math.floor(w.evaluatedPruneTime/24)),M=o=>{ge.track(o,{instance_id:Z().instanceId,workflow_id:n.value})},Y=async o=>{const i=await w.getWorkflowHistory(n.value,o);a.value=i.length,e.value=e.value.concat(i)};fe(async()=>{M("User opened workflow history");try{const[o]=await Promise.all([h.fetchWorkflow(n.value),Y({take:d.value})]);l.value=o,O.value=!1,!y.value&&e.value.length&&await f.replace({name:U.WORKFLOW_HISTORY,params:{workflowId:n.value,versionId:e.value[0].versionId}})}catch(o){$.value=!1,v.showError(o,c.baseText("workflowHistory.title"))}});const j=o=>{const i=s.params[o];return typeof i=="string"?i:(i==null?void 0:i[0])??""},G=o=>{const{href:i}=f.resolve({name:U.WORKFLOW_HISTORY,params:{workflowId:n.value,versionId:o}});window.open(i,"_blank")},se=async(o,i)=>await new Promise((g,R)=>{const E=[{text:c.baseText("workflowHistory.action.restore.modal.button.cancel"),type:"tertiary",action:()=>{g("cancel")}}];o&&E.push({text:c.baseText("workflowHistory.action.restore.modal.button.deactivateAndRestore"),type:"tertiary",action:()=>{g("deactivateAndRestore")}}),E.push({text:c.baseText("workflowHistory.action.restore.modal.button.restore"),type:"primary",action:()=>{g("restore")}});try{u.openModalWithData({name:be,data:{beforeClose:()=>{g("cancel")},isWorkflowActivated:o,formattedCreatedAt:i,buttons:E}})}catch(z){R(z)}}),ne=async(o,i)=>{const g=await w.cloneIntoNewWorkflow(n.value,o,i),{href:R}=f.resolve({name:U.WORKFLOW,params:{name:g.id}});v.showMessage({title:c.baseText("workflowHistory.action.clone.success.title"),message:ve("a",{href:R,target:"_blank"},c.baseText("workflowHistory.action.clone.success.message")),type:"success",duration:1e4})},ae=async(o,i)=>{const g=await h.fetchWorkflow(n.value),R=await se(g.active,i.formattedCreatedAt);if(R==="cancel")return;l.value=await w.restoreWorkflow(n.value,o,R==="deactivateAndRestore");const E=await w.getWorkflowHistory(n.value,{take:1});e.value=E.concat(e.value),v.showMessage({title:c.baseText("workflowHistory.action.restore.success.title"),type:"success"})},J=async({action:o,id:i,data:g})=>{try{switch(o){case t.OPEN:G(i),M("User opened version in new tab");break;case t.DOWNLOAD:await w.downloadVersion(n.value,i,g),M("User downloaded version");break;case t.CLONE:await ne(i,g),M("User cloned version");break;case t.RESTORE:await ae(i,g),M("User restored version");break}}catch(R){v.showError(R,c.baseText("workflowHistory.action.error.title",{interpolate:{action:c.baseText(`workflowHistory.item.actions.${o}`).toLowerCase()}}))}},re=async({event:o,id:i})=>{o.metaKey||o.ctrlKey?(G(i),M("User opened version in new tab")):await f.push({name:U.WORKFLOW_HISTORY,params:{workflowId:n.value,versionId:i}})},ie=()=>{u.goToUpgrade("workflow-history","upgrade-workflow-history")};return pe(async()=>{if(y.value){try{r.value=await w.getWorkflowVersion(n.value,y.value),M("User selected version")}catch(o){v.showError(new Error(`${o.message} "${y.value}"&nbsp;`),c.baseText("workflowHistory.title"))}try{l.value=await h.fetchWorkflow(n.value)}catch(o){$.value=!1,v.showError(o,c.baseText("workflowHistory.title"))}}}),(o,i)=>{const g=A("n8n-heading"),R=A("n8n-button"),E=A("router-link");return I(),L("div",{class:p(o.$style.view)},[S(g,{class:p(o.$style.header),tag:"h2",size:"medium"},{default:C(()=>{var z;return[N(k((z=l.value)==null?void 0:z.name),1)]}),_:1},8,["class"]),m("div",{class:p(o.$style.corner)},[S(g,{tag:"h2",size:"medium",bold:""},{default:C(()=>[N(k(V(c).baseText("workflowHistory.title")),1)]),_:1}),S(E,{to:H.value,"data-test-id":"workflow-history-close-button"},{default:C(()=>[S(R,{type:"tertiary",icon:"times",size:"small",text:"",square:""})]),_:1},8,["to"])],2),m("div",{class:p(o.$style.listComponentWrapper)},[$.value?(I(),P(qe,{key:0,items:e.value,"last-received-items-length":a.value,"active-item":r.value,actions:F.value,"request-number-of-items":d.value,"should-upgrade":V(w).shouldUpgrade,"evaluated-prune-time":oe.value,"is-list-loading":O.value,onAction:J,onPreview:re,onLoadMore:Y,onUpgrade:ie},null,8,["items","last-received-items-length","active-item","actions","request-number-of-items","should-upgrade","evaluated-prune-time","is-list-loading"])):x("",!0)],2),m("div",{class:p(o.$style.contentComponentWrapper)},[$.value?(I(),P(st,{key:0,workflow:l.value,"workflow-version":r.value,actions:F.value,"is-list-loading":O.value,"is-first-item-shown":q.value,onAction:J},null,8,["workflow","workflow-version","actions","is-list-loading","is-first-item-shown"])):x("",!0)],2)],2)}}}),lt="_view_phdlt_1",ct="_header_phdlt_11",ut="_corner_phdlt_19",wt="_contentComponentWrapper_phdlt_30",dt="_listComponentWrapper_phdlt_35",mt={view:lt,header:ct,corner:ut,contentComponentWrapper:wt,listComponentWrapper:dt},ft={$style:mt},qt=K(it,[["__cssModules",ft]]);export{qt as default};
2
- //# sourceMappingURL=WorkflowHistory-DrJO6HE6.js.map
1
+ import{G as B,r as T,e as b,b as le,l as I,m as L,H as Q,p as m,M as P,O as C,S as N,T as k,u as V,R as x,U as S,I as p,a2 as ce,ag as A,F as ue,a7 as we,az as de,aH as me,D as fe,w as pe,af as ve}from"./vendor-Dv5OeN6t.js";import{w as D,O as X,l as Z,b as ke,j as ee,d3 as ye,u as _e,i as he,V as U,d9 as ge,e4 as be}from"./index-DEwaaDne.js";import{d as We}from"./dateformat-B9ocXky7.js";import{_ as K}from"./n8n-B6cfQsVX.js";import{W as $e}from"./WorkflowPreview-CLfcNQ-Q.js";import{d as He}from"./pinia-BAhPp3pQ.js";import{F as Te}from"./file-saver-B3jMAULB.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-9E8Shwsg.js";import"./lodash-es-BxV-E8rt.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-x14jMqbG.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-DcTmlMkf.js";import"./@n8n/codemirror-lang-Qkdx7NoQ.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-LluJPcs3.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const Ie=["datetime"],Ve=["value"],Se=B({__name:"WorkflowHistoryListItem",props:{item:{},index:{},actions:{},isActive:{type:Boolean}},emits:["action","preview","mounted"],setup(W,{emit:_}){const t=W,s=_,f=D(),c=T(!1),v=T(null),w=T(null),u=T(!1),h=b(()=>{const e=new Date().getFullYear().toString(),[r,n]=We(t.item.createdAt,`${t.item.createdAt.startsWith(e)?"":"yyyy "}mmm d"#"HH:MM:ss`).split("#");return f.baseText("workflowHistory.item.createdAt",{interpolate:{date:r,time:n}})}),$=b(()=>{const e=t.item.authors.split(", ");let r=e[0];return e.length>1&&(r=`${r} + ${e.length-1}`),{size:e.length,label:r}}),O=b(()=>f.baseText("workflowHistory.item.id",{interpolate:{id:t.item.versionId}})),d=e=>{s("action",{action:e,id:t.item.versionId,data:{formattedCreatedAt:h.value}})},a=e=>{c.value=e},l=e=>{s("preview",{event:e,id:t.item.versionId})};return le(()=>{var e,r,n;s("mounted",{index:t.index,offsetTop:((e=v.value)==null?void 0:e.offsetTop)??0,isActive:t.isActive}),u.value=(((r=w.value)==null?void 0:r.scrollWidth)??0)>(((n=w.value)==null?void 0:n.clientWidth)??0)}),(e,r)=>{const n=A("n8n-tooltip"),y=A("n8n-badge"),H=A("n8n-action-toggle");return I(),L("li",{ref_key:"itemElement",ref:v,"data-test-id":"workflow-history-list-item",class:p({[e.$style.item]:!0,[e.$style.active]:t.isActive,[e.$style.actionsVisible]:c.value})},[Q(e.$slots,"default",{formattedCreatedAt:h.value},()=>[m("p",{onClick:l},[m("time",{datetime:e.item.createdAt},k(h.value),9,Ie),S(n,{placement:"right-end",disabled:$.value.size<2&&!u.value},{content:C(()=>[N(k(t.item.authors),1)]),default:C(()=>[m("span",{ref_key:"authorElement",ref:w},k($.value.label),513)]),_:1},8,["disabled"]),m("data",{value:e.item.versionId},k(O.value),9,Ve)])]),m("div",{class:p(e.$style.tail)},[t.index===0?(I(),P(y,{key:0},{default:C(()=>[N(k(V(f).baseText("workflowHistory.item.latest")),1)]),_:1})):x("",!0),S(H,{theme:"dark",class:p(e.$style.actions),actions:t.actions,placement:"bottom-end",onAction:d,onClick:r[0]||(r[0]=ce(()=>{},["stop"])),onVisibleChange:a},{default:C(()=>[Q(e.$slots,"action-toggle-button")]),_:3},8,["class","actions"])],2)],2)}}}),Ce="_item_1a4du_1",Oe="_tail_1a4du_33",Re="_active_1a4du_38",Ae="_actionsVisible_1a4du_45",Le="_actions_1a4du_45",xe={item:Ce,tail:Oe,active:Re,actionsVisible:Ae,actions:Le},Me={$style:xe},te=K(Se,[["__cssModules",Me]]),Ee=m("br",null,null,-1),Ne=["aria-label"],Pe=B({__name:"WorkflowHistoryList",props:{items:{},activeItem:{},actions:{},requestNumberOfItems:{},lastReceivedItemsLength:{},evaluatedPruneTime:{},shouldUpgrade:{type:Boolean},isListLoading:{type:Boolean}},emits:["action","preview","loadMore","upgrade"],setup(W,{emit:_}){const t=W,s=_,f=D(),c=T(null),v=T(!0),w=T(null),u=a=>a===0?t.actions.filter(l=>l.value!=="restore"):t.actions,h=a=>{w.value=new IntersectionObserver(([l])=>{var e,r;l.isIntersecting&&((e=w.value)==null||e.unobserve(a),(r=w.value)==null||r.disconnect(),w.value=null,s("loadMore",{take:t.requestNumberOfItems,skip:t.items.length}))},{root:c.value,threshold:.01}),w.value.observe(a)},$=({action:a,id:l,data:e})=>{v.value=!1,s("action",{action:a,id:l,data:e})},O=({event:a,id:l})=>{v.value=!1,s("preview",{event:a,id:l})},d=({index:a,offsetTop:l,isActive:e})=>{var r,n;e&&v.value&&(v.value=!1,(r=c.value)==null||r.scrollTo({top:l,behavior:"smooth"})),a===t.items.length-1&&t.lastReceivedItemsLength===t.requestNumberOfItems&&h((n=c.value)==null?void 0:n.children[a])};return(a,l)=>{const e=A("n8n-loading"),r=A("i18n-t");return I(),L("ul",{ref_key:"listElement",ref:c,class:p(a.$style.list),"data-test-id":"workflow-history-list"},[(I(!0),L(ue,null,we(t.items,(n,y)=>{var H;return I(),P(te,{key:n.versionId,index:y,item:n,"is-active":n.versionId===((H=t.activeItem)==null?void 0:H.versionId),actions:u(y),onAction:$,onPreview:O,onMounted:d},null,8,["index","item","is-active","actions"])}),128)),!t.items.length&&!t.isListLoading?(I(),L("li",{key:0,class:p(a.$style.empty)},[N(k(V(f).baseText("workflowHistory.empty"))+" ",1),Ee,N(" "+k(V(f).baseText("workflowHistory.hint")),1)],2)):x("",!0),t.isListLoading?(I(),L("li",{key:1,class:p(a.$style.loader),role:"status","aria-live":"polite","aria-busy":"true","aria-label":V(f).baseText("generic.loading")},[S(e,{rows:3,class:"mb-xs"}),S(e,{rows:3,class:"mb-xs"}),S(e,{rows:3,class:"mb-xs"})],10,Ne)):x("",!0),t.shouldUpgrade?(I(),L("li",{key:2,class:p(a.$style.retention)},[m("span",null,k(V(f).baseText("workflowHistory.limit",{interpolate:{evaluatedPruneTime:String(t.evaluatedPruneTime)}})),1),S(r,{keypath:"workflowHistory.upgrade",tag:"span"},{link:C(()=>[m("a",{href:"#",onClick:l[0]||(l[0]=n=>s("upgrade"))},k(V(f).baseText("workflowHistory.upgrade.link")),1)]),_:1})],2)):x("",!0)],2)}}}),Ue="_list_undzg_1",Fe="_empty_undzg_10",ze="_loader_undzg_23",Be="_retention_undzg_27",De={list:Ue,empty:Fe,loader:ze,retention:Be},Ke={$style:De},qe=K(Pe,[["__cssModules",Ke]]),Ye=["datetime"],je=["value"],Ge=B({__name:"WorkflowHistoryContent",props:{workflow:{},workflowVersion:{},actions:{},isListLoading:{type:Boolean},isFirstItemShown:{type:Boolean}},emits:["action"],setup(W,{emit:_}){const t=D(),s=W,f=_,c=b(()=>{if(!s.workflowVersion||!s.workflow)return;const{pinData:u,...h}=s.workflow;return{...h,nodes:s.workflowVersion.nodes,connections:s.workflowVersion.connections}}),v=b(()=>s.isFirstItemShown?s.actions.filter(u=>u.value!=="restore"):s.actions),w=({action:u,id:h,data:$})=>{f("action",{action:u,id:h,data:$})};return(u,h)=>{const $=A("n8n-icon"),O=A("n8n-button");return I(),L("div",{class:p(u.$style.content)},[s.workflowVersion?(I(),P($e,{key:0,workflow:c.value,loading:s.isListLoading,"loader-type":"spinner"},null,8,["workflow","loading"])):x("",!0),m("ul",{class:p(u.$style.info)},[s.workflowVersion?(I(),P(te,{key:0,class:p(u.$style.card),index:-1,item:s.workflowVersion,"is-active":!1,actions:v.value,onAction:w},{default:C(({formattedCreatedAt:d})=>[m("section",{class:p(u.$style.text)},[m("p",null,[m("span",{class:p(u.$style.label)},k(V(t).baseText("workflowHistory.content.title"))+": ",3),m("time",{datetime:s.workflowVersion.createdAt},k(d),9,Ye)]),m("p",null,[m("span",{class:p(u.$style.label)},k(V(t).baseText("workflowHistory.content.editedBy"))+": ",3),m("span",null,k(s.workflowVersion.authors),1)]),m("p",null,[m("span",{class:p(u.$style.label)},k(V(t).baseText("workflowHistory.content.versionId"))+": ",3),m("data",{value:s.workflowVersion.versionId},k(s.workflowVersion.versionId),9,je)])],2)]),"action-toggle-button":C(()=>[S(O,{type:"tertiary",size:"large","data-test-id":"action-toggle-button"},{default:C(()=>[N(k(V(t).baseText("workflowHistory.content.actions"))+" ",1),S($,{class:"ml-3xs",icon:"chevron-down",size:"small"})]),_:1})]),_:1},8,["class","item","actions"])):x("",!0)],2)],2)}}}),Je="_content_2kwc4_1",Qe="_info_2kwc4_11",Xe="_card_2kwc4_19",Ze="_text_2kwc4_24",et="_label_2kwc4_49",tt={content:Je,info:Qe,card:Xe,text:Ze,label:et},ot={$style:tt},st=K(Ge,[["__cssModules",ot]]),nt=async(W,_,t)=>{const{data:s}=await X(W.baseUrl,`/workflow-history/workflow/${_}`,t);return s},at=async(W,_,t)=>{const{data:s}=await X(W.baseUrl,`/workflow-history/workflow/${_}/version/${t}`);return s},rt=He("workflowHistory",()=>{const W=Z(),_=ke(),t=ee(),s=b(()=>_.settings.workflowHistory.licensePruneTime),f=b(()=>_.settings.workflowHistory.pruneTime),c=b(()=>Math.min(f.value,s.value)),v=b(()=>s.value!==-1&&s.value===f.value),w=async(d,a)=>await nt(W.getRestApiContext,d,a),u=async(d,a)=>await at(W.getRestApiContext,d,a);return{getWorkflowHistory:w,getWorkflowVersion:u,downloadVersion:async(d,a,l)=>{const[e,r]=await Promise.all([t.fetchWorkflow(d),u(d,a)]),{connections:n,nodes:y}=r,H=new Blob([JSON.stringify({...e,nodes:y,connections:n},null,2)],{type:"application/json;charset=utf-8"});Te.saveAs(H,`${e.name}(${l.formattedCreatedAt}).json`)},cloneIntoNewWorkflow:async(d,a,l)=>{const[e,r]=await Promise.all([t.fetchWorkflow(d),u(d,a)]),{connections:n,nodes:y}=r,{name:H}=e,F=await ye(W.getRestApiContext,{name:`${H} (${l.formattedCreatedAt})`}),q={nodes:y,connections:n,name:F.name};return await t.createNewWorkflow(q)},restoreWorkflow:async(d,a,l)=>{const e=await u(d,a),{connections:r,nodes:n}=e,y={connections:r,nodes:n};return l&&(y.active=!1),await t.updateWorkflow(d,y,!0).catch(async H=>{if(H.httpStatusCode===400&&H.message.includes("can not be activated"))return await t.fetchWorkflow(d);throw new Error(H)})},evaluatedPruneTime:c,shouldUpgrade:v}}),it=B({__name:"WorkflowHistory",setup(W){const _=["restore","clone","open","download"],t=_.reduce((o,i)=>({...o,[i.toUpperCase()]:i}),{}),s=de(),f=me(),c=D(),v=_e(),w=rt(),u=he(),h=ee(),$=T(!0),O=T(!0),d=T(20),a=T(0),l=T(null),e=T([]),r=T(null),n=b(()=>j("workflowId")),y=b(()=>j("versionId")),H=b(()=>({name:U.WORKFLOW,params:{name:n.value}})),F=b(()=>_.map(o=>({label:c.baseText(`workflowHistory.item.actions.${o}`),disabled:!1,value:o}))),q=b(()=>{var o;return((o=e.value[0])==null?void 0:o.versionId)===y.value}),oe=b(()=>Math.floor(w.evaluatedPruneTime/24)),M=o=>{ge.track(o,{instance_id:Z().instanceId,workflow_id:n.value})},Y=async o=>{const i=await w.getWorkflowHistory(n.value,o);a.value=i.length,e.value=e.value.concat(i)};fe(async()=>{M("User opened workflow history");try{const[o]=await Promise.all([h.fetchWorkflow(n.value),Y({take:d.value})]);l.value=o,O.value=!1,!y.value&&e.value.length&&await f.replace({name:U.WORKFLOW_HISTORY,params:{workflowId:n.value,versionId:e.value[0].versionId}})}catch(o){$.value=!1,v.showError(o,c.baseText("workflowHistory.title"))}});const j=o=>{const i=s.params[o];return typeof i=="string"?i:(i==null?void 0:i[0])??""},G=o=>{const{href:i}=f.resolve({name:U.WORKFLOW_HISTORY,params:{workflowId:n.value,versionId:o}});window.open(i,"_blank")},se=async(o,i)=>await new Promise((g,R)=>{const E=[{text:c.baseText("workflowHistory.action.restore.modal.button.cancel"),type:"tertiary",action:()=>{g("cancel")}}];o&&E.push({text:c.baseText("workflowHistory.action.restore.modal.button.deactivateAndRestore"),type:"tertiary",action:()=>{g("deactivateAndRestore")}}),E.push({text:c.baseText("workflowHistory.action.restore.modal.button.restore"),type:"primary",action:()=>{g("restore")}});try{u.openModalWithData({name:be,data:{beforeClose:()=>{g("cancel")},isWorkflowActivated:o,formattedCreatedAt:i,buttons:E}})}catch(z){R(z)}}),ne=async(o,i)=>{const g=await w.cloneIntoNewWorkflow(n.value,o,i),{href:R}=f.resolve({name:U.WORKFLOW,params:{name:g.id}});v.showMessage({title:c.baseText("workflowHistory.action.clone.success.title"),message:ve("a",{href:R,target:"_blank"},c.baseText("workflowHistory.action.clone.success.message")),type:"success",duration:1e4})},ae=async(o,i)=>{const g=await h.fetchWorkflow(n.value),R=await se(g.active,i.formattedCreatedAt);if(R==="cancel")return;l.value=await w.restoreWorkflow(n.value,o,R==="deactivateAndRestore");const E=await w.getWorkflowHistory(n.value,{take:1});e.value=E.concat(e.value),v.showMessage({title:c.baseText("workflowHistory.action.restore.success.title"),type:"success"})},J=async({action:o,id:i,data:g})=>{try{switch(o){case t.OPEN:G(i),M("User opened version in new tab");break;case t.DOWNLOAD:await w.downloadVersion(n.value,i,g),M("User downloaded version");break;case t.CLONE:await ne(i,g),M("User cloned version");break;case t.RESTORE:await ae(i,g),M("User restored version");break}}catch(R){v.showError(R,c.baseText("workflowHistory.action.error.title",{interpolate:{action:c.baseText(`workflowHistory.item.actions.${o}`).toLowerCase()}}))}},re=async({event:o,id:i})=>{o.metaKey||o.ctrlKey?(G(i),M("User opened version in new tab")):await f.push({name:U.WORKFLOW_HISTORY,params:{workflowId:n.value,versionId:i}})},ie=()=>{u.goToUpgrade("workflow-history","upgrade-workflow-history")};return pe(async()=>{if(y.value){try{r.value=await w.getWorkflowVersion(n.value,y.value),M("User selected version")}catch(o){v.showError(new Error(`${o.message} "${y.value}"&nbsp;`),c.baseText("workflowHistory.title"))}try{l.value=await h.fetchWorkflow(n.value)}catch(o){$.value=!1,v.showError(o,c.baseText("workflowHistory.title"))}}}),(o,i)=>{const g=A("n8n-heading"),R=A("n8n-button"),E=A("router-link");return I(),L("div",{class:p(o.$style.view)},[S(g,{class:p(o.$style.header),tag:"h2",size:"medium"},{default:C(()=>{var z;return[N(k((z=l.value)==null?void 0:z.name),1)]}),_:1},8,["class"]),m("div",{class:p(o.$style.corner)},[S(g,{tag:"h2",size:"medium",bold:""},{default:C(()=>[N(k(V(c).baseText("workflowHistory.title")),1)]),_:1}),S(E,{to:H.value,"data-test-id":"workflow-history-close-button"},{default:C(()=>[S(R,{type:"tertiary",icon:"times",size:"small",text:"",square:""})]),_:1},8,["to"])],2),m("div",{class:p(o.$style.listComponentWrapper)},[$.value?(I(),P(qe,{key:0,items:e.value,"last-received-items-length":a.value,"active-item":r.value,actions:F.value,"request-number-of-items":d.value,"should-upgrade":V(w).shouldUpgrade,"evaluated-prune-time":oe.value,"is-list-loading":O.value,onAction:J,onPreview:re,onLoadMore:Y,onUpgrade:ie},null,8,["items","last-received-items-length","active-item","actions","request-number-of-items","should-upgrade","evaluated-prune-time","is-list-loading"])):x("",!0)],2),m("div",{class:p(o.$style.contentComponentWrapper)},[$.value?(I(),P(st,{key:0,workflow:l.value,"workflow-version":r.value,actions:F.value,"is-list-loading":O.value,"is-first-item-shown":q.value,onAction:J},null,8,["workflow","workflow-version","actions","is-list-loading","is-first-item-shown"])):x("",!0)],2)],2)}}}),lt="_view_phdlt_1",ct="_header_phdlt_11",ut="_corner_phdlt_19",wt="_contentComponentWrapper_phdlt_30",dt="_listComponentWrapper_phdlt_35",mt={view:lt,header:ct,corner:ut,contentComponentWrapper:wt,listComponentWrapper:dt},ft={$style:mt},qt=K(it,[["__cssModules",ft]]);export{qt as default};
2
+ //# sourceMappingURL=WorkflowHistory-BCAvzdJ2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowHistory-DrJO6HE6.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/n8nRoot.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.getRestApiContext, 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.getRestApiContext, 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.getRestApiContext, {\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/n8nRoot.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-BCAvzdJ2.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/n8nRoot.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.getRestApiContext, 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.getRestApiContext, 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.getRestApiContext, {\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/n8nRoot.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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"}