增加流程图 小手功能

This commit is contained in:
Lemon 2025-02-13 18:32:00 +08:00
parent 6b6b634f49
commit 0212ef4851
2 changed files with 81 additions and 77 deletions

View File

@ -26,7 +26,15 @@
</el-button-group>
</el-row>
</div>
<div class="simple-process-model" :style="`transform: scale(${scaleValue / 100});`">
<div
class="simple-process-model"
:style="`transform: translate(${currentX}px, ${currentY}px) scale(${scaleValue / 100});`"
@mousedown="startDrag"
@mousemove="onDrag"
@mouseup="stopDrag"
@mouseleave="stopDrag"
@mouseenter="setGrabCursor"
>
<ProcessNodeTree v-if="processNodeTree" v-model:flow-node="processNodeTree" />
</div>
</div>
@ -80,24 +88,41 @@ let scaleValue = ref(100)
const MAX_SCALE_VALUE = 200
const MIN_SCALE_VALUE = 50
//
const zoomIn = () => {
if (scaleValue.value == MAX_SCALE_VALUE) {
return
}
scaleValue.value += 10
const isDragging = ref(false)
const startX = ref(0)
const startY = ref(0)
const currentX = ref(0)
const currentY = ref(0)
const setGrabCursor = () => {
document.body.style.cursor = 'grab';
}
//
const zoomOut = () => {
if (scaleValue.value == MIN_SCALE_VALUE) {
return
}
scaleValue.value -= 10
const resetCursor = () => {
document.body.style.cursor = 'default';
}
const processReZoom = () => {
scaleValue.value = 100
const startDrag = (e: MouseEvent) => {
isDragging.value = true;
startX.value = e.clientX - currentX.value;
startY.value = e.clientY - currentY.value;
setGrabCursor(); //
}
const onDrag = (e: MouseEvent) => {
if (!isDragging.value) return;
e.preventDefault();
// 使 requestAnimationFrame
requestAnimationFrame(() => {
currentX.value = e.clientX - startX.value;
currentY.value = e.clientY - startY.value;
});
}
const stopDrag = () => {
isDragging.value = false;
resetCursor(); //
}
const errorDialogVisible = ref(false)
@ -193,6 +218,39 @@ const importLocalFile = () => {
}
}
}
//
const zoomIn = () => {
if (scaleValue.value == MAX_SCALE_VALUE) {
return
}
scaleValue.value += 10
}
//
const zoomOut = () => {
if (scaleValue.value == MIN_SCALE_VALUE) {
return
}
scaleValue.value -= 10
}
const processReZoom = () => {
scaleValue.value = 100
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.simple-process-model-container {
width: 100%;
height: 100%;
position: relative;
overflow: hidden;
}
.simple-process-model {
position: relative; //
min-width: 100%; // 100%
min-height: 100%; // 100%
}
</style>

View File

@ -1,19 +1,10 @@
<template>
<div v-loading="loading" class="process-viewer-container">
<div
ref="wrapperRef"
class="process-viewer-wrapper"
@mousedown="startDrag"
@mousemove="onDrag"
@mouseup="stopDrag"
@mouseleave="stopDrag"
>
<SimpleProcessViewer
:flow-node="simpleModel"
:tasks="tasks"
:process-instance="processInstance"
/>
</div>
<SimpleProcessViewer
:flow-node="simpleModel"
:tasks="tasks"
:process-instance="processInstance"
/>
</div>
</template>
<script lang="ts" setup>
@ -34,32 +25,6 @@ const tasks = ref([])
//
const processInstance = ref()
const wrapperRef = ref<HTMLElement>()
const isDragging = ref(false)
const startX = ref(0)
const startY = ref(0)
const currentX = ref(0)
const currentY = ref(0)
const startDrag = (e: MouseEvent) => {
if (!wrapperRef.value) return
isDragging.value = true
startX.value = e.clientX - currentX.value
startY.value = e.clientY - currentY.value
}
const onDrag = (e: MouseEvent) => {
if (!isDragging.value || !wrapperRef.value) return
e.preventDefault()
currentX.value = e.clientX - startX.value
currentY.value = e.clientY - startY.value
wrapperRef.value.style.transform = `translate(${currentX.value}px, ${currentY.value}px)`
}
const stopDrag = () => {
isDragging.value = false
}
/** 监控模型视图 包括任务列表、进行中的活动节点编号等 */
watch(
() => props.modelView,
@ -119,7 +84,8 @@ const setSimpleModelNodeTaskStatus = (
//
if (
simpleModel.type === NodeType.START_USER_NODE ||
simpleModel.type === NodeType.USER_TASK_NODE
simpleModel.type === NodeType.USER_TASK_NODE ||
simpleModel.type === NodeType.TRANSACTOR_NODE
) {
simpleModel.activityStatus = TaskStatusEnum.NOT_START
if (rejectedTaskActivityIds.includes(simpleModel.id)) {
@ -205,24 +171,4 @@ const setSimpleModelNodeTaskStatus = (
</script>
<style lang="scss" scoped>
.process-viewer-container {
width: 100%;
height: 100%;
position: relative;
overflow: hidden;
.process-viewer-wrapper {
position: absolute;
top: 0;
left: 0;
min-width: 100%;
min-height: 100%;
cursor: grab;
user-select: none;
&:active {
cursor: grabbing;
}
}
}
</style>