n8n-editor-ui 1.44.0 → 1.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +77 -77
- package/dist/assets/{AuthView-1FRMwQ3r.js → AuthView-DfyvaM6i.js} +2 -2
- package/dist/assets/{AuthView-1FRMwQ3r.js.map → AuthView-DfyvaM6i.js.map} +1 -1
- package/dist/assets/{CanvasControls-FCzUEVOQ.js → CanvasControls-DFdnF5qb.js} +2 -2
- package/dist/assets/{CanvasControls-FCzUEVOQ.js.map → CanvasControls-DFdnF5qb.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-DdWHauKg.js → ChangePasswordView-B4v8DwW9.js} +2 -2
- package/dist/assets/{ChangePasswordView-DdWHauKg.js.map → ChangePasswordView-B4v8DwW9.js.map} +1 -1
- package/dist/assets/{CollectionParameter-CiMzJaXg.js → CollectionParameter-5V5xJsjs.js} +2 -2
- package/dist/assets/CollectionParameter-5V5xJsjs.js.map +1 -0
- package/dist/assets/{CredentialsView-Bn6PVi9E.js → CredentialsView-tyjXlz4Z.js} +2 -2
- package/dist/assets/{CredentialsView-Bn6PVi9E.js.map → CredentialsView-tyjXlz4Z.js.map} +1 -1
- package/dist/assets/{ExecutionsFilter-nFboBzV2.js → ExecutionsFilter-0t_omffh.js} +2 -2
- package/dist/assets/{ExecutionsFilter-nFboBzV2.js.map → ExecutionsFilter-0t_omffh.js.map} +1 -1
- package/dist/assets/{ExecutionsView-CbkLSsSW.js → ExecutionsView-DzCvkqXG.js} +2 -2
- package/dist/assets/{ExecutionsView-CbkLSsSW.js.map → ExecutionsView-DzCvkqXG.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-vPMSx22g.js → ForgotMyPasswordView-D_90K80j.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-vPMSx22g.js.map → ForgotMyPasswordView-D_90K80j.js.map} +1 -1
- package/dist/assets/{MainHeader-DedFNVir.js → MainHeader-BYoa1H_e.js} +2 -2
- package/dist/assets/{MainHeader-DedFNVir.js.map → MainHeader-BYoa1H_e.js.map} +1 -1
- package/dist/assets/{MainSidebar-BNq07OnD.js → MainSidebar-BNsdraIv.js} +2 -2
- package/dist/assets/{MainSidebar-BNq07OnD.js.map → MainSidebar-BNsdraIv.js.map} +1 -1
- package/dist/assets/{NodeCreation-C0AAIhNs.js → NodeCreation-R9yLdNU1.js} +3 -3
- package/dist/assets/{NodeCreation-C0AAIhNs.js.map → NodeCreation-R9yLdNU1.js.map} +1 -1
- package/dist/assets/{NodeCreator-ESjCn1LZ.js → NodeCreator-CLzfNOJ5.js} +2 -2
- package/dist/assets/{NodeCreator-ESjCn1LZ.js.map → NodeCreator-CLzfNOJ5.js.map} +1 -1
- package/dist/assets/{NodeList-baCRAzNs.js → NodeList-B4yRfzDq.js} +2 -2
- package/dist/assets/{NodeList-baCRAzNs.js.map → NodeList-B4yRfzDq.js.map} +1 -1
- package/dist/assets/{NodeView-BucVYztm.js → NodeView-BGtpd_Bb.js} +4 -4
- package/dist/assets/{NodeView-BucVYztm.js.map → NodeView-BGtpd_Bb.js.map} +1 -1
- package/dist/assets/{NodeView.v2-Oz2vwdfG.js → NodeView.v2-DnTCsiDE.js} +3 -3
- package/dist/assets/{NodeView.v2-Oz2vwdfG.js.map → NodeView.v2-DnTCsiDE.js.map} +1 -1
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BRGRmswR.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-CYFr8_zj.js} +2 -2
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BRGRmswR.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-CYFr8_zj.js.map} +1 -1
- package/dist/assets/{ProjectSettings-D3FAGvAm.js → ProjectSettings-kayD4yS7.js} +2 -2
- package/dist/assets/{ProjectSettings-D3FAGvAm.js.map → ProjectSettings-kayD4yS7.js.map} +1 -1
- package/dist/assets/{ProjectTabs-B_U7Q16t.js → ProjectTabs-1jmisSQb.js} +2 -2
- package/dist/assets/{ProjectTabs-B_U7Q16t.js.map → ProjectTabs-1jmisSQb.js.map} +1 -1
- package/dist/assets/{PushConnectionTracker-DQVvJ6kh.js → PushConnectionTracker-Dfvjg1ts.js} +2 -2
- package/dist/assets/{PushConnectionTracker-DQVvJ6kh.js.map → PushConnectionTracker-Dfvjg1ts.js.map} +1 -1
- package/dist/assets/{ResourcesListLayout-CfzMCzp5.js → ResourcesListLayout-BOYOLez8.js} +2 -2
- package/dist/assets/{ResourcesListLayout-CfzMCzp5.js.map → ResourcesListLayout-BOYOLez8.js.map} +1 -1
- package/dist/assets/{RunDataAi-CwnKkFZ1.js → RunDataAi-CFKU0i2R.js} +2 -2
- package/dist/assets/{RunDataAi-CwnKkFZ1.js.map → RunDataAi-CFKU0i2R.js.map} +1 -1
- package/dist/assets/{RunDataJson-DTMT_R5P.js → RunDataJson-DHI409Ix.js} +3 -3
- package/dist/assets/{RunDataJson-DTMT_R5P.js.map → RunDataJson-DHI409Ix.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-dNlM_YO3.js → RunDataJsonActions-LAsoJBBD.js} +2 -2
- package/dist/assets/{RunDataJsonActions-dNlM_YO3.js.map → RunDataJsonActions-LAsoJBBD.js.map} +1 -1
- package/dist/assets/{RunDataSchema-D7rSFQ4v.js → RunDataSchema-CgYDgOLN.js} +2 -2
- package/dist/assets/{RunDataSchema-D7rSFQ4v.js.map → RunDataSchema-CgYDgOLN.js.map} +1 -1
- package/dist/assets/{RunDataSearch-BLxgvPWc.js → RunDataSearch-ZJd98FoH.js} +2 -2
- package/dist/assets/{RunDataSearch-BLxgvPWc.js.map → RunDataSearch-ZJd98FoH.js.map} +1 -1
- package/dist/assets/{RunDataTable-CTYOMGVf.js → RunDataTable-IMqti3UV.js} +2 -2
- package/dist/assets/{RunDataTable-CTYOMGVf.js.map → RunDataTable-IMqti3UV.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-B0SKUJ7w.js → SamlOnboarding-6S1cZAZQ.js} +2 -2
- package/dist/assets/{SamlOnboarding-B0SKUJ7w.js.map → SamlOnboarding-6S1cZAZQ.js.map} +1 -1
- package/dist/assets/{SettingsApiView-04CpGWS3.js → SettingsApiView-DzACRdqO.js} +2 -2
- package/dist/assets/{SettingsApiView-04CpGWS3.js.map → SettingsApiView-DzACRdqO.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-CNryAAn3.js → SettingsCommunityNodesView-DI8tm65K.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-CNryAAn3.js.map → SettingsCommunityNodesView-DI8tm65K.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-B39P4p2-.js → SettingsExternalSecrets-DFb1WNlI.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-B39P4p2-.js.map → SettingsExternalSecrets-DFb1WNlI.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-BOQAY92v.js → SettingsFakeDoorView-CDAZibIu.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-BOQAY92v.js.map → SettingsFakeDoorView-CDAZibIu.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-VTF-EB0a.js → SettingsLdapView-yXjpScE1.js} +2 -2
- package/dist/assets/{SettingsLdapView-VTF-EB0a.js.map → SettingsLdapView-yXjpScE1.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-JsodKkoJ.js → SettingsLogStreamingView-DQTUJczt.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-JsodKkoJ.js.map → SettingsLogStreamingView-DQTUJczt.js.map} +1 -1
- package/dist/assets/{SettingsPersonalView-DxQ-hHrk.js → SettingsPersonalView-CYfSdpu7.js} +2 -2
- package/dist/assets/{SettingsPersonalView-DxQ-hHrk.js.map → SettingsPersonalView-CYfSdpu7.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-aqaWVYCl.js → SettingsSourceControl-SrxQOR5H.js} +2 -2
- package/dist/assets/{SettingsSourceControl-aqaWVYCl.js.map → SettingsSourceControl-SrxQOR5H.js.map} +1 -1
- package/dist/assets/{SettingsSso-Chwn0xrx.js → SettingsSso-DrB162SI.js} +2 -2
- package/dist/assets/{SettingsSso-Chwn0xrx.js.map → SettingsSso-DrB162SI.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-CIj5SQKn.js → SettingsUsageAndPlan-vOGNFMVq.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-CIj5SQKn.js.map → SettingsUsageAndPlan-vOGNFMVq.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-CY4kSRaG.js → SettingsUsersView-Tx1-g18F.js} +2 -2
- package/dist/assets/{SettingsUsersView-CY4kSRaG.js.map → SettingsUsersView-Tx1-g18F.js.map} +1 -1
- package/dist/assets/{SettingsView-jgK3_oOB.js → SettingsView-BOZ2SBsQ.js} +2 -2
- package/dist/assets/{SettingsView-jgK3_oOB.js.map → SettingsView-BOZ2SBsQ.js.map} +1 -1
- package/dist/assets/{SetupView-O6xv77jO.js → SetupView-DY7tVzgF.js} +2 -2
- package/dist/assets/{SetupView-O6xv77jO.js.map → SetupView-DY7tVzgF.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-oGzzXD7H.js → SetupWorkflowCredentialsButton-B9Acgowu.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-oGzzXD7H.js.map → SetupWorkflowCredentialsButton-B9Acgowu.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-BDUp9JWx.js → SetupWorkflowFromTemplateView-C2E8A8g4.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-BDUp9JWx.js.map → SetupWorkflowFromTemplateView-C2E8A8g4.js.map} +1 -1
- package/dist/assets/{SigninView-BLgTm7p4.js → SigninView-DlT1Bv9l.js} +2 -2
- package/dist/assets/{SigninView-BLgTm7p4.js.map → SigninView-DlT1Bv9l.js.map} +1 -1
- package/dist/assets/{SignoutView-DFSKFmE2.js → SignoutView-DisgJoQS.js} +2 -2
- package/dist/assets/{SignoutView-DFSKFmE2.js.map → SignoutView-DisgJoQS.js.map} +1 -1
- package/dist/assets/{SignupView-DSmDdbRA.js → SignupView-CQZSGNCi.js} +2 -2
- package/dist/assets/{SignupView-DSmDdbRA.js.map → SignupView-CQZSGNCi.js.map} +1 -1
- package/dist/assets/{TemplateDetails-DW6dTHAk.js → TemplateDetails-DZzMxROe.js} +2 -2
- package/dist/assets/{TemplateDetails-DW6dTHAk.js.map → TemplateDetails-DZzMxROe.js.map} +1 -1
- package/dist/assets/{TemplateList-DHLgDv5f.js → TemplateList-DS0lnbxA.js} +2 -2
- package/dist/assets/{TemplateList-DHLgDv5f.js.map → TemplateList-DS0lnbxA.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-Bix3khnw.js → TemplatesCollectionView-BMck3jn9.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-Bix3khnw.js.map → TemplatesCollectionView-BMck3jn9.js.map} +1 -1
- package/dist/assets/{TemplatesInfoCarousel-B3u16wII.js → TemplatesInfoCarousel-BYIB7MKZ.js} +2 -2
- package/dist/assets/{TemplatesInfoCarousel-B3u16wII.js.map → TemplatesInfoCarousel-BYIB7MKZ.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-CvtrqPXg.js → TemplatesSearchView-aVpZ2G9F.js} +2 -2
- package/dist/assets/{TemplatesSearchView-CvtrqPXg.js.map → TemplatesSearchView-aVpZ2G9F.js.map} +1 -1
- package/dist/assets/{TemplatesView-DuT3R1EI.js → TemplatesView-CuyRlzAM.js} +2 -2
- package/dist/assets/{TemplatesView-DuT3R1EI.js.map → TemplatesView-CuyRlzAM.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-C_-zPrQW.js → TemplatesWorkflowView-DAa2SCYE.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-C_-zPrQW.js.map → TemplatesWorkflowView-DAa2SCYE.js.map} +1 -1
- package/dist/assets/{VariablesView-CMrDg4Fx.js → VariablesView-57BdyEmO.js} +2 -2
- package/dist/assets/{VariablesView-CMrDg4Fx.js.map → VariablesView-57BdyEmO.js.map} +1 -1
- package/dist/assets/{WorkerView-BcfdfxOO.js → WorkerView-BLv_CYeM.js} +2 -2
- package/dist/assets/{WorkerView-BcfdfxOO.js.map → WorkerView-BLv_CYeM.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-BiqeeeBc.js → WorkflowActivator-WjfZFpnK.js} +2 -2
- package/dist/assets/{WorkflowActivator-BiqeeeBc.js.map → WorkflowActivator-WjfZFpnK.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsInfoAccordion-CITQoihQ.js → WorkflowExecutionsInfoAccordion-Dv9rbNek.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-CITQoihQ.js.map → WorkflowExecutionsInfoAccordion-Dv9rbNek.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-CnHdLYgR.js → WorkflowExecutionsLandingPage-CsbJPayv.js} +2 -2
- package/dist/assets/{WorkflowExecutionsLandingPage-CnHdLYgR.js.map → WorkflowExecutionsLandingPage-CsbJPayv.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsPreview-By0_k6NX.js → WorkflowExecutionsPreview-xxP83pWI.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-By0_k6NX.js.map → WorkflowExecutionsPreview-xxP83pWI.js.map} +1 -1
- package/dist/assets/WorkflowExecutionsView-c7NCTwks.js +2 -0
- package/dist/assets/WorkflowExecutionsView-c7NCTwks.js.map +1 -0
- package/dist/assets/{WorkflowHistory-C5ALmvoB.js → WorkflowHistory-DI6sDGlZ.js} +2 -2
- package/dist/assets/{WorkflowHistory-C5ALmvoB.js.map → WorkflowHistory-DI6sDGlZ.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-hQxsQlm1.js → WorkflowOnboardingView-DVqrTjM4.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-hQxsQlm1.js.map → WorkflowOnboardingView-DVqrTjM4.js.map} +1 -1
- package/dist/assets/{WorkflowsView-TF6zcpi6.js → WorkflowsView-DpB66gWH.js} +2 -2
- package/dist/assets/{WorkflowsView-TF6zcpi6.js.map → WorkflowsView-DpB66gWH.js.map} +1 -1
- package/dist/assets/{cloud-CZc2nauc.js → cloud-bM1gshor.js} +2 -2
- package/dist/assets/{cloud-CZc2nauc.js.map → cloud-bM1gshor.js.map} +1 -1
- package/dist/assets/{collaboration.store-BkSXOsR4.js → collaboration.store-Ct7EpGqG.js} +2 -2
- package/dist/assets/{collaboration.store-BkSXOsR4.js.map → collaboration.store-Ct7EpGqG.js.map} +1 -1
- package/dist/assets/{index-CY2ZfL2U.js → index-BQ6Z7VRj.js} +4 -4
- package/dist/assets/{index-CY2ZfL2U.js.map → index-BQ6Z7VRj.js.map} +1 -1
- package/dist/assets/{nodeCreator.store-CmYeJsEL.js → nodeCreator.store-DAcGJEHy.js} +2 -2
- package/dist/assets/{nodeCreator.store-CmYeJsEL.js.map → nodeCreator.store-DAcGJEHy.js.map} +1 -1
- package/dist/assets/{templateActions-DvpFnju7.js → templateActions-F64sfZ3n.js} +2 -2
- package/dist/assets/{templateActions-DvpFnju7.js.map → templateActions-F64sfZ3n.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-6-sjTvWS.js → useExecutionDebugging-DuMp5DdQ.js} +2 -2
- package/dist/assets/{useExecutionDebugging-6-sjTvWS.js.map → useExecutionDebugging-DuMp5DdQ.js.map} +1 -1
- package/dist/assets/{useExecutionHelpers-BZpwMJs_.js → useExecutionHelpers-Dt-UJW97.js} +2 -2
- package/dist/assets/{useExecutionHelpers-BZpwMJs_.js.map → useExecutionHelpers-Dt-UJW97.js.map} +1 -1
- package/dist/assets/{usePushConnection-DI_JaC-X.js → usePushConnection-Kek6sJ0j.js} +2 -2
- package/dist/assets/{usePushConnection-DI_JaC-X.js.map → usePushConnection-Kek6sJ0j.js.map} +1 -1
- package/dist/assets/{useViewStacks-D-hnVv3F.js → useViewStacks-CSn_e3gA.js} +2 -2
- package/dist/assets/{useViewStacks-D-hnVv3F.js.map → useViewStacks-CSn_e3gA.js.map} +1 -1
- package/dist/assets/{useWorkflowActivate-lrYalAwm.js → useWorkflowActivate-Bl43vPgP.js} +2 -2
- package/dist/assets/{useWorkflowActivate-lrYalAwm.js.map → useWorkflowActivate-Bl43vPgP.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-CiMzJaXg.js.map +0 -1
- package/dist/assets/WorkflowExecutionsView-fiAM1R-f.js +0 -2
- package/dist/assets/WorkflowExecutionsView-fiAM1R-f.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialsView-Bn6PVi9E.js","sources":["../../src/components/CredentialCard.vue","../../src/views/CredentialsView.vue"],"sourcesContent":["<template>\n\t<n8n-card :class=\"$style.cardLink\" @click=\"onClick\">\n\t\t<template #prepend>\n\t\t\t<CredentialIcon :credential-type-name=\"credentialType ? credentialType.name : ''\" />\n\t\t</template>\n\t\t<template #header>\n\t\t\t<n8n-heading tag=\"h2\" bold :class=\"$style.cardHeading\">\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-if=\"credentialType\">{{ credentialType.displayName }} | </span>\n\t\t\t\t<span v-show=\"data\"\n\t\t\t\t\t>{{ $locale.baseText('credentials.item.updated') }} <TimeAgo :date=\"data.updatedAt\" /> |\n\t\t\t\t</span>\n\t\t\t\t<span v-show=\"data\"\n\t\t\t\t\t>{{ $locale.baseText('credentials.item.created') }} {{ formattedCreatedAtDate }}\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<ProjectCardBadge :resource=\"data\" :personal-project=\"projectsStore.personalProject\" />\n\t\t\t<div ref=\"cardActions\" :class=\"$style.cardActions\">\n\t\t\t\t<n8n-action-toggle :actions=\"actions\" theme=\"dark\" @action=\"onAction\" @click.stop />\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 { PropType } from 'vue';\nimport type { ICredentialsResponse, IUser } from '@/Interface';\nimport type { ICredentialType } from 'n8n-workflow';\nimport { MODAL_CONFIRM } from '@/constants';\nimport { useMessage } from '@/composables/useMessage';\nimport CredentialIcon from '@/components/CredentialIcon.vue';\nimport type { PermissionsMap } from '@/permissions';\nimport { getCredentialPermissions } from '@/permissions';\nimport dateformat from 'dateformat';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport TimeAgo from '@/components/TimeAgo.vue';\nimport type { ProjectSharingData } from '@/features/projects/projects.types';\nimport { useProjectsStore } from '@/features/projects/projects.store';\nimport type { CredentialScope } from '@n8n/permissions';\nimport ProjectCardBadge from '@/features/projects/components/ProjectCardBadge.vue';\n\nexport const CREDENTIAL_LIST_ITEM_ACTIONS = {\n\tOPEN: 'open',\n\tDELETE: 'delete',\n};\n\nexport default defineComponent({\n\tcomponents: {\n\t\tTimeAgo,\n\t\tCredentialIcon,\n\t\tProjectCardBadge,\n\t},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object as PropType<ICredentialsResponse>,\n\t\t\trequired: true,\n\t\t\tdefault: (): ICredentialsResponse => ({\n\t\t\t\tid: '',\n\t\t\t\tcreatedAt: '',\n\t\t\t\tupdatedAt: '',\n\t\t\t\ttype: '',\n\t\t\t\tname: '',\n\t\t\t\tnodesAccess: [],\n\t\t\t\tsharedWithProjects: [],\n\t\t\t\thomeProject: {} as ProjectSharingData,\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...useMessage(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useCredentialsStore, useUIStore, useUsersStore, useProjectsStore),\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tcredentialType(): ICredentialType | undefined {\n\t\t\treturn this.credentialsStore.getCredentialTypeByName(this.data.type);\n\t\t},\n\t\tcredentialPermissions(): PermissionsMap<CredentialScope> | null {\n\t\t\treturn !this.currentUser ? null : getCredentialPermissions(this.data);\n\t\t},\n\t\tactions(): Array<{ label: string; value: string }> {\n\t\t\tif (!this.credentialPermissions) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('credentials.item.open'),\n\t\t\t\t\tvalue: CREDENTIAL_LIST_ITEM_ACTIONS.OPEN,\n\t\t\t\t},\n\t\t\t].concat(\n\t\t\t\tthis.credentialPermissions.delete\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: this.$locale.baseText('credentials.item.delete'),\n\t\t\t\t\t\t\t\tvalue: CREDENTIAL_LIST_ITEM_ACTIONS.DELETE,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [],\n\t\t\t);\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: Event) {\n\t\t\tif (\n\t\t\t\tthis.$refs.cardActions === event.target ||\n\t\t\t\tthis.$refs.cardActions?.contains(event.target)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.uiStore.openExistingCredential(this.data.id);\n\t\t},\n\t\tasync onAction(action: string) {\n\t\t\tif (action === CREDENTIAL_LIST_ITEM_ACTIONS.OPEN) {\n\t\t\t\tawait this.onClick(new Event('click'));\n\t\t\t} else if (action === CREDENTIAL_LIST_ITEM_ACTIONS.DELETE) {\n\t\t\t\tconst deleteConfirmed = await this.confirm(\n\t\t\t\t\tthis.$locale.baseText(\n\t\t\t\t\t\t'credentialEdit.credentialEdit.confirmMessage.deleteCredential.message',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinterpolate: { savedCredentialName: this.data.name },\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t\tthis.$locale.baseText(\n\t\t\t\t\t\t'credentialEdit.credentialEdit.confirmMessage.deleteCredential.headline',\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t'credentialEdit.credentialEdit.confirmMessage.deleteCredential.confirmButtonText',\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\tawait this.credentialsStore.deleteCredential({ id: this.data.id });\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 0 0 var(--spacing-s);\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\tpadding: var(--spacing-s) 0 0;\n\n\tspan {\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<template>\n\t<ResourcesListLayout\n\t\tref=\"layout\"\n\t\tresource-key=\"credentials\"\n\t\t:resources=\"allCredentials\"\n\t\t:initialize=\"initialize\"\n\t\t:filters=\"filters\"\n\t\t:additional-filters-handler=\"onFilter\"\n\t\t:type-props=\"{ itemSize: 77 }\"\n\t\t@click:add=\"addCredential\"\n\t\t@update:filters=\"filters = $event\"\n\t>\n\t\t<template #header>\n\t\t\t<ProjectTabs />\n\t\t</template>\n\t\t<template #add-button=\"{ disabled }\">\n\t\t\t<div>\n\t\t\t\t<n8n-button\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tblock\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t@click=\"addCredential\"\n\t\t\t\t>\n\t\t\t\t\t{{ addCredentialButtonText }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #default=\"{ data }\">\n\t\t\t<CredentialCard data-test-id=\"resources-list-item\" class=\"mb-2xs\" :data=\"data\" />\n\t\t</template>\n\t\t<template #filters=\"{ setKeyValue }\">\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('credentials.filters.type')\"\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\tref=\"typeInput\"\n\t\t\t\t\t:model-value=\"filters.type\"\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\tmultiple\n\t\t\t\t\tfilterable\n\t\t\t\t\t:class=\"$style['type-input']\"\n\t\t\t\t\t@update:model-value=\"setKeyValue('type', $event)\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"credentialType in allCredentialTypes\"\n\t\t\t\t\t\t:key=\"credentialType.name\"\n\t\t\t\t\t\t:value=\"credentialType.name\"\n\t\t\t\t\t\t:label=\"credentialType.displayName\"\n\t\t\t\t\t/>\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 type { ICredentialsResponse, ICredentialTypeMap } from '@/Interface';\nimport { defineComponent } from 'vue';\n\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport CredentialCard from '@/components/CredentialCard.vue';\nimport type { ICredentialType } from 'n8n-workflow';\nimport { CREDENTIAL_SELECT_MODAL_KEY, EnterpriseEditionFeature } from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useProjectsStore } from '@/features/projects/projects.store';\nimport ProjectTabs from '@/features/projects/components/ProjectTabs.vue';\nimport useEnvironmentsStore from '@/stores/environments.ee.store';\nimport { useSettingsStore } from '@/stores/settings.store';\n\ntype IResourcesListLayoutInstance = InstanceType<typeof ResourcesListLayout>;\n\nexport default defineComponent({\n\tname: 'CredentialsView',\n\tcomponents: {\n\t\tResourcesListLayout,\n\t\tCredentialCard,\n\t\tProjectTabs,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfilters: {\n\t\t\t\tsearch: '',\n\t\t\t\thomeProject: '',\n\t\t\t\ttype: '',\n\t\t\t},\n\t\t\tsourceControlStoreUnsubscribe: () => {},\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseCredentialsStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseUIStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseExternalSecretsStore,\n\t\t\tuseProjectsStore,\n\t\t),\n\t\tallCredentials(): ICredentialsResponse[] {\n\t\t\treturn this.credentialsStore.allCredentials;\n\t\t},\n\t\tallCredentialTypes(): ICredentialType[] {\n\t\t\treturn this.credentialsStore.allCredentialTypes;\n\t\t},\n\t\tcredentialTypesById(): ICredentialTypeMap {\n\t\t\treturn this.credentialsStore.credentialTypesById;\n\t\t},\n\t\taddCredentialButtonText() {\n\t\t\treturn this.projectsStore.currentProject\n\t\t\t\t? this.$locale.baseText('credentials.project.add')\n\t\t\t\t: this.$locale.baseText('credentials.add');\n\t\t},\n\t},\n\twatch: {\n\t\t'filters.type'() {\n\t\t\tthis.sendFiltersTelemetry('type');\n\t\t},\n\t\t'$route.params.projectId'() {\n\t\t\tvoid this.initialize();\n\t\t},\n\t},\n\tmounted() {\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\taddCredential() {\n\t\t\tthis.uiStore.openModal(CREDENTIAL_SELECT_MODAL_KEY);\n\n\t\t\tthis.$telemetry.track('User clicked add cred button', {\n\t\t\t\tsource: 'Creds list',\n\t\t\t});\n\t\t},\n\t\tasync initialize() {\n\t\t\tconst isVarsEnabled = useSettingsStore().isEnterpriseFeatureEnabled(\n\t\t\t\tEnterpriseEditionFeature.Variables,\n\t\t\t);\n\n\t\t\tconst loadPromises = [\n\t\t\t\tthis.credentialsStore.fetchAllCredentials(\n\t\t\t\t\tthis.$route?.params?.projectId as string | undefined,\n\t\t\t\t),\n\t\t\t\tthis.credentialsStore.fetchCredentialTypes(false),\n\t\t\t\tthis.externalSecretsStore.fetchAllSecrets(),\n\t\t\t\tthis.nodeTypesStore.loadNodeTypesIfNotLoaded(),\n\t\t\t\tisVarsEnabled ? useEnvironmentsStore().fetchAllVariables() : Promise.resolve(), // for expression resolution\n\t\t\t];\n\n\t\t\tawait Promise.all(loadPromises);\n\t\t},\n\t\tonFilter(\n\t\t\tresource: ICredentialsResponse,\n\t\t\tfilters: { type: string[]; search: string },\n\t\t\tmatches: boolean,\n\t\t): boolean {\n\t\t\tif (filters.type.length > 0) {\n\t\t\t\tmatches = matches && filters.type.includes(resource.type);\n\t\t\t}\n\n\t\t\tif (filters.search) {\n\t\t\t\tconst searchString = filters.search.toLowerCase();\n\n\t\t\t\tmatches =\n\t\t\t\t\tmatches ||\n\t\t\t\t\t(this.credentialTypesById[resource.type] &&\n\t\t\t\t\t\tthis.credentialTypesById[resource.type].displayName\n\t\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t\t.includes(searchString));\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},\n});\n</script>\n\n<style lang=\"scss\" module>\n.type-input {\n\t--max-width: 265px;\n}\n\n.sidebarContainer ul {\n\tpadding: 0 !important;\n}\n</style>\n"],"names":["CREDENTIAL_LIST_ITEM_ACTIONS","_sfc_main$1","defineComponent","TimeAgo","CredentialIcon","ProjectCardBadge","useMessage","mapStores","useCredentialsStore","useUIStore","useUsersStore","useProjectsStore","getCredentialPermissions","currentYear","dateformat","event","_a","action","MODAL_CONFIRM","_resolveComponent","_openBlock","_createBlock","_component_n8n_card","_normalizeClass","_ctx","_withCtx","_createVNode","_component_CredentialIcon","_component_n8n_heading","_createTextVNode","_toDisplayString","data","_component_ProjectCardBadge","_createElementVNode","$style","_component_n8n_action_toggle","onAction","_component_n8n_text","_hoisted_1","_createCommentVNode","_withDirectives","_component_TimeAgo","_vShow","_sfc_main","ResourcesListLayout","CredentialCard","ProjectTabs","useNodeTypesStore","useSourceControlStore","useExternalSecretsStore","name","after","CREDENTIAL_SELECT_MODAL_KEY","isVarsEnabled","useSettingsStore","EnterpriseEditionFeature","loadPromises","_b","useEnvironmentsStore","resource","filters","matches","searchString","source","_component_ResourcesListLayout","initialize","addCredential","_cache","$event","_component_ProjectTabs","disabled","_component_n8n_button","_component_CredentialCard","setKeyValue","$locale","_component_n8n_input_label","_component_n8n_select","_createElementBlock","_Fragment","_renderList","credentialType","_component_n8n_option"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CredentialsView-tyjXlz4Z.js","sources":["../../src/components/CredentialCard.vue","../../src/views/CredentialsView.vue"],"sourcesContent":["<template>\n\t<n8n-card :class=\"$style.cardLink\" @click=\"onClick\">\n\t\t<template #prepend>\n\t\t\t<CredentialIcon :credential-type-name=\"credentialType ? credentialType.name : ''\" />\n\t\t</template>\n\t\t<template #header>\n\t\t\t<n8n-heading tag=\"h2\" bold :class=\"$style.cardHeading\">\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-if=\"credentialType\">{{ credentialType.displayName }} | </span>\n\t\t\t\t<span v-show=\"data\"\n\t\t\t\t\t>{{ $locale.baseText('credentials.item.updated') }} <TimeAgo :date=\"data.updatedAt\" /> |\n\t\t\t\t</span>\n\t\t\t\t<span v-show=\"data\"\n\t\t\t\t\t>{{ $locale.baseText('credentials.item.created') }} {{ formattedCreatedAtDate }}\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<ProjectCardBadge :resource=\"data\" :personal-project=\"projectsStore.personalProject\" />\n\t\t\t<div ref=\"cardActions\" :class=\"$style.cardActions\">\n\t\t\t\t<n8n-action-toggle :actions=\"actions\" theme=\"dark\" @action=\"onAction\" @click.stop />\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 { PropType } from 'vue';\nimport type { ICredentialsResponse, IUser } from '@/Interface';\nimport type { ICredentialType } from 'n8n-workflow';\nimport { MODAL_CONFIRM } from '@/constants';\nimport { useMessage } from '@/composables/useMessage';\nimport CredentialIcon from '@/components/CredentialIcon.vue';\nimport type { PermissionsMap } from '@/permissions';\nimport { getCredentialPermissions } from '@/permissions';\nimport dateformat from 'dateformat';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport TimeAgo from '@/components/TimeAgo.vue';\nimport type { ProjectSharingData } from '@/features/projects/projects.types';\nimport { useProjectsStore } from '@/features/projects/projects.store';\nimport type { CredentialScope } from '@n8n/permissions';\nimport ProjectCardBadge from '@/features/projects/components/ProjectCardBadge.vue';\n\nexport const CREDENTIAL_LIST_ITEM_ACTIONS = {\n\tOPEN: 'open',\n\tDELETE: 'delete',\n};\n\nexport default defineComponent({\n\tcomponents: {\n\t\tTimeAgo,\n\t\tCredentialIcon,\n\t\tProjectCardBadge,\n\t},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object as PropType<ICredentialsResponse>,\n\t\t\trequired: true,\n\t\t\tdefault: (): ICredentialsResponse => ({\n\t\t\t\tid: '',\n\t\t\t\tcreatedAt: '',\n\t\t\t\tupdatedAt: '',\n\t\t\t\ttype: '',\n\t\t\t\tname: '',\n\t\t\t\tnodesAccess: [],\n\t\t\t\tsharedWithProjects: [],\n\t\t\t\thomeProject: {} as ProjectSharingData,\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...useMessage(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useCredentialsStore, useUIStore, useUsersStore, useProjectsStore),\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tcredentialType(): ICredentialType | undefined {\n\t\t\treturn this.credentialsStore.getCredentialTypeByName(this.data.type);\n\t\t},\n\t\tcredentialPermissions(): PermissionsMap<CredentialScope> | null {\n\t\t\treturn !this.currentUser ? null : getCredentialPermissions(this.data);\n\t\t},\n\t\tactions(): Array<{ label: string; value: string }> {\n\t\t\tif (!this.credentialPermissions) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('credentials.item.open'),\n\t\t\t\t\tvalue: CREDENTIAL_LIST_ITEM_ACTIONS.OPEN,\n\t\t\t\t},\n\t\t\t].concat(\n\t\t\t\tthis.credentialPermissions.delete\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: this.$locale.baseText('credentials.item.delete'),\n\t\t\t\t\t\t\t\tvalue: CREDENTIAL_LIST_ITEM_ACTIONS.DELETE,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [],\n\t\t\t);\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: Event) {\n\t\t\tif (\n\t\t\t\tthis.$refs.cardActions === event.target ||\n\t\t\t\tthis.$refs.cardActions?.contains(event.target)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.uiStore.openExistingCredential(this.data.id);\n\t\t},\n\t\tasync onAction(action: string) {\n\t\t\tif (action === CREDENTIAL_LIST_ITEM_ACTIONS.OPEN) {\n\t\t\t\tawait this.onClick(new Event('click'));\n\t\t\t} else if (action === CREDENTIAL_LIST_ITEM_ACTIONS.DELETE) {\n\t\t\t\tconst deleteConfirmed = await this.confirm(\n\t\t\t\t\tthis.$locale.baseText(\n\t\t\t\t\t\t'credentialEdit.credentialEdit.confirmMessage.deleteCredential.message',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinterpolate: { savedCredentialName: this.data.name },\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t\tthis.$locale.baseText(\n\t\t\t\t\t\t'credentialEdit.credentialEdit.confirmMessage.deleteCredential.headline',\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t'credentialEdit.credentialEdit.confirmMessage.deleteCredential.confirmButtonText',\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\tawait this.credentialsStore.deleteCredential({ id: this.data.id });\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 0 0 var(--spacing-s);\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\tpadding: var(--spacing-s) 0 0;\n\n\tspan {\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n.cardDescription {\n\tmin-height: 19px;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 0 0 var(--spacing-s);\n}\n\n.cardActions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: stretch;\n\tpadding: 0 var(--spacing-s) 0 0;\n\tcursor: default;\n}\n</style>\n","<template>\n\t<ResourcesListLayout\n\t\tref=\"layout\"\n\t\tresource-key=\"credentials\"\n\t\t:resources=\"allCredentials\"\n\t\t:initialize=\"initialize\"\n\t\t:filters=\"filters\"\n\t\t:additional-filters-handler=\"onFilter\"\n\t\t:type-props=\"{ itemSize: 77 }\"\n\t\t@click:add=\"addCredential\"\n\t\t@update:filters=\"filters = $event\"\n\t>\n\t\t<template #header>\n\t\t\t<ProjectTabs />\n\t\t</template>\n\t\t<template #add-button=\"{ disabled }\">\n\t\t\t<div>\n\t\t\t\t<n8n-button\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tblock\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\tdata-test-id=\"resources-list-add\"\n\t\t\t\t\t@click=\"addCredential\"\n\t\t\t\t>\n\t\t\t\t\t{{ addCredentialButtonText }}\n\t\t\t\t</n8n-button>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #default=\"{ data }\">\n\t\t\t<CredentialCard data-test-id=\"resources-list-item\" class=\"mb-2xs\" :data=\"data\" />\n\t\t</template>\n\t\t<template #filters=\"{ setKeyValue }\">\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('credentials.filters.type')\"\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\tref=\"typeInput\"\n\t\t\t\t\t:model-value=\"filters.type\"\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\tmultiple\n\t\t\t\t\tfilterable\n\t\t\t\t\t:class=\"$style['type-input']\"\n\t\t\t\t\t@update:model-value=\"setKeyValue('type', $event)\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"credentialType in allCredentialTypes\"\n\t\t\t\t\t\t:key=\"credentialType.name\"\n\t\t\t\t\t\t:value=\"credentialType.name\"\n\t\t\t\t\t\t:label=\"credentialType.displayName\"\n\t\t\t\t\t/>\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 type { ICredentialsResponse, ICredentialTypeMap } from '@/Interface';\nimport { defineComponent } from 'vue';\n\nimport ResourcesListLayout from '@/components/layouts/ResourcesListLayout.vue';\nimport CredentialCard from '@/components/CredentialCard.vue';\nimport type { ICredentialType } from 'n8n-workflow';\nimport { CREDENTIAL_SELECT_MODAL_KEY, EnterpriseEditionFeature } from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useProjectsStore } from '@/features/projects/projects.store';\nimport ProjectTabs from '@/features/projects/components/ProjectTabs.vue';\nimport useEnvironmentsStore from '@/stores/environments.ee.store';\nimport { useSettingsStore } from '@/stores/settings.store';\n\ntype IResourcesListLayoutInstance = InstanceType<typeof ResourcesListLayout>;\n\nexport default defineComponent({\n\tname: 'CredentialsView',\n\tcomponents: {\n\t\tResourcesListLayout,\n\t\tCredentialCard,\n\t\tProjectTabs,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfilters: {\n\t\t\t\tsearch: '',\n\t\t\t\thomeProject: '',\n\t\t\t\ttype: '',\n\t\t\t},\n\t\t\tsourceControlStoreUnsubscribe: () => {},\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseCredentialsStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseUIStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseExternalSecretsStore,\n\t\t\tuseProjectsStore,\n\t\t),\n\t\tallCredentials(): ICredentialsResponse[] {\n\t\t\treturn this.credentialsStore.allCredentials;\n\t\t},\n\t\tallCredentialTypes(): ICredentialType[] {\n\t\t\treturn this.credentialsStore.allCredentialTypes;\n\t\t},\n\t\tcredentialTypesById(): ICredentialTypeMap {\n\t\t\treturn this.credentialsStore.credentialTypesById;\n\t\t},\n\t\taddCredentialButtonText() {\n\t\t\treturn this.projectsStore.currentProject\n\t\t\t\t? this.$locale.baseText('credentials.project.add')\n\t\t\t\t: this.$locale.baseText('credentials.add');\n\t\t},\n\t},\n\twatch: {\n\t\t'filters.type'() {\n\t\t\tthis.sendFiltersTelemetry('type');\n\t\t},\n\t\t'$route.params.projectId'() {\n\t\t\tvoid this.initialize();\n\t\t},\n\t},\n\tmounted() {\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\taddCredential() {\n\t\t\tthis.uiStore.openModal(CREDENTIAL_SELECT_MODAL_KEY);\n\n\t\t\tthis.$telemetry.track('User clicked add cred button', {\n\t\t\t\tsource: 'Creds list',\n\t\t\t});\n\t\t},\n\t\tasync initialize() {\n\t\t\tconst isVarsEnabled = useSettingsStore().isEnterpriseFeatureEnabled(\n\t\t\t\tEnterpriseEditionFeature.Variables,\n\t\t\t);\n\n\t\t\tconst loadPromises = [\n\t\t\t\tthis.credentialsStore.fetchAllCredentials(\n\t\t\t\t\tthis.$route?.params?.projectId as string | undefined,\n\t\t\t\t),\n\t\t\t\tthis.credentialsStore.fetchCredentialTypes(false),\n\t\t\t\tthis.externalSecretsStore.fetchAllSecrets(),\n\t\t\t\tthis.nodeTypesStore.loadNodeTypesIfNotLoaded(),\n\t\t\t\tisVarsEnabled ? useEnvironmentsStore().fetchAllVariables() : Promise.resolve(), // for expression resolution\n\t\t\t];\n\n\t\t\tawait Promise.all(loadPromises);\n\t\t},\n\t\tonFilter(\n\t\t\tresource: ICredentialsResponse,\n\t\t\tfilters: { type: string[]; search: string },\n\t\t\tmatches: boolean,\n\t\t): boolean {\n\t\t\tif (filters.type.length > 0) {\n\t\t\t\tmatches = matches && filters.type.includes(resource.type);\n\t\t\t}\n\n\t\t\tif (filters.search) {\n\t\t\t\tconst searchString = filters.search.toLowerCase();\n\n\t\t\t\tmatches =\n\t\t\t\t\tmatches ||\n\t\t\t\t\t(this.credentialTypesById[resource.type] &&\n\t\t\t\t\t\tthis.credentialTypesById[resource.type].displayName\n\t\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t\t.includes(searchString));\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},\n});\n</script>\n\n<style lang=\"scss\" module>\n.type-input {\n\t--max-width: 265px;\n}\n\n.sidebarContainer ul {\n\tpadding: 0 !important;\n}\n</style>\n"],"names":["CREDENTIAL_LIST_ITEM_ACTIONS","_sfc_main$1","defineComponent","TimeAgo","CredentialIcon","ProjectCardBadge","useMessage","mapStores","useCredentialsStore","useUIStore","useUsersStore","useProjectsStore","getCredentialPermissions","currentYear","dateformat","event","_a","action","MODAL_CONFIRM","_resolveComponent","_openBlock","_createBlock","_component_n8n_card","_normalizeClass","_ctx","_withCtx","_createVNode","_component_CredentialIcon","_component_n8n_heading","_createTextVNode","_toDisplayString","data","_component_ProjectCardBadge","_createElementVNode","$style","_component_n8n_action_toggle","onAction","_component_n8n_text","_hoisted_1","_createCommentVNode","_withDirectives","_component_TimeAgo","_vShow","_sfc_main","ResourcesListLayout","CredentialCard","ProjectTabs","useNodeTypesStore","useSourceControlStore","useExternalSecretsStore","name","after","CREDENTIAL_SELECT_MODAL_KEY","isVarsEnabled","useSettingsStore","EnterpriseEditionFeature","loadPromises","_b","useEnvironmentsStore","resource","filters","matches","searchString","source","_component_ResourcesListLayout","initialize","addCredential","_cache","$event","_component_ProjectTabs","disabled","_component_n8n_button","_component_CredentialCard","setKeyValue","$locale","_component_n8n_input_label","_component_n8n_select","_createElementBlock","_Fragment","_renderList","credentialType","_component_n8n_option"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{G as W,l as p,m as g,T as d,r as se,e as x,Z as O,D as oe,M as _,O as i,U as r,S as y,R as h,u as o,p as n,F as Y,a7 as z,I as u,a2 as j,ag as c}from"./vendor-CUQSof8H.js";import{_ as q}from"./n8n-DT_bOwuZ.js";import{b as le,i as ne,d as ie,E as re,d2 as de,N as t,aF as H,v as ue,F as ce}from"./index-
|
|
2
|
-
//# sourceMappingURL=ExecutionsFilter-
|
|
1
|
+
import{G as W,l as p,m as g,T as d,r as se,e as x,Z as O,D as oe,M as _,O as i,U as r,S as y,R as h,u as o,p as n,F as Y,a7 as z,I as u,a2 as j,ag as c}from"./vendor-CUQSof8H.js";import{_ as q}from"./n8n-DT_bOwuZ.js";import{b as le,i as ne,d as ie,E as re,d2 as de,N as t,aF as H,v as ue,F as ce}from"./index-BQ6Z7VRj.js";const pe=W({name:"ExecutionsTime",props:["startTime"],data(){return{nowTime:-1,intervalTimer:null}},computed:{time(){if(!this.startTime)return"...";const b=this.nowTime-new Date(this.startTime).getTime();return this.$locale.displayTimer(b)}},mounted(){this.setNow(),this.intervalTimer=setInterval(()=>{this.setNow()},1e3)},beforeUnmount(){this.intervalTimer!==null&&clearInterval(this.intervalTimer)},methods:{setNow(){this.nowTime=new Date().getTime()}}});function me(b,E,$,C,I,U){return p(),g("span",null,d(b.time),1)}const Be=q(pe,[["render",me]]),fe={"data-test-id":"execution-filter-form"},be={for:"execution-filter-workflows"},ve={for:"execution-filter-tags"},xe={for:"execution-filter-status"},_e={for:"execution-filter-start-date"},ge={target:"_blank",href:"https://docs.n8n.io/workflows/executions/custom-executions-data/"},we={for:"execution-filter-saved-data-key"},Te={for:"execution-filter-saved-data-value"},R="YYYY-MM-DD HH:mm",ke=W({__name:"ExecutionsFilter",props:{workflows:{default:[]},popoverPlacement:{default:"bottom"},teleported:{type:Boolean,default:!0}},emits:["filterChanged"],setup(b,{emit:E}){const $=le(),C=ne(),{debounce:I}=ie(),U=ce(),M=b,w=E,Z=I(w,{debounceTime:500}),D=se(!1),T=x(()=>$.isEnterpriseFeatureEnabled(re.AdvancedExecutionFilters)),J=x(()=>!1),S=()=>({status:"all",workflowId:"all",tags:[],startDate:"",endDate:"",metadata:[{key:"",value:""}]}),a=O(S()),m=O(de(a).reduce((e,l)=>(e[l]=x({get(){return a[l]},set(v){a[l]=v,w("filterChanged",a)}}),e),{})),Q=x(()=>[{id:"all",name:t.baseText("executionsList.anyStatus")},{id:"error",name:t.baseText("executionsList.error")},{id:"canceled",name:t.baseText("executionsList.canceled")},{id:"running",name:t.baseText("executionsList.running")},{id:"success",name:t.baseText("executionsList.success")},{id:"waiting",name:t.baseText("executionsList.waiting")}]),k=x(()=>{let e=0;return a.status!=="all"&&e++,a.workflowId!=="all"&&M.workflows.length&&e++,H(a.tags)||e++,H(a.metadata)||e++,a.startDate&&e++,a.endDate&&e++,e}),B=(e,l,v)=>{a.metadata[e]||(a.metadata[e]={key:"",value:""}),a.metadata[e][l]=v,D.value||(U.track("User filtered executions with custom data"),D.value=!0),Z("filterChanged",a)},X=e=>{a.tags=e,w("filterChanged",a)},ee=()=>{Object.assign(a,S()),w("filterChanged",a)},L=()=>{C.goToUpgrade("custom-data-filter","upgrade-custom-data-filter")};return oe(()=>{D.value=!1}),(e,l)=>{const v=c("n8n-badge"),N=c("n8n-button"),P=c("n8n-option"),G=c("n8n-select"),A=c("el-date-picker"),F=c("i18n-t"),te=c("n8n-icon"),V=c("n8n-tooltip"),K=c("n8n-input"),ae=c("n8n-popover");return p(),_(ae,{trigger:"click",placement:e.popoverPlacement,width:"440"},{reference:i(()=>[r(N,{icon:"filter",type:"tertiary",active:!!k.value,"data-test-id":"executions-filter-button"},{default:i(()=>[k.value?(p(),_(v,{key:0,theme:"primary",class:"mr-4xs","data-test-id":"execution-filter-badge"},{default:i(()=>[y(d(k.value),1)]),_:1})):h("",!0),y(" "+d(o(t).baseText("executionsList.filters")),1)]),_:1},8,["active"])]),default:i(()=>[n("div",fe,[e.workflows&&e.workflows.length>0?(p(),g("div",{key:0,class:u(e.$style.group)},[n("label",be,d(o(t).baseText("workflows.heading")),1),r(G,{id:"execution-filter-workflows",modelValue:m.workflowId,"onUpdate:modelValue":l[0]||(l[0]=s=>m.workflowId=s),placeholder:o(t).baseText("executionsFilter.selectWorkflow"),filterable:"","data-test-id":"executions-filter-workflows-select",teleported:e.teleported},{default:i(()=>[n("div",null,[(p(!0),g(Y,null,z(M.workflows,(s,f)=>(p(),_(P,{key:f,label:s.name,value:s.id},null,8,["label","value"]))),128))])]),_:1},8,["modelValue","placeholder","teleported"])],2)):h("",!0),J.value?(p(),g("div",{key:1,class:u(e.$style.group)},[n("label",ve,d(o(t).baseText("workflows.filters.tags")),1),r(ue,{id:"execution-filter-tags",placeholder:o(t).baseText("workflowOpen.filterWorkflows"),"model-value":a.tags,"create-enabled":!1,"data-test-id":"executions-filter-tags-select","onUpdate:modelValue":X},null,8,["placeholder","model-value"])],2)):h("",!0),n("div",{class:u(e.$style.group)},[n("label",xe,d(o(t).baseText("executionsList.status")),1),r(G,{id:"execution-filter-status",modelValue:m.status,"onUpdate:modelValue":l[1]||(l[1]=s=>m.status=s),placeholder:o(t).baseText("executionsFilter.selectStatus"),filterable:"","data-test-id":"executions-filter-status-select",teleported:e.teleported},{default:i(()=>[(p(!0),g(Y,null,z(Q.value,(s,f)=>(p(),_(P,{key:f,label:s.name,value:s.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","teleported"])],2),n("div",{class:u(e.$style.group)},[n("label",_e,d(o(t).baseText("executionsFilter.start")),1),n("div",{class:u(e.$style.dates)},[r(A,{id:"execution-filter-start-date",modelValue:m.startDate,"onUpdate:modelValue":l[2]||(l[2]=s=>m.startDate=s),type:"datetime",teleported:!1,format:R,placeholder:o(t).baseText("executionsFilter.startDate"),"data-test-id":"executions-filter-start-date-picker"},null,8,["modelValue","placeholder"]),n("span",{class:u(e.$style.divider)},"to",2),r(A,{id:"execution-filter-end-date",modelValue:m.endDate,"onUpdate:modelValue":l[3]||(l[3]=s=>m.endDate=s),type:"datetime",teleported:!1,format:R,placeholder:o(t).baseText("executionsFilter.endDate"),"data-test-id":"executions-filter-end-date-picker"},null,8,["modelValue","placeholder"])],2)],2),n("div",{class:u(e.$style.group)},[r(V,{placement:"right"},{content:i(()=>[r(F,{tag:"span",keypath:"executionsFilter.customData.docsTooltip"},{link:i(()=>[n("a",ge,d(o(t).baseText("executionsFilter.customData.docsTooltip.link")),1)]),_:1})]),default:i(()=>[n("span",{class:u(e.$style.label)},[y(d(o(t).baseText("executionsFilter.savedData"))+" ",1),r(te,{class:u(e.$style.tooltipIcon),icon:"question-circle",size:"small"},null,8,["class"])],2)]),_:1}),n("div",{class:u(e.$style.subGroup)},[n("label",we,d(o(t).baseText("executionsFilter.savedDataKey")),1),r(V,{disabled:T.value,placement:"top"},{content:i(()=>[r(F,{tag:"span",keypath:"executionsFilter.customData.inputTooltip"},{link:i(()=>[n("a",{href:"#","data-test-id":"executions-filter-view-plans-link",onClick:j(L,["prevent"])},d(o(t).baseText("executionsFilter.customData.inputTooltip.link")),1)]),_:1})]),default:i(()=>{var s;return[r(K,{id:"execution-filter-saved-data-key",name:"execution-filter-saved-data-key",type:"text",disabled:!T.value,placeholder:o(t).baseText("executionsFilter.savedDataKeyPlaceholder"),"model-value":(s=a.metadata[0])==null?void 0:s.key,"data-test-id":"execution-filter-saved-data-key-input","onUpdate:modelValue":l[4]||(l[4]=f=>B(0,"key",f))},null,8,["disabled","placeholder","model-value"])]}),_:1},8,["disabled"]),n("label",Te,d(o(t).baseText("executionsFilter.savedDataValue")),1),r(V,{disabled:T.value,placement:"top"},{content:i(()=>[r(F,{tag:"span",keypath:"executionsFilter.customData.inputTooltip"},{link:i(()=>[n("a",{href:"#",onClick:j(L,["prevent"])},d(o(t).baseText("executionsFilter.customData.inputTooltip.link")),1)]),_:1})]),default:i(()=>{var s;return[r(K,{id:"execution-filter-saved-data-value",name:"execution-filter-saved-data-value",type:"text",disabled:!T.value,placeholder:o(t).baseText("executionsFilter.savedDataValuePlaceholder"),"model-value":(s=a.metadata[0])==null?void 0:s.value,"data-test-id":"execution-filter-saved-data-value-input","onUpdate:modelValue":l[5]||(l[5]=f=>B(0,"value",f))},null,8,["disabled","placeholder","model-value"])]}),_:1},8,["disabled"])],2)],2),k.value?(p(),_(N,{key:2,class:u(e.$style.resetBtn),size:"large",text:"","data-test-id":"executions-filter-reset-button",onClick:ee},{default:i(()=>[y(d(o(t).baseText("executionsFilter.reset")),1)]),_:1},8,["class"])):h("",!0)])]),_:1},8,["placement"])}}}),ye="_group_1lywb_1",he="_label_1lywb_2",De="_subGroup_1lywb_8",Fe="_dates_1lywb_17",Ve="_divider_1lywb_25",Ee="_resetBtn_1lywb_30",$e="_tooltipIcon_1lywb_35",Ce={group:ye,label:he,subGroup:De,dates:Fe,divider:Ve,resetBtn:Ee,tooltipIcon:$e},Ie={$style:Ce},Le=q(ke,[["__cssModules",Ie],["__scopeId","data-v-c59ef669"]]);export{Be as E,Le as a};
|
|
2
|
+
//# sourceMappingURL=ExecutionsFilter-0t_omffh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionsFilter-nFboBzV2.js","sources":["../../src/components/executions/ExecutionsTime.vue","../../src/components/executions/ExecutionsFilter.vue"],"sourcesContent":["<template>\n\t<span>\n\t\t{{ time }}\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'ExecutionsTime',\n\tprops: ['startTime'],\n\tdata() {\n\t\treturn {\n\t\t\tnowTime: -1,\n\t\t\tintervalTimer: null as null | NodeJS.Timeout,\n\t\t};\n\t},\n\tcomputed: {\n\t\ttime(): string {\n\t\t\tif (!this.startTime) {\n\t\t\t\treturn '...';\n\t\t\t}\n\t\t\tconst msPassed = this.nowTime - new Date(this.startTime).getTime();\n\t\t\treturn this.$locale.displayTimer(msPassed);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.setNow();\n\t\tthis.intervalTimer = setInterval(() => {\n\t\t\tthis.setNow();\n\t\t}, 1000);\n\t},\n\tbeforeUnmount() {\n\t\t// Make sure that the timer gets destroyed once no longer needed\n\t\tif (this.intervalTimer !== null) {\n\t\t\tclearInterval(this.intervalTimer);\n\t\t}\n\t},\n\tmethods: {\n\t\tsetNow() {\n\t\t\tthis.nowTime = new Date().getTime();\n\t\t},\n\t},\n});\n</script>\n","<script lang=\"ts\" setup>\nimport { computed, reactive, onBeforeMount, ref } from 'vue';\nimport type {\n\tExecutionFilterType,\n\tExecutionFilterMetadata,\n\tIWorkflowShortResponse,\n\tIWorkflowDb,\n} from '@/Interface';\nimport { i18n as locale } from '@/plugins/i18n';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport { getObjectKeys, isEmpty } from '@/utils/typesUtils';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { Placement } from '@floating-ui/core';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport type ExecutionFilterProps = {\n\tworkflows?: Array<IWorkflowDb | IWorkflowShortResponse>;\n\tpopoverPlacement?: Placement;\n\tteleported?: boolean;\n};\n\nconst DATE_TIME_MASK = 'YYYY-MM-DD HH:mm';\n\nconst settingsStore = useSettingsStore();\nconst uiStore = useUIStore();\nconst { debounce } = useDebounce();\n\nconst telemetry = useTelemetry();\n\nconst props = withDefaults(defineProps<ExecutionFilterProps>(), {\n\tworkflows: [] as Array<IWorkflowDb | IWorkflowShortResponse>,\n\tpopoverPlacement: 'bottom' as Placement,\n\tteleported: true,\n});\nconst emit = defineEmits<{\n\t(event: 'filterChanged', value: ExecutionFilterType): void;\n}>();\nconst debouncedEmit = debounce(emit, {\n\tdebounceTime: 500,\n});\n\nconst isCustomDataFilterTracked = ref(false);\nconst isAdvancedExecutionFilterEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.AdvancedExecutionFilters),\n);\nconst showTags = computed(() => false);\n\nconst getDefaultFilter = (): ExecutionFilterType => ({\n\tstatus: 'all',\n\tworkflowId: 'all',\n\ttags: [],\n\tstartDate: '',\n\tendDate: '',\n\tmetadata: [{ key: '', value: '' }],\n});\nconst filter = reactive(getDefaultFilter());\n\n// Automatically set up v-models based on filter properties\nconst vModel = reactive(\n\tgetObjectKeys(filter).reduce(\n\t\t(acc, key) => {\n\t\t\tacc[key] = computed({\n\t\t\t\tget() {\n\t\t\t\t\treturn filter[key];\n\t\t\t\t},\n\t\t\t\tset(value) {\n\t\t\t\t\t// TODO: find out what exactly is typechecker complaining about\n\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tfilter[key] = value;\n\t\t\t\t\temit('filterChanged', filter);\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<keyof ExecutionFilterType, ReturnType<typeof computed>>,\n\t),\n);\n\nconst statuses = computed(() => [\n\t{ id: 'all', name: locale.baseText('executionsList.anyStatus') },\n\t{ id: 'error', name: locale.baseText('executionsList.error') },\n\t{ id: 'canceled', name: locale.baseText('executionsList.canceled') },\n\t{ id: 'running', name: locale.baseText('executionsList.running') },\n\t{ id: 'success', name: locale.baseText('executionsList.success') },\n\t{ id: 'waiting', name: locale.baseText('executionsList.waiting') },\n]);\n\nconst countSelectedFilterProps = computed(() => {\n\tlet count = 0;\n\tif (filter.status !== 'all') {\n\t\tcount++;\n\t}\n\tif (filter.workflowId !== 'all' && props.workflows.length) {\n\t\tcount++;\n\t}\n\tif (!isEmpty(filter.tags)) {\n\t\tcount++;\n\t}\n\tif (!isEmpty(filter.metadata)) {\n\t\tcount++;\n\t}\n\tif (!!filter.startDate) {\n\t\tcount++;\n\t}\n\tif (!!filter.endDate) {\n\t\tcount++;\n\t}\n\treturn count;\n});\n\n// vModel.metadata is a text input and needs a debounced emit to avoid too many requests\n// We use the :value and @input combo instead of v-model with this event listener\nconst onFilterMetaChange = (index: number, prop: keyof ExecutionFilterMetadata, value: string) => {\n\tif (!filter.metadata[index]) {\n\t\tfilter.metadata[index] = {\n\t\t\tkey: '',\n\t\t\tvalue: '',\n\t\t};\n\t}\n\tfilter.metadata[index][prop] = value;\n\n\tif (!isCustomDataFilterTracked.value) {\n\t\ttelemetry.track('User filtered executions with custom data');\n\t\tisCustomDataFilterTracked.value = true;\n\t}\n\n\tdebouncedEmit('filterChanged', filter);\n};\n\n// Can't use v-model on TagsDropdown component and thus vModel.tags is useless\n// We just emit the updated filter\nconst onTagsChange = (tags: string[]) => {\n\tfilter.tags = tags;\n\temit('filterChanged', filter);\n};\n\nconst onFilterReset = () => {\n\tObject.assign(filter, getDefaultFilter());\n\temit('filterChanged', filter);\n};\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('custom-data-filter', 'upgrade-custom-data-filter');\n};\n\nonBeforeMount(() => {\n\tisCustomDataFilterTracked.value = false;\n});\n</script>\n<template>\n\t<n8n-popover trigger=\"click\" :placement=\"popoverPlacement\" width=\"440\">\n\t\t<template #reference>\n\t\t\t<n8n-button\n\t\t\t\ticon=\"filter\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\t:active=\"!!countSelectedFilterProps\"\n\t\t\t\tdata-test-id=\"executions-filter-button\"\n\t\t\t>\n\t\t\t\t<n8n-badge\n\t\t\t\t\tv-if=\"!!countSelectedFilterProps\"\n\t\t\t\t\ttheme=\"primary\"\n\t\t\t\t\tclass=\"mr-4xs\"\n\t\t\t\t\tdata-test-id=\"execution-filter-badge\"\n\t\t\t\t\t>{{ countSelectedFilterProps }}</n8n-badge\n\t\t\t\t>\n\t\t\t\t{{ locale.baseText('executionsList.filters') }}\n\t\t\t</n8n-button>\n\t\t</template>\n\t\t<div data-test-id=\"execution-filter-form\">\n\t\t\t<div v-if=\"workflows && workflows.length > 0\" :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-workflows\">{{ locale.baseText('workflows.heading') }}</label>\n\t\t\t\t<n8n-select\n\t\t\t\t\tid=\"execution-filter-workflows\"\n\t\t\t\t\tv-model=\"vModel.workflowId\"\n\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.selectWorkflow')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"executions-filter-workflows-select\"\n\t\t\t\t\t:teleported=\"teleported\"\n\t\t\t\t>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-option\n\t\t\t\t\t\t\tv-for=\"(item, idx) in props.workflows\"\n\t\t\t\t\t\t\t:key=\"idx\"\n\t\t\t\t\t\t\t:label=\"item.name\"\n\t\t\t\t\t\t\t:value=\"item.id\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t\t<div v-if=\"showTags\" :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-tags\">{{ locale.baseText('workflows.filters.tags') }}</label>\n\t\t\t\t<TagsDropdown\n\t\t\t\t\tid=\"execution-filter-tags\"\n\t\t\t\t\t:placeholder=\"locale.baseText('workflowOpen.filterWorkflows')\"\n\t\t\t\t\t:model-value=\"filter.tags\"\n\t\t\t\t\t:create-enabled=\"false\"\n\t\t\t\t\tdata-test-id=\"executions-filter-tags-select\"\n\t\t\t\t\t@update:model-value=\"onTagsChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-status\">{{ locale.baseText('executionsList.status') }}</label>\n\t\t\t\t<n8n-select\n\t\t\t\t\tid=\"execution-filter-status\"\n\t\t\t\t\tv-model=\"vModel.status\"\n\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.selectStatus')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"executions-filter-status-select\"\n\t\t\t\t\t:teleported=\"teleported\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"(item, idx) in statuses\"\n\t\t\t\t\t\t:key=\"idx\"\n\t\t\t\t\t\t:label=\"item.name\"\n\t\t\t\t\t\t:value=\"item.id\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-start-date\">{{\n\t\t\t\t\tlocale.baseText('executionsFilter.start')\n\t\t\t\t}}</label>\n\t\t\t\t<div :class=\"$style.dates\">\n\t\t\t\t\t<el-date-picker\n\t\t\t\t\t\tid=\"execution-filter-start-date\"\n\t\t\t\t\t\tv-model=\"vModel.startDate\"\n\t\t\t\t\t\ttype=\"datetime\"\n\t\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t\t:format=\"DATE_TIME_MASK\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.startDate')\"\n\t\t\t\t\t\tdata-test-id=\"executions-filter-start-date-picker\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span :class=\"$style.divider\">to</span>\n\t\t\t\t\t<el-date-picker\n\t\t\t\t\t\tid=\"execution-filter-end-date\"\n\t\t\t\t\t\tv-model=\"vModel.endDate\"\n\t\t\t\t\t\ttype=\"datetime\"\n\t\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t\t:format=\"DATE_TIME_MASK\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.endDate')\"\n\t\t\t\t\t\tdata-test-id=\"executions-filter-end-date-picker\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<n8n-tooltip placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"executionsFilter.customData.docsTooltip\">\n\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\thref=\"https://docs.n8n.io/workflows/executions/custom-executions-data/\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ locale.baseText('executionsFilter.customData.docsTooltip.link') }}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</template>\n\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t{{ locale.baseText('executionsFilter.savedData') }}\n\t\t\t\t\t\t<n8n-icon :class=\"$style.tooltipIcon\" icon=\"question-circle\" size=\"small\" />\n\t\t\t\t\t</span>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<div :class=\"$style.subGroup\">\n\t\t\t\t\t<label for=\"execution-filter-saved-data-key\">{{\n\t\t\t\t\t\tlocale.baseText('executionsFilter.savedDataKey')\n\t\t\t\t\t}}</label>\n\t\t\t\t\t<n8n-tooltip :disabled=\"isAdvancedExecutionFilterEnabled\" placement=\"top\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"executionsFilter.customData.inputTooltip\">\n\t\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"executions-filter-view-plans-link\"\n\t\t\t\t\t\t\t\t\t\t@click.prevent=\"goToUpgrade\"\n\t\t\t\t\t\t\t\t\t\t>{{ locale.baseText('executionsFilter.customData.inputTooltip.link') }}</a\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<n8n-input\n\t\t\t\t\t\t\tid=\"execution-filter-saved-data-key\"\n\t\t\t\t\t\t\tname=\"execution-filter-saved-data-key\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t:disabled=\"!isAdvancedExecutionFilterEnabled\"\n\t\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.savedDataKeyPlaceholder')\"\n\t\t\t\t\t\t\t:model-value=\"filter.metadata[0]?.key\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-filter-saved-data-key-input\"\n\t\t\t\t\t\t\t@update:model-value=\"onFilterMetaChange(0, 'key', $event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<label for=\"execution-filter-saved-data-value\">{{\n\t\t\t\t\t\tlocale.baseText('executionsFilter.savedDataValue')\n\t\t\t\t\t}}</label>\n\t\t\t\t\t<n8n-tooltip :disabled=\"isAdvancedExecutionFilterEnabled\" placement=\"top\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"executionsFilter.customData.inputTooltip\">\n\t\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t\t<a href=\"#\" @click.prevent=\"goToUpgrade\">{{\n\t\t\t\t\t\t\t\t\t\tlocale.baseText('executionsFilter.customData.inputTooltip.link')\n\t\t\t\t\t\t\t\t\t}}</a>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<n8n-input\n\t\t\t\t\t\t\tid=\"execution-filter-saved-data-value\"\n\t\t\t\t\t\t\tname=\"execution-filter-saved-data-value\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t:disabled=\"!isAdvancedExecutionFilterEnabled\"\n\t\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.savedDataValuePlaceholder')\"\n\t\t\t\t\t\t\t:model-value=\"filter.metadata[0]?.value\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-filter-saved-data-value-input\"\n\t\t\t\t\t\t\t@update:model-value=\"onFilterMetaChange(0, 'value', $event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<n8n-button\n\t\t\t\tv-if=\"!!countSelectedFilterProps\"\n\t\t\t\t:class=\"$style.resetBtn\"\n\t\t\t\tsize=\"large\"\n\t\t\t\ttext\n\t\t\t\tdata-test-id=\"executions-filter-reset-button\"\n\t\t\t\t@click=\"onFilterReset\"\n\t\t\t>\n\t\t\t\t{{ locale.baseText('executionsFilter.reset') }}\n\t\t\t</n8n-button>\n\t\t</div>\n\t</n8n-popover>\n</template>\n<style lang=\"scss\" module>\n.group {\n\tlabel,\n\t.label {\n\t\tdisplay: inline-block;\n\t\tfont-size: var(--font-size-2xs);\n\t\tmargin: var(--spacing-s) 0 var(--spacing-3xs);\n\t}\n}\n\n.subGroup {\n\tpadding: 0 0 var(--spacing-xs) var(--spacing-s);\n\n\tlabel,\n\t.label {\n\t\tfont-size: var(--font-size-3xs);\n\t\tmargin: var(--spacing-4xs) 0 var(--spacing-4xs);\n\t}\n}\n\n.dates {\n\tdisplay: flex;\n\tborder: 1px solid var(--color-foreground-base);\n\tborder-radius: var(--border-radius-base);\n\twhite-space: nowrap;\n\talign-items: center;\n}\n\n.divider {\n\tpadding: 0 var(--spacing-m);\n\tline-height: 100%;\n}\n\n.resetBtn {\n\tpadding: 0;\n\tmargin: var(--spacing-xs) 0 0;\n}\n\n.tooltipIcon {\n\tcolor: var(--color-text-light);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n:deep(.el-date-editor) {\n\tinput {\n\t\theight: 36px;\n\t\tborder: 0;\n\t\tpadding-right: 0;\n\t}\n\n\t.el-input__prefix {\n\t\tcolor: var(--color-foreground-dark);\n\t}\n\n\t&:last-of-type {\n\t\tinput {\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t.el-input__prefix {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n:deep(.el-select-dropdown.el-popper[data-popper-placement^='bottom']) {\n\t> .popper__arrow {\n\t\ttop: -6px;\n\t\tleft: 50%;\n\t\tright: unset;\n\t\tmargin-bottom: 0;\n\t\tmargin-right: 3px;\n\t\tborder-left-width: 6px;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-color: var(--border-color-light);\n\t\tborder-right-color: transparent;\n\n\t\t&::after {\n\t\t\ttop: 1px;\n\t\t\tleft: unset;\n\t\t\tbottom: unset;\n\t\t\tmargin-left: -6px;\n\t\t\tborder-left-width: 6px;\n\t\t\tborder-top-width: 0;\n\t\t\tborder-bottom-color: var(--color-foreground-xlight);\n\t\t\tborder-right-color: transparent;\n\t\t}\n\t}\n}\n</style>\n"],"names":["_sfc_main$1","defineComponent","msPassed","DATE_TIME_MASK","settingsStore","useSettingsStore","uiStore","useUIStore","debounce","useDebounce","telemetry","useTelemetry","props","__props","emit","__emit","debouncedEmit","isCustomDataFilterTracked","ref","isAdvancedExecutionFilterEnabled","computed","EnterpriseEditionFeature","showTags","getDefaultFilter","filter","reactive","vModel","getObjectKeys","acc","key","value","statuses","locale","countSelectedFilterProps","count","isEmpty","onFilterMetaChange","index","prop","onTagsChange","tags","onFilterReset","goToUpgrade","onBeforeMount"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExecutionsFilter-0t_omffh.js","sources":["../../src/components/executions/ExecutionsTime.vue","../../src/components/executions/ExecutionsFilter.vue"],"sourcesContent":["<template>\n\t<span>\n\t\t{{ time }}\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'ExecutionsTime',\n\tprops: ['startTime'],\n\tdata() {\n\t\treturn {\n\t\t\tnowTime: -1,\n\t\t\tintervalTimer: null as null | NodeJS.Timeout,\n\t\t};\n\t},\n\tcomputed: {\n\t\ttime(): string {\n\t\t\tif (!this.startTime) {\n\t\t\t\treturn '...';\n\t\t\t}\n\t\t\tconst msPassed = this.nowTime - new Date(this.startTime).getTime();\n\t\t\treturn this.$locale.displayTimer(msPassed);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.setNow();\n\t\tthis.intervalTimer = setInterval(() => {\n\t\t\tthis.setNow();\n\t\t}, 1000);\n\t},\n\tbeforeUnmount() {\n\t\t// Make sure that the timer gets destroyed once no longer needed\n\t\tif (this.intervalTimer !== null) {\n\t\t\tclearInterval(this.intervalTimer);\n\t\t}\n\t},\n\tmethods: {\n\t\tsetNow() {\n\t\t\tthis.nowTime = new Date().getTime();\n\t\t},\n\t},\n});\n</script>\n","<script lang=\"ts\" setup>\nimport { computed, reactive, onBeforeMount, ref } from 'vue';\nimport type {\n\tExecutionFilterType,\n\tExecutionFilterMetadata,\n\tIWorkflowShortResponse,\n\tIWorkflowDb,\n} from '@/Interface';\nimport { i18n as locale } from '@/plugins/i18n';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport { getObjectKeys, isEmpty } from '@/utils/typesUtils';\nimport { EnterpriseEditionFeature } from '@/constants';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { Placement } from '@floating-ui/core';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport type ExecutionFilterProps = {\n\tworkflows?: Array<IWorkflowDb | IWorkflowShortResponse>;\n\tpopoverPlacement?: Placement;\n\tteleported?: boolean;\n};\n\nconst DATE_TIME_MASK = 'YYYY-MM-DD HH:mm';\n\nconst settingsStore = useSettingsStore();\nconst uiStore = useUIStore();\nconst { debounce } = useDebounce();\n\nconst telemetry = useTelemetry();\n\nconst props = withDefaults(defineProps<ExecutionFilterProps>(), {\n\tworkflows: [] as Array<IWorkflowDb | IWorkflowShortResponse>,\n\tpopoverPlacement: 'bottom' as Placement,\n\tteleported: true,\n});\nconst emit = defineEmits<{\n\t(event: 'filterChanged', value: ExecutionFilterType): void;\n}>();\nconst debouncedEmit = debounce(emit, {\n\tdebounceTime: 500,\n});\n\nconst isCustomDataFilterTracked = ref(false);\nconst isAdvancedExecutionFilterEnabled = computed(() =>\n\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.AdvancedExecutionFilters),\n);\nconst showTags = computed(() => false);\n\nconst getDefaultFilter = (): ExecutionFilterType => ({\n\tstatus: 'all',\n\tworkflowId: 'all',\n\ttags: [],\n\tstartDate: '',\n\tendDate: '',\n\tmetadata: [{ key: '', value: '' }],\n});\nconst filter = reactive(getDefaultFilter());\n\n// Automatically set up v-models based on filter properties\nconst vModel = reactive(\n\tgetObjectKeys(filter).reduce(\n\t\t(acc, key) => {\n\t\t\tacc[key] = computed({\n\t\t\t\tget() {\n\t\t\t\t\treturn filter[key];\n\t\t\t\t},\n\t\t\t\tset(value) {\n\t\t\t\t\t// TODO: find out what exactly is typechecker complaining about\n\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tfilter[key] = value;\n\t\t\t\t\temit('filterChanged', filter);\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<keyof ExecutionFilterType, ReturnType<typeof computed>>,\n\t),\n);\n\nconst statuses = computed(() => [\n\t{ id: 'all', name: locale.baseText('executionsList.anyStatus') },\n\t{ id: 'error', name: locale.baseText('executionsList.error') },\n\t{ id: 'canceled', name: locale.baseText('executionsList.canceled') },\n\t{ id: 'running', name: locale.baseText('executionsList.running') },\n\t{ id: 'success', name: locale.baseText('executionsList.success') },\n\t{ id: 'waiting', name: locale.baseText('executionsList.waiting') },\n]);\n\nconst countSelectedFilterProps = computed(() => {\n\tlet count = 0;\n\tif (filter.status !== 'all') {\n\t\tcount++;\n\t}\n\tif (filter.workflowId !== 'all' && props.workflows.length) {\n\t\tcount++;\n\t}\n\tif (!isEmpty(filter.tags)) {\n\t\tcount++;\n\t}\n\tif (!isEmpty(filter.metadata)) {\n\t\tcount++;\n\t}\n\tif (!!filter.startDate) {\n\t\tcount++;\n\t}\n\tif (!!filter.endDate) {\n\t\tcount++;\n\t}\n\treturn count;\n});\n\n// vModel.metadata is a text input and needs a debounced emit to avoid too many requests\n// We use the :value and @input combo instead of v-model with this event listener\nconst onFilterMetaChange = (index: number, prop: keyof ExecutionFilterMetadata, value: string) => {\n\tif (!filter.metadata[index]) {\n\t\tfilter.metadata[index] = {\n\t\t\tkey: '',\n\t\t\tvalue: '',\n\t\t};\n\t}\n\tfilter.metadata[index][prop] = value;\n\n\tif (!isCustomDataFilterTracked.value) {\n\t\ttelemetry.track('User filtered executions with custom data');\n\t\tisCustomDataFilterTracked.value = true;\n\t}\n\n\tdebouncedEmit('filterChanged', filter);\n};\n\n// Can't use v-model on TagsDropdown component and thus vModel.tags is useless\n// We just emit the updated filter\nconst onTagsChange = (tags: string[]) => {\n\tfilter.tags = tags;\n\temit('filterChanged', filter);\n};\n\nconst onFilterReset = () => {\n\tObject.assign(filter, getDefaultFilter());\n\temit('filterChanged', filter);\n};\n\nconst goToUpgrade = () => {\n\tvoid uiStore.goToUpgrade('custom-data-filter', 'upgrade-custom-data-filter');\n};\n\nonBeforeMount(() => {\n\tisCustomDataFilterTracked.value = false;\n});\n</script>\n<template>\n\t<n8n-popover trigger=\"click\" :placement=\"popoverPlacement\" width=\"440\">\n\t\t<template #reference>\n\t\t\t<n8n-button\n\t\t\t\ticon=\"filter\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\t:active=\"!!countSelectedFilterProps\"\n\t\t\t\tdata-test-id=\"executions-filter-button\"\n\t\t\t>\n\t\t\t\t<n8n-badge\n\t\t\t\t\tv-if=\"!!countSelectedFilterProps\"\n\t\t\t\t\ttheme=\"primary\"\n\t\t\t\t\tclass=\"mr-4xs\"\n\t\t\t\t\tdata-test-id=\"execution-filter-badge\"\n\t\t\t\t\t>{{ countSelectedFilterProps }}</n8n-badge\n\t\t\t\t>\n\t\t\t\t{{ locale.baseText('executionsList.filters') }}\n\t\t\t</n8n-button>\n\t\t</template>\n\t\t<div data-test-id=\"execution-filter-form\">\n\t\t\t<div v-if=\"workflows && workflows.length > 0\" :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-workflows\">{{ locale.baseText('workflows.heading') }}</label>\n\t\t\t\t<n8n-select\n\t\t\t\t\tid=\"execution-filter-workflows\"\n\t\t\t\t\tv-model=\"vModel.workflowId\"\n\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.selectWorkflow')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"executions-filter-workflows-select\"\n\t\t\t\t\t:teleported=\"teleported\"\n\t\t\t\t>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<n8n-option\n\t\t\t\t\t\t\tv-for=\"(item, idx) in props.workflows\"\n\t\t\t\t\t\t\t:key=\"idx\"\n\t\t\t\t\t\t\t:label=\"item.name\"\n\t\t\t\t\t\t\t:value=\"item.id\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t\t<div v-if=\"showTags\" :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-tags\">{{ locale.baseText('workflows.filters.tags') }}</label>\n\t\t\t\t<TagsDropdown\n\t\t\t\t\tid=\"execution-filter-tags\"\n\t\t\t\t\t:placeholder=\"locale.baseText('workflowOpen.filterWorkflows')\"\n\t\t\t\t\t:model-value=\"filter.tags\"\n\t\t\t\t\t:create-enabled=\"false\"\n\t\t\t\t\tdata-test-id=\"executions-filter-tags-select\"\n\t\t\t\t\t@update:model-value=\"onTagsChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-status\">{{ locale.baseText('executionsList.status') }}</label>\n\t\t\t\t<n8n-select\n\t\t\t\t\tid=\"execution-filter-status\"\n\t\t\t\t\tv-model=\"vModel.status\"\n\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.selectStatus')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"executions-filter-status-select\"\n\t\t\t\t\t:teleported=\"teleported\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"(item, idx) in statuses\"\n\t\t\t\t\t\t:key=\"idx\"\n\t\t\t\t\t\t:label=\"item.name\"\n\t\t\t\t\t\t:value=\"item.id\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<label for=\"execution-filter-start-date\">{{\n\t\t\t\t\tlocale.baseText('executionsFilter.start')\n\t\t\t\t}}</label>\n\t\t\t\t<div :class=\"$style.dates\">\n\t\t\t\t\t<el-date-picker\n\t\t\t\t\t\tid=\"execution-filter-start-date\"\n\t\t\t\t\t\tv-model=\"vModel.startDate\"\n\t\t\t\t\t\ttype=\"datetime\"\n\t\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t\t:format=\"DATE_TIME_MASK\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.startDate')\"\n\t\t\t\t\t\tdata-test-id=\"executions-filter-start-date-picker\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span :class=\"$style.divider\">to</span>\n\t\t\t\t\t<el-date-picker\n\t\t\t\t\t\tid=\"execution-filter-end-date\"\n\t\t\t\t\t\tv-model=\"vModel.endDate\"\n\t\t\t\t\t\ttype=\"datetime\"\n\t\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t\t:format=\"DATE_TIME_MASK\"\n\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.endDate')\"\n\t\t\t\t\t\tdata-test-id=\"executions-filter-end-date-picker\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<n8n-tooltip placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"executionsFilter.customData.docsTooltip\">\n\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\thref=\"https://docs.n8n.io/workflows/executions/custom-executions-data/\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ locale.baseText('executionsFilter.customData.docsTooltip.link') }}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</template>\n\t\t\t\t\t<span :class=\"$style.label\">\n\t\t\t\t\t\t{{ locale.baseText('executionsFilter.savedData') }}\n\t\t\t\t\t\t<n8n-icon :class=\"$style.tooltipIcon\" icon=\"question-circle\" size=\"small\" />\n\t\t\t\t\t</span>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<div :class=\"$style.subGroup\">\n\t\t\t\t\t<label for=\"execution-filter-saved-data-key\">{{\n\t\t\t\t\t\tlocale.baseText('executionsFilter.savedDataKey')\n\t\t\t\t\t}}</label>\n\t\t\t\t\t<n8n-tooltip :disabled=\"isAdvancedExecutionFilterEnabled\" placement=\"top\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"executionsFilter.customData.inputTooltip\">\n\t\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"executions-filter-view-plans-link\"\n\t\t\t\t\t\t\t\t\t\t@click.prevent=\"goToUpgrade\"\n\t\t\t\t\t\t\t\t\t\t>{{ locale.baseText('executionsFilter.customData.inputTooltip.link') }}</a\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<n8n-input\n\t\t\t\t\t\t\tid=\"execution-filter-saved-data-key\"\n\t\t\t\t\t\t\tname=\"execution-filter-saved-data-key\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t:disabled=\"!isAdvancedExecutionFilterEnabled\"\n\t\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.savedDataKeyPlaceholder')\"\n\t\t\t\t\t\t\t:model-value=\"filter.metadata[0]?.key\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-filter-saved-data-key-input\"\n\t\t\t\t\t\t\t@update:model-value=\"onFilterMetaChange(0, 'key', $event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<label for=\"execution-filter-saved-data-value\">{{\n\t\t\t\t\t\tlocale.baseText('executionsFilter.savedDataValue')\n\t\t\t\t\t}}</label>\n\t\t\t\t\t<n8n-tooltip :disabled=\"isAdvancedExecutionFilterEnabled\" placement=\"top\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t tag=\"span\" keypath=\"executionsFilter.customData.inputTooltip\">\n\t\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t\t<a href=\"#\" @click.prevent=\"goToUpgrade\">{{\n\t\t\t\t\t\t\t\t\t\tlocale.baseText('executionsFilter.customData.inputTooltip.link')\n\t\t\t\t\t\t\t\t\t}}</a>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<n8n-input\n\t\t\t\t\t\t\tid=\"execution-filter-saved-data-value\"\n\t\t\t\t\t\t\tname=\"execution-filter-saved-data-value\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t:disabled=\"!isAdvancedExecutionFilterEnabled\"\n\t\t\t\t\t\t\t:placeholder=\"locale.baseText('executionsFilter.savedDataValuePlaceholder')\"\n\t\t\t\t\t\t\t:model-value=\"filter.metadata[0]?.value\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-filter-saved-data-value-input\"\n\t\t\t\t\t\t\t@update:model-value=\"onFilterMetaChange(0, 'value', $event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<n8n-button\n\t\t\t\tv-if=\"!!countSelectedFilterProps\"\n\t\t\t\t:class=\"$style.resetBtn\"\n\t\t\t\tsize=\"large\"\n\t\t\t\ttext\n\t\t\t\tdata-test-id=\"executions-filter-reset-button\"\n\t\t\t\t@click=\"onFilterReset\"\n\t\t\t>\n\t\t\t\t{{ locale.baseText('executionsFilter.reset') }}\n\t\t\t</n8n-button>\n\t\t</div>\n\t</n8n-popover>\n</template>\n<style lang=\"scss\" module>\n.group {\n\tlabel,\n\t.label {\n\t\tdisplay: inline-block;\n\t\tfont-size: var(--font-size-2xs);\n\t\tmargin: var(--spacing-s) 0 var(--spacing-3xs);\n\t}\n}\n\n.subGroup {\n\tpadding: 0 0 var(--spacing-xs) var(--spacing-s);\n\n\tlabel,\n\t.label {\n\t\tfont-size: var(--font-size-3xs);\n\t\tmargin: var(--spacing-4xs) 0 var(--spacing-4xs);\n\t}\n}\n\n.dates {\n\tdisplay: flex;\n\tborder: 1px solid var(--color-foreground-base);\n\tborder-radius: var(--border-radius-base);\n\twhite-space: nowrap;\n\talign-items: center;\n}\n\n.divider {\n\tpadding: 0 var(--spacing-m);\n\tline-height: 100%;\n}\n\n.resetBtn {\n\tpadding: 0;\n\tmargin: var(--spacing-xs) 0 0;\n}\n\n.tooltipIcon {\n\tcolor: var(--color-text-light);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n:deep(.el-date-editor) {\n\tinput {\n\t\theight: 36px;\n\t\tborder: 0;\n\t\tpadding-right: 0;\n\t}\n\n\t.el-input__prefix {\n\t\tcolor: var(--color-foreground-dark);\n\t}\n\n\t&:last-of-type {\n\t\tinput {\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t.el-input__prefix {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n:deep(.el-select-dropdown.el-popper[data-popper-placement^='bottom']) {\n\t> .popper__arrow {\n\t\ttop: -6px;\n\t\tleft: 50%;\n\t\tright: unset;\n\t\tmargin-bottom: 0;\n\t\tmargin-right: 3px;\n\t\tborder-left-width: 6px;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-color: var(--border-color-light);\n\t\tborder-right-color: transparent;\n\n\t\t&::after {\n\t\t\ttop: 1px;\n\t\t\tleft: unset;\n\t\t\tbottom: unset;\n\t\t\tmargin-left: -6px;\n\t\t\tborder-left-width: 6px;\n\t\t\tborder-top-width: 0;\n\t\t\tborder-bottom-color: var(--color-foreground-xlight);\n\t\t\tborder-right-color: transparent;\n\t\t}\n\t}\n}\n</style>\n"],"names":["_sfc_main$1","defineComponent","msPassed","DATE_TIME_MASK","settingsStore","useSettingsStore","uiStore","useUIStore","debounce","useDebounce","telemetry","useTelemetry","props","__props","emit","__emit","debouncedEmit","isCustomDataFilterTracked","ref","isAdvancedExecutionFilterEnabled","computed","EnterpriseEditionFeature","showTags","getDefaultFilter","filter","reactive","vModel","getObjectKeys","acc","key","value","statuses","locale","countSelectedFilterProps","count","isEmpty","onFilterMetaChange","index","prop","onTagsChange","tags","onFilterReset","goToUpgrade","onBeforeMount"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{G as ee,av as re,aH as de,r as R,e as T,ag as g,l as i,m as v,p as t,M as b,R as L,I as u,a2 as Z,T as r,U as h,O as w,u as n,S as H,d as xe,b as oe,P as me,V as fe,F as pe,a7 as ye,a0 as we,D as be,y as he}from"./vendor-CUQSof8H.js";import{E as ve,a as ge}from"./ExecutionsFilter-nFboBzV2.js";import{b8 as ke,N as Le,w as te,V as Te,j as ne,J as le,u as ie,z as _e,G as Ee,F as ae,cR as Ae,a3 as Ce}from"./index-CY2ZfL2U.js";import{a as Ie}from"./dateFormatter-SkPyTYT4.js";import{u as Se}from"./useExecutionHelpers-BZpwMJs_.js";import{_ as ce}from"./n8n-DT_bOwuZ.js";import{s as $e}from"./pinia-Dh4cxKZ0.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BiGWdRh4.js";import"./lodash-es-BFdF4Er8.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-C0ZgbPvs.js";import"./vue-i18n-CG6eDDlD.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-x14jMqbG.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-DcTmlMkf.js";import"./@n8n/codemirror-lang-Qkdx7NoQ.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-wY6jAr7b.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-DOxvr88t.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const Me={key:0},De={key:1},Ne={key:0},Oe={key:1},We=t("br",null,null,-1),Re={key:2},je=t("br",null,null,-1),ze=ee({__name:"GlobalExecutionsListItem",props:{execution:{type:Object,required:!0},selected:{type:Boolean,default:!1},workflowName:{type:String,default:void 0}},emits:["stop","select","retrySaved","retryOriginal","delete"],setup(o,{emit:S}){const p=S,c=o,s=re(),l=te(),$=de(),m=Se(),_=R(!1),y=T(()=>c.execution.status==="running"),f=T(()=>c.execution.waitTill?new Date(c.execution.waitTill).toISOString()===ke:!1),d=T(()=>m.isExecutionRetriable(c.execution)),D=T(()=>({[s.executionListItem]:!0,[s[c.execution.status??""]]:!!c.execution.status})),k=T(()=>c.execution.startedAt?F(c.execution.startedAt):""),I=T(()=>c.execution.waitTill?F(c.execution.waitTill):""),N=T(()=>c.execution.stoppedAt?l.displayTimer(new Date(c.execution.stoppedAt).getTime()-new Date(c.execution.startedAt).getTime(),!0):""),E=T(()=>c.execution.status==="waiting"&&f.value?l.baseText("executionsList.statusTooltipText.theWorkflowIsWaitingIndefinitely"):""),O=T(()=>{switch(c.execution.status){case"waiting":return l.baseText("executionsList.waiting");case"canceled":return l.baseText("executionsList.canceled");case"crashed":return l.baseText("executionsList.error");case"new":return l.baseText("executionsList.running");case"running":return l.baseText("executionsList.running");case"success":return l.baseText("executionsList.succeeded");case"error":return l.baseText("executionsList.error");default:return l.baseText("executionsList.unknown")}}),P=T(()=>{switch(c.execution.status){case"waiting":return"executionsList.statusWaiting";case"canceled":return"executionsList.statusCanceled";case"crashed":case"error":case"success":return c.execution.stoppedAt?"executionsList.statusText":"executionsList.statusTextWithoutTime";case"new":return"executionsList.statusRunning";case"running":return"executionsList.statusRunning";default:return"executionsList.statusUnknown"}});function F(x){const{date:j,time:z}=Ie(x);return Le.baseText("executionsList.started",{interpolate:{time:z,date:j}})}function M(){const x=$.resolve({name:Te.EXECUTION_PREVIEW,params:{name:c.execution.workflowId,executionId:c.execution.id}});window.open(x.href,"_blank")}function q(){_.value=!0,p("stop",c.execution)}function J(){p("select",c.execution)}async function X(x){p(x,c.execution)}return(x,j)=>{const z=g("ElCheckbox"),U=g("FontAwesomeIcon"),K=g("i18n-t"),B=g("N8nTooltip"),G=g("N8nButton"),Q=g("N8nIconButton"),V=g("ElDropdownItem"),e=g("ElDropdownMenu"),a=g("ElDropdown");return i(),v("tr",{class:u(D.value)},[t("td",null,[o.execution.stoppedAt&&o.execution.id?(i(),b(z,{key:0,"model-value":o.selected,label:"","data-test-id":"select-execution-checkbox","onUpdate:modelValue":J},null,8,["model-value"])):L("",!0)]),t("td",null,[t("span",{class:u(x.$style.link),onClick:Z(M,["stop"])},r(o.execution.workflowName||o.workflowName),3)]),t("td",null,[t("span",null,r(k.value),1)]),t("td",null,[t("div",{class:u(x.$style.statusColumn)},[y.value?(i(),v("span",{key:0,class:u(x.$style.spinner)},[h(U,{icon:"spinner",spin:""})],2)):L("",!0),f.value?(i(),b(B,{key:2,placement:"top"},{content:w(()=>[t("span",null,r(E.value),1)]),default:w(()=>[t("span",{class:u(x.$style.status)},r(O.value),3)]),_:1})):(i(),b(K,{key:1,"data-test-id":"execution-status",tag:"span",keypath:P.value},{status:w(()=>[t("span",{class:u(x.$style.status)},r(O.value),3)]),time:w(()=>[o.execution.waitTill?(i(),v("span",Me,r(I.value),1)):o.execution.stoppedAt?(i(),v("span",De,r(N.value),1)):(i(),b(ve,{key:2,"start-time":o.execution.startedAt},null,8,["start-time"]))]),_:1},8,["keypath"]))],2)]),t("td",null,[o.execution.id?(i(),v("span",Ne,"#"+r(o.execution.id),1)):L("",!0),o.execution.retryOf?(i(),v("span",Oe,[We,t("small",null," ("+r(n(l).baseText("executionsList.retryOf"))+" #"+r(o.execution.retryOf)+") ",1)])):o.execution.retrySuccessId?(i(),v("span",Re,[je,t("small",null," ("+r(n(l).baseText("executionsList.successRetry"))+" #"+r(o.execution.retrySuccessId)+") ",1)])):L("",!0)]),t("td",null,[o.execution.mode==="manual"?(i(),b(B,{key:0,placement:"top"},{content:w(()=>[t("span",null,r(n(l).baseText("executionsList.test")),1)]),default:w(()=>[h(U,{icon:"flask"})]),_:1})):L("",!0)]),t("td",null,[t("div",{class:u(x.$style.buttonCell)},[o.execution.stoppedAt&&o.execution.id?(i(),b(G,{key:0,size:"small",outline:"",label:n(l).baseText("executionsList.view"),onClick:Z(M,["stop"])},null,8,["label"])):L("",!0)],2)]),t("td",null,[t("div",{class:u(x.$style.buttonCell)},[!o.execution.stoppedAt||o.execution.waitTill?(i(),b(G,{key:0,"data-test-id":"stop-execution-button",size:"small",outline:"",label:n(l).baseText("executionsList.stop"),loading:_.value,onClick:Z(q,["stop"])},null,8,["label","loading"])):L("",!0)],2)]),t("td",null,[y.value?L("",!0):(i(),b(a,{key:0,trigger:"click",onCommand:X},{dropdown:w(()=>[h(e,{class:u({[x.$style.actions]:!0,[x.$style.deleteOnly]:!d.value})},{default:w(()=>[d.value?(i(),b(V,{key:0,"data-test-id":"execution-retry-saved-dropdown-item",class:u(x.$style.retryAction),command:"retrySaved"},{default:w(()=>[H(r(n(l).baseText("executionsList.retryWithCurrentlySavedWorkflow")),1)]),_:1},8,["class"])):L("",!0),d.value?(i(),b(V,{key:1,"data-test-id":"execution-retry-original-dropdown-item",class:u(x.$style.retryAction),command:"retryOriginal"},{default:w(()=>[H(r(n(l).baseText("executionsList.retryWithOriginalWorkflow")),1)]),_:1},8,["class"])):L("",!0),h(V,{"data-test-id":"execution-delete-dropdown-item",class:u(x.$style.deleteAction),command:"delete"},{default:w(()=>[H(r(n(l).baseText("generic.delete")),1)]),_:1},8,["class"])]),_:1},8,["class"])]),default:w(()=>[h(Q,{text:"",type:"tertiary",size:"mini",icon:"ellipsis-v"})]),_:1}))])],2)}}}),Be="_executionListItem_jgpi5_1",Ve="_crashed_jgpi5_30",He="_error_jgpi5_30",Fe="_success_jgpi5_33",Ue="_running_jgpi5_36",Ge="_waiting_jgpi5_39",Pe="_unknown_jgpi5_42",qe="_link_jgpi5_46",Je="_statusColumn_jgpi5_52",Xe="_spinner_jgpi5_57",Ke="_status_jgpi5_52",Qe="_buttonCell_jgpi5_83",Ye={executionListItem:Be,crashed:Ve,error:He,success:Fe,new:"_new_jgpi5_36",running:Ue,waiting:Ge,unknown:Pe,link:qe,statusColumn:Je,spinner:Xe,status:Ke,buttonCell:Qe},Ze={$style:Ye},et=ce(ze,[["__cssModules",Ze]]),tt={key:1},st=t("th",null,null,-1),ot=t("th",null,null,-1),nt=t("th",null,null,-1),lt=t("th",null,null,-1),it=ee({__name:"GlobalExecutionsList",props:{executions:{type:Array,default:()=>[]},filters:{type:Object,default:()=>({})},total:{type:Number,default:0},estimated:{type:Boolean,default:!1}},emits:["closeModal","execution:stop","update:autoRefresh","update:filters"],setup(o,{emit:S}){const p=o,c=S,s=te(),l=ae(),$=ne(),m=le(),_=R(!1),y=R(!1),f=R(!1),d=R({}),D=Ee(),k=ie(),I=T(()=>f.value?p.total:Object.keys(d.value).length),N=T(()=>[{id:"all",name:s.baseText("executionsList.allWorkflows")},...$.allWorkflows]);xe(()=>p.executions,()=>{p.executions.length===0&&M(),z()}),oe(()=>{_.value=!0});function E(){f.value=!f.value,y.value=!f.value,O()}function O(){y.value=!y.value,y.value?j():(f.value=!1,d.value={})}function P(e){const a=e.id;if(d.value[a]){const{[a]:A,...W}=d.value;d.value=W}else d.value={...d.value,[a]:!0};y.value=Object.keys(d.value).length===p.executions.length,f.value=Object.keys(d.value).length===p.total}async function F(){if(await D.confirm(s.baseText("executionsList.confirmMessage.message",{interpolate:{count:I.value.toString()}}),s.baseText("executionsList.confirmMessage.headline"),{type:"warning",confirmButtonText:s.baseText("executionsList.confirmMessage.confirmButtonText"),cancelButtonText:s.baseText("executionsList.confirmMessage.cancelButtonText")})===_e){try{await m.deleteExecutions({filters:m.executionsFilters,...f.value?{deleteBefore:p.executions[0].startedAt}:{ids:Object.keys(d.value)}})}catch(a){k.showError(a,s.baseText("executionsList.showError.handleDeleteSelected.title"));return}k.showMessage({title:s.baseText("executionsList.showMessage.handleDeleteSelected.title"),type:"success"}),M()}}function M(){y.value=!1,f.value=!1,d.value={}}async function q(e){c("update:filters",e),M()}function J(e){return X(e.workflowId??"")??s.baseText("executionsList.unsavedWorkflow")}function X(e){var a;return(a=N.value.find(A=>A.id===e))==null?void 0:a.name}async function x(){if(m.filters.status==="running")return;let e;p.executions.length!==0&&(e=p.executions.slice(-1)[0].id);try{await m.fetchExecutions(m.executionsFilters,e)}catch(a){k.showError(a,s.baseText("executionsList.showError.loadMore.title"))}}function j(){p.executions.forEach(e=>{d.value[e.id]=!0})}function z(){f.value&&(y.value=!0,j())}async function U(e){await B(e,!0)}async function K(e){await B(e,!1)}async function B(e,a){try{await m.retryExecution(e.id,a)?k.showMessage({title:s.baseText("executionsList.showMessage.retrySuccessfulTrue.title"),type:"success"}):k.showMessage({title:s.baseText("executionsList.showMessage.retrySuccessfulFalse.title"),type:"error"})}catch(A){k.showError(A,s.baseText("executionsList.showError.retryExecution.title"))}l.track("User clicked retry execution button",{workflow_id:$.workflowId,execution_id:e.id,retry_type:a?"current":"original"})}async function G(e){try{await m.stopCurrentExecution(e.id),k.showMessage({title:s.baseText("executionsList.showMessage.stopExecution.title"),message:s.baseText("executionsList.showMessage.stopExecution.message",{interpolate:{activeExecutionId:e.id}}),type:"success"}),c("execution:stop")}catch(a){k.showError(a,s.baseText("executionsList.showError.stopExecution.title"))}}async function Q(e){try{if(await m.deleteExecutions({ids:[e.id]}),y.value){const{[e.id]:a,...A}=d.value;d.value=A}}catch(a){k.showError(a,s.baseText("executionsList.showError.handleDeleteSelected.title"))}}async function V(e){e?await m.startAutoRefreshInterval():m.stopAutoRefreshInterval()}return(e,a)=>{const A=g("N8nHeading"),W=g("N8nLoading"),se=g("ElCheckbox"),ue=g("el-checkbox"),Y=g("N8nButton");return i(),v("div",{class:u(e.$style.execListWrapper)},[t("div",{class:u(e.$style.execList)},[t("div",{class:u(e.$style.execListHeader)},[h(A,{tag:"h1",size:"2xlarge"},{default:w(()=>[H(r(n(s).baseText("executionsList.workflowExecutions")),1)]),_:1}),t("div",{class:u(e.$style.execListHeaderControls)},[_.value?(i(),b(se,{key:1,modelValue:n(m).autoRefresh,"onUpdate:modelValue":[a[0]||(a[0]=C=>n(m).autoRefresh=C),a[1]||(a[1]=C=>V(C))],class:"mr-xl","data-test-id":"execution-auto-refresh-checkbox"},{default:w(()=>[H(r(n(s).baseText("executionsList.autoRefresh")),1)]),_:1},8,["modelValue"])):(i(),b(W,{key:0,class:u(e.$style.filterLoader),variant:"custom"},null,8,["class"])),me(h(ge,{workflows:N.value,onFilterChanged:q},null,8,["workflows"]),[[fe,_.value]])],2)],2),y.value&&o.total>0?(i(),b(se,{key:0,class:u(e.$style.selectAll),label:n(s).baseText("executionsList.selectAll",{adjustToNumber:o.total,interpolate:{executionNum:`${o.total}`}}),"model-value":f.value,"data-test-id":"select-all-executions-checkbox","onUpdate:modelValue":E},null,8,["class","label","model-value"])):L("",!0),_.value?(i(),v("table",{key:2,class:u(e.$style.execTable)},[t("thead",null,[t("tr",null,[t("th",null,[h(ue,{"model-value":y.value,disabled:o.total<1,label:"","data-test-id":"select-visible-executions-checkbox","onUpdate:modelValue":O},null,8,["model-value","disabled"])]),t("th",null,r(n(s).baseText("executionsList.name")),1),t("th",null,r(n(s).baseText("executionsList.startedAt")),1),t("th",null,r(n(s).baseText("executionsList.status")),1),t("th",null,r(n(s).baseText("executionsList.id")),1),st,ot,nt,lt])]),h(we,{tag:"tbody",name:"executions-list"},{default:w(()=>[(i(!0),v(pe,null,ye(o.executions,C=>(i(),b(et,{key:C.id,execution:C,"workflow-name":J(C),selected:d.value[C.id]||f.value,onStop:G,onDelete:Q,onSelect:P,onRetrySaved:U,onRetryOriginal:K},null,8,["execution","workflow-name","selected"]))),128))]),_:1})],2)):(i(),v("div",tt,[h(W,{class:u(e.$style.tableLoader),variant:"custom"},null,8,["class"]),h(W,{class:u(e.$style.tableLoader),variant:"custom"},null,8,["class"]),h(W,{class:u(e.$style.tableLoader),variant:"custom"},null,8,["class"])])),!o.executions.length&&_.value&&!n(m).loading?(i(),v("div",{key:3,class:u(e.$style.loadedAll),"data-test-id":"execution-list-empty"},r(n(s).baseText("executionsList.empty")),3)):o.total>o.executions.length||o.estimated?(i(),v("div",{key:4,class:u(e.$style.loadMore)},[h(Y,{icon:"sync",title:n(s).baseText("executionsList.loadMore"),label:n(s).baseText("executionsList.loadMore"),loading:n(m).loading,"data-test-id":"load-more-button",onClick:a[2]||(a[2]=C=>x())},null,8,["title","label","loading"])],2)):_.value&&!n(m).loading?(i(),v("div",{key:5,class:u(e.$style.loadedAll),"data-test-id":"execution-all-loaded"},r(n(s).baseText("executionsList.loadedAll")),3)):L("",!0)],2),I.value>0?(i(),v("div",{key:0,class:u(e.$style.selectionOptions),"data-test-id":"selected-executions-info"},[t("span",null,r(n(s).baseText("executionsList.selected",{adjustToNumber:I.value,interpolate:{count:`${I.value}`}})),1),h(Y,{label:n(s).baseText("generic.delete"),type:"tertiary","data-test-id":"delete-selected-button",onClick:F},null,8,["label"]),h(Y,{label:n(s).baseText("executionsList.clearSelection"),type:"tertiary","data-test-id":"clear-selection-button",onClick:M},null,8,["label"])],2)):L("",!0)],2)}}}),at="_execListWrapper_1xozp_1",ct="_execList_1xozp_1",ut="_execListHeader_1xozp_22",rt="_execListHeaderControls_1xozp_29",dt="_selectionOptions_1xozp_35",xt="_execTable_1xozp_53",mt="_loadMore_1xozp_96",ft="_loadedAll_1xozp_102",pt="_actions_1xozp_109",yt="_deleteOnly_1xozp_109",wt="_retryAction_1xozp_113",bt="_deleteAction_1xozp_113",ht="_selectAll_1xozp_117",vt="_filterLoader_1xozp_123",gt="_tableLoader_1xozp_128",kt={execListWrapper:at,execList:ct,execListHeader:ut,execListHeaderControls:rt,selectionOptions:dt,execTable:xt,loadMore:mt,loadedAll:ft,actions:pt,deleteOnly:yt,retryAction:wt,deleteAction:bt,selectAll:ht,filterLoader:vt,tableLoader:gt},Lt={$style:kt},Tt=ce(it,[["__cssModules",Lt]]),os=ee({__name:"ExecutionsView",setup(o){const S=te(),p=ae(),c=Ce(),s=ne(),l=le(),$=ie();R(!1);const{executionsCount:m,executionsCountEstimated:_,filters:y,allExecutions:f}=$e(l);be(async()=>{await d(),c.run("executionsList.openDialog"),p.track("User opened Executions log",{workflow_id:s.workflowId})}),oe(async()=>{Ae(`n8n - ${S.baseText("executionsList.workflowExecutions")}`),document.addEventListener("visibilitychange",D),await l.initialize()}),he(()=>{l.reset(),document.removeEventListener("visibilitychange",D)});async function d(){try{await s.fetchAllWorkflows()}catch(E){$.showError(E,S.baseText("executionsList.showError.loadWorkflows.title"))}}function D(){document.visibilityState==="hidden"?l.stopAutoRefreshInterval():l.startAutoRefreshInterval()}async function k(){try{await l.fetchExecutions()}catch(E){$.showError(E,S.baseText("executionsList.showError.refreshData.title"))}}async function I(E){l.reset(),l.setFilters(E),await l.initialize()}async function N(){await k()}return(E,O)=>(i(),b(Tt,{executions:n(f),filters:n(y),total:n(m),"estimated-total":n(_),"onExecution:stop":N,"onUpdate:filters":I},null,8,["executions","filters","total","estimated-total"]))}});export{os as default};
|
|
2
|
-
//# sourceMappingURL=ExecutionsView-
|
|
1
|
+
import{G as ee,av as re,aH as de,r as R,e as T,ag as g,l as i,m as v,p as t,M as b,R as L,I as u,a2 as Z,T as r,U as h,O as w,u as n,S as H,d as xe,b as oe,P as me,V as fe,F as pe,a7 as ye,a0 as we,D as be,y as he}from"./vendor-CUQSof8H.js";import{E as ve,a as ge}from"./ExecutionsFilter-0t_omffh.js";import{b8 as ke,N as Le,w as te,V as Te,j as ne,J as le,u as ie,z as _e,G as Ee,F as ae,cR as Ae,a3 as Ce}from"./index-BQ6Z7VRj.js";import{a as Ie}from"./dateFormatter-SkPyTYT4.js";import{u as Se}from"./useExecutionHelpers-Dt-UJW97.js";import{_ as ce}from"./n8n-DT_bOwuZ.js";import{s as $e}from"./pinia-Dh4cxKZ0.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BiGWdRh4.js";import"./lodash-es-BFdF4Er8.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-C0ZgbPvs.js";import"./vue-i18n-CG6eDDlD.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-x14jMqbG.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-DcTmlMkf.js";import"./@n8n/codemirror-lang-Qkdx7NoQ.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-wY6jAr7b.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-DOxvr88t.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const Me={key:0},De={key:1},Ne={key:0},Oe={key:1},We=t("br",null,null,-1),Re={key:2},je=t("br",null,null,-1),ze=ee({__name:"GlobalExecutionsListItem",props:{execution:{type:Object,required:!0},selected:{type:Boolean,default:!1},workflowName:{type:String,default:void 0}},emits:["stop","select","retrySaved","retryOriginal","delete"],setup(o,{emit:S}){const p=S,c=o,s=re(),l=te(),$=de(),m=Se(),_=R(!1),y=T(()=>c.execution.status==="running"),f=T(()=>c.execution.waitTill?new Date(c.execution.waitTill).toISOString()===ke:!1),d=T(()=>m.isExecutionRetriable(c.execution)),D=T(()=>({[s.executionListItem]:!0,[s[c.execution.status??""]]:!!c.execution.status})),k=T(()=>c.execution.startedAt?F(c.execution.startedAt):""),I=T(()=>c.execution.waitTill?F(c.execution.waitTill):""),N=T(()=>c.execution.stoppedAt?l.displayTimer(new Date(c.execution.stoppedAt).getTime()-new Date(c.execution.startedAt).getTime(),!0):""),E=T(()=>c.execution.status==="waiting"&&f.value?l.baseText("executionsList.statusTooltipText.theWorkflowIsWaitingIndefinitely"):""),O=T(()=>{switch(c.execution.status){case"waiting":return l.baseText("executionsList.waiting");case"canceled":return l.baseText("executionsList.canceled");case"crashed":return l.baseText("executionsList.error");case"new":return l.baseText("executionsList.running");case"running":return l.baseText("executionsList.running");case"success":return l.baseText("executionsList.succeeded");case"error":return l.baseText("executionsList.error");default:return l.baseText("executionsList.unknown")}}),P=T(()=>{switch(c.execution.status){case"waiting":return"executionsList.statusWaiting";case"canceled":return"executionsList.statusCanceled";case"crashed":case"error":case"success":return c.execution.stoppedAt?"executionsList.statusText":"executionsList.statusTextWithoutTime";case"new":return"executionsList.statusRunning";case"running":return"executionsList.statusRunning";default:return"executionsList.statusUnknown"}});function F(x){const{date:j,time:z}=Ie(x);return Le.baseText("executionsList.started",{interpolate:{time:z,date:j}})}function M(){const x=$.resolve({name:Te.EXECUTION_PREVIEW,params:{name:c.execution.workflowId,executionId:c.execution.id}});window.open(x.href,"_blank")}function q(){_.value=!0,p("stop",c.execution)}function J(){p("select",c.execution)}async function X(x){p(x,c.execution)}return(x,j)=>{const z=g("ElCheckbox"),U=g("FontAwesomeIcon"),K=g("i18n-t"),B=g("N8nTooltip"),G=g("N8nButton"),Q=g("N8nIconButton"),V=g("ElDropdownItem"),e=g("ElDropdownMenu"),a=g("ElDropdown");return i(),v("tr",{class:u(D.value)},[t("td",null,[o.execution.stoppedAt&&o.execution.id?(i(),b(z,{key:0,"model-value":o.selected,label:"","data-test-id":"select-execution-checkbox","onUpdate:modelValue":J},null,8,["model-value"])):L("",!0)]),t("td",null,[t("span",{class:u(x.$style.link),onClick:Z(M,["stop"])},r(o.execution.workflowName||o.workflowName),3)]),t("td",null,[t("span",null,r(k.value),1)]),t("td",null,[t("div",{class:u(x.$style.statusColumn)},[y.value?(i(),v("span",{key:0,class:u(x.$style.spinner)},[h(U,{icon:"spinner",spin:""})],2)):L("",!0),f.value?(i(),b(B,{key:2,placement:"top"},{content:w(()=>[t("span",null,r(E.value),1)]),default:w(()=>[t("span",{class:u(x.$style.status)},r(O.value),3)]),_:1})):(i(),b(K,{key:1,"data-test-id":"execution-status",tag:"span",keypath:P.value},{status:w(()=>[t("span",{class:u(x.$style.status)},r(O.value),3)]),time:w(()=>[o.execution.waitTill?(i(),v("span",Me,r(I.value),1)):o.execution.stoppedAt?(i(),v("span",De,r(N.value),1)):(i(),b(ve,{key:2,"start-time":o.execution.startedAt},null,8,["start-time"]))]),_:1},8,["keypath"]))],2)]),t("td",null,[o.execution.id?(i(),v("span",Ne,"#"+r(o.execution.id),1)):L("",!0),o.execution.retryOf?(i(),v("span",Oe,[We,t("small",null," ("+r(n(l).baseText("executionsList.retryOf"))+" #"+r(o.execution.retryOf)+") ",1)])):o.execution.retrySuccessId?(i(),v("span",Re,[je,t("small",null," ("+r(n(l).baseText("executionsList.successRetry"))+" #"+r(o.execution.retrySuccessId)+") ",1)])):L("",!0)]),t("td",null,[o.execution.mode==="manual"?(i(),b(B,{key:0,placement:"top"},{content:w(()=>[t("span",null,r(n(l).baseText("executionsList.test")),1)]),default:w(()=>[h(U,{icon:"flask"})]),_:1})):L("",!0)]),t("td",null,[t("div",{class:u(x.$style.buttonCell)},[o.execution.stoppedAt&&o.execution.id?(i(),b(G,{key:0,size:"small",outline:"",label:n(l).baseText("executionsList.view"),onClick:Z(M,["stop"])},null,8,["label"])):L("",!0)],2)]),t("td",null,[t("div",{class:u(x.$style.buttonCell)},[!o.execution.stoppedAt||o.execution.waitTill?(i(),b(G,{key:0,"data-test-id":"stop-execution-button",size:"small",outline:"",label:n(l).baseText("executionsList.stop"),loading:_.value,onClick:Z(q,["stop"])},null,8,["label","loading"])):L("",!0)],2)]),t("td",null,[y.value?L("",!0):(i(),b(a,{key:0,trigger:"click",onCommand:X},{dropdown:w(()=>[h(e,{class:u({[x.$style.actions]:!0,[x.$style.deleteOnly]:!d.value})},{default:w(()=>[d.value?(i(),b(V,{key:0,"data-test-id":"execution-retry-saved-dropdown-item",class:u(x.$style.retryAction),command:"retrySaved"},{default:w(()=>[H(r(n(l).baseText("executionsList.retryWithCurrentlySavedWorkflow")),1)]),_:1},8,["class"])):L("",!0),d.value?(i(),b(V,{key:1,"data-test-id":"execution-retry-original-dropdown-item",class:u(x.$style.retryAction),command:"retryOriginal"},{default:w(()=>[H(r(n(l).baseText("executionsList.retryWithOriginalWorkflow")),1)]),_:1},8,["class"])):L("",!0),h(V,{"data-test-id":"execution-delete-dropdown-item",class:u(x.$style.deleteAction),command:"delete"},{default:w(()=>[H(r(n(l).baseText("generic.delete")),1)]),_:1},8,["class"])]),_:1},8,["class"])]),default:w(()=>[h(Q,{text:"",type:"tertiary",size:"mini",icon:"ellipsis-v"})]),_:1}))])],2)}}}),Be="_executionListItem_jgpi5_1",Ve="_crashed_jgpi5_30",He="_error_jgpi5_30",Fe="_success_jgpi5_33",Ue="_running_jgpi5_36",Ge="_waiting_jgpi5_39",Pe="_unknown_jgpi5_42",qe="_link_jgpi5_46",Je="_statusColumn_jgpi5_52",Xe="_spinner_jgpi5_57",Ke="_status_jgpi5_52",Qe="_buttonCell_jgpi5_83",Ye={executionListItem:Be,crashed:Ve,error:He,success:Fe,new:"_new_jgpi5_36",running:Ue,waiting:Ge,unknown:Pe,link:qe,statusColumn:Je,spinner:Xe,status:Ke,buttonCell:Qe},Ze={$style:Ye},et=ce(ze,[["__cssModules",Ze]]),tt={key:1},st=t("th",null,null,-1),ot=t("th",null,null,-1),nt=t("th",null,null,-1),lt=t("th",null,null,-1),it=ee({__name:"GlobalExecutionsList",props:{executions:{type:Array,default:()=>[]},filters:{type:Object,default:()=>({})},total:{type:Number,default:0},estimated:{type:Boolean,default:!1}},emits:["closeModal","execution:stop","update:autoRefresh","update:filters"],setup(o,{emit:S}){const p=o,c=S,s=te(),l=ae(),$=ne(),m=le(),_=R(!1),y=R(!1),f=R(!1),d=R({}),D=Ee(),k=ie(),I=T(()=>f.value?p.total:Object.keys(d.value).length),N=T(()=>[{id:"all",name:s.baseText("executionsList.allWorkflows")},...$.allWorkflows]);xe(()=>p.executions,()=>{p.executions.length===0&&M(),z()}),oe(()=>{_.value=!0});function E(){f.value=!f.value,y.value=!f.value,O()}function O(){y.value=!y.value,y.value?j():(f.value=!1,d.value={})}function P(e){const a=e.id;if(d.value[a]){const{[a]:A,...W}=d.value;d.value=W}else d.value={...d.value,[a]:!0};y.value=Object.keys(d.value).length===p.executions.length,f.value=Object.keys(d.value).length===p.total}async function F(){if(await D.confirm(s.baseText("executionsList.confirmMessage.message",{interpolate:{count:I.value.toString()}}),s.baseText("executionsList.confirmMessage.headline"),{type:"warning",confirmButtonText:s.baseText("executionsList.confirmMessage.confirmButtonText"),cancelButtonText:s.baseText("executionsList.confirmMessage.cancelButtonText")})===_e){try{await m.deleteExecutions({filters:m.executionsFilters,...f.value?{deleteBefore:p.executions[0].startedAt}:{ids:Object.keys(d.value)}})}catch(a){k.showError(a,s.baseText("executionsList.showError.handleDeleteSelected.title"));return}k.showMessage({title:s.baseText("executionsList.showMessage.handleDeleteSelected.title"),type:"success"}),M()}}function M(){y.value=!1,f.value=!1,d.value={}}async function q(e){c("update:filters",e),M()}function J(e){return X(e.workflowId??"")??s.baseText("executionsList.unsavedWorkflow")}function X(e){var a;return(a=N.value.find(A=>A.id===e))==null?void 0:a.name}async function x(){if(m.filters.status==="running")return;let e;p.executions.length!==0&&(e=p.executions.slice(-1)[0].id);try{await m.fetchExecutions(m.executionsFilters,e)}catch(a){k.showError(a,s.baseText("executionsList.showError.loadMore.title"))}}function j(){p.executions.forEach(e=>{d.value[e.id]=!0})}function z(){f.value&&(y.value=!0,j())}async function U(e){await B(e,!0)}async function K(e){await B(e,!1)}async function B(e,a){try{await m.retryExecution(e.id,a)?k.showMessage({title:s.baseText("executionsList.showMessage.retrySuccessfulTrue.title"),type:"success"}):k.showMessage({title:s.baseText("executionsList.showMessage.retrySuccessfulFalse.title"),type:"error"})}catch(A){k.showError(A,s.baseText("executionsList.showError.retryExecution.title"))}l.track("User clicked retry execution button",{workflow_id:$.workflowId,execution_id:e.id,retry_type:a?"current":"original"})}async function G(e){try{await m.stopCurrentExecution(e.id),k.showMessage({title:s.baseText("executionsList.showMessage.stopExecution.title"),message:s.baseText("executionsList.showMessage.stopExecution.message",{interpolate:{activeExecutionId:e.id}}),type:"success"}),c("execution:stop")}catch(a){k.showError(a,s.baseText("executionsList.showError.stopExecution.title"))}}async function Q(e){try{if(await m.deleteExecutions({ids:[e.id]}),y.value){const{[e.id]:a,...A}=d.value;d.value=A}}catch(a){k.showError(a,s.baseText("executionsList.showError.handleDeleteSelected.title"))}}async function V(e){e?await m.startAutoRefreshInterval():m.stopAutoRefreshInterval()}return(e,a)=>{const A=g("N8nHeading"),W=g("N8nLoading"),se=g("ElCheckbox"),ue=g("el-checkbox"),Y=g("N8nButton");return i(),v("div",{class:u(e.$style.execListWrapper)},[t("div",{class:u(e.$style.execList)},[t("div",{class:u(e.$style.execListHeader)},[h(A,{tag:"h1",size:"2xlarge"},{default:w(()=>[H(r(n(s).baseText("executionsList.workflowExecutions")),1)]),_:1}),t("div",{class:u(e.$style.execListHeaderControls)},[_.value?(i(),b(se,{key:1,modelValue:n(m).autoRefresh,"onUpdate:modelValue":[a[0]||(a[0]=C=>n(m).autoRefresh=C),a[1]||(a[1]=C=>V(C))],class:"mr-xl","data-test-id":"execution-auto-refresh-checkbox"},{default:w(()=>[H(r(n(s).baseText("executionsList.autoRefresh")),1)]),_:1},8,["modelValue"])):(i(),b(W,{key:0,class:u(e.$style.filterLoader),variant:"custom"},null,8,["class"])),me(h(ge,{workflows:N.value,onFilterChanged:q},null,8,["workflows"]),[[fe,_.value]])],2)],2),y.value&&o.total>0?(i(),b(se,{key:0,class:u(e.$style.selectAll),label:n(s).baseText("executionsList.selectAll",{adjustToNumber:o.total,interpolate:{executionNum:`${o.total}`}}),"model-value":f.value,"data-test-id":"select-all-executions-checkbox","onUpdate:modelValue":E},null,8,["class","label","model-value"])):L("",!0),_.value?(i(),v("table",{key:2,class:u(e.$style.execTable)},[t("thead",null,[t("tr",null,[t("th",null,[h(ue,{"model-value":y.value,disabled:o.total<1,label:"","data-test-id":"select-visible-executions-checkbox","onUpdate:modelValue":O},null,8,["model-value","disabled"])]),t("th",null,r(n(s).baseText("executionsList.name")),1),t("th",null,r(n(s).baseText("executionsList.startedAt")),1),t("th",null,r(n(s).baseText("executionsList.status")),1),t("th",null,r(n(s).baseText("executionsList.id")),1),st,ot,nt,lt])]),h(we,{tag:"tbody",name:"executions-list"},{default:w(()=>[(i(!0),v(pe,null,ye(o.executions,C=>(i(),b(et,{key:C.id,execution:C,"workflow-name":J(C),selected:d.value[C.id]||f.value,onStop:G,onDelete:Q,onSelect:P,onRetrySaved:U,onRetryOriginal:K},null,8,["execution","workflow-name","selected"]))),128))]),_:1})],2)):(i(),v("div",tt,[h(W,{class:u(e.$style.tableLoader),variant:"custom"},null,8,["class"]),h(W,{class:u(e.$style.tableLoader),variant:"custom"},null,8,["class"]),h(W,{class:u(e.$style.tableLoader),variant:"custom"},null,8,["class"])])),!o.executions.length&&_.value&&!n(m).loading?(i(),v("div",{key:3,class:u(e.$style.loadedAll),"data-test-id":"execution-list-empty"},r(n(s).baseText("executionsList.empty")),3)):o.total>o.executions.length||o.estimated?(i(),v("div",{key:4,class:u(e.$style.loadMore)},[h(Y,{icon:"sync",title:n(s).baseText("executionsList.loadMore"),label:n(s).baseText("executionsList.loadMore"),loading:n(m).loading,"data-test-id":"load-more-button",onClick:a[2]||(a[2]=C=>x())},null,8,["title","label","loading"])],2)):_.value&&!n(m).loading?(i(),v("div",{key:5,class:u(e.$style.loadedAll),"data-test-id":"execution-all-loaded"},r(n(s).baseText("executionsList.loadedAll")),3)):L("",!0)],2),I.value>0?(i(),v("div",{key:0,class:u(e.$style.selectionOptions),"data-test-id":"selected-executions-info"},[t("span",null,r(n(s).baseText("executionsList.selected",{adjustToNumber:I.value,interpolate:{count:`${I.value}`}})),1),h(Y,{label:n(s).baseText("generic.delete"),type:"tertiary","data-test-id":"delete-selected-button",onClick:F},null,8,["label"]),h(Y,{label:n(s).baseText("executionsList.clearSelection"),type:"tertiary","data-test-id":"clear-selection-button",onClick:M},null,8,["label"])],2)):L("",!0)],2)}}}),at="_execListWrapper_1xozp_1",ct="_execList_1xozp_1",ut="_execListHeader_1xozp_22",rt="_execListHeaderControls_1xozp_29",dt="_selectionOptions_1xozp_35",xt="_execTable_1xozp_53",mt="_loadMore_1xozp_96",ft="_loadedAll_1xozp_102",pt="_actions_1xozp_109",yt="_deleteOnly_1xozp_109",wt="_retryAction_1xozp_113",bt="_deleteAction_1xozp_113",ht="_selectAll_1xozp_117",vt="_filterLoader_1xozp_123",gt="_tableLoader_1xozp_128",kt={execListWrapper:at,execList:ct,execListHeader:ut,execListHeaderControls:rt,selectionOptions:dt,execTable:xt,loadMore:mt,loadedAll:ft,actions:pt,deleteOnly:yt,retryAction:wt,deleteAction:bt,selectAll:ht,filterLoader:vt,tableLoader:gt},Lt={$style:kt},Tt=ce(it,[["__cssModules",Lt]]),os=ee({__name:"ExecutionsView",setup(o){const S=te(),p=ae(),c=Ce(),s=ne(),l=le(),$=ie();R(!1);const{executionsCount:m,executionsCountEstimated:_,filters:y,allExecutions:f}=$e(l);be(async()=>{await d(),c.run("executionsList.openDialog"),p.track("User opened Executions log",{workflow_id:s.workflowId})}),oe(async()=>{Ae(`n8n - ${S.baseText("executionsList.workflowExecutions")}`),document.addEventListener("visibilitychange",D),await l.initialize()}),he(()=>{l.reset(),document.removeEventListener("visibilitychange",D)});async function d(){try{await s.fetchAllWorkflows()}catch(E){$.showError(E,S.baseText("executionsList.showError.loadWorkflows.title"))}}function D(){document.visibilityState==="hidden"?l.stopAutoRefreshInterval():l.startAutoRefreshInterval()}async function k(){try{await l.fetchExecutions()}catch(E){$.showError(E,S.baseText("executionsList.showError.refreshData.title"))}}async function I(E){l.reset(),l.setFilters(E),await l.initialize()}async function N(){await k()}return(E,O)=>(i(),b(Tt,{executions:n(f),filters:n(y),total:n(m),"estimated-total":n(_),"onExecution:stop":N,"onUpdate:filters":I},null,8,["executions","filters","total","estimated-total"]))}});export{os as default};
|
|
2
|
+
//# sourceMappingURL=ExecutionsView-DzCvkqXG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionsView-CbkLSsSW.js","sources":["../../src/components/executions/global/GlobalExecutionsListItem.vue","../../src/components/executions/global/GlobalExecutionsList.vue","../../src/views/ExecutionsView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { PropType } from 'vue';\nimport { ref, computed, useCssModule } from 'vue';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS, WAIT_TIME_UNLIMITED } from '@/constants';\nimport { useRouter } from 'vue-router';\nimport { convertToDisplayDate } from '@/utils/formatters/dateFormatter';\nimport { i18n as locale } from '@/plugins/i18n';\nimport ExecutionsTime from '@/components/executions/ExecutionsTime.vue';\nimport { useExecutionHelpers } from '@/composables/useExecutionHelpers';\n\nconst emit = defineEmits(['stop', 'select', 'retrySaved', 'retryOriginal', 'delete']);\n\nconst props = defineProps({\n\texecution: {\n\t\ttype: Object as PropType<ExecutionSummary>,\n\t\trequired: true,\n\t},\n\tselected: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n\tworkflowName: {\n\t\ttype: String,\n\t\tdefault: undefined,\n\t},\n});\n\nconst style = useCssModule();\nconst i18n = useI18n();\nconst router = useRouter();\nconst executionHelpers = useExecutionHelpers();\n\nconst isStopping = ref(false);\n\nconst isRunning = computed(() => {\n\treturn props.execution.status === 'running';\n});\n\nconst isWaitTillIndefinite = computed(() => {\n\tif (!props.execution.waitTill) {\n\t\treturn false;\n\t}\n\n\treturn new Date(props.execution.waitTill).toISOString() === WAIT_TIME_UNLIMITED;\n});\n\nconst isRetriable = computed(() => executionHelpers.isExecutionRetriable(props.execution));\n\nconst classes = computed(() => {\n\treturn {\n\t\t[style.executionListItem]: true,\n\t\t[style[props.execution.status ?? '']]: !!props.execution.status,\n\t};\n});\n\nconst formattedStartedAtDate = computed(() => {\n\treturn props.execution.startedAt ? formatDate(props.execution.startedAt) : '';\n});\n\nconst formattedWaitTillDate = computed(() => {\n\treturn props.execution.waitTill ? formatDate(props.execution.waitTill) : '';\n});\n\nconst formattedStoppedAtDate = computed(() => {\n\treturn props.execution.stoppedAt\n\t\t? i18n.displayTimer(\n\t\t\t\tnew Date(props.execution.stoppedAt).getTime() -\n\t\t\t\t\tnew Date(props.execution.startedAt).getTime(),\n\t\t\t\ttrue,\n\t\t\t)\n\t\t: '';\n});\n\nconst statusTooltipText = computed(() => {\n\tif (props.execution.status === 'waiting' && isWaitTillIndefinite.value) {\n\t\treturn i18n.baseText('executionsList.statusTooltipText.theWorkflowIsWaitingIndefinitely');\n\t}\n\treturn '';\n});\n\nconst statusText = computed(() => {\n\tswitch (props.execution.status) {\n\t\tcase 'waiting':\n\t\t\treturn i18n.baseText('executionsList.waiting');\n\t\tcase 'canceled':\n\t\t\treturn i18n.baseText('executionsList.canceled');\n\t\tcase 'crashed':\n\t\t\treturn i18n.baseText('executionsList.error');\n\t\tcase 'new':\n\t\t\treturn i18n.baseText('executionsList.running');\n\t\tcase 'running':\n\t\t\treturn i18n.baseText('executionsList.running');\n\t\tcase 'success':\n\t\t\treturn i18n.baseText('executionsList.succeeded');\n\t\tcase 'error':\n\t\t\treturn i18n.baseText('executionsList.error');\n\t\tdefault:\n\t\t\treturn i18n.baseText('executionsList.unknown');\n\t}\n});\n\nconst statusTextTranslationPath = computed(() => {\n\tswitch (props.execution.status) {\n\t\tcase 'waiting':\n\t\t\treturn 'executionsList.statusWaiting';\n\t\tcase 'canceled':\n\t\t\treturn 'executionsList.statusCanceled';\n\t\tcase 'crashed':\n\t\tcase 'error':\n\t\tcase 'success':\n\t\t\tif (!props.execution.stoppedAt) {\n\t\t\t\treturn 'executionsList.statusTextWithoutTime';\n\t\t\t} else {\n\t\t\t\treturn 'executionsList.statusText';\n\t\t\t}\n\t\tcase 'new':\n\t\t\treturn 'executionsList.statusRunning';\n\t\tcase 'running':\n\t\t\treturn 'executionsList.statusRunning';\n\t\tdefault:\n\t\t\treturn 'executionsList.statusUnknown';\n\t}\n});\n\nfunction formatDate(fullDate: Date | string | number) {\n\tconst { date, time } = convertToDisplayDate(fullDate);\n\treturn locale.baseText('executionsList.started', { interpolate: { time, date } });\n}\n\nfunction displayExecution() {\n\tconst route = router.resolve({\n\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\tparams: { name: props.execution.workflowId, executionId: props.execution.id },\n\t});\n\twindow.open(route.href, '_blank');\n}\n\nfunction onStopExecution() {\n\tisStopping.value = true;\n\temit('stop', props.execution);\n}\n\nfunction onSelect() {\n\temit('select', props.execution);\n}\n\nasync function handleActionItemClick(commandData: 'retrySaved' | 'retryOriginal' | 'delete') {\n\temit(commandData, props.execution);\n}\n</script>\n<template>\n\t<tr :class=\"classes\">\n\t\t<td>\n\t\t\t<ElCheckbox\n\t\t\t\tv-if=\"!!execution.stoppedAt && execution.id\"\n\t\t\t\t:model-value=\"selected\"\n\t\t\t\tlabel=\"\"\n\t\t\t\tdata-test-id=\"select-execution-checkbox\"\n\t\t\t\t@update:model-value=\"onSelect\"\n\t\t\t/>\n\t\t</td>\n\t\t<td>\n\t\t\t<span :class=\"$style.link\" @click.stop=\"displayExecution\">\n\t\t\t\t{{ execution.workflowName || workflowName }}\n\t\t\t</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<span>{{ formattedStartedAtDate }}</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<div :class=\"$style.statusColumn\">\n\t\t\t\t<span v-if=\"isRunning\" :class=\"$style.spinner\">\n\t\t\t\t\t<FontAwesomeIcon icon=\"spinner\" spin />\n\t\t\t\t</span>\n\t\t\t\t<i18n-t\n\t\t\t\t\tv-if=\"!isWaitTillIndefinite\"\n\t\t\t\t\tdata-test-id=\"execution-status\"\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t:keypath=\"statusTextTranslationPath\"\n\t\t\t\t>\n\t\t\t\t\t<template #status>\n\t\t\t\t\t\t<span :class=\"$style.status\">{{ statusText }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #time>\n\t\t\t\t\t\t<span v-if=\"execution.waitTill\">{{ formattedWaitTillDate }}</span>\n\t\t\t\t\t\t<span v-else-if=\"!!execution.stoppedAt\">\n\t\t\t\t\t\t\t{{ formattedStoppedAtDate }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<ExecutionsTime v-else :start-time=\"execution.startedAt\" />\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t\t<N8nTooltip v-else placement=\"top\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<span>{{ statusTooltipText }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<span :class=\"$style.status\">{{ statusText }}</span>\n\t\t\t\t</N8nTooltip>\n\t\t\t</div>\n\t\t</td>\n\t\t<td>\n\t\t\t<span v-if=\"execution.id\">#{{ execution.id }}</span>\n\t\t\t<span v-if=\"execution.retryOf\">\n\t\t\t\t<br />\n\t\t\t\t<small> ({{ i18n.baseText('executionsList.retryOf') }} #{{ execution.retryOf }}) </small>\n\t\t\t</span>\n\t\t\t<span v-else-if=\"execution.retrySuccessId\">\n\t\t\t\t<br />\n\t\t\t\t<small>\n\t\t\t\t\t({{ i18n.baseText('executionsList.successRetry') }} #{{ execution.retrySuccessId }})\n\t\t\t\t</small>\n\t\t\t</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<N8nTooltip v-if=\"execution.mode === 'manual'\" placement=\"top\">\n\t\t\t\t<template #content>\n\t\t\t\t\t<span>{{ i18n.baseText('executionsList.test') }}</span>\n\t\t\t\t</template>\n\t\t\t\t<FontAwesomeIcon icon=\"flask\" />\n\t\t\t</N8nTooltip>\n\t\t</td>\n\t\t<td>\n\t\t\t<div :class=\"$style.buttonCell\">\n\t\t\t\t<N8nButton\n\t\t\t\t\tv-if=\"!!execution.stoppedAt && execution.id\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"i18n.baseText('executionsList.view')\"\n\t\t\t\t\t@click.stop=\"displayExecution\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td>\n\t\t\t<div :class=\"$style.buttonCell\">\n\t\t\t\t<N8nButton\n\t\t\t\t\tv-if=\"!execution.stoppedAt || execution.waitTill\"\n\t\t\t\t\tdata-test-id=\"stop-execution-button\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"i18n.baseText('executionsList.stop')\"\n\t\t\t\t\t:loading=\"isStopping\"\n\t\t\t\t\t@click.stop=\"onStopExecution\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td>\n\t\t\t<ElDropdown v-if=\"!isRunning\" trigger=\"click\" @command=\"handleActionItemClick\">\n\t\t\t\t<N8nIconButton text type=\"tertiary\" size=\"mini\" icon=\"ellipsis-v\" />\n\t\t\t\t<template #dropdown>\n\t\t\t\t\t<ElDropdownMenu\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.actions]: true,\n\t\t\t\t\t\t\t[$style.deleteOnly]: !isRetriable,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ElDropdownItem\n\t\t\t\t\t\t\tv-if=\"isRetriable\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-retry-saved-dropdown-item\"\n\t\t\t\t\t\t\t:class=\"$style.retryAction\"\n\t\t\t\t\t\t\tcommand=\"retrySaved\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('executionsList.retryWithCurrentlySavedWorkflow') }}\n\t\t\t\t\t\t</ElDropdownItem>\n\t\t\t\t\t\t<ElDropdownItem\n\t\t\t\t\t\t\tv-if=\"isRetriable\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-retry-original-dropdown-item\"\n\t\t\t\t\t\t\t:class=\"$style.retryAction\"\n\t\t\t\t\t\t\tcommand=\"retryOriginal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('executionsList.retryWithOriginalWorkflow') }}\n\t\t\t\t\t\t</ElDropdownItem>\n\t\t\t\t\t\t<ElDropdownItem\n\t\t\t\t\t\t\tdata-test-id=\"execution-delete-dropdown-item\"\n\t\t\t\t\t\t\t:class=\"$style.deleteAction\"\n\t\t\t\t\t\t\tcommand=\"delete\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('generic.delete') }}\n\t\t\t\t\t\t</ElDropdownItem>\n\t\t\t\t\t</ElDropdownMenu>\n\t\t\t\t</template>\n\t\t\t</ElDropdown>\n\t\t</td>\n\t</tr>\n</template>\n\n<style lang=\"scss\" module>\n@import '@/styles/variables';\n\n.executionListItem {\n\t--execution-list-item-background: var(--color-table-row-background);\n\t--execution-list-item-highlight-background: var(--color-table-row-highlight-background);\n\tcolor: var(--color-text-base);\n\n\ttd {\n\t\tbackground: var(--execution-list-item-background);\n\t}\n\n\t&:nth-child(even) td {\n\t\t--execution-list-item-background: var(--color-table-row-even-background);\n\t}\n\n\t&:hover td {\n\t\tbackground: var(--color-table-row-hover-background);\n\t}\n\n\ttd:first-child {\n\t\twidth: 30px;\n\t\tpadding: 0 var(--spacing-s) 0 0;\n\n\t\t/*\n\t\t\tThis is needed instead of table cell border because they are overlapping the sticky header\n\t\t*/\n\t\t&::before {\n\t\t\tcontent: '';\n\t\t\tdisplay: inline-block;\n\t\t\twidth: var(--spacing-4xs);\n\t\t\theight: 100%;\n\t\t\tvertical-align: middle;\n\t\t\tmargin-right: var(--spacing-xs);\n\t\t}\n\t}\n\n\t&.crashed td:first-child::before,\n\t&.error td:first-child::before {\n\t\tbackground: var(--execution-card-border-error);\n\t}\n\n\t&.success td:first-child::before {\n\t\tbackground: var(--execution-card-border-success);\n\t}\n\n\t&.new td:first-child::before,\n\t&.running td:first-child::before {\n\t\tbackground: var(--execution-card-border-running);\n\t}\n\n\t&.waiting td:first-child::before {\n\t\tbackground: var(--execution-card-border-waiting);\n\t}\n\n\t&.unknown td:first-child::before {\n\t\tbackground: var(--execution-card-border-unknown);\n\t}\n}\n\n.link {\n\tcolor: var(--color-text-base);\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\n\n.statusColumn {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.spinner {\n\tmargin-right: var(--spacing-2xs);\n}\n\n.status {\n\tline-height: 22.6px;\n\ttext-align: center;\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n\n\t.crashed &,\n\t.error & {\n\t\tcolor: var(--color-danger);\n\t}\n\n\t.waiting & {\n\t\tcolor: var(--color-secondary);\n\t}\n\n\t.success & {\n\t\tfont-weight: var(--font-weight-normal);\n\t}\n\n\t.new &,\n\t.running & {\n\t\tcolor: var(--color-warning);\n\t}\n\n\t.unknown & {\n\t\tcolor: var(--color-background-dark);\n\t}\n}\n\n.buttonCell {\n\toverflow: hidden;\n\n\tbutton {\n\t\ttransform: translateX(1000%);\n\t\ttransition: transform 0s;\n\n\t\t&:focus-visible,\n\t\t.executionListItem:hover & {\n\t\t\ttransform: translateX(0);\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { PropType } from 'vue';\nimport { watch, computed, ref, onMounted } from 'vue';\nimport ExecutionsFilter from '@/components/executions/ExecutionsFilter.vue';\nimport GlobalExecutionsListItem from '@/components/executions/global/GlobalExecutionsListItem.vue';\nimport { MODAL_CONFIRM } from '@/constants';\nimport { useToast } from '@/composables/useToast';\nimport { useMessage } from '@/composables/useMessage';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { ExecutionFilterType, IWorkflowDb } from '@/Interface';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useExecutionsStore } from '@/stores/executions.store';\n\nconst props = defineProps({\n\texecutions: {\n\t\ttype: Array as PropType<ExecutionSummary[]>,\n\t\tdefault: () => [],\n\t},\n\tfilters: {\n\t\ttype: Object as PropType<ExecutionFilterType>,\n\t\tdefault: () => ({}),\n\t},\n\ttotal: {\n\t\ttype: Number,\n\t\tdefault: 0,\n\t},\n\testimated: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n});\n\nconst emit = defineEmits(['closeModal', 'execution:stop', 'update:autoRefresh', 'update:filters']);\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst workflowsStore = useWorkflowsStore();\nconst executionsStore = useExecutionsStore();\n\nconst isMounted = ref(false);\nconst allVisibleSelected = ref(false);\nconst allExistingSelected = ref(false);\nconst selectedItems = ref<Record<string, boolean>>({});\n\nconst message = useMessage();\nconst toast = useToast();\n\nconst selectedCount = computed(() => {\n\tif (allExistingSelected.value) {\n\t\treturn props.total;\n\t}\n\n\treturn Object.keys(selectedItems.value).length;\n});\n\nconst workflows = computed<IWorkflowDb[]>(() => {\n\treturn [\n\t\t{\n\t\t\tid: 'all',\n\t\t\tname: i18n.baseText('executionsList.allWorkflows'),\n\t\t} as IWorkflowDb,\n\t\t...workflowsStore.allWorkflows,\n\t];\n});\n\nwatch(\n\t() => props.executions,\n\t() => {\n\t\tif (props.executions.length === 0) {\n\t\t\thandleClearSelection();\n\t\t}\n\t\tadjustSelectionAfterMoreItemsLoaded();\n\t},\n);\n\nonMounted(() => {\n\tisMounted.value = true;\n});\n\nfunction handleCheckAllExistingChange() {\n\tallExistingSelected.value = !allExistingSelected.value;\n\tallVisibleSelected.value = !allExistingSelected.value;\n\thandleCheckAllVisibleChange();\n}\n\nfunction handleCheckAllVisibleChange() {\n\tallVisibleSelected.value = !allVisibleSelected.value;\n\tif (!allVisibleSelected.value) {\n\t\tallExistingSelected.value = false;\n\t\tselectedItems.value = {};\n\t} else {\n\t\tselectAllVisibleExecutions();\n\t}\n}\n\nfunction toggleSelectExecution(execution: ExecutionSummary) {\n\tconst executionId = execution.id;\n\tif (selectedItems.value[executionId]) {\n\t\tconst { [executionId]: removedSelectedItem, ...rest } = selectedItems.value;\n\t\tselectedItems.value = rest;\n\t} else {\n\t\tselectedItems.value = {\n\t\t\t...selectedItems.value,\n\t\t\t[executionId]: true,\n\t\t};\n\t}\n\tallVisibleSelected.value = Object.keys(selectedItems.value).length === props.executions.length;\n\tallExistingSelected.value = Object.keys(selectedItems.value).length === props.total;\n}\n\nasync function handleDeleteSelected() {\n\tconst deleteExecutions = await message.confirm(\n\t\ti18n.baseText('executionsList.confirmMessage.message', {\n\t\t\tinterpolate: { count: selectedCount.value.toString() },\n\t\t}),\n\t\ti18n.baseText('executionsList.confirmMessage.headline'),\n\t\t{\n\t\t\ttype: 'warning',\n\t\t\tconfirmButtonText: i18n.baseText('executionsList.confirmMessage.confirmButtonText'),\n\t\t\tcancelButtonText: i18n.baseText('executionsList.confirmMessage.cancelButtonText'),\n\t\t},\n\t);\n\n\tif (deleteExecutions !== MODAL_CONFIRM) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait executionsStore.deleteExecutions({\n\t\t\tfilters: executionsStore.executionsFilters,\n\t\t\t...(allExistingSelected.value\n\t\t\t\t? { deleteBefore: props.executions[0].startedAt }\n\t\t\t\t: {\n\t\t\t\t\t\tids: Object.keys(selectedItems.value),\n\t\t\t\t\t}),\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.handleDeleteSelected.title'));\n\t\treturn;\n\t}\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('executionsList.showMessage.handleDeleteSelected.title'),\n\t\ttype: 'success',\n\t});\n\n\thandleClearSelection();\n}\n\nfunction handleClearSelection() {\n\tallVisibleSelected.value = false;\n\tallExistingSelected.value = false;\n\tselectedItems.value = {};\n}\n\nasync function onFilterChanged(filters: ExecutionFilterType) {\n\temit('update:filters', filters);\n\thandleClearSelection();\n}\n\nfunction getExecutionWorkflowName(execution: ExecutionSummary): string {\n\treturn (\n\t\tgetWorkflowName(execution.workflowId ?? '') ?? i18n.baseText('executionsList.unsavedWorkflow')\n\t);\n}\n\nfunction getWorkflowName(workflowId: string): string | undefined {\n\treturn workflows.value.find((data: IWorkflowDb) => data.id === workflowId)?.name;\n}\n\nasync function loadMore() {\n\tif (executionsStore.filters.status === 'running') {\n\t\treturn;\n\t}\n\n\tlet lastId: string | undefined;\n\tif (props.executions.length !== 0) {\n\t\tconst lastItem = props.executions.slice(-1)[0];\n\t\tlastId = lastItem.id;\n\t}\n\n\ttry {\n\t\tawait executionsStore.fetchExecutions(executionsStore.executionsFilters, lastId);\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.loadMore.title'));\n\t}\n}\n\nfunction selectAllVisibleExecutions() {\n\tprops.executions.forEach((execution: ExecutionSummary) => {\n\t\tselectedItems.value[execution.id] = true;\n\t});\n}\n\nfunction adjustSelectionAfterMoreItemsLoaded() {\n\tif (allExistingSelected.value) {\n\t\tallVisibleSelected.value = true;\n\t\tselectAllVisibleExecutions();\n\t}\n}\n\nasync function retrySavedExecution(execution: ExecutionSummary) {\n\tawait retryExecution(execution, true);\n}\n\nasync function retryOriginalExecution(execution: ExecutionSummary) {\n\tawait retryExecution(execution, false);\n}\n\nasync function retryExecution(execution: ExecutionSummary, loadWorkflow?: boolean) {\n\ttry {\n\t\tconst retrySuccessful = await executionsStore.retryExecution(execution.id, loadWorkflow);\n\n\t\tif (retrySuccessful) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulTrue.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulFalse.title'),\n\t\t\t\ttype: 'error',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.retryExecution.title'));\n\t}\n\n\ttelemetry.track('User clicked retry execution button', {\n\t\tworkflow_id: workflowsStore.workflowId,\n\t\texecution_id: execution.id,\n\t\tretry_type: loadWorkflow ? 'current' : 'original',\n\t});\n}\n\nasync function stopExecution(execution: ExecutionSummary) {\n\ttry {\n\t\tawait executionsStore.stopCurrentExecution(execution.id);\n\n\t\ttoast.showMessage({\n\t\t\ttitle: i18n.baseText('executionsList.showMessage.stopExecution.title'),\n\t\t\tmessage: i18n.baseText('executionsList.showMessage.stopExecution.message', {\n\t\t\t\tinterpolate: { activeExecutionId: execution.id },\n\t\t\t}),\n\t\t\ttype: 'success',\n\t\t});\n\n\t\temit('execution:stop');\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.stopExecution.title'));\n\t}\n}\n\nasync function deleteExecution(execution: ExecutionSummary) {\n\ttry {\n\t\tawait executionsStore.deleteExecutions({ ids: [execution.id] });\n\n\t\tif (allVisibleSelected.value) {\n\t\t\tconst { [execution.id]: _, ...rest } = selectedItems.value;\n\t\t\tselectedItems.value = rest;\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.handleDeleteSelected.title'));\n\t}\n}\n\nasync function onAutoRefreshToggle(value: boolean) {\n\tif (value) {\n\t\tawait executionsStore.startAutoRefreshInterval();\n\t} else {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t}\n}\n</script>\n\n<template>\n\t<div :class=\"$style.execListWrapper\">\n\t\t<div :class=\"$style.execList\">\n\t\t\t<div :class=\"$style.execListHeader\">\n\t\t\t\t<N8nHeading tag=\"h1\" size=\"2xlarge\">\n\t\t\t\t\t{{ i18n.baseText('executionsList.workflowExecutions') }}\n\t\t\t\t</N8nHeading>\n\t\t\t\t<div :class=\"$style.execListHeaderControls\">\n\t\t\t\t\t<N8nLoading v-if=\"!isMounted\" :class=\"$style.filterLoader\" variant=\"custom\" />\n\t\t\t\t\t<ElCheckbox\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tv-model=\"executionsStore.autoRefresh\"\n\t\t\t\t\t\tclass=\"mr-xl\"\n\t\t\t\t\t\tdata-test-id=\"execution-auto-refresh-checkbox\"\n\t\t\t\t\t\t@update:model-value=\"onAutoRefreshToggle($event)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ i18n.baseText('executionsList.autoRefresh') }}\n\t\t\t\t\t</ElCheckbox>\n\t\t\t\t\t<ExecutionsFilter\n\t\t\t\t\t\tv-show=\"isMounted\"\n\t\t\t\t\t\t:workflows=\"workflows\"\n\t\t\t\t\t\t@filter-changed=\"onFilterChanged\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<ElCheckbox\n\t\t\t\tv-if=\"allVisibleSelected && total > 0\"\n\t\t\t\t:class=\"$style.selectAll\"\n\t\t\t\t:label=\"\n\t\t\t\t\ti18n.baseText('executionsList.selectAll', {\n\t\t\t\t\t\tadjustToNumber: total,\n\t\t\t\t\t\tinterpolate: { executionNum: `${total}` },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t\t:model-value=\"allExistingSelected\"\n\t\t\t\tdata-test-id=\"select-all-executions-checkbox\"\n\t\t\t\t@update:model-value=\"handleCheckAllExistingChange\"\n\t\t\t/>\n\n\t\t\t<div v-if=\"!isMounted\">\n\t\t\t\t<N8nLoading :class=\"$style.tableLoader\" variant=\"custom\" />\n\t\t\t\t<N8nLoading :class=\"$style.tableLoader\" variant=\"custom\" />\n\t\t\t\t<N8nLoading :class=\"$style.tableLoader\" variant=\"custom\" />\n\t\t\t</div>\n\t\t\t<table v-else :class=\"$style.execTable\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<el-checkbox\n\t\t\t\t\t\t\t\t:model-value=\"allVisibleSelected\"\n\t\t\t\t\t\t\t\t:disabled=\"total < 1\"\n\t\t\t\t\t\t\t\tlabel=\"\"\n\t\t\t\t\t\t\t\tdata-test-id=\"select-visible-executions-checkbox\"\n\t\t\t\t\t\t\t\t@update:model-value=\"handleCheckAllVisibleChange\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.name') }}</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.startedAt') }}</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.status') }}</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.id') }}</th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<TransitionGroup tag=\"tbody\" name=\"executions-list\">\n\t\t\t\t\t<GlobalExecutionsListItem\n\t\t\t\t\t\tv-for=\"execution in executions\"\n\t\t\t\t\t\t:key=\"execution.id\"\n\t\t\t\t\t\t:execution=\"execution\"\n\t\t\t\t\t\t:workflow-name=\"getExecutionWorkflowName(execution)\"\n\t\t\t\t\t\t:selected=\"selectedItems[execution.id] || allExistingSelected\"\n\t\t\t\t\t\t@stop=\"stopExecution\"\n\t\t\t\t\t\t@delete=\"deleteExecution\"\n\t\t\t\t\t\t@select=\"toggleSelectExecution\"\n\t\t\t\t\t\t@retry-saved=\"retrySavedExecution\"\n\t\t\t\t\t\t@retry-original=\"retryOriginalExecution\"\n\t\t\t\t\t/>\n\t\t\t\t</TransitionGroup>\n\t\t\t</table>\n\n\t\t\t<div\n\t\t\t\tv-if=\"!executions.length && isMounted && !executionsStore.loading\"\n\t\t\t\t:class=\"$style.loadedAll\"\n\t\t\t\tdata-test-id=\"execution-list-empty\"\n\t\t\t>\n\t\t\t\t{{ i18n.baseText('executionsList.empty') }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"total > executions.length || estimated\" :class=\"$style.loadMore\">\n\t\t\t\t<N8nButton\n\t\t\t\t\ticon=\"sync\"\n\t\t\t\t\t:title=\"i18n.baseText('executionsList.loadMore')\"\n\t\t\t\t\t:label=\"i18n.baseText('executionsList.loadMore')\"\n\t\t\t\t\t:loading=\"executionsStore.loading\"\n\t\t\t\t\tdata-test-id=\"load-more-button\"\n\t\t\t\t\t@click=\"loadMore()\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-else-if=\"isMounted && !executionsStore.loading\"\n\t\t\t\t:class=\"$style.loadedAll\"\n\t\t\t\tdata-test-id=\"execution-all-loaded\"\n\t\t\t>\n\t\t\t\t{{ i18n.baseText('executionsList.loadedAll') }}\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"selectedCount > 0\"\n\t\t\t:class=\"$style.selectionOptions\"\n\t\t\tdata-test-id=\"selected-executions-info\"\n\t\t>\n\t\t\t<span>\n\t\t\t\t{{\n\t\t\t\t\ti18n.baseText('executionsList.selected', {\n\t\t\t\t\t\tadjustToNumber: selectedCount,\n\t\t\t\t\t\tinterpolate: { count: `${selectedCount}` },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</span>\n\t\t\t<N8nButton\n\t\t\t\t:label=\"i18n.baseText('generic.delete')\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tdata-test-id=\"delete-selected-button\"\n\t\t\t\t@click=\"handleDeleteSelected\"\n\t\t\t/>\n\t\t\t<N8nButton\n\t\t\t\t:label=\"i18n.baseText('executionsList.clearSelection')\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tdata-test-id=\"clear-selection-button\"\n\t\t\t\t@click=\"handleClearSelection\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.execListWrapper {\n\tdisplay: grid;\n\tgrid-template-rows: 1fr 0;\n\tposition: relative;\n\theight: 100%;\n\twidth: 100%;\n\tmax-width: 1280px;\n}\n\n.execList {\n\tposition: relative;\n\theight: 100%;\n\toverflow: auto;\n\tpadding: var(--spacing-l) var(--spacing-l) 0;\n\t@media (min-width: 1200px) {\n\t\tpadding: var(--spacing-2xl) var(--spacing-2xl) 0;\n\t}\n}\n\n.execListHeader {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.execListHeaderControls {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n}\n\n.selectionOptions {\n\tdisplay: flex;\n\talign-items: center;\n\tposition: absolute;\n\tpadding: var(--spacing-2xs);\n\tz-index: 2;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-3xl);\n\tbackground: var(--execution-selector-background);\n\tborder-radius: var(--border-radius-base);\n\tcolor: var(--execution-selector-text);\n\tfont-size: var(--font-size-2xs);\n\n\tbutton {\n\t\tmargin-left: var(--spacing-2xs);\n\t}\n}\n\n.execTable {\n\t/*\n\t Table height needs to be set to 0 in order to use height 100% for elements in table cells\n\t*/\n\theight: 0;\n\twidth: 100%;\n\ttext-align: left;\n\tfont-size: var(--font-size-s);\n\n\tthead th {\n\t\tposition: sticky;\n\t\ttop: calc(var(--spacing-3xl) * -1);\n\t\tz-index: 2;\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) 0;\n\t\tbackground: var(--color-table-header-background);\n\n\t\t&:first-child {\n\t\t\tpadding-left: var(--spacing-s);\n\t\t}\n\t}\n\n\tth,\n\ttd {\n\t\theight: 100%;\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) 0;\n\n\t\t&:not(:first-child, :nth-last-child(-n + 3)) {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t&:nth-last-child(-n + 2) {\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t@media (min-width: $breakpoint-sm) {\n\t\t\t&:not(:nth-child(2)) {\n\t\t\t\t&,\n\t\t\t\tdiv,\n\t\t\t\tspan {\n\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.loadMore {\n\tmargin: var(--spacing-m) 0;\n\twidth: 100%;\n\ttext-align: center;\n}\n\n.loadedAll {\n\ttext-align: center;\n\tfont-size: var(--font-size-s);\n\tcolor: var(--color-text-light);\n\tmargin: var(--spacing-l) 0;\n}\n\n.actions.deleteOnly {\n\tpadding: 0;\n}\n\n.retryAction + .deleteAction {\n\tborder-top: 1px solid var(--color-foreground-light);\n}\n\n.selectAll {\n\tdisplay: inline-block;\n\tmargin: 0 0 var(--spacing-s) var(--spacing-s);\n\tcolor: var(--execution-select-all-text);\n}\n\n.filterLoader {\n\twidth: 220px;\n\theight: 32px;\n}\n\n.tableLoader {\n\twidth: 100%;\n\theight: 48px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { onBeforeMount, onBeforeUnmount, onMounted, ref } from 'vue';\nimport GlobalExecutionsList from '@/components/executions/global/GlobalExecutionsList.vue';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useToast } from '@/composables/useToast';\nimport { storeToRefs } from 'pinia';\nimport type { ExecutionFilterType } from '@/Interface';\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst externalHooks = useExternalHooks();\nconst workflowsStore = useWorkflowsStore();\nconst executionsStore = useExecutionsStore();\n\nconst toast = useToast();\n\nconst animationsEnabled = ref(false);\n\nconst { executionsCount, executionsCountEstimated, filters, allExecutions } =\n\tstoreToRefs(executionsStore);\n\nonBeforeMount(async () => {\n\tawait loadWorkflows();\n\n\tvoid externalHooks.run('executionsList.openDialog');\n\ttelemetry.track('User opened Executions log', {\n\t\tworkflow_id: workflowsStore.workflowId,\n\t});\n});\n\nonMounted(async () => {\n\tsetPageTitle(`n8n - ${i18n.baseText('executionsList.workflowExecutions')}`);\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n\n\tawait executionsStore.initialize();\n});\n\nonBeforeUnmount(() => {\n\texecutionsStore.reset();\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nasync function loadWorkflows() {\n\ttry {\n\t\tawait workflowsStore.fetchAllWorkflows();\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.loadWorkflows.title'));\n\t}\n}\n\nfunction onDocumentVisibilityChange() {\n\tif (document.visibilityState === 'hidden') {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t} else {\n\t\tvoid executionsStore.startAutoRefreshInterval();\n\t}\n}\n\nasync function onRefreshData() {\n\ttry {\n\t\tawait executionsStore.fetchExecutions();\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.refreshData.title'));\n\t}\n}\n\nasync function onUpdateFilters(newFilters: ExecutionFilterType) {\n\texecutionsStore.reset();\n\texecutionsStore.setFilters(newFilters);\n\tawait executionsStore.initialize();\n}\n\nasync function onExecutionStop() {\n\tawait onRefreshData();\n}\n</script>\n<template>\n\t<GlobalExecutionsList\n\t\t:executions=\"allExecutions\"\n\t\t:filters=\"filters\"\n\t\t:total=\"executionsCount\"\n\t\t:estimated-total=\"executionsCountEstimated\"\n\t\t@execution:stop=\"onExecutionStop\"\n\t\t@update:filters=\"onUpdateFilters\"\n\t/>\n</template>\n"],"names":["emit","__emit","props","__props","style","useCssModule","i18n","useI18n","router","useRouter","executionHelpers","useExecutionHelpers","isStopping","ref","isRunning","computed","isWaitTillIndefinite","WAIT_TIME_UNLIMITED","isRetriable","classes","formattedStartedAtDate","formatDate","formattedWaitTillDate","formattedStoppedAtDate","statusTooltipText","statusText","statusTextTranslationPath","fullDate","date","time","convertToDisplayDate","locale","displayExecution","route","VIEWS","onStopExecution","onSelect","handleActionItemClick","commandData","telemetry","useTelemetry","workflowsStore","useWorkflowsStore","executionsStore","useExecutionsStore","isMounted","allVisibleSelected","allExistingSelected","selectedItems","message","useMessage","toast","useToast","selectedCount","workflows","watch","handleClearSelection","adjustSelectionAfterMoreItemsLoaded","onMounted","handleCheckAllExistingChange","handleCheckAllVisibleChange","selectAllVisibleExecutions","toggleSelectExecution","execution","executionId","removedSelectedItem","rest","handleDeleteSelected","MODAL_CONFIRM","error","onFilterChanged","filters","getExecutionWorkflowName","getWorkflowName","workflowId","_a","data","loadMore","lastId","retrySavedExecution","retryExecution","retryOriginalExecution","loadWorkflow","stopExecution","deleteExecution","_","onAutoRefreshToggle","value","externalHooks","useExternalHooks","executionsCount","executionsCountEstimated","allExecutions","storeToRefs","onBeforeMount","loadWorkflows","setPageTitle","onDocumentVisibilityChange","onBeforeUnmount","onRefreshData","onUpdateFilters","newFilters","onExecutionStop"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExecutionsView-DzCvkqXG.js","sources":["../../src/components/executions/global/GlobalExecutionsListItem.vue","../../src/components/executions/global/GlobalExecutionsList.vue","../../src/views/ExecutionsView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { PropType } from 'vue';\nimport { ref, computed, useCssModule } from 'vue';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { useI18n } from '@/composables/useI18n';\nimport { VIEWS, WAIT_TIME_UNLIMITED } from '@/constants';\nimport { useRouter } from 'vue-router';\nimport { convertToDisplayDate } from '@/utils/formatters/dateFormatter';\nimport { i18n as locale } from '@/plugins/i18n';\nimport ExecutionsTime from '@/components/executions/ExecutionsTime.vue';\nimport { useExecutionHelpers } from '@/composables/useExecutionHelpers';\n\nconst emit = defineEmits(['stop', 'select', 'retrySaved', 'retryOriginal', 'delete']);\n\nconst props = defineProps({\n\texecution: {\n\t\ttype: Object as PropType<ExecutionSummary>,\n\t\trequired: true,\n\t},\n\tselected: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n\tworkflowName: {\n\t\ttype: String,\n\t\tdefault: undefined,\n\t},\n});\n\nconst style = useCssModule();\nconst i18n = useI18n();\nconst router = useRouter();\nconst executionHelpers = useExecutionHelpers();\n\nconst isStopping = ref(false);\n\nconst isRunning = computed(() => {\n\treturn props.execution.status === 'running';\n});\n\nconst isWaitTillIndefinite = computed(() => {\n\tif (!props.execution.waitTill) {\n\t\treturn false;\n\t}\n\n\treturn new Date(props.execution.waitTill).toISOString() === WAIT_TIME_UNLIMITED;\n});\n\nconst isRetriable = computed(() => executionHelpers.isExecutionRetriable(props.execution));\n\nconst classes = computed(() => {\n\treturn {\n\t\t[style.executionListItem]: true,\n\t\t[style[props.execution.status ?? '']]: !!props.execution.status,\n\t};\n});\n\nconst formattedStartedAtDate = computed(() => {\n\treturn props.execution.startedAt ? formatDate(props.execution.startedAt) : '';\n});\n\nconst formattedWaitTillDate = computed(() => {\n\treturn props.execution.waitTill ? formatDate(props.execution.waitTill) : '';\n});\n\nconst formattedStoppedAtDate = computed(() => {\n\treturn props.execution.stoppedAt\n\t\t? i18n.displayTimer(\n\t\t\t\tnew Date(props.execution.stoppedAt).getTime() -\n\t\t\t\t\tnew Date(props.execution.startedAt).getTime(),\n\t\t\t\ttrue,\n\t\t\t)\n\t\t: '';\n});\n\nconst statusTooltipText = computed(() => {\n\tif (props.execution.status === 'waiting' && isWaitTillIndefinite.value) {\n\t\treturn i18n.baseText('executionsList.statusTooltipText.theWorkflowIsWaitingIndefinitely');\n\t}\n\treturn '';\n});\n\nconst statusText = computed(() => {\n\tswitch (props.execution.status) {\n\t\tcase 'waiting':\n\t\t\treturn i18n.baseText('executionsList.waiting');\n\t\tcase 'canceled':\n\t\t\treturn i18n.baseText('executionsList.canceled');\n\t\tcase 'crashed':\n\t\t\treturn i18n.baseText('executionsList.error');\n\t\tcase 'new':\n\t\t\treturn i18n.baseText('executionsList.running');\n\t\tcase 'running':\n\t\t\treturn i18n.baseText('executionsList.running');\n\t\tcase 'success':\n\t\t\treturn i18n.baseText('executionsList.succeeded');\n\t\tcase 'error':\n\t\t\treturn i18n.baseText('executionsList.error');\n\t\tdefault:\n\t\t\treturn i18n.baseText('executionsList.unknown');\n\t}\n});\n\nconst statusTextTranslationPath = computed(() => {\n\tswitch (props.execution.status) {\n\t\tcase 'waiting':\n\t\t\treturn 'executionsList.statusWaiting';\n\t\tcase 'canceled':\n\t\t\treturn 'executionsList.statusCanceled';\n\t\tcase 'crashed':\n\t\tcase 'error':\n\t\tcase 'success':\n\t\t\tif (!props.execution.stoppedAt) {\n\t\t\t\treturn 'executionsList.statusTextWithoutTime';\n\t\t\t} else {\n\t\t\t\treturn 'executionsList.statusText';\n\t\t\t}\n\t\tcase 'new':\n\t\t\treturn 'executionsList.statusRunning';\n\t\tcase 'running':\n\t\t\treturn 'executionsList.statusRunning';\n\t\tdefault:\n\t\t\treturn 'executionsList.statusUnknown';\n\t}\n});\n\nfunction formatDate(fullDate: Date | string | number) {\n\tconst { date, time } = convertToDisplayDate(fullDate);\n\treturn locale.baseText('executionsList.started', { interpolate: { time, date } });\n}\n\nfunction displayExecution() {\n\tconst route = router.resolve({\n\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\tparams: { name: props.execution.workflowId, executionId: props.execution.id },\n\t});\n\twindow.open(route.href, '_blank');\n}\n\nfunction onStopExecution() {\n\tisStopping.value = true;\n\temit('stop', props.execution);\n}\n\nfunction onSelect() {\n\temit('select', props.execution);\n}\n\nasync function handleActionItemClick(commandData: 'retrySaved' | 'retryOriginal' | 'delete') {\n\temit(commandData, props.execution);\n}\n</script>\n<template>\n\t<tr :class=\"classes\">\n\t\t<td>\n\t\t\t<ElCheckbox\n\t\t\t\tv-if=\"!!execution.stoppedAt && execution.id\"\n\t\t\t\t:model-value=\"selected\"\n\t\t\t\tlabel=\"\"\n\t\t\t\tdata-test-id=\"select-execution-checkbox\"\n\t\t\t\t@update:model-value=\"onSelect\"\n\t\t\t/>\n\t\t</td>\n\t\t<td>\n\t\t\t<span :class=\"$style.link\" @click.stop=\"displayExecution\">\n\t\t\t\t{{ execution.workflowName || workflowName }}\n\t\t\t</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<span>{{ formattedStartedAtDate }}</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<div :class=\"$style.statusColumn\">\n\t\t\t\t<span v-if=\"isRunning\" :class=\"$style.spinner\">\n\t\t\t\t\t<FontAwesomeIcon icon=\"spinner\" spin />\n\t\t\t\t</span>\n\t\t\t\t<i18n-t\n\t\t\t\t\tv-if=\"!isWaitTillIndefinite\"\n\t\t\t\t\tdata-test-id=\"execution-status\"\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t:keypath=\"statusTextTranslationPath\"\n\t\t\t\t>\n\t\t\t\t\t<template #status>\n\t\t\t\t\t\t<span :class=\"$style.status\">{{ statusText }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #time>\n\t\t\t\t\t\t<span v-if=\"execution.waitTill\">{{ formattedWaitTillDate }}</span>\n\t\t\t\t\t\t<span v-else-if=\"!!execution.stoppedAt\">\n\t\t\t\t\t\t\t{{ formattedStoppedAtDate }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<ExecutionsTime v-else :start-time=\"execution.startedAt\" />\n\t\t\t\t\t</template>\n\t\t\t\t</i18n-t>\n\t\t\t\t<N8nTooltip v-else placement=\"top\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<span>{{ statusTooltipText }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<span :class=\"$style.status\">{{ statusText }}</span>\n\t\t\t\t</N8nTooltip>\n\t\t\t</div>\n\t\t</td>\n\t\t<td>\n\t\t\t<span v-if=\"execution.id\">#{{ execution.id }}</span>\n\t\t\t<span v-if=\"execution.retryOf\">\n\t\t\t\t<br />\n\t\t\t\t<small> ({{ i18n.baseText('executionsList.retryOf') }} #{{ execution.retryOf }}) </small>\n\t\t\t</span>\n\t\t\t<span v-else-if=\"execution.retrySuccessId\">\n\t\t\t\t<br />\n\t\t\t\t<small>\n\t\t\t\t\t({{ i18n.baseText('executionsList.successRetry') }} #{{ execution.retrySuccessId }})\n\t\t\t\t</small>\n\t\t\t</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<N8nTooltip v-if=\"execution.mode === 'manual'\" placement=\"top\">\n\t\t\t\t<template #content>\n\t\t\t\t\t<span>{{ i18n.baseText('executionsList.test') }}</span>\n\t\t\t\t</template>\n\t\t\t\t<FontAwesomeIcon icon=\"flask\" />\n\t\t\t</N8nTooltip>\n\t\t</td>\n\t\t<td>\n\t\t\t<div :class=\"$style.buttonCell\">\n\t\t\t\t<N8nButton\n\t\t\t\t\tv-if=\"!!execution.stoppedAt && execution.id\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"i18n.baseText('executionsList.view')\"\n\t\t\t\t\t@click.stop=\"displayExecution\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td>\n\t\t\t<div :class=\"$style.buttonCell\">\n\t\t\t\t<N8nButton\n\t\t\t\t\tv-if=\"!execution.stoppedAt || execution.waitTill\"\n\t\t\t\t\tdata-test-id=\"stop-execution-button\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"i18n.baseText('executionsList.stop')\"\n\t\t\t\t\t:loading=\"isStopping\"\n\t\t\t\t\t@click.stop=\"onStopExecution\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</td>\n\t\t<td>\n\t\t\t<ElDropdown v-if=\"!isRunning\" trigger=\"click\" @command=\"handleActionItemClick\">\n\t\t\t\t<N8nIconButton text type=\"tertiary\" size=\"mini\" icon=\"ellipsis-v\" />\n\t\t\t\t<template #dropdown>\n\t\t\t\t\t<ElDropdownMenu\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.actions]: true,\n\t\t\t\t\t\t\t[$style.deleteOnly]: !isRetriable,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ElDropdownItem\n\t\t\t\t\t\t\tv-if=\"isRetriable\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-retry-saved-dropdown-item\"\n\t\t\t\t\t\t\t:class=\"$style.retryAction\"\n\t\t\t\t\t\t\tcommand=\"retrySaved\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('executionsList.retryWithCurrentlySavedWorkflow') }}\n\t\t\t\t\t\t</ElDropdownItem>\n\t\t\t\t\t\t<ElDropdownItem\n\t\t\t\t\t\t\tv-if=\"isRetriable\"\n\t\t\t\t\t\t\tdata-test-id=\"execution-retry-original-dropdown-item\"\n\t\t\t\t\t\t\t:class=\"$style.retryAction\"\n\t\t\t\t\t\t\tcommand=\"retryOriginal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('executionsList.retryWithOriginalWorkflow') }}\n\t\t\t\t\t\t</ElDropdownItem>\n\t\t\t\t\t\t<ElDropdownItem\n\t\t\t\t\t\t\tdata-test-id=\"execution-delete-dropdown-item\"\n\t\t\t\t\t\t\t:class=\"$style.deleteAction\"\n\t\t\t\t\t\t\tcommand=\"delete\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.baseText('generic.delete') }}\n\t\t\t\t\t\t</ElDropdownItem>\n\t\t\t\t\t</ElDropdownMenu>\n\t\t\t\t</template>\n\t\t\t</ElDropdown>\n\t\t</td>\n\t</tr>\n</template>\n\n<style lang=\"scss\" module>\n@import '@/styles/variables';\n\n.executionListItem {\n\t--execution-list-item-background: var(--color-table-row-background);\n\t--execution-list-item-highlight-background: var(--color-table-row-highlight-background);\n\tcolor: var(--color-text-base);\n\n\ttd {\n\t\tbackground: var(--execution-list-item-background);\n\t}\n\n\t&:nth-child(even) td {\n\t\t--execution-list-item-background: var(--color-table-row-even-background);\n\t}\n\n\t&:hover td {\n\t\tbackground: var(--color-table-row-hover-background);\n\t}\n\n\ttd:first-child {\n\t\twidth: 30px;\n\t\tpadding: 0 var(--spacing-s) 0 0;\n\n\t\t/*\n\t\t\tThis is needed instead of table cell border because they are overlapping the sticky header\n\t\t*/\n\t\t&::before {\n\t\t\tcontent: '';\n\t\t\tdisplay: inline-block;\n\t\t\twidth: var(--spacing-4xs);\n\t\t\theight: 100%;\n\t\t\tvertical-align: middle;\n\t\t\tmargin-right: var(--spacing-xs);\n\t\t}\n\t}\n\n\t&.crashed td:first-child::before,\n\t&.error td:first-child::before {\n\t\tbackground: var(--execution-card-border-error);\n\t}\n\n\t&.success td:first-child::before {\n\t\tbackground: var(--execution-card-border-success);\n\t}\n\n\t&.new td:first-child::before,\n\t&.running td:first-child::before {\n\t\tbackground: var(--execution-card-border-running);\n\t}\n\n\t&.waiting td:first-child::before {\n\t\tbackground: var(--execution-card-border-waiting);\n\t}\n\n\t&.unknown td:first-child::before {\n\t\tbackground: var(--execution-card-border-unknown);\n\t}\n}\n\n.link {\n\tcolor: var(--color-text-base);\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\n\n.statusColumn {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.spinner {\n\tmargin-right: var(--spacing-2xs);\n}\n\n.status {\n\tline-height: 22.6px;\n\ttext-align: center;\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n\n\t.crashed &,\n\t.error & {\n\t\tcolor: var(--color-danger);\n\t}\n\n\t.waiting & {\n\t\tcolor: var(--color-secondary);\n\t}\n\n\t.success & {\n\t\tfont-weight: var(--font-weight-normal);\n\t}\n\n\t.new &,\n\t.running & {\n\t\tcolor: var(--color-warning);\n\t}\n\n\t.unknown & {\n\t\tcolor: var(--color-background-dark);\n\t}\n}\n\n.buttonCell {\n\toverflow: hidden;\n\n\tbutton {\n\t\ttransform: translateX(1000%);\n\t\ttransition: transform 0s;\n\n\t\t&:focus-visible,\n\t\t.executionListItem:hover & {\n\t\t\ttransform: translateX(0);\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { PropType } from 'vue';\nimport { watch, computed, ref, onMounted } from 'vue';\nimport ExecutionsFilter from '@/components/executions/ExecutionsFilter.vue';\nimport GlobalExecutionsListItem from '@/components/executions/global/GlobalExecutionsListItem.vue';\nimport { MODAL_CONFIRM } from '@/constants';\nimport { useToast } from '@/composables/useToast';\nimport { useMessage } from '@/composables/useMessage';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { ExecutionFilterType, IWorkflowDb } from '@/Interface';\nimport type { ExecutionSummary } from 'n8n-workflow';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useExecutionsStore } from '@/stores/executions.store';\n\nconst props = defineProps({\n\texecutions: {\n\t\ttype: Array as PropType<ExecutionSummary[]>,\n\t\tdefault: () => [],\n\t},\n\tfilters: {\n\t\ttype: Object as PropType<ExecutionFilterType>,\n\t\tdefault: () => ({}),\n\t},\n\ttotal: {\n\t\ttype: Number,\n\t\tdefault: 0,\n\t},\n\testimated: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n});\n\nconst emit = defineEmits(['closeModal', 'execution:stop', 'update:autoRefresh', 'update:filters']);\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst workflowsStore = useWorkflowsStore();\nconst executionsStore = useExecutionsStore();\n\nconst isMounted = ref(false);\nconst allVisibleSelected = ref(false);\nconst allExistingSelected = ref(false);\nconst selectedItems = ref<Record<string, boolean>>({});\n\nconst message = useMessage();\nconst toast = useToast();\n\nconst selectedCount = computed(() => {\n\tif (allExistingSelected.value) {\n\t\treturn props.total;\n\t}\n\n\treturn Object.keys(selectedItems.value).length;\n});\n\nconst workflows = computed<IWorkflowDb[]>(() => {\n\treturn [\n\t\t{\n\t\t\tid: 'all',\n\t\t\tname: i18n.baseText('executionsList.allWorkflows'),\n\t\t} as IWorkflowDb,\n\t\t...workflowsStore.allWorkflows,\n\t];\n});\n\nwatch(\n\t() => props.executions,\n\t() => {\n\t\tif (props.executions.length === 0) {\n\t\t\thandleClearSelection();\n\t\t}\n\t\tadjustSelectionAfterMoreItemsLoaded();\n\t},\n);\n\nonMounted(() => {\n\tisMounted.value = true;\n});\n\nfunction handleCheckAllExistingChange() {\n\tallExistingSelected.value = !allExistingSelected.value;\n\tallVisibleSelected.value = !allExistingSelected.value;\n\thandleCheckAllVisibleChange();\n}\n\nfunction handleCheckAllVisibleChange() {\n\tallVisibleSelected.value = !allVisibleSelected.value;\n\tif (!allVisibleSelected.value) {\n\t\tallExistingSelected.value = false;\n\t\tselectedItems.value = {};\n\t} else {\n\t\tselectAllVisibleExecutions();\n\t}\n}\n\nfunction toggleSelectExecution(execution: ExecutionSummary) {\n\tconst executionId = execution.id;\n\tif (selectedItems.value[executionId]) {\n\t\tconst { [executionId]: removedSelectedItem, ...rest } = selectedItems.value;\n\t\tselectedItems.value = rest;\n\t} else {\n\t\tselectedItems.value = {\n\t\t\t...selectedItems.value,\n\t\t\t[executionId]: true,\n\t\t};\n\t}\n\tallVisibleSelected.value = Object.keys(selectedItems.value).length === props.executions.length;\n\tallExistingSelected.value = Object.keys(selectedItems.value).length === props.total;\n}\n\nasync function handleDeleteSelected() {\n\tconst deleteExecutions = await message.confirm(\n\t\ti18n.baseText('executionsList.confirmMessage.message', {\n\t\t\tinterpolate: { count: selectedCount.value.toString() },\n\t\t}),\n\t\ti18n.baseText('executionsList.confirmMessage.headline'),\n\t\t{\n\t\t\ttype: 'warning',\n\t\t\tconfirmButtonText: i18n.baseText('executionsList.confirmMessage.confirmButtonText'),\n\t\t\tcancelButtonText: i18n.baseText('executionsList.confirmMessage.cancelButtonText'),\n\t\t},\n\t);\n\n\tif (deleteExecutions !== MODAL_CONFIRM) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait executionsStore.deleteExecutions({\n\t\t\tfilters: executionsStore.executionsFilters,\n\t\t\t...(allExistingSelected.value\n\t\t\t\t? { deleteBefore: props.executions[0].startedAt }\n\t\t\t\t: {\n\t\t\t\t\t\tids: Object.keys(selectedItems.value),\n\t\t\t\t\t}),\n\t\t});\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.handleDeleteSelected.title'));\n\t\treturn;\n\t}\n\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('executionsList.showMessage.handleDeleteSelected.title'),\n\t\ttype: 'success',\n\t});\n\n\thandleClearSelection();\n}\n\nfunction handleClearSelection() {\n\tallVisibleSelected.value = false;\n\tallExistingSelected.value = false;\n\tselectedItems.value = {};\n}\n\nasync function onFilterChanged(filters: ExecutionFilterType) {\n\temit('update:filters', filters);\n\thandleClearSelection();\n}\n\nfunction getExecutionWorkflowName(execution: ExecutionSummary): string {\n\treturn (\n\t\tgetWorkflowName(execution.workflowId ?? '') ?? i18n.baseText('executionsList.unsavedWorkflow')\n\t);\n}\n\nfunction getWorkflowName(workflowId: string): string | undefined {\n\treturn workflows.value.find((data: IWorkflowDb) => data.id === workflowId)?.name;\n}\n\nasync function loadMore() {\n\tif (executionsStore.filters.status === 'running') {\n\t\treturn;\n\t}\n\n\tlet lastId: string | undefined;\n\tif (props.executions.length !== 0) {\n\t\tconst lastItem = props.executions.slice(-1)[0];\n\t\tlastId = lastItem.id;\n\t}\n\n\ttry {\n\t\tawait executionsStore.fetchExecutions(executionsStore.executionsFilters, lastId);\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.loadMore.title'));\n\t}\n}\n\nfunction selectAllVisibleExecutions() {\n\tprops.executions.forEach((execution: ExecutionSummary) => {\n\t\tselectedItems.value[execution.id] = true;\n\t});\n}\n\nfunction adjustSelectionAfterMoreItemsLoaded() {\n\tif (allExistingSelected.value) {\n\t\tallVisibleSelected.value = true;\n\t\tselectAllVisibleExecutions();\n\t}\n}\n\nasync function retrySavedExecution(execution: ExecutionSummary) {\n\tawait retryExecution(execution, true);\n}\n\nasync function retryOriginalExecution(execution: ExecutionSummary) {\n\tawait retryExecution(execution, false);\n}\n\nasync function retryExecution(execution: ExecutionSummary, loadWorkflow?: boolean) {\n\ttry {\n\t\tconst retrySuccessful = await executionsStore.retryExecution(execution.id, loadWorkflow);\n\n\t\tif (retrySuccessful) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulTrue.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t} else {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('executionsList.showMessage.retrySuccessfulFalse.title'),\n\t\t\t\ttype: 'error',\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.retryExecution.title'));\n\t}\n\n\ttelemetry.track('User clicked retry execution button', {\n\t\tworkflow_id: workflowsStore.workflowId,\n\t\texecution_id: execution.id,\n\t\tretry_type: loadWorkflow ? 'current' : 'original',\n\t});\n}\n\nasync function stopExecution(execution: ExecutionSummary) {\n\ttry {\n\t\tawait executionsStore.stopCurrentExecution(execution.id);\n\n\t\ttoast.showMessage({\n\t\t\ttitle: i18n.baseText('executionsList.showMessage.stopExecution.title'),\n\t\t\tmessage: i18n.baseText('executionsList.showMessage.stopExecution.message', {\n\t\t\t\tinterpolate: { activeExecutionId: execution.id },\n\t\t\t}),\n\t\t\ttype: 'success',\n\t\t});\n\n\t\temit('execution:stop');\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.stopExecution.title'));\n\t}\n}\n\nasync function deleteExecution(execution: ExecutionSummary) {\n\ttry {\n\t\tawait executionsStore.deleteExecutions({ ids: [execution.id] });\n\n\t\tif (allVisibleSelected.value) {\n\t\t\tconst { [execution.id]: _, ...rest } = selectedItems.value;\n\t\t\tselectedItems.value = rest;\n\t\t}\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.handleDeleteSelected.title'));\n\t}\n}\n\nasync function onAutoRefreshToggle(value: boolean) {\n\tif (value) {\n\t\tawait executionsStore.startAutoRefreshInterval();\n\t} else {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t}\n}\n</script>\n\n<template>\n\t<div :class=\"$style.execListWrapper\">\n\t\t<div :class=\"$style.execList\">\n\t\t\t<div :class=\"$style.execListHeader\">\n\t\t\t\t<N8nHeading tag=\"h1\" size=\"2xlarge\">\n\t\t\t\t\t{{ i18n.baseText('executionsList.workflowExecutions') }}\n\t\t\t\t</N8nHeading>\n\t\t\t\t<div :class=\"$style.execListHeaderControls\">\n\t\t\t\t\t<N8nLoading v-if=\"!isMounted\" :class=\"$style.filterLoader\" variant=\"custom\" />\n\t\t\t\t\t<ElCheckbox\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tv-model=\"executionsStore.autoRefresh\"\n\t\t\t\t\t\tclass=\"mr-xl\"\n\t\t\t\t\t\tdata-test-id=\"execution-auto-refresh-checkbox\"\n\t\t\t\t\t\t@update:model-value=\"onAutoRefreshToggle($event)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ i18n.baseText('executionsList.autoRefresh') }}\n\t\t\t\t\t</ElCheckbox>\n\t\t\t\t\t<ExecutionsFilter\n\t\t\t\t\t\tv-show=\"isMounted\"\n\t\t\t\t\t\t:workflows=\"workflows\"\n\t\t\t\t\t\t@filter-changed=\"onFilterChanged\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<ElCheckbox\n\t\t\t\tv-if=\"allVisibleSelected && total > 0\"\n\t\t\t\t:class=\"$style.selectAll\"\n\t\t\t\t:label=\"\n\t\t\t\t\ti18n.baseText('executionsList.selectAll', {\n\t\t\t\t\t\tadjustToNumber: total,\n\t\t\t\t\t\tinterpolate: { executionNum: `${total}` },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t\t:model-value=\"allExistingSelected\"\n\t\t\t\tdata-test-id=\"select-all-executions-checkbox\"\n\t\t\t\t@update:model-value=\"handleCheckAllExistingChange\"\n\t\t\t/>\n\n\t\t\t<div v-if=\"!isMounted\">\n\t\t\t\t<N8nLoading :class=\"$style.tableLoader\" variant=\"custom\" />\n\t\t\t\t<N8nLoading :class=\"$style.tableLoader\" variant=\"custom\" />\n\t\t\t\t<N8nLoading :class=\"$style.tableLoader\" variant=\"custom\" />\n\t\t\t</div>\n\t\t\t<table v-else :class=\"$style.execTable\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<el-checkbox\n\t\t\t\t\t\t\t\t:model-value=\"allVisibleSelected\"\n\t\t\t\t\t\t\t\t:disabled=\"total < 1\"\n\t\t\t\t\t\t\t\tlabel=\"\"\n\t\t\t\t\t\t\t\tdata-test-id=\"select-visible-executions-checkbox\"\n\t\t\t\t\t\t\t\t@update:model-value=\"handleCheckAllVisibleChange\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.name') }}</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.startedAt') }}</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.status') }}</th>\n\t\t\t\t\t\t<th>{{ i18n.baseText('executionsList.id') }}</th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<TransitionGroup tag=\"tbody\" name=\"executions-list\">\n\t\t\t\t\t<GlobalExecutionsListItem\n\t\t\t\t\t\tv-for=\"execution in executions\"\n\t\t\t\t\t\t:key=\"execution.id\"\n\t\t\t\t\t\t:execution=\"execution\"\n\t\t\t\t\t\t:workflow-name=\"getExecutionWorkflowName(execution)\"\n\t\t\t\t\t\t:selected=\"selectedItems[execution.id] || allExistingSelected\"\n\t\t\t\t\t\t@stop=\"stopExecution\"\n\t\t\t\t\t\t@delete=\"deleteExecution\"\n\t\t\t\t\t\t@select=\"toggleSelectExecution\"\n\t\t\t\t\t\t@retry-saved=\"retrySavedExecution\"\n\t\t\t\t\t\t@retry-original=\"retryOriginalExecution\"\n\t\t\t\t\t/>\n\t\t\t\t</TransitionGroup>\n\t\t\t</table>\n\n\t\t\t<div\n\t\t\t\tv-if=\"!executions.length && isMounted && !executionsStore.loading\"\n\t\t\t\t:class=\"$style.loadedAll\"\n\t\t\t\tdata-test-id=\"execution-list-empty\"\n\t\t\t>\n\t\t\t\t{{ i18n.baseText('executionsList.empty') }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"total > executions.length || estimated\" :class=\"$style.loadMore\">\n\t\t\t\t<N8nButton\n\t\t\t\t\ticon=\"sync\"\n\t\t\t\t\t:title=\"i18n.baseText('executionsList.loadMore')\"\n\t\t\t\t\t:label=\"i18n.baseText('executionsList.loadMore')\"\n\t\t\t\t\t:loading=\"executionsStore.loading\"\n\t\t\t\t\tdata-test-id=\"load-more-button\"\n\t\t\t\t\t@click=\"loadMore()\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-else-if=\"isMounted && !executionsStore.loading\"\n\t\t\t\t:class=\"$style.loadedAll\"\n\t\t\t\tdata-test-id=\"execution-all-loaded\"\n\t\t\t>\n\t\t\t\t{{ i18n.baseText('executionsList.loadedAll') }}\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"selectedCount > 0\"\n\t\t\t:class=\"$style.selectionOptions\"\n\t\t\tdata-test-id=\"selected-executions-info\"\n\t\t>\n\t\t\t<span>\n\t\t\t\t{{\n\t\t\t\t\ti18n.baseText('executionsList.selected', {\n\t\t\t\t\t\tadjustToNumber: selectedCount,\n\t\t\t\t\t\tinterpolate: { count: `${selectedCount}` },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</span>\n\t\t\t<N8nButton\n\t\t\t\t:label=\"i18n.baseText('generic.delete')\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tdata-test-id=\"delete-selected-button\"\n\t\t\t\t@click=\"handleDeleteSelected\"\n\t\t\t/>\n\t\t\t<N8nButton\n\t\t\t\t:label=\"i18n.baseText('executionsList.clearSelection')\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tdata-test-id=\"clear-selection-button\"\n\t\t\t\t@click=\"handleClearSelection\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.execListWrapper {\n\tdisplay: grid;\n\tgrid-template-rows: 1fr 0;\n\tposition: relative;\n\theight: 100%;\n\twidth: 100%;\n\tmax-width: 1280px;\n}\n\n.execList {\n\tposition: relative;\n\theight: 100%;\n\toverflow: auto;\n\tpadding: var(--spacing-l) var(--spacing-l) 0;\n\t@media (min-width: 1200px) {\n\t\tpadding: var(--spacing-2xl) var(--spacing-2xl) 0;\n\t}\n}\n\n.execListHeader {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.execListHeaderControls {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n}\n\n.selectionOptions {\n\tdisplay: flex;\n\talign-items: center;\n\tposition: absolute;\n\tpadding: var(--spacing-2xs);\n\tz-index: 2;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-3xl);\n\tbackground: var(--execution-selector-background);\n\tborder-radius: var(--border-radius-base);\n\tcolor: var(--execution-selector-text);\n\tfont-size: var(--font-size-2xs);\n\n\tbutton {\n\t\tmargin-left: var(--spacing-2xs);\n\t}\n}\n\n.execTable {\n\t/*\n\t Table height needs to be set to 0 in order to use height 100% for elements in table cells\n\t*/\n\theight: 0;\n\twidth: 100%;\n\ttext-align: left;\n\tfont-size: var(--font-size-s);\n\n\tthead th {\n\t\tposition: sticky;\n\t\ttop: calc(var(--spacing-3xl) * -1);\n\t\tz-index: 2;\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) 0;\n\t\tbackground: var(--color-table-header-background);\n\n\t\t&:first-child {\n\t\t\tpadding-left: var(--spacing-s);\n\t\t}\n\t}\n\n\tth,\n\ttd {\n\t\theight: 100%;\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) 0;\n\n\t\t&:not(:first-child, :nth-last-child(-n + 3)) {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t&:nth-last-child(-n + 2) {\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t@media (min-width: $breakpoint-sm) {\n\t\t\t&:not(:nth-child(2)) {\n\t\t\t\t&,\n\t\t\t\tdiv,\n\t\t\t\tspan {\n\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.loadMore {\n\tmargin: var(--spacing-m) 0;\n\twidth: 100%;\n\ttext-align: center;\n}\n\n.loadedAll {\n\ttext-align: center;\n\tfont-size: var(--font-size-s);\n\tcolor: var(--color-text-light);\n\tmargin: var(--spacing-l) 0;\n}\n\n.actions.deleteOnly {\n\tpadding: 0;\n}\n\n.retryAction + .deleteAction {\n\tborder-top: 1px solid var(--color-foreground-light);\n}\n\n.selectAll {\n\tdisplay: inline-block;\n\tmargin: 0 0 var(--spacing-s) var(--spacing-s);\n\tcolor: var(--execution-select-all-text);\n}\n\n.filterLoader {\n\twidth: 220px;\n\theight: 32px;\n}\n\n.tableLoader {\n\twidth: 100%;\n\theight: 48px;\n\tmargin-bottom: var(--spacing-2xs);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { onBeforeMount, onBeforeUnmount, onMounted, ref } from 'vue';\nimport GlobalExecutionsList from '@/components/executions/global/GlobalExecutionsList.vue';\nimport { setPageTitle } from '@/utils/htmlUtils';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useToast } from '@/composables/useToast';\nimport { storeToRefs } from 'pinia';\nimport type { ExecutionFilterType } from '@/Interface';\n\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst externalHooks = useExternalHooks();\nconst workflowsStore = useWorkflowsStore();\nconst executionsStore = useExecutionsStore();\n\nconst toast = useToast();\n\nconst animationsEnabled = ref(false);\n\nconst { executionsCount, executionsCountEstimated, filters, allExecutions } =\n\tstoreToRefs(executionsStore);\n\nonBeforeMount(async () => {\n\tawait loadWorkflows();\n\n\tvoid externalHooks.run('executionsList.openDialog');\n\ttelemetry.track('User opened Executions log', {\n\t\tworkflow_id: workflowsStore.workflowId,\n\t});\n});\n\nonMounted(async () => {\n\tsetPageTitle(`n8n - ${i18n.baseText('executionsList.workflowExecutions')}`);\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n\n\tawait executionsStore.initialize();\n});\n\nonBeforeUnmount(() => {\n\texecutionsStore.reset();\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nasync function loadWorkflows() {\n\ttry {\n\t\tawait workflowsStore.fetchAllWorkflows();\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.loadWorkflows.title'));\n\t}\n}\n\nfunction onDocumentVisibilityChange() {\n\tif (document.visibilityState === 'hidden') {\n\t\texecutionsStore.stopAutoRefreshInterval();\n\t} else {\n\t\tvoid executionsStore.startAutoRefreshInterval();\n\t}\n}\n\nasync function onRefreshData() {\n\ttry {\n\t\tawait executionsStore.fetchExecutions();\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('executionsList.showError.refreshData.title'));\n\t}\n}\n\nasync function onUpdateFilters(newFilters: ExecutionFilterType) {\n\texecutionsStore.reset();\n\texecutionsStore.setFilters(newFilters);\n\tawait executionsStore.initialize();\n}\n\nasync function onExecutionStop() {\n\tawait onRefreshData();\n}\n</script>\n<template>\n\t<GlobalExecutionsList\n\t\t:executions=\"allExecutions\"\n\t\t:filters=\"filters\"\n\t\t:total=\"executionsCount\"\n\t\t:estimated-total=\"executionsCountEstimated\"\n\t\t@execution:stop=\"onExecutionStop\"\n\t\t@update:filters=\"onUpdateFilters\"\n\t/>\n</template>\n"],"names":["emit","__emit","props","__props","style","useCssModule","i18n","useI18n","router","useRouter","executionHelpers","useExecutionHelpers","isStopping","ref","isRunning","computed","isWaitTillIndefinite","WAIT_TIME_UNLIMITED","isRetriable","classes","formattedStartedAtDate","formatDate","formattedWaitTillDate","formattedStoppedAtDate","statusTooltipText","statusText","statusTextTranslationPath","fullDate","date","time","convertToDisplayDate","locale","displayExecution","route","VIEWS","onStopExecution","onSelect","handleActionItemClick","commandData","telemetry","useTelemetry","workflowsStore","useWorkflowsStore","executionsStore","useExecutionsStore","isMounted","allVisibleSelected","allExistingSelected","selectedItems","message","useMessage","toast","useToast","selectedCount","workflows","watch","handleClearSelection","adjustSelectionAfterMoreItemsLoaded","onMounted","handleCheckAllExistingChange","handleCheckAllVisibleChange","selectAllVisibleExecutions","toggleSelectExecution","execution","executionId","removedSelectedItem","rest","handleDeleteSelected","MODAL_CONFIRM","error","onFilterChanged","filters","getExecutionWorkflowName","getWorkflowName","workflowId","_a","data","loadMore","lastId","retrySavedExecution","retryExecution","retryOriginalExecution","loadWorkflow","stopExecution","deleteExecution","_","onAutoRefreshToggle","value","externalHooks","useExternalHooks","executionsCount","executionsCountEstimated","allExecutions","storeToRefs","onBeforeMount","loadWorkflows","setPageTitle","onDocumentVisibilityChange","onBeforeUnmount","onRefreshData","onUpdateFilters","newFilters","onExecutionStop"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as i}from"./AuthView-
|
|
2
|
-
//# sourceMappingURL=ForgotMyPasswordView-
|
|
1
|
+
import{A as i}from"./AuthView-DfyvaM6i.js";import{u as a,a as m,b as n}from"./index-BQ6Z7VRj.js";import{m as p}from"./pinia-Dh4cxKZ0.js";import{G as l,l as c,M as u,ag as d}from"./vendor-CUQSof8H.js";import{_ as f}from"./n8n-DT_bOwuZ.js";import"./axios-Mm4CS0gO.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BiGWdRh4.js";import"./lodash-es-BFdF4Er8.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-C0ZgbPvs.js";import"./vue-i18n-CG6eDDlD.js";import"./uuid-SoommWqA.js";import"./luxon-CLwAIbs0.js";import"./@n8n/codemirror-lang-sql-x14jMqbG.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-DcTmlMkf.js";import"./@n8n/codemirror-lang-Qkdx7NoQ.js";import"./esprima-next-nhoSXAeq.js";import"./fast-json-stable-stringify-wY6jAr7b.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-DOxvr88t.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const g=l({name:"ForgotMyPasswordView",components:{AuthView:i},setup(){return{...a()}},data(){return{loading:!1}},computed:{...p(n,m),formConfig(){const t=[{name:"email",properties:{label:this.$locale.baseText("auth.email"),type:"email",required:!0,validationRules:[{name:"VALID_EMAIL"}],autocomplete:"email",capitalize:!0}}],o=[{name:"no-smtp-warning",properties:{label:this.$locale.baseText("forgotPassword.noSMTPToSendEmailWarning"),type:"info"}}],e={title:this.$locale.baseText("forgotPassword.recoverPassword"),redirectText:this.$locale.baseText("forgotPassword.returnToSignIn"),redirectLink:"/signin"};return this.settingsStore.isSmtpSetup?{...e,buttonText:this.$locale.baseText("forgotPassword.getRecoveryLink"),inputs:t}:{...e,inputs:o}}},methods:{async onSubmit(t){try{this.loading=!0,await this.usersStore.sendForgotPasswordEmail(t),this.showMessage({type:"success",title:this.$locale.baseText("forgotPassword.recoveryEmailSent"),message:this.$locale.baseText("forgotPassword.emailSentIfExists",{interpolate:{email:t.email}})})}catch(o){let e=this.$locale.baseText("forgotPassword.smtpErrorContactAdministrator");if(o.httpStatusCode){const{httpStatusCode:s}=o;s===429?e=this.$locale.baseText("forgotPassword.tooManyRequests"):o.httpStatusCode===422&&(e=this.$locale.baseText(o.message)),this.showMessage({type:"error",title:this.$locale.baseText("forgotPassword.sendingEmailError"),message:e})}}this.loading=!1}}});function h(t,o,e,s,S,w){const r=d("AuthView");return c(),u(r,{form:t.formConfig,"form-loading":t.loading,onSubmit:t.onSubmit},null,8,["form","form-loading","onSubmit"])}const K=f(g,[["render",h]]);export{K as default};
|
|
2
|
+
//# sourceMappingURL=ForgotMyPasswordView-D_90K80j.js.map
|