|
@@ -22,9 +22,7 @@
|
|
class="flex-1"
|
|
class="flex-1"
|
|
:data="workflow.drawflow"
|
|
:data="workflow.drawflow"
|
|
@load="editor = $event"
|
|
@load="editor = $event"
|
|
- @addBlock="addBlock"
|
|
|
|
@deleteBlock="deleteBlock"
|
|
@deleteBlock="deleteBlock"
|
|
- @export="updateWorkflow({ drawflow: $event })"
|
|
|
|
/>
|
|
/>
|
|
</div>
|
|
</div>
|
|
<ui-modal v-model="state.showDataColumnsModal">
|
|
<ui-modal v-model="state.showDataColumnsModal">
|
|
@@ -37,6 +35,7 @@
|
|
</ui-modal>
|
|
</ui-modal>
|
|
</template>
|
|
</template>
|
|
<script setup>
|
|
<script setup>
|
|
|
|
+/* eslint-disable consistent-return */
|
|
import {
|
|
import {
|
|
computed,
|
|
computed,
|
|
reactive,
|
|
reactive,
|
|
@@ -45,9 +44,8 @@ import {
|
|
onMounted,
|
|
onMounted,
|
|
onUnmounted,
|
|
onUnmounted,
|
|
} from 'vue';
|
|
} from 'vue';
|
|
-import { useRoute, useRouter } from 'vue-router';
|
|
|
|
|
|
+import { useRoute, useRouter, onBeforeRouteLeave } from 'vue-router';
|
|
import emitter from 'tiny-emitter/instance';
|
|
import emitter from 'tiny-emitter/instance';
|
|
-import Task from '@/models/task';
|
|
|
|
import Workflow from '@/models/workflow';
|
|
import Workflow from '@/models/workflow';
|
|
import { debounce } from '@/utils/helper';
|
|
import { debounce } from '@/utils/helper';
|
|
import WorkflowBuilder from '@/components/newtab/workflow/WorkflowBuilder.vue';
|
|
import WorkflowBuilder from '@/components/newtab/workflow/WorkflowBuilder.vue';
|
|
@@ -64,12 +62,14 @@ const editor = shallowRef(null);
|
|
const state = reactive({
|
|
const state = reactive({
|
|
blockData: {},
|
|
blockData: {},
|
|
isEditBlock: false,
|
|
isEditBlock: false,
|
|
|
|
+ isDataChanged: false,
|
|
showDataColumnsModal: false,
|
|
showDataColumnsModal: false,
|
|
});
|
|
});
|
|
const workflow = computed(() => Workflow.find(workflowId) || {});
|
|
const workflow = computed(() => Workflow.find(workflowId) || {});
|
|
|
|
|
|
const updateBlockData = debounce((data) => {
|
|
const updateBlockData = debounce((data) => {
|
|
state.blockData.data = data;
|
|
state.blockData.data = data;
|
|
|
|
+ state.isDataChanged = true;
|
|
editor.value.updateNodeDataFromId(state.blockData.blockId, data);
|
|
editor.value.updateNodeDataFromId(state.blockData.blockId, data);
|
|
|
|
|
|
const inputEl = document.querySelector(
|
|
const inputEl = document.querySelector(
|
|
@@ -78,27 +78,25 @@ const updateBlockData = debounce((data) => {
|
|
|
|
|
|
if (inputEl) inputEl.dispatchEvent(new Event('change'));
|
|
if (inputEl) inputEl.dispatchEvent(new Event('change'));
|
|
}, 250);
|
|
}, 250);
|
|
-function addBlock(data) {
|
|
|
|
- Task.insert({
|
|
|
|
- data: { ...data, workflowId },
|
|
|
|
- });
|
|
|
|
-}
|
|
|
|
function deleteBlock(id) {
|
|
function deleteBlock(id) {
|
|
if (state.isEditBlock && state.blockData.blockId === id) {
|
|
if (state.isEditBlock && state.blockData.blockId === id) {
|
|
state.isEditBlock = false;
|
|
state.isEditBlock = false;
|
|
state.blockData = {};
|
|
state.blockData = {};
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ state.isDataChanged = true;
|
|
}
|
|
}
|
|
function updateWorkflow(data) {
|
|
function updateWorkflow(data) {
|
|
- Workflow.update({
|
|
|
|
|
|
+ return Workflow.update({
|
|
where: workflowId,
|
|
where: workflowId,
|
|
data,
|
|
data,
|
|
});
|
|
});
|
|
}
|
|
}
|
|
function saveWorkflow() {
|
|
function saveWorkflow() {
|
|
const data = editor.value.export();
|
|
const data = editor.value.export();
|
|
- console.log(data);
|
|
|
|
- updateWorkflow({ drawflow: JSON.stringify(data) });
|
|
|
|
|
|
+ updateWorkflow({ drawflow: JSON.stringify(data) }).then(() => {
|
|
|
|
+ state.isDataChanged = false;
|
|
|
|
+ });
|
|
}
|
|
}
|
|
function editBlock(data) {
|
|
function editBlock(data) {
|
|
state.isEditBlock = true;
|
|
state.isEditBlock = true;
|
|
@@ -107,6 +105,9 @@ function editBlock(data) {
|
|
function executeWorkflow() {
|
|
function executeWorkflow() {
|
|
console.log(editor.value);
|
|
console.log(editor.value);
|
|
}
|
|
}
|
|
|
|
+function handleEditorDataChanged() {
|
|
|
|
+ state.isDataChanged = true;
|
|
|
|
+}
|
|
|
|
|
|
provide('workflow', {
|
|
provide('workflow', {
|
|
data: workflow,
|
|
data: workflow,
|
|
@@ -115,6 +116,15 @@ provide('workflow', {
|
|
showDataColumnsModal: (show = true) => (state.showDataColumnsModal = show),
|
|
showDataColumnsModal: (show = true) => (state.showDataColumnsModal = show),
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+onBeforeRouteLeave(() => {
|
|
|
|
+ if (!state.isDataChanged) return;
|
|
|
|
+
|
|
|
|
+ const answer = window.confirm(
|
|
|
|
+ 'Do you really want to leave? you have unsaved changes!'
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ if (!answer) return false;
|
|
|
|
+});
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
const isWorkflowExists = Workflow.query().where('id', workflowId).exists();
|
|
const isWorkflowExists = Workflow.query().where('id', workflowId).exists();
|
|
|
|
|
|
@@ -122,10 +132,19 @@ onMounted(() => {
|
|
router.push('/workflows');
|
|
router.push('/workflows');
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ window.onbeforeunload = () => {
|
|
|
|
+ if (state.isDataChanged) {
|
|
|
|
+ return 'Changes you made may not be saved.';
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
emitter.on('editor:edit-block', editBlock);
|
|
emitter.on('editor:edit-block', editBlock);
|
|
|
|
+ emitter.on('editor:data-changed', handleEditorDataChanged);
|
|
});
|
|
});
|
|
onUnmounted(() => {
|
|
onUnmounted(() => {
|
|
|
|
+ window.onbeforeunload = null;
|
|
emitter.off('editor:edit-block', editBlock);
|
|
emitter.off('editor:edit-block', editBlock);
|
|
|
|
+ emitter.off('editor:data-changed', handleEditorDataChanged);
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|
|
<style>
|
|
<style>
|