Pre Merge pull request !709 from Lemon/feature/bpm-流程模型表单信息优化
commit
d37f696e63
|
|
@ -4,7 +4,7 @@ NODE_ENV=development
|
||||||
VITE_DEV=true
|
VITE_DEV=true
|
||||||
|
|
||||||
# 请求路径
|
# 请求路径
|
||||||
VITE_BASE_URL='http://localhost:48080'
|
VITE_BASE_URL='http://192.168.3.9:48080'
|
||||||
|
|
||||||
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务
|
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务
|
||||||
VITE_UPLOAD_TYPE=server
|
VITE_UPLOAD_TYPE=server
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
<template>
|
||||||
|
<div class="scroll-buttons-overlay">
|
||||||
|
<div
|
||||||
|
v-show="showTopBtn"
|
||||||
|
class="scroll-btn"
|
||||||
|
@click="scrollToTop"
|
||||||
|
>
|
||||||
|
<el-icon :size="20">
|
||||||
|
<ArrowUpBold />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-show="showBottomBtn"
|
||||||
|
class="scroll-btn"
|
||||||
|
@click="scrollToBottom"
|
||||||
|
>
|
||||||
|
<el-icon :size="20">
|
||||||
|
<ArrowDownBold />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, onMounted, onUnmounted } from 'vue'
|
||||||
|
import { ArrowUpBold, ArrowDownBold } from '@element-plus/icons-vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
containerSelector: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
// 控制按钮显示的滚动阈值
|
||||||
|
scrollThreshold: {
|
||||||
|
type: Number,
|
||||||
|
default: 100
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const showTopBtn = ref(false)
|
||||||
|
const showBottomBtn = ref(false)
|
||||||
|
|
||||||
|
const handleScroll = () => {
|
||||||
|
const container = document.querySelector(props.containerSelector)
|
||||||
|
if (container) {
|
||||||
|
const { scrollTop, scrollHeight, clientHeight } = container as Element
|
||||||
|
showTopBtn.value = scrollTop > props.scrollThreshold
|
||||||
|
showBottomBtn.value = scrollTop + clientHeight < scrollHeight - 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const scrollToTop = () => {
|
||||||
|
const container = document.querySelector(props.containerSelector)
|
||||||
|
if (container) {
|
||||||
|
container.scrollTo({
|
||||||
|
top: 0,
|
||||||
|
behavior: 'smooth'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const scrollToBottom = () => {
|
||||||
|
const container = document.querySelector(props.containerSelector)
|
||||||
|
if (container) {
|
||||||
|
container.scrollTo({
|
||||||
|
top: (container as Element).scrollHeight,
|
||||||
|
behavior: 'smooth'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
const container = document.querySelector(props.containerSelector)
|
||||||
|
if (container) {
|
||||||
|
container.addEventListener('scroll', handleScroll)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
const container = document.querySelector(props.containerSelector)
|
||||||
|
if (container) {
|
||||||
|
container.removeEventListener('scroll', handleScroll)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.scroll-buttons-overlay {
|
||||||
|
position: fixed;
|
||||||
|
right: calc(50% - 400px - 60px);
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
z-index: 2001;
|
||||||
|
|
||||||
|
.scroll-btn {
|
||||||
|
background-color: var(--el-color-primary);
|
||||||
|
color: white;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 50%;
|
||||||
|
box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.3s;
|
||||||
|
opacity: 0.8;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--el-color-primary);
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -254,8 +254,13 @@
|
||||||
</Dialog>
|
</Dialog>
|
||||||
|
|
||||||
<!-- 弹窗:表单详情 -->
|
<!-- 弹窗:表单详情 -->
|
||||||
<Dialog title="表单详情" :fullscreen="true" v-model="formDetailVisible">
|
<Dialog title="表单详情" :fullscreen="false" v-model="formDetailVisible" width="800" class="form-detail-dialog">
|
||||||
<form-create :rule="formDetailPreview.rule" :option="formDetailPreview.option" />
|
<div class="form-detail-container relative" @scroll="handleScroll">
|
||||||
|
<form-create :rule="formDetailPreview.rule" :option="formDetailPreview.option" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 使用新组件替换原来的滚动按钮 -->
|
||||||
|
<ScrollButtons container-selector=".form-detail-container" />
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
@ -274,6 +279,9 @@ import { cloneDeep, isEqual } from 'lodash-es'
|
||||||
import { useTagsView } from '@/hooks/web/useTagsView'
|
import { useTagsView } from '@/hooks/web/useTagsView'
|
||||||
import { useDebounceFn } from '@vueuse/core'
|
import { useDebounceFn } from '@vueuse/core'
|
||||||
import { subString } from '@/utils/index'
|
import { subString } from '@/utils/index'
|
||||||
|
import { ArrowUpBold, ArrowDownBold } from '@element-plus/icons-vue'
|
||||||
|
import { ElBacktop } from 'element-plus'
|
||||||
|
import ScrollButtons from '@/components/ScrollButtons/index.vue'
|
||||||
|
|
||||||
defineOptions({ name: 'BpmModel' })
|
defineOptions({ name: 'BpmModel' })
|
||||||
|
|
||||||
|
|
@ -612,6 +620,17 @@ watchEffect(() => {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
.form-detail-dialog.el-dialog {
|
||||||
|
margin: 5vh auto !important;
|
||||||
|
|
||||||
|
.el-dialog__body {
|
||||||
|
position: relative;
|
||||||
|
padding: 0;
|
||||||
|
height: 70vh;
|
||||||
|
max-height: 800px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.rename-dialog.el-dialog {
|
.rename-dialog.el-dialog {
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
|
|
||||||
|
|
@ -648,4 +667,26 @@ watchEffect(() => {
|
||||||
transform: translateZ(0);
|
transform: translateZ(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.form-detail-container {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 20px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
// 保留滚动条样式
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background-color: var(--el-color-primary-light-5);
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-track {
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue