n8n-editor-ui 1.44.0 → 1.44.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.
- package/.turbo/turbo-build.log +77 -77
- package/dist/assets/{AuthView-1FRMwQ3r.js → AuthView-DfyvaM6i.js} +2 -2
- package/dist/assets/{AuthView-1FRMwQ3r.js.map → AuthView-DfyvaM6i.js.map} +1 -1
- package/dist/assets/{CanvasControls-FCzUEVOQ.js → CanvasControls-DFdnF5qb.js} +2 -2
- package/dist/assets/{CanvasControls-FCzUEVOQ.js.map → CanvasControls-DFdnF5qb.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-DdWHauKg.js → ChangePasswordView-B4v8DwW9.js} +2 -2
- package/dist/assets/{ChangePasswordView-DdWHauKg.js.map → ChangePasswordView-B4v8DwW9.js.map} +1 -1
- package/dist/assets/{CollectionParameter-CiMzJaXg.js → CollectionParameter-5V5xJsjs.js} +2 -2
- package/dist/assets/CollectionParameter-5V5xJsjs.js.map +1 -0
- package/dist/assets/{CredentialsView-Bn6PVi9E.js → CredentialsView-tyjXlz4Z.js} +2 -2
- package/dist/assets/{CredentialsView-Bn6PVi9E.js.map → CredentialsView-tyjXlz4Z.js.map} +1 -1
- package/dist/assets/{ExecutionsFilter-nFboBzV2.js → ExecutionsFilter-0t_omffh.js} +2 -2
- package/dist/assets/{ExecutionsFilter-nFboBzV2.js.map → ExecutionsFilter-0t_omffh.js.map} +1 -1
- package/dist/assets/{ExecutionsView-CbkLSsSW.js → ExecutionsView-DzCvkqXG.js} +2 -2
- package/dist/assets/{ExecutionsView-CbkLSsSW.js.map → ExecutionsView-DzCvkqXG.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-vPMSx22g.js → ForgotMyPasswordView-D_90K80j.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-vPMSx22g.js.map → ForgotMyPasswordView-D_90K80j.js.map} +1 -1
- package/dist/assets/{MainHeader-DedFNVir.js → MainHeader-BYoa1H_e.js} +2 -2
- package/dist/assets/{MainHeader-DedFNVir.js.map → MainHeader-BYoa1H_e.js.map} +1 -1
- package/dist/assets/{MainSidebar-BNq07OnD.js → MainSidebar-BNsdraIv.js} +2 -2
- package/dist/assets/{MainSidebar-BNq07OnD.js.map → MainSidebar-BNsdraIv.js.map} +1 -1
- package/dist/assets/{NodeCreation-C0AAIhNs.js → NodeCreation-R9yLdNU1.js} +3 -3
- package/dist/assets/{NodeCreation-C0AAIhNs.js.map → NodeCreation-R9yLdNU1.js.map} +1 -1
- package/dist/assets/{NodeCreator-ESjCn1LZ.js → NodeCreator-CLzfNOJ5.js} +2 -2
- package/dist/assets/{NodeCreator-ESjCn1LZ.js.map → NodeCreator-CLzfNOJ5.js.map} +1 -1
- package/dist/assets/{NodeList-baCRAzNs.js → NodeList-B4yRfzDq.js} +2 -2
- package/dist/assets/{NodeList-baCRAzNs.js.map → NodeList-B4yRfzDq.js.map} +1 -1
- package/dist/assets/{NodeView-BucVYztm.js → NodeView-BGtpd_Bb.js} +4 -4
- package/dist/assets/{NodeView-BucVYztm.js.map → NodeView-BGtpd_Bb.js.map} +1 -1
- package/dist/assets/{NodeView.v2-Oz2vwdfG.js → NodeView.v2-DnTCsiDE.js} +3 -3
- package/dist/assets/{NodeView.v2-Oz2vwdfG.js.map → NodeView.v2-DnTCsiDE.js.map} +1 -1
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BRGRmswR.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-CYFr8_zj.js} +2 -2
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BRGRmswR.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-CYFr8_zj.js.map} +1 -1
- package/dist/assets/{ProjectSettings-D3FAGvAm.js → ProjectSettings-kayD4yS7.js} +2 -2
- package/dist/assets/{ProjectSettings-D3FAGvAm.js.map → ProjectSettings-kayD4yS7.js.map} +1 -1
- package/dist/assets/{ProjectTabs-B_U7Q16t.js → ProjectTabs-1jmisSQb.js} +2 -2
- package/dist/assets/{ProjectTabs-B_U7Q16t.js.map → ProjectTabs-1jmisSQb.js.map} +1 -1
- package/dist/assets/{PushConnectionTracker-DQVvJ6kh.js → PushConnectionTracker-Dfvjg1ts.js} +2 -2
- package/dist/assets/{PushConnectionTracker-DQVvJ6kh.js.map → PushConnectionTracker-Dfvjg1ts.js.map} +1 -1
- package/dist/assets/{ResourcesListLayout-CfzMCzp5.js → ResourcesListLayout-BOYOLez8.js} +2 -2
- package/dist/assets/{ResourcesListLayout-CfzMCzp5.js.map → ResourcesListLayout-BOYOLez8.js.map} +1 -1
- package/dist/assets/{RunDataAi-CwnKkFZ1.js → RunDataAi-CFKU0i2R.js} +2 -2
- package/dist/assets/{RunDataAi-CwnKkFZ1.js.map → RunDataAi-CFKU0i2R.js.map} +1 -1
- package/dist/assets/{RunDataJson-DTMT_R5P.js → RunDataJson-DHI409Ix.js} +3 -3
- package/dist/assets/{RunDataJson-DTMT_R5P.js.map → RunDataJson-DHI409Ix.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-dNlM_YO3.js → RunDataJsonActions-LAsoJBBD.js} +2 -2
- package/dist/assets/{RunDataJsonActions-dNlM_YO3.js.map → RunDataJsonActions-LAsoJBBD.js.map} +1 -1
- package/dist/assets/{RunDataSchema-D7rSFQ4v.js → RunDataSchema-CgYDgOLN.js} +2 -2
- package/dist/assets/{RunDataSchema-D7rSFQ4v.js.map → RunDataSchema-CgYDgOLN.js.map} +1 -1
- package/dist/assets/{RunDataSearch-BLxgvPWc.js → RunDataSearch-ZJd98FoH.js} +2 -2
- package/dist/assets/{RunDataSearch-BLxgvPWc.js.map → RunDataSearch-ZJd98FoH.js.map} +1 -1
- package/dist/assets/{RunDataTable-CTYOMGVf.js → RunDataTable-IMqti3UV.js} +2 -2
- package/dist/assets/{RunDataTable-CTYOMGVf.js.map → RunDataTable-IMqti3UV.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-B0SKUJ7w.js → SamlOnboarding-6S1cZAZQ.js} +2 -2
- package/dist/assets/{SamlOnboarding-B0SKUJ7w.js.map → SamlOnboarding-6S1cZAZQ.js.map} +1 -1
- package/dist/assets/{SettingsApiView-04CpGWS3.js → SettingsApiView-DzACRdqO.js} +2 -2
- package/dist/assets/{SettingsApiView-04CpGWS3.js.map → SettingsApiView-DzACRdqO.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-CNryAAn3.js → SettingsCommunityNodesView-DI8tm65K.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-CNryAAn3.js.map → SettingsCommunityNodesView-DI8tm65K.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-B39P4p2-.js → SettingsExternalSecrets-DFb1WNlI.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-B39P4p2-.js.map → SettingsExternalSecrets-DFb1WNlI.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-BOQAY92v.js → SettingsFakeDoorView-CDAZibIu.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-BOQAY92v.js.map → SettingsFakeDoorView-CDAZibIu.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-VTF-EB0a.js → SettingsLdapView-yXjpScE1.js} +2 -2
- package/dist/assets/{SettingsLdapView-VTF-EB0a.js.map → SettingsLdapView-yXjpScE1.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-JsodKkoJ.js → SettingsLogStreamingView-DQTUJczt.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-JsodKkoJ.js.map → SettingsLogStreamingView-DQTUJczt.js.map} +1 -1
- package/dist/assets/{SettingsPersonalView-DxQ-hHrk.js → SettingsPersonalView-CYfSdpu7.js} +2 -2
- package/dist/assets/{SettingsPersonalView-DxQ-hHrk.js.map → SettingsPersonalView-CYfSdpu7.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-aqaWVYCl.js → SettingsSourceControl-SrxQOR5H.js} +2 -2
- package/dist/assets/{SettingsSourceControl-aqaWVYCl.js.map → SettingsSourceControl-SrxQOR5H.js.map} +1 -1
- package/dist/assets/{SettingsSso-Chwn0xrx.js → SettingsSso-DrB162SI.js} +2 -2
- package/dist/assets/{SettingsSso-Chwn0xrx.js.map → SettingsSso-DrB162SI.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-CIj5SQKn.js → SettingsUsageAndPlan-vOGNFMVq.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-CIj5SQKn.js.map → SettingsUsageAndPlan-vOGNFMVq.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-CY4kSRaG.js → SettingsUsersView-Tx1-g18F.js} +2 -2
- package/dist/assets/{SettingsUsersView-CY4kSRaG.js.map → SettingsUsersView-Tx1-g18F.js.map} +1 -1
- package/dist/assets/{SettingsView-jgK3_oOB.js → SettingsView-BOZ2SBsQ.js} +2 -2
- package/dist/assets/{SettingsView-jgK3_oOB.js.map → SettingsView-BOZ2SBsQ.js.map} +1 -1
- package/dist/assets/{SetupView-O6xv77jO.js → SetupView-DY7tVzgF.js} +2 -2
- package/dist/assets/{SetupView-O6xv77jO.js.map → SetupView-DY7tVzgF.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-oGzzXD7H.js → SetupWorkflowCredentialsButton-B9Acgowu.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-oGzzXD7H.js.map → SetupWorkflowCredentialsButton-B9Acgowu.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-BDUp9JWx.js → SetupWorkflowFromTemplateView-C2E8A8g4.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-BDUp9JWx.js.map → SetupWorkflowFromTemplateView-C2E8A8g4.js.map} +1 -1
- package/dist/assets/{SigninView-BLgTm7p4.js → SigninView-DlT1Bv9l.js} +2 -2
- package/dist/assets/{SigninView-BLgTm7p4.js.map → SigninView-DlT1Bv9l.js.map} +1 -1
- package/dist/assets/{SignoutView-DFSKFmE2.js → SignoutView-DisgJoQS.js} +2 -2
- package/dist/assets/{SignoutView-DFSKFmE2.js.map → SignoutView-DisgJoQS.js.map} +1 -1
- package/dist/assets/{SignupView-DSmDdbRA.js → SignupView-CQZSGNCi.js} +2 -2
- package/dist/assets/{SignupView-DSmDdbRA.js.map → SignupView-CQZSGNCi.js.map} +1 -1
- package/dist/assets/{TemplateDetails-DW6dTHAk.js → TemplateDetails-DZzMxROe.js} +2 -2
- package/dist/assets/{TemplateDetails-DW6dTHAk.js.map → TemplateDetails-DZzMxROe.js.map} +1 -1
- package/dist/assets/{TemplateList-DHLgDv5f.js → TemplateList-DS0lnbxA.js} +2 -2
- package/dist/assets/{TemplateList-DHLgDv5f.js.map → TemplateList-DS0lnbxA.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-Bix3khnw.js → TemplatesCollectionView-BMck3jn9.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-Bix3khnw.js.map → TemplatesCollectionView-BMck3jn9.js.map} +1 -1
- package/dist/assets/{TemplatesInfoCarousel-B3u16wII.js → TemplatesInfoCarousel-BYIB7MKZ.js} +2 -2
- package/dist/assets/{TemplatesInfoCarousel-B3u16wII.js.map → TemplatesInfoCarousel-BYIB7MKZ.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-CvtrqPXg.js → TemplatesSearchView-aVpZ2G9F.js} +2 -2
- package/dist/assets/{TemplatesSearchView-CvtrqPXg.js.map → TemplatesSearchView-aVpZ2G9F.js.map} +1 -1
- package/dist/assets/{TemplatesView-DuT3R1EI.js → TemplatesView-CuyRlzAM.js} +2 -2
- package/dist/assets/{TemplatesView-DuT3R1EI.js.map → TemplatesView-CuyRlzAM.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-C_-zPrQW.js → TemplatesWorkflowView-DAa2SCYE.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-C_-zPrQW.js.map → TemplatesWorkflowView-DAa2SCYE.js.map} +1 -1
- package/dist/assets/{VariablesView-CMrDg4Fx.js → VariablesView-57BdyEmO.js} +2 -2
- package/dist/assets/{VariablesView-CMrDg4Fx.js.map → VariablesView-57BdyEmO.js.map} +1 -1
- package/dist/assets/{WorkerView-BcfdfxOO.js → WorkerView-BLv_CYeM.js} +2 -2
- package/dist/assets/{WorkerView-BcfdfxOO.js.map → WorkerView-BLv_CYeM.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-BiqeeeBc.js → WorkflowActivator-WjfZFpnK.js} +2 -2
- package/dist/assets/{WorkflowActivator-BiqeeeBc.js.map → WorkflowActivator-WjfZFpnK.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsInfoAccordion-CITQoihQ.js → WorkflowExecutionsInfoAccordion-Dv9rbNek.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-CITQoihQ.js.map → WorkflowExecutionsInfoAccordion-Dv9rbNek.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-CnHdLYgR.js → WorkflowExecutionsLandingPage-CsbJPayv.js} +2 -2
- package/dist/assets/{WorkflowExecutionsLandingPage-CnHdLYgR.js.map → WorkflowExecutionsLandingPage-CsbJPayv.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsPreview-By0_k6NX.js → WorkflowExecutionsPreview-xxP83pWI.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-By0_k6NX.js.map → WorkflowExecutionsPreview-xxP83pWI.js.map} +1 -1
- package/dist/assets/WorkflowExecutionsView-c7NCTwks.js +2 -0
- package/dist/assets/WorkflowExecutionsView-c7NCTwks.js.map +1 -0
- package/dist/assets/{WorkflowHistory-C5ALmvoB.js → WorkflowHistory-DI6sDGlZ.js} +2 -2
- package/dist/assets/{WorkflowHistory-C5ALmvoB.js.map → WorkflowHistory-DI6sDGlZ.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-hQxsQlm1.js → WorkflowOnboardingView-DVqrTjM4.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-hQxsQlm1.js.map → WorkflowOnboardingView-DVqrTjM4.js.map} +1 -1
- package/dist/assets/{WorkflowsView-TF6zcpi6.js → WorkflowsView-DpB66gWH.js} +2 -2
- package/dist/assets/{WorkflowsView-TF6zcpi6.js.map → WorkflowsView-DpB66gWH.js.map} +1 -1
- package/dist/assets/{cloud-CZc2nauc.js → cloud-bM1gshor.js} +2 -2
- package/dist/assets/{cloud-CZc2nauc.js.map → cloud-bM1gshor.js.map} +1 -1
- package/dist/assets/{collaboration.store-BkSXOsR4.js → collaboration.store-Ct7EpGqG.js} +2 -2
- package/dist/assets/{collaboration.store-BkSXOsR4.js.map → collaboration.store-Ct7EpGqG.js.map} +1 -1
- package/dist/assets/{index-CY2ZfL2U.js → index-BQ6Z7VRj.js} +4 -4
- package/dist/assets/{index-CY2ZfL2U.js.map → index-BQ6Z7VRj.js.map} +1 -1
- package/dist/assets/{nodeCreator.store-CmYeJsEL.js → nodeCreator.store-DAcGJEHy.js} +2 -2
- package/dist/assets/{nodeCreator.store-CmYeJsEL.js.map → nodeCreator.store-DAcGJEHy.js.map} +1 -1
- package/dist/assets/{templateActions-DvpFnju7.js → templateActions-F64sfZ3n.js} +2 -2
- package/dist/assets/{templateActions-DvpFnju7.js.map → templateActions-F64sfZ3n.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-6-sjTvWS.js → useExecutionDebugging-DuMp5DdQ.js} +2 -2
- package/dist/assets/{useExecutionDebugging-6-sjTvWS.js.map → useExecutionDebugging-DuMp5DdQ.js.map} +1 -1
- package/dist/assets/{useExecutionHelpers-BZpwMJs_.js → useExecutionHelpers-Dt-UJW97.js} +2 -2
- package/dist/assets/{useExecutionHelpers-BZpwMJs_.js.map → useExecutionHelpers-Dt-UJW97.js.map} +1 -1
- package/dist/assets/{usePushConnection-DI_JaC-X.js → usePushConnection-Kek6sJ0j.js} +2 -2
- package/dist/assets/{usePushConnection-DI_JaC-X.js.map → usePushConnection-Kek6sJ0j.js.map} +1 -1
- package/dist/assets/{useViewStacks-D-hnVv3F.js → useViewStacks-CSn_e3gA.js} +2 -2
- package/dist/assets/{useViewStacks-D-hnVv3F.js.map → useViewStacks-CSn_e3gA.js.map} +1 -1
- package/dist/assets/{useWorkflowActivate-lrYalAwm.js → useWorkflowActivate-Bl43vPgP.js} +2 -2
- package/dist/assets/{useWorkflowActivate-lrYalAwm.js.map → useWorkflowActivate-Bl43vPgP.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-CiMzJaXg.js.map +0 -1
- package/dist/assets/WorkflowExecutionsView-fiAM1R-f.js +0 -2
- package/dist/assets/WorkflowExecutionsView-fiAM1R-f.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowHistory-C5ALmvoB.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 editorRoute = computed(() => ({\n\tname: VIEWS.WORKFLOW,\n\tparams: {\n\t\tname: route.params.workflowId,\n\t},\n}));\nconst activeWorkflow = ref<IWorkflowDb | null>(null);\nconst workflowHistory = ref<WorkflowHistory[]>([]);\nconst activeWorkflowVersion = ref<WorkflowVersion | null>(null);\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(\n\t() => workflowHistory.value[0]?.versionId === route.params.versionId,\n);\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: route.params.workflowId,\n\t});\n};\n\nconst loadMore = async (queryParams: WorkflowHistoryRequestParams) => {\n\tconst history = await workflowHistoryStore.getWorkflowHistory(\n\t\troute.params.workflowId,\n\t\tqueryParams,\n\t);\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(route.params.workflowId),\n\t\t\tloadMore({ take: requestNumberOfItems.value }),\n\t\t]);\n\t\tactiveWorkflow.value = workflow;\n\t\tisListLoading.value = false;\n\n\t\tif (!route.params.versionId && 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: route.params.workflowId,\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 openInNewTab = (id: WorkflowVersionId) => {\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: route.params.workflowId,\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\troute.params.workflowId,\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(route.params.workflowId);\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\troute.params.workflowId,\n\t\tid,\n\t\tmodalAction === WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore,\n\t);\n\tconst history = await workflowHistoryStore.getWorkflowHistory(route.params.workflowId, {\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(route.params.workflowId, 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: route.params.workflowId,\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 (!route.params.versionId) {\n\t\treturn;\n\t}\n\ttry {\n\t\tactiveWorkflowVersion.value = await workflowHistoryStore.getWorkflowVersion(\n\t\t\troute.params.workflowId,\n\t\t\troute.params.versionId,\n\t\t);\n\t\tsendTelemetry('User selected version');\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\tnew Error(`${error.message} \"${route.params.versionId}\" `),\n\t\t\ti18n.baseText('workflowHistory.title'),\n\t\t);\n\t}\n\n\ttry {\n\t\tactiveWorkflow.value = await workflowsStore.fetchWorkflow(route.params.workflowId);\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","editorRoute","VIEWS","activeWorkflow","workflowHistory","activeWorkflowVersion","value","isFirstItemShown","sendTelemetry","telemetry","loadMore","history","onBeforeMount","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-DI6sDGlZ.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 editorRoute = computed(() => ({\n\tname: VIEWS.WORKFLOW,\n\tparams: {\n\t\tname: route.params.workflowId,\n\t},\n}));\nconst activeWorkflow = ref<IWorkflowDb | null>(null);\nconst workflowHistory = ref<WorkflowHistory[]>([]);\nconst activeWorkflowVersion = ref<WorkflowVersion | null>(null);\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(\n\t() => workflowHistory.value[0]?.versionId === route.params.versionId,\n);\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: route.params.workflowId,\n\t});\n};\n\nconst loadMore = async (queryParams: WorkflowHistoryRequestParams) => {\n\tconst history = await workflowHistoryStore.getWorkflowHistory(\n\t\troute.params.workflowId,\n\t\tqueryParams,\n\t);\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(route.params.workflowId),\n\t\t\tloadMore({ take: requestNumberOfItems.value }),\n\t\t]);\n\t\tactiveWorkflow.value = workflow;\n\t\tisListLoading.value = false;\n\n\t\tif (!route.params.versionId && 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: route.params.workflowId,\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 openInNewTab = (id: WorkflowVersionId) => {\n\tconst { href } = router.resolve({\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: route.params.workflowId,\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\troute.params.workflowId,\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(route.params.workflowId);\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\troute.params.workflowId,\n\t\tid,\n\t\tmodalAction === WorkflowHistoryVersionRestoreModalActions.deactivateAndRestore,\n\t);\n\tconst history = await workflowHistoryStore.getWorkflowHistory(route.params.workflowId, {\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(route.params.workflowId, 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: route.params.workflowId,\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 (!route.params.versionId) {\n\t\treturn;\n\t}\n\ttry {\n\t\tactiveWorkflowVersion.value = await workflowHistoryStore.getWorkflowVersion(\n\t\t\troute.params.workflowId,\n\t\t\troute.params.versionId,\n\t\t);\n\t\tsendTelemetry('User selected version');\n\t} catch (error) {\n\t\ttoast.showError(\n\t\t\tnew Error(`${error.message} \"${route.params.versionId}\" `),\n\t\t\ti18n.baseText('workflowHistory.title'),\n\t\t);\n\t}\n\n\ttry {\n\t\tactiveWorkflow.value = await workflowsStore.fetchWorkflow(route.params.workflowId);\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","editorRoute","VIEWS","activeWorkflow","workflowHistory","activeWorkflowVersion","value","isFirstItemShown","sendTelemetry","telemetry","loadMore","history","onBeforeMount","openInNewTab","href","openRestorationModal","isWorkflowActivated","resolve","reject","buttons","WORKFLOW_HISTORY_VERSION_RESTORE","cloneWorkflowVersion","clonedWorkflow","h","restoreWorkflowVersion","modalAction","onUpgrade","watchEffect"],"mappings":"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"}
|
package/dist/assets/{WorkflowOnboardingView-hQxsQlm1.js → WorkflowOnboardingView-DVqrTjM4.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{X as l,$ as d,j as f,V as a,w as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=WorkflowOnboardingView-
|
|
1
|
+
import{X as l,$ as d,j as f,V as a,w as u}from"./index-BQ6Z7VRj.js";import{G as g,aH as W,az as k,b as _,l as b,m as L}from"./vendor-CUQSof8H.js";import"./pinia-Dh4cxKZ0.js";import"./n8n-DT_bOwuZ.js";import"./axios-Mm4CS0gO.js";import"./esprima-next-nhoSXAeq.js";import"./luxon-CLwAIbs0.js";import"./lodash-es-BFdF4Er8.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BiGWdRh4.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-C0ZgbPvs.js";import"./vue-i18n-CG6eDDlD.js";import"./uuid-SoommWqA.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"./fast-json-stable-stringify-wY6jAr7b.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-DOxvr88t.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const Y=g({__name:"WorkflowOnboardingView",setup(O){const r=l(),n=d(),i=f(),e=W(),s=k(),p=u(),m=async o=>{try{r.startLoading();const t=await n.getFixedWorkflowTemplate(o);if(!t)throw new Error;const c=p.baseText("onboarding.title",{interpolate:{name:t.name}}),w=await i.createNewWorkflow({name:c,connections:t.workflow.connections,nodes:t.workflow.nodes,pinData:t.workflow.pinData,settings:t.workflow.settings,meta:{onboardingId:o}});await e.replace({name:a.WORKFLOW,params:{name:w.id},query:{onboardingId:o}}),r.stopLoading()}catch{throw await e.replace({name:a.NEW_WORKFLOW}),r.stopLoading(),new Error(`Could not load onboarding template ${o}`)}};return _(async()=>{const o=s.params.id;if(!o||typeof o!="string"){await e.replace({name:a.NEW_WORKFLOW});return}await m(o)}),(o,t)=>(b(),L("div"))}});export{Y as default};
|
|
2
|
+
//# sourceMappingURL=WorkflowOnboardingView-DVqrTjM4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowOnboardingView-
|
|
1
|
+
{"version":3,"file":"WorkflowOnboardingView-DVqrTjM4.js","sources":["../../src/views/WorkflowOnboardingView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useLoadingService } from '@/composables/useLoadingService';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS } from '@/constants';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { onMounted } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nconst loadingService = useLoadingService();\nconst templateStore = useTemplatesStore();\nconst workfowStore = useWorkflowsStore();\nconst router = useRouter();\nconst route = useRoute();\nconst i18n = useI18n();\n\nconst openWorkflowTemplate = async (templateId: string) => {\n\ttry {\n\t\tloadingService.startLoading();\n\t\tconst template = await templateStore.getFixedWorkflowTemplate(templateId);\n\t\tif (!template) {\n\t\t\tthrow new Error();\n\t\t}\n\n\t\tconst name: string = i18n.baseText('onboarding.title', {\n\t\t\tinterpolate: { name: template.name },\n\t\t});\n\n\t\tconst workflow = await workfowStore.createNewWorkflow({\n\t\t\tname,\n\t\t\tconnections: template.workflow.connections,\n\t\t\tnodes: template.workflow.nodes,\n\t\t\tpinData: template.workflow.pinData,\n\t\t\tsettings: template.workflow.settings,\n\t\t\tmeta: {\n\t\t\t\tonboardingId: templateId,\n\t\t\t},\n\t\t});\n\n\t\tawait router.replace({\n\t\t\tname: VIEWS.WORKFLOW,\n\t\t\tparams: { name: workflow.id },\n\t\t\tquery: { onboardingId: templateId },\n\t\t});\n\n\t\tloadingService.stopLoading();\n\t} catch (e) {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\tloadingService.stopLoading();\n\n\t\tthrow new Error(`Could not load onboarding template ${templateId}`); // sentry reporing\n\t}\n};\n\nonMounted(async () => {\n\tconst templateId = route.params.id;\n\tif (!templateId || typeof templateId !== 'string') {\n\t\tawait router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\treturn;\n\t}\n\n\tawait openWorkflowTemplate(templateId);\n});\n</script>\n\n<template>\n\t<div></div>\n</template>\n\n<style lang=\"scss\" module></style>\n"],"names":["loadingService","useLoadingService","templateStore","useTemplatesStore","workfowStore","useWorkflowsStore","router","useRouter","route","useRoute","i18n","useI18n","openWorkflowTemplate","templateId","template","name","workflow","VIEWS","onMounted"],"mappings":"woCASA,MAAMA,EAAiBC,IACjBC,EAAgBC,IAChBC,EAAeC,IACfC,EAASC,IACTC,EAAQC,IACRC,EAAOC,IAEPC,EAAuB,MAAOC,GAAuB,CACtD,GAAA,CACHb,EAAe,aAAa,EAC5B,MAAMc,EAAW,MAAMZ,EAAc,yBAAyBW,CAAU,EACxE,GAAI,CAACC,EACJ,MAAM,IAAI,MAGL,MAAAC,EAAeL,EAAK,SAAS,mBAAoB,CACtD,YAAa,CAAE,KAAMI,EAAS,IAAK,CAAA,CACnC,EAEKE,EAAW,MAAMZ,EAAa,kBAAkB,CACrD,KAAAW,EACA,YAAaD,EAAS,SAAS,YAC/B,MAAOA,EAAS,SAAS,MACzB,QAASA,EAAS,SAAS,QAC3B,SAAUA,EAAS,SAAS,SAC5B,KAAM,CACL,aAAcD,CACf,CAAA,CACA,EAED,MAAMP,EAAO,QAAQ,CACpB,KAAMW,EAAM,SACZ,OAAQ,CAAE,KAAMD,EAAS,EAAG,EAC5B,MAAO,CAAE,aAAcH,CAAW,CAAA,CAClC,EAEDb,EAAe,YAAY,OAChB,CACX,YAAMM,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjDjB,EAAe,YAAY,EAErB,IAAI,MAAM,sCAAsCa,CAAU,EAAE,CACnE,CAAA,EAGD,OAAAK,EAAU,SAAY,CACf,MAAAL,EAAaL,EAAM,OAAO,GAChC,GAAI,CAACK,GAAc,OAAOA,GAAe,SAAU,CAClD,MAAMP,EAAO,QAAQ,CAAE,KAAMW,EAAM,aAAc,EACjD,MACD,CAEA,MAAML,EAAqBC,CAAU,CAAA,CACrC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{R as Z}from"./ResourcesListLayout-CfzMCzp5.js";import{cS as ee,u as te,G as se,o as H,j as K,a as V,i as U,b as q,q as oe,V as L,D as ae,x as re,z as ne,e0 as le,F as ie,v as ce,c as de,n as ue,E as pe}from"./index-CY2ZfL2U.js";import{d as me}from"./dateformat-C0ZgbPvs.js";import{W as fe}from"./WorkflowActivator-BiqeeeBc.js";import{m as Y}from"./pinia-Dh4cxKZ0.js";import{_ as he}from"./ProjectCardBadge.vue_vue_type_script_setup_true_lang-BRGRmswR.js";import{G as D,ag as s,l as c,M as v,O as a,U as o,I as p,S as b,T as m,p as g,a2 as ge,P as F,V as R,m as y,R as W,e as j,aH as we,F as z,a7 as M,u as ke}from"./vendor-CUQSof8H.js";import{_ as I}from"./n8n-DT_bOwuZ.js";import{T as ye}from"./TemplatesInfoCarousel-B3u16wII.js";import{P as be}from"./ProjectTabs-B_U7Q16t.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BiGWdRh4.js";import"./lodash-es-BFdF4Er8.js";import"./@n8n/permissions-BxxteU-C.js";import"./vue-i18n-CG6eDDlD.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-wY6jAr7b.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-DOxvr88t.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";import"./useWorkflowActivate-lrYalAwm.js";import"./NodeList-baCRAzNs.js";import"./vue-agile-BMPe4UtP.js";const C={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},Te=D({components:{TimeAgo:ee,WorkflowActivator:fe,ProjectCardBadge:he},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWithProjects:[],homeProject:{},versionId:""})},readOnly:{type:Boolean,default:!1}},setup(){return{...te(),...se()}},computed:{...Y(q,U,V,K,H),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return oe(this.data)},actions(){const e=[{label:this.$locale.baseText("workflows.item.open"),value:C.OPEN},{label:this.$locale.baseText("workflows.item.share"),value:C.SHARE}];return this.readOnly||e.push({label:this.$locale.baseText("workflows.item.duplicate"),value:C.DUPLICATE}),this.workflowPermissions.delete&&!this.readOnly&&e.push({label:this.$locale.baseText("workflows.item.delete"),value:C.DELETE}),e},formattedCreatedAtDate(){const e=new Date().getFullYear();return me(this.data.createdAt,`d mmmm${this.data.createdAt.startsWith(e)?"":", yyyy"}`)}},methods:{async onClick(e){if(e!=null&&e.ctrlKey||e!=null&&e.metaKey){const t=this.$router.resolve({name:L.WORKFLOW,params:{name:this.data.id}});window.open(t.href,"_blank");return}await this.$router.push({name:L.WORKFLOW,params:{name:this.data.id}})},onClickTag(e,t){t.stopPropagation(),this.$emit("click:tag",e,t)},onExpandTags(){this.$emit("expand:tags")},async onAction(e){if(e===C.OPEN)await this.onClick();else if(e===C.DUPLICATE)this.uiStore.openModalWithData({name:ae,data:{id:this.data.id,name:this.data.name,tags:(this.data.tags||[]).map(t=>t.id)}});else if(e===C.SHARE)this.uiStore.openModalWithData({name:re,data:{id:this.data.id}}),this.$telemetry.track("User opened sharing modal",{workflow_id:this.data.id,user_id_sharer:this.currentUser.id,sub_view:"Workflows listing"});else if(e===C.DELETE){if(await this.confirm(this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.message",{interpolate:{workflowName:this.data.name}}),this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.headline"),{type:"warning",confirmButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.confirmButtonText"),cancelButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.cancelButtonText")})!==ne)return;try{await this.workflowsStore.deleteWorkflow(this.data.id)}catch(l){this.showError(l,this.$locale.baseText("generic.deleteWorkflowError"));return}this.showMessage({title:this.$locale.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}}}),_e="_cardLink_1ahnz_1",Se="_cardHeading_1ahnz_11",$e="_cardDescription_1ahnz_20",Ce="_cardActions_1ahnz_27",ve={cardLink:_e,cardHeading:Se,cardDescription:$e,cardActions:Ce},Ee={key:0};function Ae(e,t,l,r,d,f){const i=s("n8n-heading"),u=s("TimeAgo"),T=s("n8n-tags"),E=s("n8n-text"),n=s("ProjectCardBadge"),_=s("WorkflowActivator"),w=s("n8n-action-toggle"),S=s("n8n-card");return c(),v(S,{class:p(e.$style.cardLink),onClick:e.onClick},{header:a(()=>[o(i,{tag:"h2",bold:"",class:p(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:a(()=>[b(m(e.data.name),1)]),_:1},8,["class"])]),append:a(()=>[g("div",{class:p(e.$style.cardActions),onClick:t[0]||(t[0]=ge(()=>{},["stop"]))},[o(n,{resource:e.data,"personal-project":e.projectsStore.personalProject},null,8,["resource","personal-project"]),o(_,{class:"mr-s","workflow-active":e.data.active,"workflow-id":e.data.id,"data-test-id":"workflow-card-activator"},null,8,["workflow-active","workflow-id"]),o(w,{actions:e.actions,theme:"dark","data-test-id":"workflow-card-actions",onAction:e.onAction},null,8,["actions","onAction"])],2)]),default:a(()=>[g("div",{class:p(e.$style.cardDescription)},[o(E,{color:"text-light",size:"small"},{default:a(()=>[F(g("span",null,[b(m(e.$locale.baseText("workflows.item.updated"))+" ",1),o(u,{date:e.data.updatedAt},null,8,["date"]),b(" | ")],512),[[R,e.data]]),F(g("span",{class:"mr-2xs"},m(e.$locale.baseText("workflows.item.created"))+" "+m(e.formattedCreatedAtDate),513),[[R,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?F((c(),y("span",Ee,[o(T,{tags:e.data.tags,"truncate-at":3,truncate:"","data-test-id":"workflow-card-tags","onClick:tag":e.onClickTag,onExpand:e.onExpandTags},null,8,["tags","onClick:tag","onExpand"])],512)),[[R,e.data]]):W("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const We={$style:ve},Oe=I(Te,[["render",Ae],["__cssModules",We]]),Pe=D({__name:"SuggestedTemplatesSection",props:{section:{type:Object,required:!0},title:{type:String,required:!1},showTitle:{type:Boolean,default:!0}},setup(e){const t=U(),l=ie(),r=e,d=j(()=>{const i=Array();return t.suggestedTemplates&&r.section.workflows.forEach((u,T)=>{i.push({id:T,name:u.title,workflows:[{id:T}],nodes:u.nodes})}),i});function f({id:i}){t.openModalWithData({name:le,data:{workflow:r.section.workflows[i]}}),l.track("User clicked template recommendation",{templateName:r.section.workflows[i].title},{withPostHog:!0})}return(i,u)=>{const T=s("n8n-text");return c(),y("div",{class:p(i.$style.container),"data-test-id":"suggested-templates-section-container"},[e.showTitle?(c(),y("div",{key:0,class:p(i.$style.header)},[o(T,{size:"large",color:"text-base",bold:!0},{default:a(()=>[b(m(r.title??e.section.title),1)]),_:1})],2)):W("",!0),g("div",{class:p(i.$style.content)},[o(ye,{collections:d.value,loading:!1,"show-item-count":!1,"show-navigation":!1,"cards-width":"24%",onOpenCollection:f},null,8,["collections"])],2)],2)}}}),je="_container_13wqg_1",Le={container:je},Ue={$style:Le},x=I(Pe,[["__cssModules",Ue]]),De=D({__name:"SuggestedTemplatesPage",setup(e,{expose:t}){const l=V(),r=U(),d=we(),f=j(()=>l.currentUser),i=n=>{var _,w,S;if(n!=null&&n.firstName)return((w=(_=n.firstName)==null?void 0:_.charAt(0))==null?void 0:w.toUpperCase())+((S=n==null?void 0:n.firstName)==null?void 0:S.slice(1))},u=j(()=>r.suggestedTemplates?r.suggestedTemplates.sections[0]:null),T=j(()=>{const n=Array();return!r.suggestedTemplates||!u.value||u.value.workflows.forEach((_,w)=>{n.push({id:w,name:_.title,workflows:[{id:w}],nodes:_.nodes})}),n});function E(){r.nodeViewInitialized=!1,d.push({name:L.NEW_WORKFLOW})}return t({currentUser:f,openCanvas:E,suggestedTemplates:T}),(n,_)=>{var P;const w=s("n8n-heading"),S=s("n8n-text"),O=s("n8n-button");return c(),y("div",{class:p(n.$style.container),"data-test-id":"suggested-templates-page-container"},[g("div",{class:p(n.$style.header)},[o(w,{tag:"h1",size:"2xlarge",class:"mb-2xs"},{default:a(()=>[b(m(n.$locale.baseText("suggestedTemplates.heading",{interpolate:{name:i(f.value)||n.$locale.baseText("generic.welcome")}})),1)]),_:1}),o(S,{size:"large",color:"text-base","data-test-id":"suggested-template-section-description"},{default:a(()=>{var $;return[b(m(($=u.value)==null?void 0:$.description),1)]}),_:1})],2),g("div",{class:p(n.$style.content)},[(c(!0),y(z,null,M((P=ke(r).suggestedTemplates)==null?void 0:P.sections,$=>(c(),v(x,{key:$.title,section:$,"show-title":!1},null,8,["section"]))),128))],2),g("div",null,[o(O,{label:n.$locale.baseText("suggestedTemplates.newWorkflowButton"),type:"secondary",size:"medium",icon:"plus","data-test-id":"suggested-templates-new-workflow-button",onClick:E},null,8,["label"])])],2)}}}),Ie="_container_1on4d_1",Fe="_header_1on4d_7",Re={container:Ie,header:Fe},ze={$style:Re},Me=I(De,[["__cssModules",ze]]),A={ACTIVE:!0,DEACTIVATED:!1,ALL:""},Ve=D({name:"WorkflowsView",components:{ResourcesListLayout:Z,WorkflowCard:Oe,TagsDropdown:ce,SuggestedTemplatesPage:Me,SuggestedTemplatesSection:x,ProjectTabs:be},data(){return{filters:{search:"",homeProject:"",status:A.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...Y(q,U,V,K,ue,de,H),readOnlyEnv(){return this.sourceControlStore.preferences.branchReadOnly},currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(pe.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:A.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:A.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:A.DEACTIVATED}]},suggestedTemplates(){return this.uiStore.suggestedTemplates},userRole(){var t,l,r;return((t=this.usersStore.currentUserCloudInfo)==null?void 0:t.role)??((r=(l=this.usersStore.currentUser)==null?void 0:l.personalizationAnswers)==null?void 0:r.role)},isSalesUser(){return this.userRole?["Sales","sales-and-marketing"].includes(this.userRole):!1},showProjectTabs(){return!!this.$route.params.projectId||!!this.allWorkflows.length||this.projectsStore.myProjects.length>1},addWorkflowButtonText(){return this.projectsStore.currentProject?this.$locale.baseText("workflows.project.add"):this.$locale.baseText("workflows.add")}},watch:{"filters.tags"(){this.sendFiltersTelemetry("tags")},"$route.params.projectId"(){this.initialize()}},async mounted(){await this.setFiltersFromQueryString(),this.usersStore.showPersonalizationSurvey(),this.sourceControlStoreUnsubscribe=this.sourceControlStore.$onAction(({name:e,after:t})=>{e==="pullWorkfolder"&&t&&t(()=>{this.initialize()})})},beforeUnmount(){this.sourceControlStoreUnsubscribe()},methods:{onFiltersUpdated(e){this.filters=e,this.saveFiltersOnQueryString()},addWorkflow(){var e,t;this.uiStore.nodeViewInitialized=!1,this.$router.push({name:L.NEW_WORKFLOW,query:{projectId:(t=(e=this.$route)==null?void 0:e.params)==null?void 0:t.projectId}}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},getTemplateRepositoryURL(){return this.templatesStore.websiteTemplateRepositoryURL},trackCategoryLinkClick(e){var t;this.$telemetry.track(`User clicked Browse ${e} Templates`,{role:(t=this.usersStore.currentUserCloudInfo)==null?void 0:t.role,active_workflow_count:this.workflowsStore.activeWorkflows.length})},async initialize(){var e,t;await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows((t=(e=this.$route)==null?void 0:e.params)==null?void 0:t.projectId),this.workflowsStore.fetchActiveWorkflows()])},onClickTag(e,t){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,t,l){return this.settingsStore.areTagsEnabled&&t.tags.length>0&&(l=l&&t.tags.every(r=>{var d;return(d=e.tags)==null?void 0:d.find(f=>typeof f=="object"?`${f.id}`==`${r}`:`${f}`==`${r}`)})),t.status!==""&&(l=l&&e.active===t.status),l},sendFiltersTelemetry(e){this.$refs.layout.sendFiltersTelemetry(e)},saveFiltersOnQueryString(){const e={};this.filters.search&&(e.search=this.filters.search),typeof this.filters.status!="string"&&(e.status=this.filters.status.toString()),this.filters.tags.length&&(e.tags=this.filters.tags.join(",")),this.filters.homeProject&&(e.homeProject=this.filters.homeProject),this.$router.replace({query:Object.keys(e).length?e:void 0})},isValidProjectId(e){return this.projectsStore.projects.some(t=>t.id===e)},async setFiltersFromQueryString(){const{tags:e,status:t,search:l,homeProject:r}=this.$route.query,d={};if(r&&typeof r=="string"&&(await this.projectsStore.getAllProjects(),this.isValidProjectId(r)&&(d.homeProject=r)),l&&typeof l=="string"&&(d.search=l),e&&typeof e=="string"){const f=this.tagsStore.allTags.map(u=>u.id),i=e.split(",").filter(u=>f.includes(u));i.length&&(d.tags=i)}t&&typeof t=="string"&&[A.ACTIVE.toString(),A.DEACTIVATED.toString()].includes(t)&&(d.status=t==="true"),Object.keys(d).length&&(this.filters={...this.filters,...d})}}}),Ne=Ve,Be="_actionsContainer_1gv00_1",He="_emptyStateCard_1gv00_6",Ke="_emptyStateCardIcon_1gv00_19",qe={actionsContainer:Be,emptyStateCard:He,emptyStateCardIcon:Ke},Ye={target:"_blank",href:"https://docs.n8n.io/source-control-environments/"},xe={key:1},Ge={class:"text-center mt-s"},Qe=["href"],Je={key:0,class:"mb-s"},Xe={class:"mb-s"};function Ze(e,t,l,r,d,f){const i=s("ProjectTabs"),u=s("n8n-button"),T=s("i18n-t"),E=s("n8n-tooltip"),n=s("WorkflowCard"),_=s("SuggestedTemplatesSection"),w=s("SuggestedTemplatesPage"),S=s("n8n-heading"),O=s("n8n-text"),P=s("n8n-icon"),$=s("n8n-card"),N=s("n8n-input-label"),G=s("TagsDropdown"),Q=s("n8n-option"),J=s("n8n-select"),X=s("ResourcesListLayout");return c(),v(X,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":e.onFiltersUpdated},{header:a(()=>[e.showProjectTabs?(c(),v(i,{key:0})):W("",!0)]),"add-button":a(({disabled:k})=>[o(E,{disabled:!e.readOnlyEnv},{content:a(()=>[o(T,{tag:"span",keypath:"mainSidebar.workflows.readOnlyEnv.tooltip"},{link:a(()=>[g("a",Ye,m(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip.link")),1)]),_:1})]),default:a(()=>[g("div",null,[o(u,{size:"large",block:"",disabled:k,"data-test-id":"resources-list-add",onClick:e.addWorkflow},{default:a(()=>[b(m(e.addWorkflowButtonText),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:a(({data:k,updateItemSize:h})=>[o(n,{"data-test-id":"resources-list-item",class:"mb-2xs",data:k,"read-only":e.readOnlyEnv,"onExpand:tags":B=>h(k),"onClick:tag":e.onClickTag},null,8,["data","read-only","onExpand:tags","onClick:tag"])]),postListContent:a(()=>{var k;return[(c(!0),y(z,null,M((k=e.suggestedTemplates)==null?void 0:k.sections,(h,B)=>(c(),v(_,{key:B,section:h,title:e.$locale.baseText("suggestedTemplates.sectionTitle",{interpolate:{sectionName:h.name.toLocaleLowerCase()}})},null,8,["section","title"]))),128))]}),empty:a(()=>[e.suggestedTemplates?(c(),v(w,{key:0})):(c(),y("div",xe,[g("div",Ge,[o(S,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:a(()=>[b(m(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),o(O,{size:"large",color:"text-base"},{default:a(()=>[b(m(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?W("",!0):(c(),y("div",{key:0,class:p(["text-center","mt-2xl",e.$style.actionsContainer])},[e.isSalesUser?(c(),y("a",{key:0,href:e.getTemplateRepositoryURL(),class:p(e.$style.emptyStateCard),target:"_blank"},[o($,{hoverable:"","data-test-id":"browse-sales-templates-card",onClick:t[0]||(t[0]=k=>e.trackCategoryLinkClick("Sales"))},{default:a(()=>[o(P,{class:p(e.$style.emptyStateCardIcon),icon:"box-open"},null,8,["class"]),o(O,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[b(m(e.$locale.baseText("workflows.empty.browseTemplates")),1)]),_:1})]),_:1})],10,Qe)):W("",!0),o($,{class:p(e.$style.emptyStateCard),hoverable:"","data-test-id":"new-workflow-card",onClick:e.addWorkflow},{default:a(()=>[o(P,{class:p(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),o(O,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[b(m(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]))]),filters:a(({setKeyValue:k})=>[e.settingsStore.areTagsEnabled?(c(),y("div",Je,[o(N,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(G,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),"model-value":e.filters.tags,"create-enabled":!1,"onUpdate:modelValue":h=>k("tags",h)},null,8,["placeholder","model-value","onUpdate:modelValue"])])):W("",!0),g("div",Xe,[o(N,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(J,{"data-test-id":"status-dropdown","model-value":e.filters.status,"onUpdate:modelValue":h=>k("status",h)},{default:a(()=>[(c(!0),y(z,null,M(e.statusFilterOptions,h=>(c(),v(Q,{key:h.label,label:h.label,value:h.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","shareable","initialize","disabled","onClick:add","onUpdate:filters"])}const et={$style:qe},Rt=I(Ne,[["render",Ze],["__cssModules",et]]);export{Rt as default};
|
|
2
|
-
//# sourceMappingURL=WorkflowsView-
|
|
1
|
+
import{R as Z}from"./ResourcesListLayout-BOYOLez8.js";import{cS as ee,u as te,G as se,o as H,j as K,a as V,i as U,b as q,q as oe,V as L,D as ae,x as re,z as ne,e0 as le,F as ie,v as ce,c as de,n as ue,E as pe}from"./index-BQ6Z7VRj.js";import{d as me}from"./dateformat-C0ZgbPvs.js";import{W as fe}from"./WorkflowActivator-WjfZFpnK.js";import{m as Y}from"./pinia-Dh4cxKZ0.js";import{_ as he}from"./ProjectCardBadge.vue_vue_type_script_setup_true_lang-CYFr8_zj.js";import{G as D,ag as s,l as c,M as v,O as a,U as o,I as p,S as b,T as m,p as g,a2 as ge,P as F,V as R,m as y,R as W,e as j,aH as we,F as z,a7 as M,u as ke}from"./vendor-CUQSof8H.js";import{_ as I}from"./n8n-DT_bOwuZ.js";import{T as ye}from"./TemplatesInfoCarousel-BYIB7MKZ.js";import{P as be}from"./ProjectTabs-1jmisSQb.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BiGWdRh4.js";import"./lodash-es-BFdF4Er8.js";import"./@n8n/permissions-BxxteU-C.js";import"./vue-i18n-CG6eDDlD.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-wY6jAr7b.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-DOxvr88t.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";import"./useWorkflowActivate-Bl43vPgP.js";import"./NodeList-B4yRfzDq.js";import"./vue-agile-BMPe4UtP.js";const C={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},Te=D({components:{TimeAgo:ee,WorkflowActivator:fe,ProjectCardBadge:he},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWithProjects:[],homeProject:{},versionId:""})},readOnly:{type:Boolean,default:!1}},setup(){return{...te(),...se()}},computed:{...Y(q,U,V,K,H),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return oe(this.data)},actions(){const e=[{label:this.$locale.baseText("workflows.item.open"),value:C.OPEN},{label:this.$locale.baseText("workflows.item.share"),value:C.SHARE}];return this.readOnly||e.push({label:this.$locale.baseText("workflows.item.duplicate"),value:C.DUPLICATE}),this.workflowPermissions.delete&&!this.readOnly&&e.push({label:this.$locale.baseText("workflows.item.delete"),value:C.DELETE}),e},formattedCreatedAtDate(){const e=new Date().getFullYear();return me(this.data.createdAt,`d mmmm${this.data.createdAt.startsWith(e)?"":", yyyy"}`)}},methods:{async onClick(e){if(e!=null&&e.ctrlKey||e!=null&&e.metaKey){const t=this.$router.resolve({name:L.WORKFLOW,params:{name:this.data.id}});window.open(t.href,"_blank");return}await this.$router.push({name:L.WORKFLOW,params:{name:this.data.id}})},onClickTag(e,t){t.stopPropagation(),this.$emit("click:tag",e,t)},onExpandTags(){this.$emit("expand:tags")},async onAction(e){if(e===C.OPEN)await this.onClick();else if(e===C.DUPLICATE)this.uiStore.openModalWithData({name:ae,data:{id:this.data.id,name:this.data.name,tags:(this.data.tags||[]).map(t=>t.id)}});else if(e===C.SHARE)this.uiStore.openModalWithData({name:re,data:{id:this.data.id}}),this.$telemetry.track("User opened sharing modal",{workflow_id:this.data.id,user_id_sharer:this.currentUser.id,sub_view:"Workflows listing"});else if(e===C.DELETE){if(await this.confirm(this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.message",{interpolate:{workflowName:this.data.name}}),this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.headline"),{type:"warning",confirmButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.confirmButtonText"),cancelButtonText:this.$locale.baseText("mainSidebar.confirmMessage.workflowDelete.cancelButtonText")})!==ne)return;try{await this.workflowsStore.deleteWorkflow(this.data.id)}catch(l){this.showError(l,this.$locale.baseText("generic.deleteWorkflowError"));return}this.showMessage({title:this.$locale.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}}}),_e="_cardLink_1ahnz_1",Se="_cardHeading_1ahnz_11",$e="_cardDescription_1ahnz_20",Ce="_cardActions_1ahnz_27",ve={cardLink:_e,cardHeading:Se,cardDescription:$e,cardActions:Ce},Ee={key:0};function Ae(e,t,l,r,d,f){const i=s("n8n-heading"),u=s("TimeAgo"),T=s("n8n-tags"),E=s("n8n-text"),n=s("ProjectCardBadge"),_=s("WorkflowActivator"),w=s("n8n-action-toggle"),S=s("n8n-card");return c(),v(S,{class:p(e.$style.cardLink),onClick:e.onClick},{header:a(()=>[o(i,{tag:"h2",bold:"",class:p(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:a(()=>[b(m(e.data.name),1)]),_:1},8,["class"])]),append:a(()=>[g("div",{class:p(e.$style.cardActions),onClick:t[0]||(t[0]=ge(()=>{},["stop"]))},[o(n,{resource:e.data,"personal-project":e.projectsStore.personalProject},null,8,["resource","personal-project"]),o(_,{class:"mr-s","workflow-active":e.data.active,"workflow-id":e.data.id,"data-test-id":"workflow-card-activator"},null,8,["workflow-active","workflow-id"]),o(w,{actions:e.actions,theme:"dark","data-test-id":"workflow-card-actions",onAction:e.onAction},null,8,["actions","onAction"])],2)]),default:a(()=>[g("div",{class:p(e.$style.cardDescription)},[o(E,{color:"text-light",size:"small"},{default:a(()=>[F(g("span",null,[b(m(e.$locale.baseText("workflows.item.updated"))+" ",1),o(u,{date:e.data.updatedAt},null,8,["date"]),b(" | ")],512),[[R,e.data]]),F(g("span",{class:"mr-2xs"},m(e.$locale.baseText("workflows.item.created"))+" "+m(e.formattedCreatedAtDate),513),[[R,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?F((c(),y("span",Ee,[o(T,{tags:e.data.tags,"truncate-at":3,truncate:"","data-test-id":"workflow-card-tags","onClick:tag":e.onClickTag,onExpand:e.onExpandTags},null,8,["tags","onClick:tag","onExpand"])],512)),[[R,e.data]]):W("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const We={$style:ve},Oe=I(Te,[["render",Ae],["__cssModules",We]]),Pe=D({__name:"SuggestedTemplatesSection",props:{section:{type:Object,required:!0},title:{type:String,required:!1},showTitle:{type:Boolean,default:!0}},setup(e){const t=U(),l=ie(),r=e,d=j(()=>{const i=Array();return t.suggestedTemplates&&r.section.workflows.forEach((u,T)=>{i.push({id:T,name:u.title,workflows:[{id:T}],nodes:u.nodes})}),i});function f({id:i}){t.openModalWithData({name:le,data:{workflow:r.section.workflows[i]}}),l.track("User clicked template recommendation",{templateName:r.section.workflows[i].title},{withPostHog:!0})}return(i,u)=>{const T=s("n8n-text");return c(),y("div",{class:p(i.$style.container),"data-test-id":"suggested-templates-section-container"},[e.showTitle?(c(),y("div",{key:0,class:p(i.$style.header)},[o(T,{size:"large",color:"text-base",bold:!0},{default:a(()=>[b(m(r.title??e.section.title),1)]),_:1})],2)):W("",!0),g("div",{class:p(i.$style.content)},[o(ye,{collections:d.value,loading:!1,"show-item-count":!1,"show-navigation":!1,"cards-width":"24%",onOpenCollection:f},null,8,["collections"])],2)],2)}}}),je="_container_13wqg_1",Le={container:je},Ue={$style:Le},x=I(Pe,[["__cssModules",Ue]]),De=D({__name:"SuggestedTemplatesPage",setup(e,{expose:t}){const l=V(),r=U(),d=we(),f=j(()=>l.currentUser),i=n=>{var _,w,S;if(n!=null&&n.firstName)return((w=(_=n.firstName)==null?void 0:_.charAt(0))==null?void 0:w.toUpperCase())+((S=n==null?void 0:n.firstName)==null?void 0:S.slice(1))},u=j(()=>r.suggestedTemplates?r.suggestedTemplates.sections[0]:null),T=j(()=>{const n=Array();return!r.suggestedTemplates||!u.value||u.value.workflows.forEach((_,w)=>{n.push({id:w,name:_.title,workflows:[{id:w}],nodes:_.nodes})}),n});function E(){r.nodeViewInitialized=!1,d.push({name:L.NEW_WORKFLOW})}return t({currentUser:f,openCanvas:E,suggestedTemplates:T}),(n,_)=>{var P;const w=s("n8n-heading"),S=s("n8n-text"),O=s("n8n-button");return c(),y("div",{class:p(n.$style.container),"data-test-id":"suggested-templates-page-container"},[g("div",{class:p(n.$style.header)},[o(w,{tag:"h1",size:"2xlarge",class:"mb-2xs"},{default:a(()=>[b(m(n.$locale.baseText("suggestedTemplates.heading",{interpolate:{name:i(f.value)||n.$locale.baseText("generic.welcome")}})),1)]),_:1}),o(S,{size:"large",color:"text-base","data-test-id":"suggested-template-section-description"},{default:a(()=>{var $;return[b(m(($=u.value)==null?void 0:$.description),1)]}),_:1})],2),g("div",{class:p(n.$style.content)},[(c(!0),y(z,null,M((P=ke(r).suggestedTemplates)==null?void 0:P.sections,$=>(c(),v(x,{key:$.title,section:$,"show-title":!1},null,8,["section"]))),128))],2),g("div",null,[o(O,{label:n.$locale.baseText("suggestedTemplates.newWorkflowButton"),type:"secondary",size:"medium",icon:"plus","data-test-id":"suggested-templates-new-workflow-button",onClick:E},null,8,["label"])])],2)}}}),Ie="_container_1on4d_1",Fe="_header_1on4d_7",Re={container:Ie,header:Fe},ze={$style:Re},Me=I(De,[["__cssModules",ze]]),A={ACTIVE:!0,DEACTIVATED:!1,ALL:""},Ve=D({name:"WorkflowsView",components:{ResourcesListLayout:Z,WorkflowCard:Oe,TagsDropdown:ce,SuggestedTemplatesPage:Me,SuggestedTemplatesSection:x,ProjectTabs:be},data(){return{filters:{search:"",homeProject:"",status:A.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...Y(q,U,V,K,ue,de,H),readOnlyEnv(){return this.sourceControlStore.preferences.branchReadOnly},currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(pe.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:A.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:A.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:A.DEACTIVATED}]},suggestedTemplates(){return this.uiStore.suggestedTemplates},userRole(){var t,l,r;return((t=this.usersStore.currentUserCloudInfo)==null?void 0:t.role)??((r=(l=this.usersStore.currentUser)==null?void 0:l.personalizationAnswers)==null?void 0:r.role)},isSalesUser(){return this.userRole?["Sales","sales-and-marketing"].includes(this.userRole):!1},showProjectTabs(){return!!this.$route.params.projectId||!!this.allWorkflows.length||this.projectsStore.myProjects.length>1},addWorkflowButtonText(){return this.projectsStore.currentProject?this.$locale.baseText("workflows.project.add"):this.$locale.baseText("workflows.add")}},watch:{"filters.tags"(){this.sendFiltersTelemetry("tags")},"$route.params.projectId"(){this.initialize()}},async mounted(){await this.setFiltersFromQueryString(),this.usersStore.showPersonalizationSurvey(),this.sourceControlStoreUnsubscribe=this.sourceControlStore.$onAction(({name:e,after:t})=>{e==="pullWorkfolder"&&t&&t(()=>{this.initialize()})})},beforeUnmount(){this.sourceControlStoreUnsubscribe()},methods:{onFiltersUpdated(e){this.filters=e,this.saveFiltersOnQueryString()},addWorkflow(){var e,t;this.uiStore.nodeViewInitialized=!1,this.$router.push({name:L.NEW_WORKFLOW,query:{projectId:(t=(e=this.$route)==null?void 0:e.params)==null?void 0:t.projectId}}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},getTemplateRepositoryURL(){return this.templatesStore.websiteTemplateRepositoryURL},trackCategoryLinkClick(e){var t;this.$telemetry.track(`User clicked Browse ${e} Templates`,{role:(t=this.usersStore.currentUserCloudInfo)==null?void 0:t.role,active_workflow_count:this.workflowsStore.activeWorkflows.length})},async initialize(){var e,t;await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows((t=(e=this.$route)==null?void 0:e.params)==null?void 0:t.projectId),this.workflowsStore.fetchActiveWorkflows()])},onClickTag(e,t){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,t,l){return this.settingsStore.areTagsEnabled&&t.tags.length>0&&(l=l&&t.tags.every(r=>{var d;return(d=e.tags)==null?void 0:d.find(f=>typeof f=="object"?`${f.id}`==`${r}`:`${f}`==`${r}`)})),t.status!==""&&(l=l&&e.active===t.status),l},sendFiltersTelemetry(e){this.$refs.layout.sendFiltersTelemetry(e)},saveFiltersOnQueryString(){const e={};this.filters.search&&(e.search=this.filters.search),typeof this.filters.status!="string"&&(e.status=this.filters.status.toString()),this.filters.tags.length&&(e.tags=this.filters.tags.join(",")),this.filters.homeProject&&(e.homeProject=this.filters.homeProject),this.$router.replace({query:Object.keys(e).length?e:void 0})},isValidProjectId(e){return this.projectsStore.projects.some(t=>t.id===e)},async setFiltersFromQueryString(){const{tags:e,status:t,search:l,homeProject:r}=this.$route.query,d={};if(r&&typeof r=="string"&&(await this.projectsStore.getAllProjects(),this.isValidProjectId(r)&&(d.homeProject=r)),l&&typeof l=="string"&&(d.search=l),e&&typeof e=="string"){const f=this.tagsStore.allTags.map(u=>u.id),i=e.split(",").filter(u=>f.includes(u));i.length&&(d.tags=i)}t&&typeof t=="string"&&[A.ACTIVE.toString(),A.DEACTIVATED.toString()].includes(t)&&(d.status=t==="true"),Object.keys(d).length&&(this.filters={...this.filters,...d})}}}),Ne=Ve,Be="_actionsContainer_1gv00_1",He="_emptyStateCard_1gv00_6",Ke="_emptyStateCardIcon_1gv00_19",qe={actionsContainer:Be,emptyStateCard:He,emptyStateCardIcon:Ke},Ye={target:"_blank",href:"https://docs.n8n.io/source-control-environments/"},xe={key:1},Ge={class:"text-center mt-s"},Qe=["href"],Je={key:0,class:"mb-s"},Xe={class:"mb-s"};function Ze(e,t,l,r,d,f){const i=s("ProjectTabs"),u=s("n8n-button"),T=s("i18n-t"),E=s("n8n-tooltip"),n=s("WorkflowCard"),_=s("SuggestedTemplatesSection"),w=s("SuggestedTemplatesPage"),S=s("n8n-heading"),O=s("n8n-text"),P=s("n8n-icon"),$=s("n8n-card"),N=s("n8n-input-label"),G=s("TagsDropdown"),Q=s("n8n-option"),J=s("n8n-select"),X=s("ResourcesListLayout");return c(),v(X,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":e.onFiltersUpdated},{header:a(()=>[e.showProjectTabs?(c(),v(i,{key:0})):W("",!0)]),"add-button":a(({disabled:k})=>[o(E,{disabled:!e.readOnlyEnv},{content:a(()=>[o(T,{tag:"span",keypath:"mainSidebar.workflows.readOnlyEnv.tooltip"},{link:a(()=>[g("a",Ye,m(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip.link")),1)]),_:1})]),default:a(()=>[g("div",null,[o(u,{size:"large",block:"",disabled:k,"data-test-id":"resources-list-add",onClick:e.addWorkflow},{default:a(()=>[b(m(e.addWorkflowButtonText),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:a(({data:k,updateItemSize:h})=>[o(n,{"data-test-id":"resources-list-item",class:"mb-2xs",data:k,"read-only":e.readOnlyEnv,"onExpand:tags":B=>h(k),"onClick:tag":e.onClickTag},null,8,["data","read-only","onExpand:tags","onClick:tag"])]),postListContent:a(()=>{var k;return[(c(!0),y(z,null,M((k=e.suggestedTemplates)==null?void 0:k.sections,(h,B)=>(c(),v(_,{key:B,section:h,title:e.$locale.baseText("suggestedTemplates.sectionTitle",{interpolate:{sectionName:h.name.toLocaleLowerCase()}})},null,8,["section","title"]))),128))]}),empty:a(()=>[e.suggestedTemplates?(c(),v(w,{key:0})):(c(),y("div",xe,[g("div",Ge,[o(S,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:a(()=>[b(m(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),o(O,{size:"large",color:"text-base"},{default:a(()=>[b(m(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?W("",!0):(c(),y("div",{key:0,class:p(["text-center","mt-2xl",e.$style.actionsContainer])},[e.isSalesUser?(c(),y("a",{key:0,href:e.getTemplateRepositoryURL(),class:p(e.$style.emptyStateCard),target:"_blank"},[o($,{hoverable:"","data-test-id":"browse-sales-templates-card",onClick:t[0]||(t[0]=k=>e.trackCategoryLinkClick("Sales"))},{default:a(()=>[o(P,{class:p(e.$style.emptyStateCardIcon),icon:"box-open"},null,8,["class"]),o(O,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[b(m(e.$locale.baseText("workflows.empty.browseTemplates")),1)]),_:1})]),_:1})],10,Qe)):W("",!0),o($,{class:p(e.$style.emptyStateCard),hoverable:"","data-test-id":"new-workflow-card",onClick:e.addWorkflow},{default:a(()=>[o(P,{class:p(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),o(O,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[b(m(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]))]),filters:a(({setKeyValue:k})=>[e.settingsStore.areTagsEnabled?(c(),y("div",Je,[o(N,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(G,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),"model-value":e.filters.tags,"create-enabled":!1,"onUpdate:modelValue":h=>k("tags",h)},null,8,["placeholder","model-value","onUpdate:modelValue"])])):W("",!0),g("div",Xe,[o(N,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(J,{"data-test-id":"status-dropdown","model-value":e.filters.status,"onUpdate:modelValue":h=>k("status",h)},{default:a(()=>[(c(!0),y(z,null,M(e.statusFilterOptions,h=>(c(),v(Q,{key:h.label,label:h.label,value:h.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","shareable","initialize","disabled","onClick:add","onUpdate:filters"])}const et={$style:qe},Rt=I(Ne,[["render",Ze],["__cssModules",et]]);export{Rt as default};
|
|
2
|
+
//# sourceMappingURL=WorkflowsView-DpB66gWH.js.map
|