n8n-editor-ui 1.34.1 → 1.34.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +63 -63
- package/dist/assets/{AuthView-94aQ7z4H.js → AuthView-TLL7d7nz.js} +2 -2
- package/dist/assets/{AuthView-94aQ7z4H.js.map → AuthView-TLL7d7nz.js.map} +1 -1
- package/dist/assets/{CanvasControls-A5WBrohY.js → CanvasControls-QMz-txwk.js} +2 -2
- package/dist/assets/{CanvasControls-A5WBrohY.js.map → CanvasControls-QMz-txwk.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-wsEhj8cy.js → ChangePasswordView-BpG2Rx4d.js} +2 -2
- package/dist/assets/{ChangePasswordView-wsEhj8cy.js.map → ChangePasswordView-BpG2Rx4d.js.map} +1 -1
- package/dist/assets/{CollectionParameter-XvPjL77I.js → CollectionParameter-jdGzYeqj.js} +2 -2
- package/dist/assets/CollectionParameter-jdGzYeqj.js.map +1 -0
- package/dist/assets/{CredentialsView-0XJMAGhU.js → CredentialsView-kiuFxEVH.js} +2 -2
- package/dist/assets/{CredentialsView-0XJMAGhU.js.map → CredentialsView-kiuFxEVH.js.map} +1 -1
- package/dist/assets/{ExecutionFilter-bhanFEvf.js → ExecutionFilter-V1l-9ps5.js} +2 -2
- package/dist/assets/{ExecutionFilter-bhanFEvf.js.map → ExecutionFilter-V1l-9ps5.js.map} +1 -1
- package/dist/assets/{ExecutionPreview-OlIAVmt8.js → ExecutionPreview-MPwJjWY4.js} +2 -2
- package/dist/assets/{ExecutionPreview-OlIAVmt8.js.map → ExecutionPreview-MPwJjWY4.js.map} +1 -1
- package/dist/assets/{ExecutionsInfoAccordion-8y0XuFEi.js → ExecutionsInfoAccordion-H3fj26pu.js} +2 -2
- package/dist/assets/{ExecutionsInfoAccordion-8y0XuFEi.js.map → ExecutionsInfoAccordion-H3fj26pu.js.map} +1 -1
- package/dist/assets/{ExecutionsLandingPage-S5UN8vIw.js → ExecutionsLandingPage-7qAKHfBe.js} +2 -2
- package/dist/assets/{ExecutionsLandingPage-S5UN8vIw.js.map → ExecutionsLandingPage-7qAKHfBe.js.map} +1 -1
- package/dist/assets/{ExecutionsList-BU7_tq5x.js → ExecutionsList-Y9rsGvqE.js} +2 -2
- package/dist/assets/{ExecutionsList-BU7_tq5x.js.map → ExecutionsList-Y9rsGvqE.js.map} +1 -1
- package/dist/assets/{ExecutionsView-aBSDNhOw.js → ExecutionsView-hi5NLYKp.js} +2 -2
- package/dist/assets/{ExecutionsView-aBSDNhOw.js.map → ExecutionsView-hi5NLYKp.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-y5xFculD.js → ForgotMyPasswordView-ho6gQT6y.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-y5xFculD.js.map → ForgotMyPasswordView-ho6gQT6y.js.map} +1 -1
- package/dist/assets/{MainHeader-dPdeQhkH.js → MainHeader-JVxjOJwJ.js} +2 -2
- package/dist/assets/{MainHeader-dPdeQhkH.js.map → MainHeader-JVxjOJwJ.js.map} +1 -1
- package/dist/assets/{MainSidebar-5wv4Ntz3.js → MainSidebar-h-btynOF.js} +2 -2
- package/dist/assets/{MainSidebar-5wv4Ntz3.js.map → MainSidebar-h-btynOF.js.map} +1 -1
- package/dist/assets/{NodeCreation-vCHQm0aM.js → NodeCreation--SFXDuf-.js} +3 -3
- package/dist/assets/{NodeCreation-vCHQm0aM.js.map → NodeCreation--SFXDuf-.js.map} +1 -1
- package/dist/assets/{NodeCreator-Qi3ajhnf.js → NodeCreator-ns8j677p.js} +2 -2
- package/dist/assets/{NodeCreator-Qi3ajhnf.js.map → NodeCreator-ns8j677p.js.map} +1 -1
- package/dist/assets/{NodeList-bi4nWtpD.js → NodeList-f2AyrOck.js} +2 -2
- package/dist/assets/{NodeList-bi4nWtpD.js.map → NodeList-f2AyrOck.js.map} +1 -1
- package/dist/assets/{NodeView-oDPyzajr.js → NodeView-7yZJ9OMj.js} +4 -4
- package/dist/assets/NodeView-7yZJ9OMj.js.map +1 -0
- package/dist/assets/NodeView-pdKhF5kg.css +1 -0
- package/dist/assets/{RunDataAi-DJiuZFJ2.js → RunDataAi-PNu5uqz6.js} +2 -2
- package/dist/assets/{RunDataAi-DJiuZFJ2.js.map → RunDataAi-PNu5uqz6.js.map} +1 -1
- package/dist/assets/{RunDataJson-9PUFQ2iv.js → RunDataJson-s5yVk7VC.js} +3 -3
- package/dist/assets/{RunDataJson-9PUFQ2iv.js.map → RunDataJson-s5yVk7VC.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-4HpuK2F9.js → RunDataJsonActions-VSs2XNyt.js} +2 -2
- package/dist/assets/{RunDataJsonActions-4HpuK2F9.js.map → RunDataJsonActions-VSs2XNyt.js.map} +1 -1
- package/dist/assets/{RunDataSchema-ezXA1IRJ.js → RunDataSchema-WeaaXm2i.js} +2 -2
- package/dist/assets/{RunDataSchema-ezXA1IRJ.js.map → RunDataSchema-WeaaXm2i.js.map} +1 -1
- package/dist/assets/{RunDataTable-fjkHn30C.js → RunDataTable-2YR4xl8i.js} +2 -2
- package/dist/assets/{RunDataTable-fjkHn30C.js.map → RunDataTable-2YR4xl8i.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-yIx-rRda.js → SamlOnboarding-0ds_5hgl.js} +2 -2
- package/dist/assets/{SamlOnboarding-yIx-rRda.js.map → SamlOnboarding-0ds_5hgl.js.map} +1 -1
- package/dist/assets/{SettingsApiView-EZ0nAdDr.js → SettingsApiView-ZNTmBDeh.js} +2 -2
- package/dist/assets/{SettingsApiView-EZ0nAdDr.js.map → SettingsApiView-ZNTmBDeh.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-GY7HDfXP.js → SettingsCommunityNodesView-YGybEb0Q.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-GY7HDfXP.js.map → SettingsCommunityNodesView-YGybEb0Q.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-XjmxCmxV.js → SettingsExternalSecrets-V6XKdflH.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-XjmxCmxV.js.map → SettingsExternalSecrets-V6XKdflH.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-pVOCkUpk.js → SettingsFakeDoorView-RT3jHFTZ.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-pVOCkUpk.js.map → SettingsFakeDoorView-RT3jHFTZ.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-447rSrxc.js → SettingsLdapView-lVhJpXDn.js} +2 -2
- package/dist/assets/{SettingsLdapView-447rSrxc.js.map → SettingsLdapView-lVhJpXDn.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-bUhYaLuP.js → SettingsLogStreamingView-hWjeVuyC.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-bUhYaLuP.js.map → SettingsLogStreamingView-hWjeVuyC.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-QbgpyFeh.js → SettingsSourceControl-XOku0dYa.js} +2 -2
- package/dist/assets/{SettingsSourceControl-QbgpyFeh.js.map → SettingsSourceControl-XOku0dYa.js.map} +1 -1
- package/dist/assets/{SettingsSso-1YVWObhc.js → SettingsSso-FfUWpkMk.js} +2 -2
- package/dist/assets/{SettingsSso-1YVWObhc.js.map → SettingsSso-FfUWpkMk.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-RXRRDXy4.js → SettingsUsageAndPlan-bhK5h4Fc.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-RXRRDXy4.js.map → SettingsUsageAndPlan-bhK5h4Fc.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-eHaVB_6L.js → SettingsUsersView-wSBhrK4z.js} +2 -2
- package/dist/assets/{SettingsUsersView-eHaVB_6L.js.map → SettingsUsersView-wSBhrK4z.js.map} +1 -1
- package/dist/assets/{SettingsView-JVUkQw0d.js → SettingsView-k7YCmGxR.js} +2 -2
- package/dist/assets/{SettingsView-JVUkQw0d.js.map → SettingsView-k7YCmGxR.js.map} +1 -1
- package/dist/assets/{SetupView-fQzty7Gp.js → SetupView-q1H9bzQn.js} +2 -2
- package/dist/assets/{SetupView-fQzty7Gp.js.map → SetupView-q1H9bzQn.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-OiOkf-hI.js → SetupWorkflowCredentialsButton-MXDnpOlJ.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-OiOkf-hI.js.map → SetupWorkflowCredentialsButton-MXDnpOlJ.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-ckehDOej.js → SetupWorkflowFromTemplateView-0HgnF8Wk.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-ckehDOej.js.map → SetupWorkflowFromTemplateView-0HgnF8Wk.js.map} +1 -1
- package/dist/assets/{SigninView-6kvI5K04.js → SigninView-ZtC3HJKC.js} +2 -2
- package/dist/assets/{SigninView-6kvI5K04.js.map → SigninView-ZtC3HJKC.js.map} +1 -1
- package/dist/assets/{SignupView-USh4Ng3q.js → SignupView-9jLlb4-m.js} +2 -2
- package/dist/assets/{SignupView-USh4Ng3q.js.map → SignupView-9jLlb4-m.js.map} +1 -1
- package/dist/assets/{TemplateDetails-tXvyDDVg.js → TemplateDetails-w7x_Vgw_.js} +2 -2
- package/dist/assets/{TemplateDetails-tXvyDDVg.js.map → TemplateDetails-w7x_Vgw_.js.map} +1 -1
- package/dist/assets/{TemplateList-rsNRt0qZ.js → TemplateList-0nuqWVBy.js} +2 -2
- package/dist/assets/{TemplateList-rsNRt0qZ.js.map → TemplateList-0nuqWVBy.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-lXJ9U359.js → TemplatesCollectionView-Z9UtKR-g.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-lXJ9U359.js.map → TemplatesCollectionView-Z9UtKR-g.js.map} +1 -1
- package/dist/assets/{TemplatesInfoCarousel-P2HZ4dOz.js → TemplatesInfoCarousel-N3l1eTTG.js} +2 -2
- package/dist/assets/{TemplatesInfoCarousel-P2HZ4dOz.js.map → TemplatesInfoCarousel-N3l1eTTG.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-FN7reyfg.js → TemplatesSearchView-wkSt7PFf.js} +2 -2
- package/dist/assets/{TemplatesSearchView-FN7reyfg.js.map → TemplatesSearchView-wkSt7PFf.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-iRU7xCpM.js → TemplatesWorkflowView-epjsTDT4.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-iRU7xCpM.js.map → TemplatesWorkflowView-epjsTDT4.js.map} +1 -1
- package/dist/assets/{VariablesView-pWnSAbjy.js → VariablesView-mj7tvP3Z.js} +2 -2
- package/dist/assets/{VariablesView-pWnSAbjy.js.map → VariablesView-mj7tvP3Z.js.map} +1 -1
- package/dist/assets/{WorkerView-8rB6MB_M.js → WorkerView-urDpqCfL.js} +2 -2
- package/dist/assets/{WorkerView-8rB6MB_M.js.map → WorkerView-urDpqCfL.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-hF9F5zIs.js → WorkflowActivator-2LVSrBU4.js} +2 -2
- package/dist/assets/{WorkflowActivator-hF9F5zIs.js.map → WorkflowActivator-2LVSrBU4.js.map} +1 -1
- package/dist/assets/{WorkflowHistory-gHQbqUXH.js → WorkflowHistory-4SEsxR0t.js} +2 -2
- package/dist/assets/{WorkflowHistory-gHQbqUXH.js.map → WorkflowHistory-4SEsxR0t.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-VpQ3P8b_.js → WorkflowOnboardingView-27zExcdN.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-VpQ3P8b_.js.map → WorkflowOnboardingView-27zExcdN.js.map} +1 -1
- package/dist/assets/{WorkflowsView-bfxfJsmW.js → WorkflowsView-rICV14FU.js} +2 -2
- package/dist/assets/{WorkflowsView-bfxfJsmW.js.map → WorkflowsView-rICV14FU.js.map} +1 -1
- package/dist/assets/{cloud-f74z4VKj.js → cloud-8u4ixH3T.js} +2 -2
- package/dist/assets/{cloud-f74z4VKj.js.map → cloud-8u4ixH3T.js.map} +1 -1
- package/dist/assets/{index-vdh5hVg3.js → index-4C1AxeXk.js} +4 -4
- package/dist/assets/{index-vdh5hVg3.js.map → index-4C1AxeXk.js.map} +1 -1
- package/dist/assets/index-PmN852am.css +1 -0
- package/dist/assets/{pushConnection-j2REJYmc.js → pushConnection-kCBulx2c.js} +2 -2
- package/dist/assets/{pushConnection-j2REJYmc.js.map → pushConnection-kCBulx2c.js.map} +1 -1
- package/dist/assets/{templateActions-iSfFOAhF.js → templateActions-tZeqnIph.js} +2 -2
- package/dist/assets/{templateActions-iSfFOAhF.js.map → templateActions-tZeqnIph.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-s7lAeIqB.js → useExecutionDebugging-eQjp4txV.js} +2 -2
- package/dist/assets/{useExecutionDebugging-s7lAeIqB.js.map → useExecutionDebugging-eQjp4txV.js.map} +1 -1
- package/dist/assets/{workflowActivate-SIKKLz8V.js → workflowActivate-6jCh92f_.js} +2 -2
- package/dist/assets/{workflowActivate-SIKKLz8V.js.map → workflowActivate-6jCh92f_.js.map} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-XvPjL77I.js.map +0 -1
- package/dist/assets/NodeView-FjGatqri.css +0 -1
- package/dist/assets/NodeView-oDPyzajr.js.map +0 -1
- package/dist/assets/index-suVg9RiN.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowHistory-gHQbqUXH.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\tauthorElement.value?.scrollWidth > authorElement.value?.clientWidth;\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: 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(\n\t\t\trootStore.getRestApiContext,\n\t\t\t`${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-4SEsxR0t.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\tauthorElement.value?.scrollWidth > authorElement.value?.clientWidth;\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: 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(\n\t\t\trootStore.getRestApiContext,\n\t\t\t`${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-VpQ3P8b_.js → WorkflowOnboardingView-27zExcdN.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{f as l,h as f}from"./index-
|
|
2
|
-
//# sourceMappingURL=WorkflowOnboardingView-
|
|
1
|
+
import{f as l,h as f}from"./index-4C1AxeXk.js";import{v as d,V as a,x as u}from"./n8n-G5ZIZCy5.js";import{v as g,at as W,am as k,b as _,f as b,h as L}from"./vendor-VXT4wwt2.js";import"./pinia-UPmhnKmF.js";import"./@n8n/codemirror-lang-sql-A8tNeQAo.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-s3fE3Qyr.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./lodash-es-xYzII6mS.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./uuid-McvpxQtQ.js";import"./codemirror-lang-html-n8n-aqAgigXU.js";import"./luxon-ZRIU05qF.js";import"./codemirror-lang-n8n-expression-7tlJbTJw.js";import"./@vueuse/core-4MtarU7n.js";import"./fast-json-stable-stringify-4gflVid-.js";import"./esprima-next-ulPLCZ1Z.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-t9lCVWTj.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./vue-i18n-ZIlZf-IE.js";import"./@n8n/permissions-8yMqUF1Y.js";const X=g({__name:"WorkflowOnboardingView",setup(O){const r=l(),n=f(),i=d(),e=W(),s=k(),m=u(),p=async o=>{try{r.startLoading();const t=await n.getFixedWorkflowTemplate(o);if(!t)throw new Error;const c=m.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 p(o)}),(o,t)=>(b(),L("div"))}});export{X as default};
|
|
2
|
+
//# sourceMappingURL=WorkflowOnboardingView-27zExcdN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowOnboardingView-
|
|
1
|
+
{"version":3,"file":"WorkflowOnboardingView-27zExcdN.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":"snCASA,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-aq6P8Z4F.js";import{e as X,t as K,v as H,f as B,u as F,l as j,Z as ee,dG as te,V as O,dS as se,dr as oe,a9 as ae,_ as I,dJ as ne,O as re,B as ie}from"./n8n-G5ZIZCy5.js";import{aE as le,b as de,T as ce,u as ue,d as me}from"./index-vdh5hVg3.js";import{W as pe}from"./WorkflowActivator-hF9F5zIs.js";import{m as q}from"./pinia-UPmhnKmF.js";import{v as M,a6 as s,f as c,D as v,E as a,y as h,I as f,J as y,K as o,V as fe,H as L,i as w,L as V,M as z,h as T,e as U,at as he,F as N,_ as P,u as ge}from"./vendor-VXT4wwt2.js";import{T as we}from"./TemplatesInfoCarousel-P2HZ4dOz.js";import"./lodash-es-xYzII6mS.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-4MtarU7n.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-ZIlZf-IE.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-A8tNeQAo.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-s3fE3Qyr.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-aqAgigXU.js";import"./codemirror-lang-n8n-expression-7tlJbTJw.js";import"./fast-json-stable-stringify-4gflVid-.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-t9lCVWTj.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";import"./workflowActivate-SIKKLz8V.js";import"./NodeList-bi4nWtpD.js";import"./vue-agile-MK-2_Q_D.js";const C={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},ke=M({components:{TimeAgo:le,WorkflowActivator:pe},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWith:[],ownedBy:{},versionId:""})},readOnly:{type:Boolean,default:!1}},setup(){return{...X(),...de()}},data(){return{EnterpriseEditionFeature:K}},computed:{...q(j,F,B,H),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return ee(this.currentUser,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 te(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:O.WORKFLOW,params:{name:this.data.id}});window.open(t.href,"_blank");return}await this.$router.push({name:O.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:se,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:oe,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:this.$route.name===O.WORKFLOWS?"Workflows listing":"Workflow editor"});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")})!==ae)return;try{await this.workflowsStore.deleteWorkflow(this.data.id)}catch(d){this.showError(d,this.$locale.baseText("generic.deleteWorkflowError"));return}this.showMessage({title:this.$locale.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}}}),ye="_cardLink_w0ebe_1",_e="_cardHeading_w0ebe_11",be="_cardDescription_w0ebe_17",Te="_cardActions_w0ebe_24",Se={cardLink:ye,cardHeading:_e,cardDescription:be,cardActions:Te},$e={key:0};function Ce(e,t,d,r,p,i){const l=s("n8n-heading"),u=s("TimeAgo"),m=s("n8n-tags"),E=s("n8n-text"),n=s("n8n-badge"),_=s("enterprise-edition"),k=s("WorkflowActivator"),S=s("n8n-action-toggle"),A=s("n8n-card");return c(),v(A,{class:h(e.$style.cardLink),onClick:e.onClick},{header:a(()=>[o(l,{tag:"h2",bold:"",class:h(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:a(()=>[y(f(e.data.name),1)]),_:1},8,["class"])]),append:a(()=>[w("div",{class:h(e.$style.cardActions),onClick:t[0]||(t[0]=fe(()=>{},["stop"]))},[o(_,{features:[e.EnterpriseEditionFeature.Sharing]},{default:a(()=>[e.workflowPermissions.isOwner?(c(),v(n,{key:0,class:"mr-xs",theme:"tertiary",bold:""},{default:a(()=>[y(f(e.$locale.baseText("workflows.item.owner")),1)]),_:1})):L("",!0)]),_:1},8,["features"]),o(k,{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(S,{actions:e.actions,theme:"dark","data-test-id":"workflow-card-actions",onAction:e.onAction},null,8,["actions","onAction"])],2)]),default:a(()=>[w("div",{class:h(e.$style.cardDescription)},[o(E,{color:"text-light",size:"small"},{default:a(()=>[z(w("span",null,[y(f(e.$locale.baseText("workflows.item.updated"))+" ",1),o(u,{date:e.data.updatedAt},null,8,["date"]),y(" | ")],512),[[V,e.data]]),z(w("span",{class:"mr-2xs"},f(e.$locale.baseText("workflows.item.created"))+" "+f(e.formattedCreatedAtDate),513),[[V,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?z((c(),T("span",$e,[o(m,{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)),[[V,e.data]]):L("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const ve={$style:Se},Ee=I(ke,[["render",Ce],["__cssModules",ve]]),We=M({__name:"SuggestedTemplatesSection",props:{section:{type:Object,required:!0},title:{type:String,required:!1},showTitle:{type:Boolean,default:!0}},setup(e){const t=F(),d=re(),r=e,p=U(()=>{const l=Array();return t.suggestedTemplates&&r.section.workflows.forEach((u,m)=>{l.push({id:m,name:u.title,workflows:[{id:m}],nodes:u.nodes})}),l});function i({id:l}){t.openModalWithData({name:ne,data:{workflow:r.section.workflows[l]}}),d.track("User clicked template recommendation",{templateName:r.section.workflows[l].title},{withPostHog:!0})}return(l,u)=>{const m=s("n8n-text");return c(),T("div",{class:h(l.$style.container),"data-test-id":"suggested-templates-section-container"},[e.showTitle?(c(),T("div",{key:0,class:h(l.$style.header)},[o(m,{size:"large",color:"text-base",bold:!0},{default:a(()=>[y(f(r.title??e.section.title),1)]),_:1})],2)):L("",!0),w("div",{class:h(l.$style.content)},[o(we,{collections:p.value,loading:!1,"show-item-count":!1,"show-navigation":!1,"cards-width":"24%",onOpenCollection:i},null,8,["collections"])],2)],2)}}}),Ae="_container_13wqg_1",Oe={container:Ae},Le={$style:Oe},Y=I(We,[["__cssModules",Le]]),De=M({__name:"SuggestedTemplatesPage",setup(e,{expose:t}){const d=B(),r=F(),p=he(),i=U(()=>d.currentUser),l=n=>{var _,k,S;if(n!=null&&n.firstName)return((k=(_=n.firstName)==null?void 0:_.charAt(0))==null?void 0:k.toUpperCase())+((S=n==null?void 0:n.firstName)==null?void 0:S.slice(1))},u=U(()=>r.suggestedTemplates?r.suggestedTemplates.sections[0]:null),m=U(()=>{const n=Array();return!r.suggestedTemplates||!u.value||u.value.workflows.forEach((_,k)=>{n.push({id:k,name:_.title,workflows:[{id:k}],nodes:_.nodes})}),n});function E(){r.nodeViewInitialized=!1,p.push({name:O.NEW_WORKFLOW})}return t({currentUser:i,openCanvas:E,suggestedTemplates:m}),(n,_)=>{var D;const k=s("n8n-heading"),S=s("n8n-text"),A=s("n8n-button");return c(),T("div",{class:h(n.$style.container),"data-test-id":"suggested-templates-page-container"},[w("div",{class:h(n.$style.header)},[o(k,{tag:"h1",size:"2xlarge",class:"mb-2xs"},{default:a(()=>[y(f(n.$locale.baseText("suggestedTemplates.heading",{interpolate:{name:l(i.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[y(f(($=u.value)==null?void 0:$.description),1)]}),_:1})],2),w("div",{class:h(n.$style.content)},[(c(!0),T(N,null,P((D=ge(r).suggestedTemplates)==null?void 0:D.sections,$=>(c(),v(Y,{key:$.title,section:$,"show-title":!1},null,8,["section"]))),128))],2),w("div",null,[o(A,{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)}}}),Ue="_container_1on4d_1",Fe="_header_1on4d_7",Ie={container:Ue,header:Fe},Me={$style:Ie},Ve=I(De,[["__cssModules",Me]]),W={ACTIVE:!0,DEACTIVATED:!1,ALL:""},ze=M({name:"WorkflowsView",components:{ResourcesListLayout:Z,WorkflowCard:Ee,TagsDropdown:ce,SuggestedTemplatesPage:Ve,SuggestedTemplatesSection:Y},data(){return{filters:{search:"",ownedBy:"",sharedWith:"",status:W.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...q(j,F,B,H,ie,me,ue),readOnlyEnv(){return this.sourceControlStore.preferences.branchReadOnly},currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(K.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:W.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:W.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:W.DEACTIVATED}]},suggestedTemplates(){return this.uiStore.suggestedTemplates}},watch:{"filters.tags"(){this.sendFiltersTelemetry("tags")}},mounted(){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(){this.uiStore.nodeViewInitialized=!1,this.$router.push({name:O.NEW_WORKFLOW}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},async initialize(){await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows(),this.workflowsStore.fetchActiveWorkflows(),this.credentialsStore.fetchAllCredentials()])},onClickTag(e,t){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,t,d){return this.settingsStore.areTagsEnabled&&t.tags.length>0&&(d=d&&t.tags.every(r=>{var p;return(p=e.tags)==null?void 0:p.find(i=>typeof i=="object"?`${i.id}`==`${r}`:`${i}`==`${r}`)})),t.status!==""&&(d=d&&e.active===t.status),d},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.ownedBy&&(e.ownedBy=this.filters.ownedBy),this.filters.sharedWith&&(e.sharedWith=this.filters.sharedWith),this.$router.replace({query:Object.keys(e).length?e:void 0})},isValidUserId(e){return Object.keys(this.usersStore.users).includes(e)},setFiltersFromQueryString(){const{tags:e,status:t,search:d,ownedBy:r,sharedWith:p}=this.$route.query,i={};if(r&&typeof r=="string"&&this.isValidUserId(r)&&(i.ownedBy=r),p&&typeof p=="string"&&this.isValidUserId(p)&&(i.sharedWith=p),d&&typeof d=="string"&&(i.search=d),e&&typeof e=="string"){const l=this.tagsStore.allTags.map(m=>m.id),u=e.split(",").filter(m=>l.includes(m));u.length&&(i.tags=u)}t&&typeof t=="string"&&[W.ACTIVE.toString(),W.DEACTIVATED.toString()].includes(t)&&(i.status=t==="true"),Object.keys(i).length&&(this.filters={...this.filters,...i})}}}),Ne=ze,Pe="_actionsContainer_1gv00_1",Be="_emptyStateCard_1gv00_6",Re="_emptyStateCardIcon_1gv00_19",Ke={actionsContainer:Pe,emptyStateCard:Be,emptyStateCardIcon:Re},He={target:"_blank",href:"https://docs.n8n.io/source-control-environments/"},je={key:1},qe={class:"text-center mt-s"},Ye={key:0,class:"mb-s"},Qe={class:"mb-s"};function xe(e,t,d,r,p,i){const l=s("n8n-button"),u=s("i18n-t"),m=s("n8n-tooltip"),E=s("WorkflowCard"),n=s("SuggestedTemplatesSection"),_=s("SuggestedTemplatesPage"),k=s("n8n-heading"),S=s("n8n-text"),A=s("n8n-icon"),D=s("n8n-card"),$=s("n8n-input-label"),Q=s("TagsDropdown"),x=s("n8n-option"),G=s("n8n-select"),J=s("ResourcesListLayout");return c(),v(J,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},"show-aside":e.allWorkflows.length>0,shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":e.onFiltersUpdated},{"add-button":a(({disabled:b})=>[o(m,{disabled:!e.readOnlyEnv},{content:a(()=>[o(u,{tag:"span",keypath:"mainSidebar.workflows.readOnlyEnv.tooltip"},{link:a(()=>[w("a",He,f(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip.link")),1)]),_:1})]),default:a(()=>[w("div",null,[o(l,{size:"large",block:"",disabled:b,"data-test-id":"resources-list-add",onClick:e.addWorkflow},{default:a(()=>[y(f(e.$locale.baseText("workflows.add")),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:a(({data:b,updateItemSize:g})=>[o(E,{"data-test-id":"resources-list-item",class:"mb-2xs",data:b,"read-only":e.readOnlyEnv,"onExpand:tags":R=>g(b),"onClick:tag":e.onClickTag},null,8,["data","read-only","onExpand:tags","onClick:tag"])]),postListContent:a(()=>{var b;return[(c(!0),T(N,null,P((b=e.suggestedTemplates)==null?void 0:b.sections,(g,R)=>(c(),v(n,{key:R,section:g,title:e.$locale.baseText("suggestedTemplates.sectionTitle",{interpolate:{sectionName:g.name.toLocaleLowerCase()}})},null,8,["section","title"]))),128))]}),empty:a(()=>[e.suggestedTemplates?(c(),v(_,{key:0})):(c(),T("div",je,[w("div",qe,[o(k,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:a(()=>[y(f(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),o(S,{size:"large",color:"text-base"},{default:a(()=>[y(f(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?L("",!0):(c(),T("div",{key:0,class:h(["text-center","mt-2xl",e.$style.actionsContainer])},[o(D,{class:h(e.$style.emptyStateCard),hoverable:"","data-test-id":"new-workflow-card",onClick:e.addWorkflow},{default:a(()=>[o(A,{class:h(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),o(S,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[y(f(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]))]),filters:a(({setKeyValue:b})=>[e.settingsStore.areTagsEnabled?(c(),T("div",Ye,[o($,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(Q,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),"model-value":e.filters.tags,"create-enabled":!1,"onUpdate:modelValue":g=>b("tags",g)},null,8,["placeholder","model-value","onUpdate:modelValue"])])):L("",!0),w("div",Qe,[o($,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(G,{"data-test-id":"status-dropdown","model-value":e.filters.status,"onUpdate:modelValue":g=>b("status",g)},{default:a(()=>[(c(!0),T(N,null,P(e.statusFilterOptions,g=>(c(),v(x,{key:g.label,label:g.label,value:g.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","show-aside","shareable","initialize","disabled","onClick:add","onUpdate:filters"])}const Ge={$style:Ke},Lt=I(Ne,[["render",xe],["__cssModules",Ge]]);export{Lt as default};
|
|
2
|
-
//# sourceMappingURL=WorkflowsView-
|
|
1
|
+
import{R as Z}from"./ResourcesListLayout-aq6P8Z4F.js";import{e as X,t as K,v as H,f as B,u as F,l as j,Z as ee,dG as te,V as O,dS as se,dr as oe,a9 as ae,_ as I,dJ as ne,O as re,B as ie}from"./n8n-G5ZIZCy5.js";import{aE as le,b as de,T as ce,u as ue,d as me}from"./index-4C1AxeXk.js";import{W as pe}from"./WorkflowActivator-2LVSrBU4.js";import{m as q}from"./pinia-UPmhnKmF.js";import{v as M,a6 as s,f as c,D as v,E as a,y as h,I as f,J as y,K as o,V as fe,H as L,i as w,L as V,M as z,h as T,e as U,at as he,F as N,_ as P,u as ge}from"./vendor-VXT4wwt2.js";import{T as we}from"./TemplatesInfoCarousel-N3l1eTTG.js";import"./lodash-es-xYzII6mS.js";import"./axios-s2RMMPhA.js";import"./flatted-jPn12Tq4.js";import"./esprima-next-ulPLCZ1Z.js";import"./luxon-ZRIU05qF.js";import"./@vueuse/core-4MtarU7n.js";import"./uuid-McvpxQtQ.js";import"./vue-i18n-ZIlZf-IE.js";import"./@n8n/permissions-8yMqUF1Y.js";import"./@n8n/codemirror-lang-sql-A8tNeQAo.js";import"./@lezer/common-1hBQ1gIF.js";import"./prettier-s3fE3Qyr.js";import"./@jsplumb/util-DR0SB56A.js";import"./@jsplumb/core-MKwKlGip.js";import"./@jsplumb/common-Q5_tv_GT.js";import"./@jsplumb/connector-bezier-3dWY17R5.js";import"./@jsplumb/browser-ui-AlqFM-P6.js";import"./codemirror-lang-html-n8n-aqAgigXU.js";import"./codemirror-lang-n8n-expression-7tlJbTJw.js";import"./fast-json-stable-stringify-4gflVid-.js";import"./timeago.js--Bumj2r9.js";import"./qrcode.vue-t9lCVWTj.js";import"./vue3-touch-events-_RfbPMOD.js";import"./chart.js-JtqvIvkt.js";import"./workflowActivate-6jCh92f_.js";import"./NodeList-f2AyrOck.js";import"./vue-agile-MK-2_Q_D.js";const C={OPEN:"open",SHARE:"share",DUPLICATE:"duplicate",DELETE:"delete"},ke=M({components:{TimeAgo:le,WorkflowActivator:pe},props:{data:{type:Object,required:!0,default:()=>({id:"",createdAt:"",updatedAt:"",active:!1,connections:{},nodes:[],name:"",sharedWith:[],ownedBy:{},versionId:""})},readOnly:{type:Boolean,default:!1}},setup(){return{...X(),...de()}},data(){return{EnterpriseEditionFeature:K}},computed:{...q(j,F,B,H),currentUser(){return this.usersStore.currentUser||{}},workflowPermissions(){return ee(this.currentUser,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 te(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:O.WORKFLOW,params:{name:this.data.id}});window.open(t.href,"_blank");return}await this.$router.push({name:O.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:se,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:oe,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:this.$route.name===O.WORKFLOWS?"Workflows listing":"Workflow editor"});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")})!==ae)return;try{await this.workflowsStore.deleteWorkflow(this.data.id)}catch(d){this.showError(d,this.$locale.baseText("generic.deleteWorkflowError"));return}this.showMessage({title:this.$locale.baseText("mainSidebar.showMessage.handleSelect1.title"),type:"success"})}}}}),ye="_cardLink_w0ebe_1",_e="_cardHeading_w0ebe_11",be="_cardDescription_w0ebe_17",Te="_cardActions_w0ebe_24",Se={cardLink:ye,cardHeading:_e,cardDescription:be,cardActions:Te},$e={key:0};function Ce(e,t,d,r,p,i){const l=s("n8n-heading"),u=s("TimeAgo"),m=s("n8n-tags"),E=s("n8n-text"),n=s("n8n-badge"),_=s("enterprise-edition"),k=s("WorkflowActivator"),S=s("n8n-action-toggle"),A=s("n8n-card");return c(),v(A,{class:h(e.$style.cardLink),onClick:e.onClick},{header:a(()=>[o(l,{tag:"h2",bold:"",class:h(e.$style.cardHeading),"data-test-id":"workflow-card-name"},{default:a(()=>[y(f(e.data.name),1)]),_:1},8,["class"])]),append:a(()=>[w("div",{class:h(e.$style.cardActions),onClick:t[0]||(t[0]=fe(()=>{},["stop"]))},[o(_,{features:[e.EnterpriseEditionFeature.Sharing]},{default:a(()=>[e.workflowPermissions.isOwner?(c(),v(n,{key:0,class:"mr-xs",theme:"tertiary",bold:""},{default:a(()=>[y(f(e.$locale.baseText("workflows.item.owner")),1)]),_:1})):L("",!0)]),_:1},8,["features"]),o(k,{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(S,{actions:e.actions,theme:"dark","data-test-id":"workflow-card-actions",onAction:e.onAction},null,8,["actions","onAction"])],2)]),default:a(()=>[w("div",{class:h(e.$style.cardDescription)},[o(E,{color:"text-light",size:"small"},{default:a(()=>[z(w("span",null,[y(f(e.$locale.baseText("workflows.item.updated"))+" ",1),o(u,{date:e.data.updatedAt},null,8,["date"]),y(" | ")],512),[[V,e.data]]),z(w("span",{class:"mr-2xs"},f(e.$locale.baseText("workflows.item.created"))+" "+f(e.formattedCreatedAtDate),513),[[V,e.data]]),e.settingsStore.areTagsEnabled&&e.data.tags&&e.data.tags.length>0?z((c(),T("span",$e,[o(m,{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)),[[V,e.data]]):L("",!0)]),_:1})],2)]),_:1},8,["class","onClick"])}const ve={$style:Se},Ee=I(ke,[["render",Ce],["__cssModules",ve]]),We=M({__name:"SuggestedTemplatesSection",props:{section:{type:Object,required:!0},title:{type:String,required:!1},showTitle:{type:Boolean,default:!0}},setup(e){const t=F(),d=re(),r=e,p=U(()=>{const l=Array();return t.suggestedTemplates&&r.section.workflows.forEach((u,m)=>{l.push({id:m,name:u.title,workflows:[{id:m}],nodes:u.nodes})}),l});function i({id:l}){t.openModalWithData({name:ne,data:{workflow:r.section.workflows[l]}}),d.track("User clicked template recommendation",{templateName:r.section.workflows[l].title},{withPostHog:!0})}return(l,u)=>{const m=s("n8n-text");return c(),T("div",{class:h(l.$style.container),"data-test-id":"suggested-templates-section-container"},[e.showTitle?(c(),T("div",{key:0,class:h(l.$style.header)},[o(m,{size:"large",color:"text-base",bold:!0},{default:a(()=>[y(f(r.title??e.section.title),1)]),_:1})],2)):L("",!0),w("div",{class:h(l.$style.content)},[o(we,{collections:p.value,loading:!1,"show-item-count":!1,"show-navigation":!1,"cards-width":"24%",onOpenCollection:i},null,8,["collections"])],2)],2)}}}),Ae="_container_13wqg_1",Oe={container:Ae},Le={$style:Oe},Y=I(We,[["__cssModules",Le]]),De=M({__name:"SuggestedTemplatesPage",setup(e,{expose:t}){const d=B(),r=F(),p=he(),i=U(()=>d.currentUser),l=n=>{var _,k,S;if(n!=null&&n.firstName)return((k=(_=n.firstName)==null?void 0:_.charAt(0))==null?void 0:k.toUpperCase())+((S=n==null?void 0:n.firstName)==null?void 0:S.slice(1))},u=U(()=>r.suggestedTemplates?r.suggestedTemplates.sections[0]:null),m=U(()=>{const n=Array();return!r.suggestedTemplates||!u.value||u.value.workflows.forEach((_,k)=>{n.push({id:k,name:_.title,workflows:[{id:k}],nodes:_.nodes})}),n});function E(){r.nodeViewInitialized=!1,p.push({name:O.NEW_WORKFLOW})}return t({currentUser:i,openCanvas:E,suggestedTemplates:m}),(n,_)=>{var D;const k=s("n8n-heading"),S=s("n8n-text"),A=s("n8n-button");return c(),T("div",{class:h(n.$style.container),"data-test-id":"suggested-templates-page-container"},[w("div",{class:h(n.$style.header)},[o(k,{tag:"h1",size:"2xlarge",class:"mb-2xs"},{default:a(()=>[y(f(n.$locale.baseText("suggestedTemplates.heading",{interpolate:{name:l(i.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[y(f(($=u.value)==null?void 0:$.description),1)]}),_:1})],2),w("div",{class:h(n.$style.content)},[(c(!0),T(N,null,P((D=ge(r).suggestedTemplates)==null?void 0:D.sections,$=>(c(),v(Y,{key:$.title,section:$,"show-title":!1},null,8,["section"]))),128))],2),w("div",null,[o(A,{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)}}}),Ue="_container_1on4d_1",Fe="_header_1on4d_7",Ie={container:Ue,header:Fe},Me={$style:Ie},Ve=I(De,[["__cssModules",Me]]),W={ACTIVE:!0,DEACTIVATED:!1,ALL:""},ze=M({name:"WorkflowsView",components:{ResourcesListLayout:Z,WorkflowCard:Ee,TagsDropdown:ce,SuggestedTemplatesPage:Ve,SuggestedTemplatesSection:Y},data(){return{filters:{search:"",ownedBy:"",sharedWith:"",status:W.ALL,tags:[]},sourceControlStoreUnsubscribe:()=>{}}},computed:{...q(j,F,B,H,ie,me,ue),readOnlyEnv(){return this.sourceControlStore.preferences.branchReadOnly},currentUser(){return this.usersStore.currentUser||{}},allWorkflows(){return this.workflowsStore.allWorkflows},isShareable(){return this.settingsStore.isEnterpriseFeatureEnabled(K.Sharing)},statusFilterOptions(){return[{label:this.$locale.baseText("workflows.filters.status.all"),value:W.ALL},{label:this.$locale.baseText("workflows.filters.status.active"),value:W.ACTIVE},{label:this.$locale.baseText("workflows.filters.status.deactivated"),value:W.DEACTIVATED}]},suggestedTemplates(){return this.uiStore.suggestedTemplates}},watch:{"filters.tags"(){this.sendFiltersTelemetry("tags")}},mounted(){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(){this.uiStore.nodeViewInitialized=!1,this.$router.push({name:O.NEW_WORKFLOW}),this.$telemetry.track("User clicked add workflow button",{source:"Workflows list"})},async initialize(){await Promise.all([this.usersStore.fetchUsers(),this.workflowsStore.fetchAllWorkflows(),this.workflowsStore.fetchActiveWorkflows(),this.credentialsStore.fetchAllCredentials()])},onClickTag(e,t){this.filters.tags.includes(e)||this.filters.tags.push(e)},onFilter(e,t,d){return this.settingsStore.areTagsEnabled&&t.tags.length>0&&(d=d&&t.tags.every(r=>{var p;return(p=e.tags)==null?void 0:p.find(i=>typeof i=="object"?`${i.id}`==`${r}`:`${i}`==`${r}`)})),t.status!==""&&(d=d&&e.active===t.status),d},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.ownedBy&&(e.ownedBy=this.filters.ownedBy),this.filters.sharedWith&&(e.sharedWith=this.filters.sharedWith),this.$router.replace({query:Object.keys(e).length?e:void 0})},isValidUserId(e){return Object.keys(this.usersStore.users).includes(e)},setFiltersFromQueryString(){const{tags:e,status:t,search:d,ownedBy:r,sharedWith:p}=this.$route.query,i={};if(r&&typeof r=="string"&&this.isValidUserId(r)&&(i.ownedBy=r),p&&typeof p=="string"&&this.isValidUserId(p)&&(i.sharedWith=p),d&&typeof d=="string"&&(i.search=d),e&&typeof e=="string"){const l=this.tagsStore.allTags.map(m=>m.id),u=e.split(",").filter(m=>l.includes(m));u.length&&(i.tags=u)}t&&typeof t=="string"&&[W.ACTIVE.toString(),W.DEACTIVATED.toString()].includes(t)&&(i.status=t==="true"),Object.keys(i).length&&(this.filters={...this.filters,...i})}}}),Ne=ze,Pe="_actionsContainer_1gv00_1",Be="_emptyStateCard_1gv00_6",Re="_emptyStateCardIcon_1gv00_19",Ke={actionsContainer:Pe,emptyStateCard:Be,emptyStateCardIcon:Re},He={target:"_blank",href:"https://docs.n8n.io/source-control-environments/"},je={key:1},qe={class:"text-center mt-s"},Ye={key:0,class:"mb-s"},Qe={class:"mb-s"};function xe(e,t,d,r,p,i){const l=s("n8n-button"),u=s("i18n-t"),m=s("n8n-tooltip"),E=s("WorkflowCard"),n=s("SuggestedTemplatesSection"),_=s("SuggestedTemplatesPage"),k=s("n8n-heading"),S=s("n8n-text"),A=s("n8n-icon"),D=s("n8n-card"),$=s("n8n-input-label"),Q=s("TagsDropdown"),x=s("n8n-option"),G=s("n8n-select"),J=s("ResourcesListLayout");return c(),v(J,{ref:"layout","resource-key":"workflows",resources:e.allWorkflows,filters:e.filters,"additional-filters-handler":e.onFilter,"type-props":{itemSize:80},"show-aside":e.allWorkflows.length>0,shareable:e.isShareable,initialize:e.initialize,disabled:e.readOnlyEnv,"onClick:add":e.addWorkflow,"onUpdate:filters":e.onFiltersUpdated},{"add-button":a(({disabled:b})=>[o(m,{disabled:!e.readOnlyEnv},{content:a(()=>[o(u,{tag:"span",keypath:"mainSidebar.workflows.readOnlyEnv.tooltip"},{link:a(()=>[w("a",He,f(e.$locale.baseText("mainSidebar.workflows.readOnlyEnv.tooltip.link")),1)]),_:1})]),default:a(()=>[w("div",null,[o(l,{size:"large",block:"",disabled:b,"data-test-id":"resources-list-add",onClick:e.addWorkflow},{default:a(()=>[y(f(e.$locale.baseText("workflows.add")),1)]),_:2},1032,["disabled","onClick"])])]),_:2},1032,["disabled"])]),default:a(({data:b,updateItemSize:g})=>[o(E,{"data-test-id":"resources-list-item",class:"mb-2xs",data:b,"read-only":e.readOnlyEnv,"onExpand:tags":R=>g(b),"onClick:tag":e.onClickTag},null,8,["data","read-only","onExpand:tags","onClick:tag"])]),postListContent:a(()=>{var b;return[(c(!0),T(N,null,P((b=e.suggestedTemplates)==null?void 0:b.sections,(g,R)=>(c(),v(n,{key:R,section:g,title:e.$locale.baseText("suggestedTemplates.sectionTitle",{interpolate:{sectionName:g.name.toLocaleLowerCase()}})},null,8,["section","title"]))),128))]}),empty:a(()=>[e.suggestedTemplates?(c(),v(_,{key:0})):(c(),T("div",je,[w("div",qe,[o(k,{tag:"h2",size:"xlarge",class:"mb-2xs"},{default:a(()=>[y(f(e.$locale.baseText(e.currentUser.firstName?"workflows.empty.heading":"workflows.empty.heading.userNotSetup",{interpolate:{name:e.currentUser.firstName}})),1)]),_:1}),o(S,{size:"large",color:"text-base"},{default:a(()=>[y(f(e.$locale.baseText(e.readOnlyEnv?"workflows.empty.description.readOnlyEnv":"workflows.empty.description")),1)]),_:1})]),e.readOnlyEnv?L("",!0):(c(),T("div",{key:0,class:h(["text-center","mt-2xl",e.$style.actionsContainer])},[o(D,{class:h(e.$style.emptyStateCard),hoverable:"","data-test-id":"new-workflow-card",onClick:e.addWorkflow},{default:a(()=>[o(A,{class:h(e.$style.emptyStateCardIcon),icon:"file"},null,8,["class"]),o(S,{size:"large",class:"mt-xs",color:"text-base"},{default:a(()=>[y(f(e.$locale.baseText("workflows.empty.startFromScratch")),1)]),_:1})]),_:1},8,["class","onClick"])],2))]))]),filters:a(({setKeyValue:b})=>[e.settingsStore.areTagsEnabled?(c(),T("div",Ye,[o($,{label:e.$locale.baseText("workflows.filters.tags"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(Q,{placeholder:e.$locale.baseText("workflowOpen.filterWorkflows"),"model-value":e.filters.tags,"create-enabled":!1,"onUpdate:modelValue":g=>b("tags",g)},null,8,["placeholder","model-value","onUpdate:modelValue"])])):L("",!0),w("div",Qe,[o($,{label:e.$locale.baseText("workflows.filters.status"),bold:!1,size:"small",color:"text-base",class:"mb-3xs"},null,8,["label"]),o(G,{"data-test-id":"status-dropdown","model-value":e.filters.status,"onUpdate:modelValue":g=>b("status",g)},{default:a(()=>[(c(!0),T(N,null,P(e.statusFilterOptions,g=>(c(),v(x,{key:g.label,label:g.label,value:g.value,"data-test-id":"status"},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"])])]),_:1},8,["resources","filters","additional-filters-handler","show-aside","shareable","initialize","disabled","onClick:add","onUpdate:filters"])}const Ge={$style:Ke},Lt=I(Ne,[["render",xe],["__cssModules",Ge]]);export{Lt as default};
|
|
2
|
+
//# sourceMappingURL=WorkflowsView-rICV14FU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsView-bfxfJsmW.js","sources":["../../src/components/WorkflowCard.vue","../../src/components/SuggestedTemplates/SuggestedTemplatesSection.vue","../../src/components/SuggestedTemplates/SuggestedTemplatesPage.vue","../../src/views/WorkflowsView.vue"],"sourcesContent":["<template>\n\t<n8n-card :class=\"$style.cardLink\" @click=\"onClick\">\n\t\t<template #header>\n\t\t\t<n8n-heading tag=\"h2\" bold :class=\"$style.cardHeading\" data-test-id=\"workflow-card-name\">\n\t\t\t\t{{ data.name }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<div :class=\"$style.cardDescription\">\n\t\t\t<n8n-text color=\"text-light\" size=\"small\">\n\t\t\t\t<span v-show=\"data\"\n\t\t\t\t\t>{{ $locale.baseText('workflows.item.updated') }} <TimeAgo :date=\"data.updatedAt\" /> |\n\t\t\t\t</span>\n\t\t\t\t<span v-show=\"data\" class=\"mr-2xs\"\n\t\t\t\t\t>{{ $locale.baseText('workflows.item.created') }} {{ formattedCreatedAtDate }}\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"settingsStore.areTagsEnabled && data.tags && data.tags.length > 0\"\n\t\t\t\t\tv-show=\"data\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-tags\n\t\t\t\t\t\t:tags=\"data.tags\"\n\t\t\t\t\t\t:truncate-at=\"3\"\n\t\t\t\t\t\ttruncate\n\t\t\t\t\t\tdata-test-id=\"workflow-card-tags\"\n\t\t\t\t\t\t@click:tag=\"onClickTag\"\n\t\t\t\t\t\t@expand=\"onExpandTags\"\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<template #append>\n\t\t\t<div :class=\"$style.cardActions\" @click.stop>\n\t\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\">\n\t\t\t\t\t<n8n-badge v-if=\"workflowPermissions.isOwner\" class=\"mr-xs\" theme=\"tertiary\" bold>\n\t\t\t\t\t\t{{ $locale.baseText('workflows.item.owner') }}\n\t\t\t\t\t</n8n-badge>\n\t\t\t\t</enterprise-edition>\n\n\t\t\t\t<WorkflowActivator\n\t\t\t\t\tclass=\"mr-s\"\n\t\t\t\t\t:workflow-active=\"data.active\"\n\t\t\t\t\t:workflow-id=\"data.id\"\n\t\t\t\t\tdata-test-id=\"workflow-card-activator\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-action-toggle\n\t\t\t\t\t:actions=\"actions\"\n\t\t\t\t\ttheme=\"dark\"\n\t\t\t\t\tdata-test-id=\"workflow-card-actions\"\n\t\t\t\t\t@action=\"onAction\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</n8n-card>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IWorkflowDb, IUser, ITag } from '@/Interface';\nimport {\n\tDUPLICATE_MODAL_KEY,\n\tEnterpriseEditionFeature,\n\tMODAL_CONFIRM,\n\tVIEWS,\n\tWORKFLOW_SHARE_MODAL_KEY,\n} from '@/constants';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport type { IPermissions } from '@/permissions';\nimport { getWorkflowPermissions } from '@/permissions';\nimport dateformat from 'dateformat';\nimport WorkflowActivator from '@/components/WorkflowActivator.vue';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport TimeAgo from '@/components/TimeAgo.vue';\n\nexport const WORKFLOW_LIST_ITEM_ACTIONS = {\n\tOPEN: 'open',\n\tSHARE: 'share',\n\tDUPLICATE: 'duplicate',\n\tDELETE: 'delete',\n};\n\nexport default defineComponent({\n\tcomponents: {\n\t\tTimeAgo,\n\t\tWorkflowActivator,\n\t},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: (): IWorkflowDb => ({\n\t\t\t\tid: '',\n\t\t\t\tcreatedAt: '',\n\t\t\t\tupdatedAt: '',\n\t\t\t\tactive: false,\n\t\t\t\tconnections: {},\n\t\t\t\tnodes: [],\n\t\t\t\tname: '',\n\t\t\t\tsharedWith: [],\n\t\t\t\townedBy: {} as IUser,\n\t\t\t\tversionId: '',\n\t\t\t}),\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useSettingsStore, useUIStore, useUsersStore, useWorkflowsStore),\n\t\tcurrentUser(): IUser {\n\t\t\treturn this.usersStore.currentUser || ({} as IUser);\n\t\t},\n\t\tworkflowPermissions(): IPermissions {\n\t\t\treturn getWorkflowPermissions(this.currentUser, this.data);\n\t\t},\n\t\tactions(): Array<{ label: string; value: string }> {\n\t\t\tconst actions = [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.open'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.OPEN,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.share'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.SHARE,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (!this.readOnly) {\n\t\t\t\tactions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.duplicate'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.DUPLICATE,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.workflowPermissions.delete && !this.readOnly) {\n\t\t\t\tactions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.delete'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.DELETE,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn actions;\n\t\t},\n\t\tformattedCreatedAtDate(): string {\n\t\t\tconst currentYear = new Date().getFullYear();\n\n\t\t\treturn dateformat(\n\t\t\t\tthis.data.createdAt,\n\t\t\t\t`d mmmm${this.data.createdAt.startsWith(currentYear) ? '' : ', yyyy'}`,\n\t\t\t);\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onClick(event?: KeyboardEvent | PointerEvent) {\n\t\t\tif (event?.ctrlKey || event?.metaKey) {\n\t\t\t\tconst route = this.$router.resolve({\n\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\tparams: { name: this.data.id },\n\t\t\t\t});\n\t\t\t\twindow.open(route.href, '_blank');\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.$router.push({\n\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\tparams: { name: this.data.id },\n\t\t\t});\n\t\t},\n\t\tonClickTag(tagId: string, event: PointerEvent) {\n\t\t\tevent.stopPropagation();\n\n\t\t\tthis.$emit('click:tag', tagId, event);\n\t\t},\n\t\tonExpandTags() {\n\t\t\tthis.$emit('expand:tags');\n\t\t},\n\t\tasync onAction(action: string) {\n\t\t\tif (action === WORKFLOW_LIST_ITEM_ACTIONS.OPEN) {\n\t\t\t\tawait this.onClick();\n\t\t\t} else if (action === WORKFLOW_LIST_ITEM_ACTIONS.DUPLICATE) {\n\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\tname: DUPLICATE_MODAL_KEY,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tid: this.data.id,\n\t\t\t\t\t\tname: this.data.name,\n\t\t\t\t\t\ttags: (this.data.tags || []).map((tag: ITag) => tag.id),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else if (action === WORKFLOW_LIST_ITEM_ACTIONS.SHARE) {\n\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\tname: WORKFLOW_SHARE_MODAL_KEY,\n\t\t\t\t\tdata: { id: this.data.id },\n\t\t\t\t});\n\n\t\t\t\tthis.$telemetry.track('User opened sharing modal', {\n\t\t\t\t\tworkflow_id: this.data.id,\n\t\t\t\t\tuser_id_sharer: this.currentUser.id,\n\t\t\t\t\tsub_view: this.$route.name === VIEWS.WORKFLOWS ? 'Workflows listing' : 'Workflow editor',\n\t\t\t\t});\n\t\t\t} else if (action === WORKFLOW_LIST_ITEM_ACTIONS.DELETE) {\n\t\t\t\tconst deleteConfirmed = await this.confirm(\n\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.message', {\n\t\t\t\t\t\tinterpolate: { workflowName: this.data.name },\n\t\t\t\t\t}),\n\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.headline'),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.confirmButtonText',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.cancelButtonText',\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (deleteConfirmed !== MODAL_CONFIRM) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait this.workflowsStore.deleteWorkflow(this.data.id);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.showError(error, this.$locale.baseText('generic.deleteWorkflowError'));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Reset tab title since workflow is deleted.\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('mainSidebar.showMessage.handleSelect1.title'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.cardLink {\n\ttransition: box-shadow 0.3s ease;\n\tcursor: pointer;\n\tpadding: 0;\n\talign-items: stretch;\n\n\t&:hover {\n\t\tbox-shadow: 0 2px 8px rgba(#441c17, 0.1);\n\t}\n}\n\n.cardHeading {\n\tfont-size: var(--font-size-s);\n\tword-break: break-word;\n\tpadding: var(--spacing-s) 0 0 var(--spacing-s);\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s) var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type PropType, computed } from 'vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { ITemplatesCollection, ITemplatesNode, SuggestedTemplatesSection } from '@/Interface';\nimport TemplatesInfoCarousel from '@/components/TemplatesInfoCarousel.vue';\nimport { SUGGESTED_TEMPLATES_PREVIEW_MODAL_KEY } from '@/constants';\n\nconst uiStore = useUIStore();\nconst telemetry = useTelemetry();\n\nconst props = defineProps({\n\tsection: {\n\t\ttype: Object as PropType<SuggestedTemplatesSection>,\n\t\trequired: true,\n\t},\n\ttitle: {\n\t\ttype: String as PropType<string>,\n\t\trequired: false,\n\t},\n\tshowTitle: {\n\t\ttype: Boolean as PropType<boolean>,\n\t\tdefault: true,\n\t},\n});\n\nconst sectionTemplates = computed(() => {\n\tconst carouselCollections = Array<ITemplatesCollection>();\n\tif (!uiStore.suggestedTemplates) {\n\t\treturn carouselCollections;\n\t}\n\tprops.section.workflows.forEach((workflow, index) => {\n\t\tcarouselCollections.push({\n\t\t\tid: index,\n\t\t\tname: workflow.title,\n\t\t\tworkflows: [{ id: index }],\n\t\t\tnodes: workflow.nodes as ITemplatesNode[],\n\t\t});\n\t});\n\treturn carouselCollections;\n});\n\nfunction onOpenCollection({ id }: { event: Event; id: number }) {\n\tuiStore.openModalWithData({\n\t\tname: SUGGESTED_TEMPLATES_PREVIEW_MODAL_KEY,\n\t\tdata: { workflow: props.section.workflows[id] },\n\t});\n\ttelemetry.track(\n\t\t'User clicked template recommendation',\n\t\t{ templateName: props.section.workflows[id].title },\n\t\t{ withPostHog: true },\n\t);\n}\n</script>\n\n<template>\n\t<div :class=\"$style.container\" data-test-id=\"suggested-templates-section-container\">\n\t\t<div v-if=\"showTitle\" :class=\"$style.header\">\n\t\t\t<n8n-text size=\"large\" color=\"text-base\" :bold=\"true\">\n\t\t\t\t{{ props.title ?? section.title }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div :class=\"$style.content\">\n\t\t\t<TemplatesInfoCarousel\n\t\t\t\t:collections=\"sectionTemplates\"\n\t\t\t\t:loading=\"false\"\n\t\t\t\t:show-item-count=\"false\"\n\t\t\t\t:show-navigation=\"false\"\n\t\t\t\tcards-width=\"24%\"\n\t\t\t\t@openCollection=\"onOpenCollection\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-l);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router';\nimport { computed } from 'vue';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { VIEWS } from '@/constants';\nimport type { ITemplatesCollection, IUser } from '@/Interface';\nimport SuggestedTemplatesSection from '@/components/SuggestedTemplates/SuggestedTemplatesSection.vue';\n\nconst usersStore = useUsersStore();\nconst uiStore = useUIStore();\nconst router = useRouter();\n\nconst currentUser = computed(() => usersStore.currentUser);\n\nconst upperCaseFirstName = (user: IUser | null) => {\n\tif (!user?.firstName) return;\n\treturn user.firstName?.charAt(0)?.toUpperCase() + user?.firstName?.slice(1);\n};\n\nconst defaultSection = computed(() => {\n\tif (!uiStore.suggestedTemplates) {\n\t\treturn null;\n\t}\n\treturn uiStore.suggestedTemplates.sections[0];\n});\n\nconst suggestedTemplates = computed(() => {\n\tconst carouselCollections = Array<ITemplatesCollection>();\n\tif (!uiStore.suggestedTemplates || !defaultSection.value) {\n\t\treturn carouselCollections;\n\t}\n\tdefaultSection.value.workflows.forEach((workflow, index) => {\n\t\tcarouselCollections.push({\n\t\t\tid: index,\n\t\t\tname: workflow.title,\n\t\t\tworkflows: [{ id: index }],\n\t\t\tnodes: workflow.nodes,\n\t\t});\n\t});\n\treturn carouselCollections;\n});\n\nfunction openCanvas() {\n\tuiStore.nodeViewInitialized = false;\n\tvoid router.push({ name: VIEWS.NEW_WORKFLOW });\n}\n\ndefineExpose({\n\tcurrentUser,\n\topenCanvas,\n\tsuggestedTemplates,\n});\n</script>\n\n<template>\n\t<div :class=\"$style.container\" data-test-id=\"suggested-templates-page-container\">\n\t\t<div :class=\"$style.header\">\n\t\t\t<n8n-heading tag=\"h1\" size=\"2xlarge\" class=\"mb-2xs\">\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('suggestedTemplates.heading', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tname: upperCaseFirstName(currentUser) || $locale.baseText('generic.welcome'),\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-heading>\n\t\t\t<n8n-text\n\t\t\t\tsize=\"large\"\n\t\t\t\tcolor=\"text-base\"\n\t\t\t\tdata-test-id=\"suggested-template-section-description\"\n\t\t\t>\n\t\t\t\t{{ defaultSection?.description }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div :class=\"$style.content\">\n\t\t\t<SuggestedTemplatesSection\n\t\t\t\tv-for=\"section in uiStore.suggestedTemplates?.sections\"\n\t\t\t\t:key=\"section.title\"\n\t\t\t\t:section=\"section\"\n\t\t\t\t:show-title=\"false\"\n\t\t\t/>\n\t\t</div>\n\t\t<div>\n\t\t\t<n8n-button\n\t\t\t\t:label=\"$locale.baseText('suggestedTemplates.newWorkflowButton')\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t\tsize=\"medium\"\n\t\t\t\ticon=\"plus\"\n\t\t\t\tdata-test-id=\"suggested-templates-new-workflow-button\"\n\t\t\t\t@click=\"openCanvas\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-l);\n}\n\n.header {\n\tmargin-bottom: var(--spacing-l);\n}\n</style>\n","<template>\n\t<ResourcesListLayout\n\t\tref=\"layout\"\n\t\tresource-key=\"workflows\"\n\t\t:resources=\"allWorkflows\"\n\t\t:filters=\"filters\"\n\t\t:additional-filters-handler=\"onFilter\"\n\t\t:type-props=\"{ itemSize: 80 }\"\n\t\t:show-aside=\"allWorkflows.length > 0\"\n\t\t:shareable=\"isShareable\"\n\t\t:initialize=\"initialize\"\n\t\t:disabled=\"readOnlyEnv\"\n\t\t@click:add=\"addWorkflow\"\n\t\t@update:filters=\"onFiltersUpdated\"\n\t>\n\t\t<template #add-button=\"{ disabled }\">\n\t\t\t<n8n-tooltip :disabled=\"!readOnlyEnv\">\n\t\t\t\t<div>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t\t@click=\"addWorkflow\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText(`workflows.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #content>\n\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"mainSidebar.workflows.readOnlyEnv.tooltip\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a target=\"_blank\" href=\"https://docs.n8n.io/source-control-environments/\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('mainSidebar.workflows.readOnlyEnv.tooltip.link') }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</template>\n\t\t\t</n8n-tooltip>\n\t\t</template>\n\t\t<template #default=\"{ data, updateItemSize }\">\n\t\t\t<WorkflowCard\n\t\t\t\tdata-test-id=\"resources-list-item\"\n\t\t\t\tclass=\"mb-2xs\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t:read-only=\"readOnlyEnv\"\n\t\t\t\t@expand:tags=\"updateItemSize(data)\"\n\t\t\t\t@click:tag=\"onClickTag\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #postListContent>\n\t\t\t<SuggestedTemplatesSection\n\t\t\t\tv-for=\"(section, key) in suggestedTemplates?.sections\"\n\t\t\t\t:key=\"key\"\n\t\t\t\t:section=\"section\"\n\t\t\t\t:title=\"\n\t\t\t\t\t$locale.baseText('suggestedTemplates.sectionTitle', {\n\t\t\t\t\t\tinterpolate: { sectionName: section.name.toLocaleLowerCase() },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #empty>\n\t\t\t<SuggestedTemplatesPage v-if=\"suggestedTemplates\" />\n\t\t\t<div v-else>\n\t\t\t\t<div class=\"text-center mt-s\">\n\t\t\t\t\t<n8n-heading tag=\"h2\" size=\"xlarge\" class=\"mb-2xs\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\tcurrentUser.firstName\n\t\t\t\t\t\t\t\t\t? 'workflows.empty.heading'\n\t\t\t\t\t\t\t\t\t: 'workflows.empty.heading.userNotSetup',\n\t\t\t\t\t\t\t\t{ interpolate: { name: currentUser.firstName } },\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-heading>\n\t\t\t\t\t<n8n-text size=\"large\" color=\"text-base\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\treadOnlyEnv\n\t\t\t\t\t\t\t\t\t? 'workflows.empty.description.readOnlyEnv'\n\t\t\t\t\t\t\t\t\t: 'workflows.empty.description',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"!readOnlyEnv\" :class=\"['text-center', 'mt-2xl', $style.actionsContainer]\">\n\t\t\t\t\t<n8n-card\n\t\t\t\t\t\t:class=\"$style.emptyStateCard\"\n\t\t\t\t\t\thoverable\n\t\t\t\t\t\tdata-test-id=\"new-workflow-card\"\n\t\t\t\t\t\t@click=\"addWorkflow\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-icon :class=\"$style.emptyStateCardIcon\" icon=\"file\" />\n\t\t\t\t\t\t<n8n-text size=\"large\" class=\"mt-xs\" color=\"text-base\">\n\t\t\t\t\t\t\t{{ $locale.baseText('workflows.empty.startFromScratch') }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</n8n-card>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #filters=\"{ setKeyValue }\">\n\t\t\t<div v-if=\"settingsStore.areTagsEnabled\" class=\"mb-s\">\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('workflows.filters.tags')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<TagsDropdown\n\t\t\t\t\t:placeholder=\"$locale.baseText('workflowOpen.filterWorkflows')\"\n\t\t\t\t\t:model-value=\"filters.tags\"\n\t\t\t\t\t:create-enabled=\"false\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('tags', $event)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"mb-s\">\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('workflows.filters.status')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<n8n-select\n\t\t\t\t\tdata-test-id=\"status-dropdown\"\n\t\t\t\t\t:model-value=\"filters.status\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('status', $event)\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"option in statusFilterOptions\"\n\t\t\t\t\t\t:key=\"option.label\"\n\t\t\t\t\t\t:label=\"option.label\"\n\t\t\t\t\t\t:value=\"option.value\"\n\t\t\t\t\t\tdata-test-id=\"status\"\n\t\t\t\t\t>\n\t\t\t\t\t</n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</template>\n\t</ResourcesListLayout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport WorkflowCard from '@/components/WorkflowCard.vue';\nimport { EnterpriseEditionFeature, VIEWS } from '@/constants';\nimport type { ITag, IUser, IWorkflowDb } from '@/Interface';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport SuggestedTemplatesPage from '@/components/SuggestedTemplates/SuggestedTemplatesPage.vue';\nimport SuggestedTemplatesSection from '@/components/SuggestedTemplates/SuggestedTemplatesSection.vue';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useTagsStore } from '@/stores/tags.store';\n\ntype IResourcesListLayoutInstance = InstanceType<typeof ResourcesListLayout>;\n\ninterface Filters {\n\tsearch: string;\n\townedBy: string;\n\tsharedWith: string;\n\tstatus: string | boolean;\n\ttags: string[];\n}\n\nconst StatusFilter = {\n\tACTIVE: true,\n\tDEACTIVATED: false,\n\tALL: '',\n};\n\nconst WorkflowsView = defineComponent({\n\tname: 'WorkflowsView',\n\tcomponents: {\n\t\tResourcesListLayout,\n\t\tWorkflowCard,\n\t\tTagsDropdown,\n\t\tSuggestedTemplatesPage,\n\t\tSuggestedTemplatesSection,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfilters: {\n\t\t\t\tsearch: '',\n\t\t\t\townedBy: '',\n\t\t\t\tsharedWith: '',\n\t\t\t\tstatus: StatusFilter.ALL as string | boolean,\n\t\t\t\ttags: [] as string[],\n\t\t\t},\n\t\t\tsourceControlStoreUnsubscribe: () => {},\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsersStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseTagsStore,\n\t\t),\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tcurrentUser(): IUser {\n\t\t\treturn this.usersStore.currentUser || ({} as IUser);\n\t\t},\n\t\tallWorkflows(): IWorkflowDb[] {\n\t\t\treturn this.workflowsStore.allWorkflows;\n\t\t},\n\t\tisShareable(): boolean {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing);\n\t\t},\n\t\tstatusFilterOptions(): Array<{ label: string; value: string | boolean }> {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.filters.status.all'),\n\t\t\t\t\tvalue: StatusFilter.ALL,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.filters.status.active'),\n\t\t\t\t\tvalue: StatusFilter.ACTIVE,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.filters.status.deactivated'),\n\t\t\t\t\tvalue: StatusFilter.DEACTIVATED,\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tsuggestedTemplates() {\n\t\t\treturn this.uiStore.suggestedTemplates;\n\t\t},\n\t},\n\twatch: {\n\t\t'filters.tags'() {\n\t\t\tthis.sendFiltersTelemetry('tags');\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.setFiltersFromQueryString();\n\n\t\tvoid this.usersStore.showPersonalizationSurvey();\n\n\t\tthis.sourceControlStoreUnsubscribe = this.sourceControlStore.$onAction(({ name, after }) => {\n\t\t\tif (name === 'pullWorkfolder' && after) {\n\t\t\t\tafter(() => {\n\t\t\t\t\tvoid this.initialize();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\tbeforeUnmount() {\n\t\tthis.sourceControlStoreUnsubscribe();\n\t},\n\tmethods: {\n\t\tonFiltersUpdated(filters: Filters) {\n\t\t\tthis.filters = filters;\n\t\t\tthis.saveFiltersOnQueryString();\n\t\t},\n\t\taddWorkflow() {\n\t\t\tthis.uiStore.nodeViewInitialized = false;\n\t\t\tvoid this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\n\t\t\tthis.$telemetry.track('User clicked add workflow button', {\n\t\t\t\tsource: 'Workflows list',\n\t\t\t});\n\t\t},\n\t\tasync initialize() {\n\t\t\tawait Promise.all([\n\t\t\t\tthis.usersStore.fetchUsers(),\n\t\t\t\tthis.workflowsStore.fetchAllWorkflows(),\n\t\t\t\tthis.workflowsStore.fetchActiveWorkflows(),\n\t\t\t\tthis.credentialsStore.fetchAllCredentials(),\n\t\t\t]);\n\t\t},\n\t\tonClickTag(tagId: string, event: PointerEvent) {\n\t\t\tif (!this.filters.tags.includes(tagId)) {\n\t\t\t\tthis.filters.tags.push(tagId);\n\t\t\t}\n\t\t},\n\t\tonFilter(\n\t\t\tresource: IWorkflowDb,\n\t\t\tfilters: { tags: string[]; search: string; status: string | boolean },\n\t\t\tmatches: boolean,\n\t\t): boolean {\n\t\t\tif (this.settingsStore.areTagsEnabled && filters.tags.length > 0) {\n\t\t\t\tmatches =\n\t\t\t\t\tmatches &&\n\t\t\t\t\tfilters.tags.every(\n\t\t\t\t\t\t(tag) =>\n\t\t\t\t\t\t\t(resource.tags as ITag[])?.find((resourceTag) =>\n\t\t\t\t\t\t\t\ttypeof resourceTag === 'object'\n\t\t\t\t\t\t\t\t\t? `${resourceTag.id}` === `${tag}`\n\t\t\t\t\t\t\t\t\t: `${resourceTag}` === `${tag}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (filters.status !== '') {\n\t\t\t\tmatches = matches && resource.active === filters.status;\n\t\t\t}\n\n\t\t\treturn matches;\n\t\t},\n\t\tsendFiltersTelemetry(source: string) {\n\t\t\t(this.$refs.layout as IResourcesListLayoutInstance).sendFiltersTelemetry(source);\n\t\t},\n\t\tsaveFiltersOnQueryString() {\n\t\t\tconst query: { [key: string]: string } = {};\n\n\t\t\tif (this.filters.search) {\n\t\t\t\tquery.search = this.filters.search;\n\t\t\t}\n\n\t\t\tif (typeof this.filters.status !== 'string') {\n\t\t\t\tquery.status = this.filters.status.toString();\n\t\t\t}\n\n\t\t\tif (this.filters.tags.length) {\n\t\t\t\tquery.tags = this.filters.tags.join(',');\n\t\t\t}\n\n\t\t\tif (this.filters.ownedBy) {\n\t\t\t\tquery.ownedBy = this.filters.ownedBy;\n\t\t\t}\n\n\t\t\tif (this.filters.sharedWith) {\n\t\t\t\tquery.sharedWith = this.filters.sharedWith;\n\t\t\t}\n\n\t\t\tvoid this.$router.replace({\n\t\t\t\tquery: Object.keys(query).length ? query : undefined,\n\t\t\t});\n\t\t},\n\t\tisValidUserId(userId: string) {\n\t\t\treturn Object.keys(this.usersStore.users).includes(userId);\n\t\t},\n\t\tsetFiltersFromQueryString() {\n\t\t\tconst { tags, status, search, ownedBy, sharedWith } = this.$route.query;\n\n\t\t\tconst filtersToApply: { [key: string]: string | string[] | boolean } = {};\n\n\t\t\tif (ownedBy && typeof ownedBy === 'string' && this.isValidUserId(ownedBy)) {\n\t\t\t\tfiltersToApply.ownedBy = ownedBy;\n\t\t\t}\n\n\t\t\tif (sharedWith && typeof sharedWith === 'string' && this.isValidUserId(sharedWith)) {\n\t\t\t\tfiltersToApply.sharedWith = sharedWith;\n\t\t\t}\n\n\t\t\tif (search && typeof search === 'string') {\n\t\t\t\tfiltersToApply.search = search;\n\t\t\t}\n\n\t\t\tif (tags && typeof tags === 'string') {\n\t\t\t\tconst currentTags = this.tagsStore.allTags.map((tag) => tag.id);\n\t\t\t\tconst savedTags = tags.split(',').filter((tag) => currentTags.includes(tag));\n\t\t\t\tif (savedTags.length) {\n\t\t\t\t\tfiltersToApply.tags = savedTags;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstatus &&\n\t\t\t\ttypeof status === 'string' &&\n\t\t\t\t[StatusFilter.ACTIVE.toString(), StatusFilter.DEACTIVATED.toString()].includes(status)\n\t\t\t) {\n\t\t\t\tfiltersToApply.status = status === 'true';\n\t\t\t}\n\n\t\t\tif (Object.keys(filtersToApply).length) {\n\t\t\t\tthis.filters = {\n\t\t\t\t\t...this.filters,\n\t\t\t\t\t...filtersToApply,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t},\n});\n\nexport default WorkflowsView;\n</script>\n\n<style lang=\"scss\" module>\n.actionsContainer {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.emptyStateCard {\n\twidth: 192px;\n\ttext-align: center;\n\tdisplay: inline-flex;\n\theight: 230px;\n\n\t& + & {\n\t\tmargin-left: var(--spacing-s);\n\t}\n\n\t&:hover {\n\t\tsvg {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n\n.emptyStateCardIcon {\n\tfont-size: 48px;\n\n\tsvg {\n\t\twidth: 48px !important;\n\t\tcolor: var(--color-foreground-dark);\n\t\ttransition: color 0.3s ease;\n\t}\n}\n</style>\n"],"names":["WORKFLOW_LIST_ITEM_ACTIONS","_sfc_main$3","defineComponent","TimeAgo","WorkflowActivator","useToast","useMessage","EnterpriseEditionFeature","mapStores","useSettingsStore","useUIStore","useUsersStore","useWorkflowsStore","getWorkflowPermissions","actions","currentYear","dateformat","event","route","VIEWS","tagId","action","DUPLICATE_MODAL_KEY","tag","WORKFLOW_SHARE_MODAL_KEY","MODAL_CONFIRM","error","_resolveComponent","_openBlock","_createBlock","_component_n8n_card","_normalizeClass","_ctx","_withCtx","_createVNode","_component_n8n_heading","_createTextVNode","_toDisplayString","_createElementVNode","_cache","_withModifiers","_component_n8n_badge","_createCommentVNode","_component_WorkflowActivator","_component_n8n_action_toggle","_component_n8n_text","_withDirectives","_component_TimeAgo","data","_vShow","settingsStore","_createElementBlock","_hoisted_1","_component_n8n_tags","onExpandTags","uiStore","telemetry","useTelemetry","props","__props","sectionTemplates","computed","carouselCollections","workflow","index","onOpenCollection","id","SUGGESTED_TEMPLATES_PREVIEW_MODAL_KEY","usersStore","router","useRouter","currentUser","upperCaseFirstName","user","_b","_a","_c","defaultSection","suggestedTemplates","openCanvas","__expose","StatusFilter","WorkflowsView","ResourcesListLayout","WorkflowCard","TagsDropdown","SuggestedTemplatesPage","SuggestedTemplatesSection","useCredentialsStore","useSourceControlStore","useTagsStore","name","after","filters","resource","matches","resourceTag","source","query","userId","tags","status","search","ownedBy","sharedWith","filtersToApply","currentTags","savedTags","_sfc_main","_hoisted_3","_hoisted_4","_component_ResourcesListLayout","allWorkflows","isShareable","initialize","readOnlyEnv","addWorkflow","disabled","_component_n8n_tooltip","_component_i18n_t","_component_n8n_button","updateItemSize","_component_WorkflowCard","onClickTag","_Fragment","_renderList","section","key","_component_SuggestedTemplatesSection","$locale","_component_SuggestedTemplatesPage","_hoisted_2","_component_n8n_icon","setKeyValue","_component_n8n_input_label","_component_TagsDropdown","_hoisted_5","_component_n8n_select","$event","option","_component_n8n_option"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowsView-rICV14FU.js","sources":["../../src/components/WorkflowCard.vue","../../src/components/SuggestedTemplates/SuggestedTemplatesSection.vue","../../src/components/SuggestedTemplates/SuggestedTemplatesPage.vue","../../src/views/WorkflowsView.vue"],"sourcesContent":["<template>\n\t<n8n-card :class=\"$style.cardLink\" @click=\"onClick\">\n\t\t<template #header>\n\t\t\t<n8n-heading tag=\"h2\" bold :class=\"$style.cardHeading\" data-test-id=\"workflow-card-name\">\n\t\t\t\t{{ data.name }}\n\t\t\t</n8n-heading>\n\t\t</template>\n\t\t<div :class=\"$style.cardDescription\">\n\t\t\t<n8n-text color=\"text-light\" size=\"small\">\n\t\t\t\t<span v-show=\"data\"\n\t\t\t\t\t>{{ $locale.baseText('workflows.item.updated') }} <TimeAgo :date=\"data.updatedAt\" /> |\n\t\t\t\t</span>\n\t\t\t\t<span v-show=\"data\" class=\"mr-2xs\"\n\t\t\t\t\t>{{ $locale.baseText('workflows.item.created') }} {{ formattedCreatedAtDate }}\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"settingsStore.areTagsEnabled && data.tags && data.tags.length > 0\"\n\t\t\t\t\tv-show=\"data\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-tags\n\t\t\t\t\t\t:tags=\"data.tags\"\n\t\t\t\t\t\t:truncate-at=\"3\"\n\t\t\t\t\t\ttruncate\n\t\t\t\t\t\tdata-test-id=\"workflow-card-tags\"\n\t\t\t\t\t\t@click:tag=\"onClickTag\"\n\t\t\t\t\t\t@expand=\"onExpandTags\"\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<template #append>\n\t\t\t<div :class=\"$style.cardActions\" @click.stop>\n\t\t\t\t<enterprise-edition :features=\"[EnterpriseEditionFeature.Sharing]\">\n\t\t\t\t\t<n8n-badge v-if=\"workflowPermissions.isOwner\" class=\"mr-xs\" theme=\"tertiary\" bold>\n\t\t\t\t\t\t{{ $locale.baseText('workflows.item.owner') }}\n\t\t\t\t\t</n8n-badge>\n\t\t\t\t</enterprise-edition>\n\n\t\t\t\t<WorkflowActivator\n\t\t\t\t\tclass=\"mr-s\"\n\t\t\t\t\t:workflow-active=\"data.active\"\n\t\t\t\t\t:workflow-id=\"data.id\"\n\t\t\t\t\tdata-test-id=\"workflow-card-activator\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-action-toggle\n\t\t\t\t\t:actions=\"actions\"\n\t\t\t\t\ttheme=\"dark\"\n\t\t\t\t\tdata-test-id=\"workflow-card-actions\"\n\t\t\t\t\t@action=\"onAction\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</n8n-card>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IWorkflowDb, IUser, ITag } from '@/Interface';\nimport {\n\tDUPLICATE_MODAL_KEY,\n\tEnterpriseEditionFeature,\n\tMODAL_CONFIRM,\n\tVIEWS,\n\tWORKFLOW_SHARE_MODAL_KEY,\n} from '@/constants';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport type { IPermissions } from '@/permissions';\nimport { getWorkflowPermissions } from '@/permissions';\nimport dateformat from 'dateformat';\nimport WorkflowActivator from '@/components/WorkflowActivator.vue';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport TimeAgo from '@/components/TimeAgo.vue';\n\nexport const WORKFLOW_LIST_ITEM_ACTIONS = {\n\tOPEN: 'open',\n\tSHARE: 'share',\n\tDUPLICATE: 'duplicate',\n\tDELETE: 'delete',\n};\n\nexport default defineComponent({\n\tcomponents: {\n\t\tTimeAgo,\n\t\tWorkflowActivator,\n\t},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: (): IWorkflowDb => ({\n\t\t\t\tid: '',\n\t\t\t\tcreatedAt: '',\n\t\t\t\tupdatedAt: '',\n\t\t\t\tactive: false,\n\t\t\t\tconnections: {},\n\t\t\t\tnodes: [],\n\t\t\t\tname: '',\n\t\t\t\tsharedWith: [],\n\t\t\t\townedBy: {} as IUser,\n\t\t\t\tversionId: '',\n\t\t\t}),\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tEnterpriseEditionFeature,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useSettingsStore, useUIStore, useUsersStore, useWorkflowsStore),\n\t\tcurrentUser(): IUser {\n\t\t\treturn this.usersStore.currentUser || ({} as IUser);\n\t\t},\n\t\tworkflowPermissions(): IPermissions {\n\t\t\treturn getWorkflowPermissions(this.currentUser, this.data);\n\t\t},\n\t\tactions(): Array<{ label: string; value: string }> {\n\t\t\tconst actions = [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.open'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.OPEN,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.share'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.SHARE,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (!this.readOnly) {\n\t\t\t\tactions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.duplicate'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.DUPLICATE,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.workflowPermissions.delete && !this.readOnly) {\n\t\t\t\tactions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.item.delete'),\n\t\t\t\t\tvalue: WORKFLOW_LIST_ITEM_ACTIONS.DELETE,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn actions;\n\t\t},\n\t\tformattedCreatedAtDate(): string {\n\t\t\tconst currentYear = new Date().getFullYear();\n\n\t\t\treturn dateformat(\n\t\t\t\tthis.data.createdAt,\n\t\t\t\t`d mmmm${this.data.createdAt.startsWith(currentYear) ? '' : ', yyyy'}`,\n\t\t\t);\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onClick(event?: KeyboardEvent | PointerEvent) {\n\t\t\tif (event?.ctrlKey || event?.metaKey) {\n\t\t\t\tconst route = this.$router.resolve({\n\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\tparams: { name: this.data.id },\n\t\t\t\t});\n\t\t\t\twindow.open(route.href, '_blank');\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.$router.push({\n\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\tparams: { name: this.data.id },\n\t\t\t});\n\t\t},\n\t\tonClickTag(tagId: string, event: PointerEvent) {\n\t\t\tevent.stopPropagation();\n\n\t\t\tthis.$emit('click:tag', tagId, event);\n\t\t},\n\t\tonExpandTags() {\n\t\t\tthis.$emit('expand:tags');\n\t\t},\n\t\tasync onAction(action: string) {\n\t\t\tif (action === WORKFLOW_LIST_ITEM_ACTIONS.OPEN) {\n\t\t\t\tawait this.onClick();\n\t\t\t} else if (action === WORKFLOW_LIST_ITEM_ACTIONS.DUPLICATE) {\n\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\tname: DUPLICATE_MODAL_KEY,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tid: this.data.id,\n\t\t\t\t\t\tname: this.data.name,\n\t\t\t\t\t\ttags: (this.data.tags || []).map((tag: ITag) => tag.id),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else if (action === WORKFLOW_LIST_ITEM_ACTIONS.SHARE) {\n\t\t\t\tthis.uiStore.openModalWithData({\n\t\t\t\t\tname: WORKFLOW_SHARE_MODAL_KEY,\n\t\t\t\t\tdata: { id: this.data.id },\n\t\t\t\t});\n\n\t\t\t\tthis.$telemetry.track('User opened sharing modal', {\n\t\t\t\t\tworkflow_id: this.data.id,\n\t\t\t\t\tuser_id_sharer: this.currentUser.id,\n\t\t\t\t\tsub_view: this.$route.name === VIEWS.WORKFLOWS ? 'Workflows listing' : 'Workflow editor',\n\t\t\t\t});\n\t\t\t} else if (action === WORKFLOW_LIST_ITEM_ACTIONS.DELETE) {\n\t\t\t\tconst deleteConfirmed = await this.confirm(\n\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.message', {\n\t\t\t\t\t\tinterpolate: { workflowName: this.data.name },\n\t\t\t\t\t}),\n\t\t\t\t\tthis.$locale.baseText('mainSidebar.confirmMessage.workflowDelete.headline'),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.confirmButtonText',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.cancelButtonText',\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (deleteConfirmed !== MODAL_CONFIRM) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait this.workflowsStore.deleteWorkflow(this.data.id);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.showError(error, this.$locale.baseText('generic.deleteWorkflowError'));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Reset tab title since workflow is deleted.\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('mainSidebar.showMessage.handleSelect1.title'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.cardLink {\n\ttransition: box-shadow 0.3s ease;\n\tcursor: pointer;\n\tpadding: 0;\n\talign-items: stretch;\n\n\t&:hover {\n\t\tbox-shadow: 0 2px 8px rgba(#441c17, 0.1);\n\t}\n}\n\n.cardHeading {\n\tfont-size: var(--font-size-s);\n\tword-break: break-word;\n\tpadding: var(--spacing-s) 0 0 var(--spacing-s);\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s) var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type PropType, computed } from 'vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { ITemplatesCollection, ITemplatesNode, SuggestedTemplatesSection } from '@/Interface';\nimport TemplatesInfoCarousel from '@/components/TemplatesInfoCarousel.vue';\nimport { SUGGESTED_TEMPLATES_PREVIEW_MODAL_KEY } from '@/constants';\n\nconst uiStore = useUIStore();\nconst telemetry = useTelemetry();\n\nconst props = defineProps({\n\tsection: {\n\t\ttype: Object as PropType<SuggestedTemplatesSection>,\n\t\trequired: true,\n\t},\n\ttitle: {\n\t\ttype: String as PropType<string>,\n\t\trequired: false,\n\t},\n\tshowTitle: {\n\t\ttype: Boolean as PropType<boolean>,\n\t\tdefault: true,\n\t},\n});\n\nconst sectionTemplates = computed(() => {\n\tconst carouselCollections = Array<ITemplatesCollection>();\n\tif (!uiStore.suggestedTemplates) {\n\t\treturn carouselCollections;\n\t}\n\tprops.section.workflows.forEach((workflow, index) => {\n\t\tcarouselCollections.push({\n\t\t\tid: index,\n\t\t\tname: workflow.title,\n\t\t\tworkflows: [{ id: index }],\n\t\t\tnodes: workflow.nodes as ITemplatesNode[],\n\t\t});\n\t});\n\treturn carouselCollections;\n});\n\nfunction onOpenCollection({ id }: { event: Event; id: number }) {\n\tuiStore.openModalWithData({\n\t\tname: SUGGESTED_TEMPLATES_PREVIEW_MODAL_KEY,\n\t\tdata: { workflow: props.section.workflows[id] },\n\t});\n\ttelemetry.track(\n\t\t'User clicked template recommendation',\n\t\t{ templateName: props.section.workflows[id].title },\n\t\t{ withPostHog: true },\n\t);\n}\n</script>\n\n<template>\n\t<div :class=\"$style.container\" data-test-id=\"suggested-templates-section-container\">\n\t\t<div v-if=\"showTitle\" :class=\"$style.header\">\n\t\t\t<n8n-text size=\"large\" color=\"text-base\" :bold=\"true\">\n\t\t\t\t{{ props.title ?? section.title }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div :class=\"$style.content\">\n\t\t\t<TemplatesInfoCarousel\n\t\t\t\t:collections=\"sectionTemplates\"\n\t\t\t\t:loading=\"false\"\n\t\t\t\t:show-item-count=\"false\"\n\t\t\t\t:show-navigation=\"false\"\n\t\t\t\tcards-width=\"24%\"\n\t\t\t\t@openCollection=\"onOpenCollection\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-l);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router';\nimport { computed } from 'vue';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { VIEWS } from '@/constants';\nimport type { ITemplatesCollection, IUser } from '@/Interface';\nimport SuggestedTemplatesSection from '@/components/SuggestedTemplates/SuggestedTemplatesSection.vue';\n\nconst usersStore = useUsersStore();\nconst uiStore = useUIStore();\nconst router = useRouter();\n\nconst currentUser = computed(() => usersStore.currentUser);\n\nconst upperCaseFirstName = (user: IUser | null) => {\n\tif (!user?.firstName) return;\n\treturn user.firstName?.charAt(0)?.toUpperCase() + user?.firstName?.slice(1);\n};\n\nconst defaultSection = computed(() => {\n\tif (!uiStore.suggestedTemplates) {\n\t\treturn null;\n\t}\n\treturn uiStore.suggestedTemplates.sections[0];\n});\n\nconst suggestedTemplates = computed(() => {\n\tconst carouselCollections = Array<ITemplatesCollection>();\n\tif (!uiStore.suggestedTemplates || !defaultSection.value) {\n\t\treturn carouselCollections;\n\t}\n\tdefaultSection.value.workflows.forEach((workflow, index) => {\n\t\tcarouselCollections.push({\n\t\t\tid: index,\n\t\t\tname: workflow.title,\n\t\t\tworkflows: [{ id: index }],\n\t\t\tnodes: workflow.nodes,\n\t\t});\n\t});\n\treturn carouselCollections;\n});\n\nfunction openCanvas() {\n\tuiStore.nodeViewInitialized = false;\n\tvoid router.push({ name: VIEWS.NEW_WORKFLOW });\n}\n\ndefineExpose({\n\tcurrentUser,\n\topenCanvas,\n\tsuggestedTemplates,\n});\n</script>\n\n<template>\n\t<div :class=\"$style.container\" data-test-id=\"suggested-templates-page-container\">\n\t\t<div :class=\"$style.header\">\n\t\t\t<n8n-heading tag=\"h1\" size=\"2xlarge\" class=\"mb-2xs\">\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('suggestedTemplates.heading', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tname: upperCaseFirstName(currentUser) || $locale.baseText('generic.welcome'),\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-heading>\n\t\t\t<n8n-text\n\t\t\t\tsize=\"large\"\n\t\t\t\tcolor=\"text-base\"\n\t\t\t\tdata-test-id=\"suggested-template-section-description\"\n\t\t\t>\n\t\t\t\t{{ defaultSection?.description }}\n\t\t\t</n8n-text>\n\t\t</div>\n\t\t<div :class=\"$style.content\">\n\t\t\t<SuggestedTemplatesSection\n\t\t\t\tv-for=\"section in uiStore.suggestedTemplates?.sections\"\n\t\t\t\t:key=\"section.title\"\n\t\t\t\t:section=\"section\"\n\t\t\t\t:show-title=\"false\"\n\t\t\t/>\n\t\t</div>\n\t\t<div>\n\t\t\t<n8n-button\n\t\t\t\t:label=\"$locale.baseText('suggestedTemplates.newWorkflowButton')\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t\tsize=\"medium\"\n\t\t\t\ticon=\"plus\"\n\t\t\t\tdata-test-id=\"suggested-templates-new-workflow-button\"\n\t\t\t\t@click=\"openCanvas\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-l);\n}\n\n.header {\n\tmargin-bottom: var(--spacing-l);\n}\n</style>\n","<template>\n\t<ResourcesListLayout\n\t\tref=\"layout\"\n\t\tresource-key=\"workflows\"\n\t\t:resources=\"allWorkflows\"\n\t\t:filters=\"filters\"\n\t\t:additional-filters-handler=\"onFilter\"\n\t\t:type-props=\"{ itemSize: 80 }\"\n\t\t:show-aside=\"allWorkflows.length > 0\"\n\t\t:shareable=\"isShareable\"\n\t\t:initialize=\"initialize\"\n\t\t:disabled=\"readOnlyEnv\"\n\t\t@click:add=\"addWorkflow\"\n\t\t@update:filters=\"onFiltersUpdated\"\n\t>\n\t\t<template #add-button=\"{ disabled }\">\n\t\t\t<n8n-tooltip :disabled=\"!readOnlyEnv\">\n\t\t\t\t<div>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tblock\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t\t@click=\"addWorkflow\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText(`workflows.add`) }}\n\t\t\t\t\t</n8n-button>\n\t\t\t\t</div>\n\t\t\t\t<template #content>\n\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"mainSidebar.workflows.readOnlyEnv.tooltip\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a target=\"_blank\" href=\"https://docs.n8n.io/source-control-environments/\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('mainSidebar.workflows.readOnlyEnv.tooltip.link') }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</template>\n\t\t\t</n8n-tooltip>\n\t\t</template>\n\t\t<template #default=\"{ data, updateItemSize }\">\n\t\t\t<WorkflowCard\n\t\t\t\tdata-test-id=\"resources-list-item\"\n\t\t\t\tclass=\"mb-2xs\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t:read-only=\"readOnlyEnv\"\n\t\t\t\t@expand:tags=\"updateItemSize(data)\"\n\t\t\t\t@click:tag=\"onClickTag\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #postListContent>\n\t\t\t<SuggestedTemplatesSection\n\t\t\t\tv-for=\"(section, key) in suggestedTemplates?.sections\"\n\t\t\t\t:key=\"key\"\n\t\t\t\t:section=\"section\"\n\t\t\t\t:title=\"\n\t\t\t\t\t$locale.baseText('suggestedTemplates.sectionTitle', {\n\t\t\t\t\t\tinterpolate: { sectionName: section.name.toLocaleLowerCase() },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #empty>\n\t\t\t<SuggestedTemplatesPage v-if=\"suggestedTemplates\" />\n\t\t\t<div v-else>\n\t\t\t\t<div class=\"text-center mt-s\">\n\t\t\t\t\t<n8n-heading tag=\"h2\" size=\"xlarge\" class=\"mb-2xs\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\tcurrentUser.firstName\n\t\t\t\t\t\t\t\t\t? 'workflows.empty.heading'\n\t\t\t\t\t\t\t\t\t: 'workflows.empty.heading.userNotSetup',\n\t\t\t\t\t\t\t\t{ interpolate: { name: currentUser.firstName } },\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-heading>\n\t\t\t\t\t<n8n-text size=\"large\" color=\"text-base\">\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\treadOnlyEnv\n\t\t\t\t\t\t\t\t\t? 'workflows.empty.description.readOnlyEnv'\n\t\t\t\t\t\t\t\t\t: 'workflows.empty.description',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"!readOnlyEnv\" :class=\"['text-center', 'mt-2xl', $style.actionsContainer]\">\n\t\t\t\t\t<n8n-card\n\t\t\t\t\t\t:class=\"$style.emptyStateCard\"\n\t\t\t\t\t\thoverable\n\t\t\t\t\t\tdata-test-id=\"new-workflow-card\"\n\t\t\t\t\t\t@click=\"addWorkflow\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-icon :class=\"$style.emptyStateCardIcon\" icon=\"file\" />\n\t\t\t\t\t\t<n8n-text size=\"large\" class=\"mt-xs\" color=\"text-base\">\n\t\t\t\t\t\t\t{{ $locale.baseText('workflows.empty.startFromScratch') }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</n8n-card>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #filters=\"{ setKeyValue }\">\n\t\t\t<div v-if=\"settingsStore.areTagsEnabled\" class=\"mb-s\">\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('workflows.filters.tags')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<TagsDropdown\n\t\t\t\t\t:placeholder=\"$locale.baseText('workflowOpen.filterWorkflows')\"\n\t\t\t\t\t:model-value=\"filters.tags\"\n\t\t\t\t\t:create-enabled=\"false\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('tags', $event)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"mb-s\">\n\t\t\t\t<n8n-input-label\n\t\t\t\t\t:label=\"$locale.baseText('workflows.filters.status')\"\n\t\t\t\t\t:bold=\"false\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tcolor=\"text-base\"\n\t\t\t\t\tclass=\"mb-3xs\"\n\t\t\t\t/>\n\t\t\t\t<n8n-select\n\t\t\t\t\tdata-test-id=\"status-dropdown\"\n\t\t\t\t\t:model-value=\"filters.status\"\n\t\t\t\t\t@update:modelValue=\"setKeyValue('status', $event)\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"option in statusFilterOptions\"\n\t\t\t\t\t\t:key=\"option.label\"\n\t\t\t\t\t\t:label=\"option.label\"\n\t\t\t\t\t\t:value=\"option.value\"\n\t\t\t\t\t\tdata-test-id=\"status\"\n\t\t\t\t\t>\n\t\t\t\t\t</n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</template>\n\t</ResourcesListLayout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport WorkflowCard from '@/components/WorkflowCard.vue';\nimport { EnterpriseEditionFeature, VIEWS } from '@/constants';\nimport type { ITag, IUser, IWorkflowDb } from '@/Interface';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport SuggestedTemplatesPage from '@/components/SuggestedTemplates/SuggestedTemplatesPage.vue';\nimport SuggestedTemplatesSection from '@/components/SuggestedTemplates/SuggestedTemplatesSection.vue';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useTagsStore } from '@/stores/tags.store';\n\ntype IResourcesListLayoutInstance = InstanceType<typeof ResourcesListLayout>;\n\ninterface Filters {\n\tsearch: string;\n\townedBy: string;\n\tsharedWith: string;\n\tstatus: string | boolean;\n\ttags: string[];\n}\n\nconst StatusFilter = {\n\tACTIVE: true,\n\tDEACTIVATED: false,\n\tALL: '',\n};\n\nconst WorkflowsView = defineComponent({\n\tname: 'WorkflowsView',\n\tcomponents: {\n\t\tResourcesListLayout,\n\t\tWorkflowCard,\n\t\tTagsDropdown,\n\t\tSuggestedTemplatesPage,\n\t\tSuggestedTemplatesSection,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfilters: {\n\t\t\t\tsearch: '',\n\t\t\t\townedBy: '',\n\t\t\t\tsharedWith: '',\n\t\t\t\tstatus: StatusFilter.ALL as string | boolean,\n\t\t\t\ttags: [] as string[],\n\t\t\t},\n\t\t\tsourceControlStoreUnsubscribe: () => {},\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseSettingsStore,\n\t\t\tuseUIStore,\n\t\t\tuseUsersStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseTagsStore,\n\t\t),\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tcurrentUser(): IUser {\n\t\t\treturn this.usersStore.currentUser || ({} as IUser);\n\t\t},\n\t\tallWorkflows(): IWorkflowDb[] {\n\t\t\treturn this.workflowsStore.allWorkflows;\n\t\t},\n\t\tisShareable(): boolean {\n\t\t\treturn this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing);\n\t\t},\n\t\tstatusFilterOptions(): Array<{ label: string; value: string | boolean }> {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.filters.status.all'),\n\t\t\t\t\tvalue: StatusFilter.ALL,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.filters.status.active'),\n\t\t\t\t\tvalue: StatusFilter.ACTIVE,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('workflows.filters.status.deactivated'),\n\t\t\t\t\tvalue: StatusFilter.DEACTIVATED,\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tsuggestedTemplates() {\n\t\t\treturn this.uiStore.suggestedTemplates;\n\t\t},\n\t},\n\twatch: {\n\t\t'filters.tags'() {\n\t\t\tthis.sendFiltersTelemetry('tags');\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.setFiltersFromQueryString();\n\n\t\tvoid this.usersStore.showPersonalizationSurvey();\n\n\t\tthis.sourceControlStoreUnsubscribe = this.sourceControlStore.$onAction(({ name, after }) => {\n\t\t\tif (name === 'pullWorkfolder' && after) {\n\t\t\t\tafter(() => {\n\t\t\t\t\tvoid this.initialize();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\tbeforeUnmount() {\n\t\tthis.sourceControlStoreUnsubscribe();\n\t},\n\tmethods: {\n\t\tonFiltersUpdated(filters: Filters) {\n\t\t\tthis.filters = filters;\n\t\t\tthis.saveFiltersOnQueryString();\n\t\t},\n\t\taddWorkflow() {\n\t\t\tthis.uiStore.nodeViewInitialized = false;\n\t\t\tvoid this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\n\t\t\tthis.$telemetry.track('User clicked add workflow button', {\n\t\t\t\tsource: 'Workflows list',\n\t\t\t});\n\t\t},\n\t\tasync initialize() {\n\t\t\tawait Promise.all([\n\t\t\t\tthis.usersStore.fetchUsers(),\n\t\t\t\tthis.workflowsStore.fetchAllWorkflows(),\n\t\t\t\tthis.workflowsStore.fetchActiveWorkflows(),\n\t\t\t\tthis.credentialsStore.fetchAllCredentials(),\n\t\t\t]);\n\t\t},\n\t\tonClickTag(tagId: string, event: PointerEvent) {\n\t\t\tif (!this.filters.tags.includes(tagId)) {\n\t\t\t\tthis.filters.tags.push(tagId);\n\t\t\t}\n\t\t},\n\t\tonFilter(\n\t\t\tresource: IWorkflowDb,\n\t\t\tfilters: { tags: string[]; search: string; status: string | boolean },\n\t\t\tmatches: boolean,\n\t\t): boolean {\n\t\t\tif (this.settingsStore.areTagsEnabled && filters.tags.length > 0) {\n\t\t\t\tmatches =\n\t\t\t\t\tmatches &&\n\t\t\t\t\tfilters.tags.every(\n\t\t\t\t\t\t(tag) =>\n\t\t\t\t\t\t\t(resource.tags as ITag[])?.find((resourceTag) =>\n\t\t\t\t\t\t\t\ttypeof resourceTag === 'object'\n\t\t\t\t\t\t\t\t\t? `${resourceTag.id}` === `${tag}`\n\t\t\t\t\t\t\t\t\t: `${resourceTag}` === `${tag}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (filters.status !== '') {\n\t\t\t\tmatches = matches && resource.active === filters.status;\n\t\t\t}\n\n\t\t\treturn matches;\n\t\t},\n\t\tsendFiltersTelemetry(source: string) {\n\t\t\t(this.$refs.layout as IResourcesListLayoutInstance).sendFiltersTelemetry(source);\n\t\t},\n\t\tsaveFiltersOnQueryString() {\n\t\t\tconst query: { [key: string]: string } = {};\n\n\t\t\tif (this.filters.search) {\n\t\t\t\tquery.search = this.filters.search;\n\t\t\t}\n\n\t\t\tif (typeof this.filters.status !== 'string') {\n\t\t\t\tquery.status = this.filters.status.toString();\n\t\t\t}\n\n\t\t\tif (this.filters.tags.length) {\n\t\t\t\tquery.tags = this.filters.tags.join(',');\n\t\t\t}\n\n\t\t\tif (this.filters.ownedBy) {\n\t\t\t\tquery.ownedBy = this.filters.ownedBy;\n\t\t\t}\n\n\t\t\tif (this.filters.sharedWith) {\n\t\t\t\tquery.sharedWith = this.filters.sharedWith;\n\t\t\t}\n\n\t\t\tvoid this.$router.replace({\n\t\t\t\tquery: Object.keys(query).length ? query : undefined,\n\t\t\t});\n\t\t},\n\t\tisValidUserId(userId: string) {\n\t\t\treturn Object.keys(this.usersStore.users).includes(userId);\n\t\t},\n\t\tsetFiltersFromQueryString() {\n\t\t\tconst { tags, status, search, ownedBy, sharedWith } = this.$route.query;\n\n\t\t\tconst filtersToApply: { [key: string]: string | string[] | boolean } = {};\n\n\t\t\tif (ownedBy && typeof ownedBy === 'string' && this.isValidUserId(ownedBy)) {\n\t\t\t\tfiltersToApply.ownedBy = ownedBy;\n\t\t\t}\n\n\t\t\tif (sharedWith && typeof sharedWith === 'string' && this.isValidUserId(sharedWith)) {\n\t\t\t\tfiltersToApply.sharedWith = sharedWith;\n\t\t\t}\n\n\t\t\tif (search && typeof search === 'string') {\n\t\t\t\tfiltersToApply.search = search;\n\t\t\t}\n\n\t\t\tif (tags && typeof tags === 'string') {\n\t\t\t\tconst currentTags = this.tagsStore.allTags.map((tag) => tag.id);\n\t\t\t\tconst savedTags = tags.split(',').filter((tag) => currentTags.includes(tag));\n\t\t\t\tif (savedTags.length) {\n\t\t\t\t\tfiltersToApply.tags = savedTags;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstatus &&\n\t\t\t\ttypeof status === 'string' &&\n\t\t\t\t[StatusFilter.ACTIVE.toString(), StatusFilter.DEACTIVATED.toString()].includes(status)\n\t\t\t) {\n\t\t\t\tfiltersToApply.status = status === 'true';\n\t\t\t}\n\n\t\t\tif (Object.keys(filtersToApply).length) {\n\t\t\t\tthis.filters = {\n\t\t\t\t\t...this.filters,\n\t\t\t\t\t...filtersToApply,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t},\n});\n\nexport default WorkflowsView;\n</script>\n\n<style lang=\"scss\" module>\n.actionsContainer {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.emptyStateCard {\n\twidth: 192px;\n\ttext-align: center;\n\tdisplay: inline-flex;\n\theight: 230px;\n\n\t& + & {\n\t\tmargin-left: var(--spacing-s);\n\t}\n\n\t&:hover {\n\t\tsvg {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n\n.emptyStateCardIcon {\n\tfont-size: 48px;\n\n\tsvg {\n\t\twidth: 48px !important;\n\t\tcolor: var(--color-foreground-dark);\n\t\ttransition: color 0.3s ease;\n\t}\n}\n</style>\n"],"names":["WORKFLOW_LIST_ITEM_ACTIONS","_sfc_main$3","defineComponent","TimeAgo","WorkflowActivator","useToast","useMessage","EnterpriseEditionFeature","mapStores","useSettingsStore","useUIStore","useUsersStore","useWorkflowsStore","getWorkflowPermissions","actions","currentYear","dateformat","event","route","VIEWS","tagId","action","DUPLICATE_MODAL_KEY","tag","WORKFLOW_SHARE_MODAL_KEY","MODAL_CONFIRM","error","_resolveComponent","_openBlock","_createBlock","_component_n8n_card","_normalizeClass","_ctx","_withCtx","_createVNode","_component_n8n_heading","_createTextVNode","_toDisplayString","_createElementVNode","_cache","_withModifiers","_component_n8n_badge","_createCommentVNode","_component_WorkflowActivator","_component_n8n_action_toggle","_component_n8n_text","_withDirectives","_component_TimeAgo","data","_vShow","settingsStore","_createElementBlock","_hoisted_1","_component_n8n_tags","onExpandTags","uiStore","telemetry","useTelemetry","props","__props","sectionTemplates","computed","carouselCollections","workflow","index","onOpenCollection","id","SUGGESTED_TEMPLATES_PREVIEW_MODAL_KEY","usersStore","router","useRouter","currentUser","upperCaseFirstName","user","_b","_a","_c","defaultSection","suggestedTemplates","openCanvas","__expose","StatusFilter","WorkflowsView","ResourcesListLayout","WorkflowCard","TagsDropdown","SuggestedTemplatesPage","SuggestedTemplatesSection","useCredentialsStore","useSourceControlStore","useTagsStore","name","after","filters","resource","matches","resourceTag","source","query","userId","tags","status","search","ownedBy","sharedWith","filtersToApply","currentTags","savedTags","_sfc_main","_hoisted_3","_hoisted_4","_component_ResourcesListLayout","allWorkflows","isShareable","initialize","readOnlyEnv","addWorkflow","disabled","_component_n8n_tooltip","_component_i18n_t","_component_n8n_button","updateItemSize","_component_WorkflowCard","onClickTag","_Fragment","_renderList","section","key","_component_SuggestedTemplatesSection","$locale","_component_SuggestedTemplatesPage","_hoisted_2","_component_n8n_icon","setKeyValue","_component_n8n_input_label","_component_TagsDropdown","_hoisted_5","_component_n8n_select","$event","option","_component_n8n_option"],"mappings":"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"}
|