diff --git a/client/src/components/Workflow/Editor/Index.vue b/client/src/components/Workflow/Editor/Index.vue index a283e5b863b..ffb147416fc 100644 --- a/client/src/components/Workflow/Editor/Index.vue +++ b/client/src/components/Workflow/Editor/Index.vue @@ -13,6 +13,7 @@ @onRefactor="onRefactor" @onShow="hideModal" /> + import { Toast } from "composables/toast"; import { storeToRefs } from "pinia"; -import Vue, { computed, onUnmounted, ref, unref } from "vue"; +import Vue, { computed, nextTick, onUnmounted, ref, unref } from "vue"; import { getUntypedWorkflowParameters } from "@/components/Workflow/Editor/modules/parameters"; import { ConfirmDialog } from "@/composables/confirmDialog"; @@ -192,6 +193,7 @@ import WorkflowLint from "./Lint.vue"; import MessagesModal from "./MessagesModal.vue"; import WorkflowOptions from "./Options.vue"; import RefactorConfirmationModal from "./RefactorConfirmationModal.vue"; +import SaveChangesModal from "./SaveChangesModal.vue"; import StateUpgradeModal from "./StateUpgradeModal.vue"; import WorkflowGraph from "./WorkflowGraph.vue"; import MarkdownEditor from "@/components/Markdown/MarkdownEditor.vue"; @@ -204,6 +206,7 @@ export default { components: { MarkdownEditor, FlexPanel, + SaveChangesModal, StateUpgradeModal, ToolPanel, FormDefault, @@ -337,6 +340,8 @@ export default { showSaveAsModal: false, transform: { x: 0, y: 0, k: 1 }, graphOffset: { left: 0, top: 0, width: 0, height: 0 }, + showSaveChangesModal: false, + navUrl: "", }; }, computed: { @@ -677,14 +682,21 @@ export default { const runUrl = `/workflows/run?id=${this.id}`; this.onNavigate(runUrl); }, - async onNavigate(url) { + async onNavigate(url, forceSave = false, ignoreChanges = false) { if (this.isNewTempWorkflow) { await this.onCreate(); - } else { - await this.onSave(true); + } else if (this.hasChanges && !forceSave && !ignoreChanges) { + // if there are changes, prompt user to save or discard or cancel + this.navUrl = url; + this.showSaveChangesModal = true; + return; + } else if (forceSave) { + // when forceSave is true, save the workflow before navigating + await this.onSave(); } this.hasChanges = false; + await nextTick(); this.$router.push(url); }, onSave(hideProgress = false) { diff --git a/client/src/components/Workflow/Editor/SaveChangesModal.vue b/client/src/components/Workflow/Editor/SaveChangesModal.vue new file mode 100644 index 00000000000..9a2b5bbda2d --- /dev/null +++ b/client/src/components/Workflow/Editor/SaveChangesModal.vue @@ -0,0 +1,97 @@ + + +