155 lines
8.4 KiB
Vue
155 lines
8.4 KiB
Vue
|
<!--
|
||
|
* @Descripttion: 仿钉钉流程设计器
|
||
|
* @version: 1.3
|
||
|
* @Author: sakuya
|
||
|
* @Date: 2021年9月14日08:38:35
|
||
|
* @LastEditors: sakuya
|
||
|
* @LastEditTime: 2022年5月14日19:43:46
|
||
|
-->
|
||
|
|
||
|
<template>
|
||
|
<div class="sc-workflow-design">
|
||
|
<div class="box-scale">
|
||
|
<node-wrap v-if="nodeConfig" v-model="nodeConfig"></node-wrap>
|
||
|
<div class="end-node">
|
||
|
<div class="end-node-circle"></div>
|
||
|
<div class="end-node-text">流程结束</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<use-select v-if="selectVisible" ref="useselect" @closed="selectVisible=false"></use-select>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import nodeWrap from './nodeWrap'
|
||
|
import useSelect from './select'
|
||
|
|
||
|
export default {
|
||
|
provide(){
|
||
|
return {
|
||
|
select: this.selectHandle
|
||
|
}
|
||
|
},
|
||
|
props: {
|
||
|
modelValue: { type: Object, default: () => {} }
|
||
|
},
|
||
|
components: {
|
||
|
nodeWrap,
|
||
|
useSelect
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
nodeConfig: this.modelValue,
|
||
|
selectVisible: false
|
||
|
}
|
||
|
},
|
||
|
watch:{
|
||
|
modelValue(val){
|
||
|
this.nodeConfig = val
|
||
|
},
|
||
|
nodeConfig(val){
|
||
|
this.$emit("update:modelValue", val)
|
||
|
}
|
||
|
},
|
||
|
mounted() {
|
||
|
|
||
|
},
|
||
|
methods: {
|
||
|
selectHandle(type, data){
|
||
|
this.selectVisible = true
|
||
|
this.$nextTick(() => {
|
||
|
this.$refs.useselect.open(type, data)
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss">
|
||
|
.sc-workflow-design {width: 100%;}
|
||
|
.sc-workflow-design .box-scale {display: inline-block;position: relative;width: 100%;padding: 54.5px 0px;align-items: flex-start;justify-content: center;flex-wrap: wrap;min-width: min-content;}
|
||
|
|
||
|
.sc-workflow-design {
|
||
|
.node-wrap {display: inline-flex;width: 100%;flex-flow: column wrap;justify-content: flex-start;align-items: center;padding: 0px 50px;position: relative;z-index: 1;}
|
||
|
.node-wrap-box {display: inline-flex;flex-direction: column;position: relative;width: 220px;min-height: 72px;flex-shrink: 0;background: rgb(255, 255, 255);border-radius: 4px;cursor: pointer;box-shadow: 0 2px 5px 0 rgba(0,0,0,.1);}
|
||
|
.node-wrap-box::before {content: "";position: absolute;top: -12px;left: 50%;transform: translateX(-50%);width: 0px;border-style: solid;border-width: 8px 6px 4px;border-color: rgb(202, 202, 202) transparent transparent;background: #f6f8f9;}
|
||
|
.node-wrap-box.start-node:before {content: none}
|
||
|
.node-wrap-box .title {height:24px;line-height: 24px;color: #fff;padding-left: 16px;padding-right: 30px;border-radius: 4px 4px 0 0;position: relative;display: flex;align-items: center;}
|
||
|
.node-wrap-box .title .icon {margin-right: 5px;}
|
||
|
.node-wrap-box .title .close {font-size: 15px;position: absolute;top:50%;transform: translateY(-50%);right:10px;display: none;}
|
||
|
.node-wrap-box .content {position: relative;padding: 15px;}
|
||
|
.node-wrap-box .content .placeholder {color: #999;}
|
||
|
.node-wrap-box:hover .close {display: block;}
|
||
|
.add-node-btn-box {width: 240px;display: inline-flex;flex-shrink: 0;position: relative;z-index: 1;}
|
||
|
.add-node-btn-box:before {content: "";position: absolute;top: 0px;left: 0px;right: 0px;bottom: 0px;z-index: -1;margin: auto;width: 2px;height: 100%;background-color: rgb(202, 202, 202);}
|
||
|
.add-node-btn {user-select: none;width: 240px;padding: 20px 0px 32px;display: flex;justify-content: center;flex-shrink: 0;flex-grow: 1;}
|
||
|
.add-node-btn span {}
|
||
|
.add-branch {justify-content: center;padding: 0px 10px;position: absolute;top: -16px;left: 50%;transform: translateX(-50%);transform-origin: center center;z-index: 1;display: inline-flex;align-items: center;}
|
||
|
.branch-wrap {display: inline-flex;width: 100%;}
|
||
|
.branch-box-wrap {display: flex;flex-flow: column wrap;align-items: center;min-height: 270px;width: 100%;flex-shrink: 0;}
|
||
|
.col-box {display: inline-flex;flex-direction: column;align-items: center;position: relative;background: #f6f8f9;}
|
||
|
.branch-box {display: flex;overflow: visible;min-height: 180px;height: auto;border-bottom: 2px solid #ccc;border-top: 2px solid #ccc;position: relative;margin-top: 15px;}
|
||
|
.branch-box .col-box::before {content: "";position: absolute;top: 0px;left: 0px;right: 0px;bottom: 0px;z-index: 0;margin: auto;width: 2px;height: 100%;background-color: rgb(202, 202, 202);}
|
||
|
.condition-node {display: inline-flex;flex-direction: column;min-height: 220px;}
|
||
|
.condition-node-box {padding-top: 30px;padding-right: 50px;padding-left: 50px;justify-content: center;align-items: center;flex-grow: 1;position: relative;display: inline-flex;flex-direction: column;}
|
||
|
.condition-node-box::before {content: "";position: absolute;top: 0px;left: 0px;right: 0px;bottom: 0px;margin: auto;width: 2px;height: 100%;background-color: rgb(202, 202, 202);}
|
||
|
.auto-judge {position: relative;width: 220px;min-height: 72px;background: rgb(255, 255, 255);border-radius: 4px;padding: 15px 15px;cursor: pointer;box-shadow: 0 2px 5px 0 rgba(0,0,0,.1);}
|
||
|
.auto-judge::before {content: "";position: absolute;top: -12px;left: 50%;transform: translateX(-50%);width: 0px;border-style: solid;border-width: 8px 6px 4px;border-color: rgb(202, 202, 202) transparent transparent;background: rgb(245, 245, 247);}
|
||
|
.auto-judge .title {line-height: 16px;}
|
||
|
.auto-judge .title .node-title {color: #15BC83;}
|
||
|
.auto-judge .title .close {font-size: 15px;position: absolute;top:15px;right:15px;color: #999;display: none;}
|
||
|
.auto-judge .title .priority-title {position: absolute;top:15px;right:15px;color: #999;}
|
||
|
.auto-judge .content {position: relative;padding-top: 15px;}
|
||
|
.auto-judge .content .placeholder {color: #999;}
|
||
|
.auto-judge:hover {
|
||
|
.close {display: block;}
|
||
|
.priority-title {display: none;}
|
||
|
}
|
||
|
.top-left-cover-line, .top-right-cover-line {position: absolute;height: 3px;width: 50%;background-color: #f6f8f9;top: -2px;}
|
||
|
.bottom-left-cover-line, .bottom-right-cover-line {position: absolute;height: 3px;width: 50%;background-color: #f6f8f9;bottom: -2px;}
|
||
|
.top-left-cover-line {left: -1px;}
|
||
|
.top-right-cover-line {right: -1px;}
|
||
|
.bottom-left-cover-line {left: -1px;}
|
||
|
.bottom-right-cover-line {right: -1px;}
|
||
|
.end-node {border-radius: 50%;font-size: 14px;color: rgba(25,31,37,.4);text-align: left;}
|
||
|
.end-node-circle {width: 10px;height: 10px;margin: auto;border-radius: 50%;background: #dbdcdc;}
|
||
|
.end-node-text {margin-top: 5px;text-align: center;}
|
||
|
.auto-judge:hover {
|
||
|
.sort-left {display: flex;}
|
||
|
.sort-right {display: flex;}
|
||
|
}
|
||
|
.auto-judge .sort-left {position: absolute;top: 0;bottom: 0;z-index: 1;left: 0;display: none;justify-content: center;align-items: center;flex-direction: column;}
|
||
|
.auto-judge .sort-right {position: absolute;top: 0;bottom: 0;z-index: 1;right: 0;display: none;justify-content: center;align-items: center;flex-direction: column;}
|
||
|
.auto-judge .sort-left:hover, .auto-judge .sort-right:hover {background: #eee;}
|
||
|
.auto-judge:after {pointer-events: none;content: "";position: absolute;top:0;bottom:0;left:0;right:0;z-index: 2;border-radius: 4px;transition: all .1s;}
|
||
|
.auto-judge:hover:after {border: 1px solid #3296fa;box-shadow: 0 0 6px 0 rgba(50,150,250,.3);}
|
||
|
.node-wrap-box:after {pointer-events: none;content: "";position: absolute;top:0;bottom:0;left:0;right:0;z-index: 2;border-radius: 4px;transition: all .1s;}
|
||
|
.node-wrap-box:hover:after {border: 1px solid #3296fa;box-shadow: 0 0 6px 0 rgba(50,150,250,.3);}
|
||
|
}
|
||
|
|
||
|
.tags-list {margin-top: 15px;width: 100%;}
|
||
|
.add-node-popover-body {}
|
||
|
.add-node-popover-body li {display: inline-block;width: 80px;text-align: center;padding:10px 0;}
|
||
|
.add-node-popover-body li i {border: 1px solid var(--el-border-color-light);width:40px;height:40px;border-radius: 50%;text-align: center;line-height: 38px;font-size: 18px;cursor: pointer;}
|
||
|
.add-node-popover-body li i:hover {border: 1px solid #3296fa;background: #3296fa;color: #fff!important;}
|
||
|
.add-node-popover-body li p {font-size: 12px;margin-top: 5px;}
|
||
|
.node-wrap-drawer__title {padding-right:40px;}
|
||
|
.node-wrap-drawer__title label {cursor: pointer;}
|
||
|
.node-wrap-drawer__title label:hover {border-bottom: 1px dashed #409eff;}
|
||
|
.node-wrap-drawer__title .node-wrap-drawer__title-edit {color: #409eff;margin-left: 10px;vertical-align: middle;}
|
||
|
|
||
|
.dark .sc-workflow-design {
|
||
|
.node-wrap-box,.auto-judge {background: #2b2b2b;}
|
||
|
.col-box {background: var(--el-bg-color);}
|
||
|
.top-left-cover-line,
|
||
|
.top-right-cover-line,
|
||
|
.bottom-left-cover-line,
|
||
|
.bottom-right-cover-line {background-color: var(--el-bg-color);}
|
||
|
.node-wrap-box::before,.auto-judge::before {background-color: var(--el-bg-color);}
|
||
|
.branch-box .add-branch {background: var(--el-bg-color);}
|
||
|
.end-node .end-node-text {color: #d0d0d0;}
|
||
|
.auto-judge .sort-left:hover, .auto-judge .sort-right:hover {background: var(--el-bg-color);}
|
||
|
}
|
||
|
|
||
|
</style>
|