<script setup lang="ts" name="AddNode"> import { ref } from 'vue' const props = defineProps({ childNodeP: { type: Object, default: () => ({}), }, }) const emits = defineEmits(['update:childNodeP']) const visible = ref(false) // 对话框显隐 // 添加节点(给节点设置初始值) const addType = (type: number) => { visible.value = false if (type != 4) { let data if (type == 1) { // 审核 data = { nodeName: '审核人', // 节点名称 error: true, // 控制空节点提示 type: 1, // 节点类型 settype: 1, // 负责人类型 1成员、2主管、7连续多级主管、11角色 selectMode: 0, selectRange: 0, directorLevel: 1, // 审批终点-主管 examineMode: 1, // 审批方式 noHanderAction: 1, // 审批人为空时 examineEndDirectorLevel: 0, // 审批终点-连续多级主管 childNode: JSON.stringify(props.childNodeP) === '{}' || props.childNodeP === null ? null : props.childNodeP, nodeUserList: [], } } else if (type == 2) { // 抄送 data = { nodeName: '抄送人', // 节点名称 type: 2, // 节点类型 ccSelfSelectFlag: 1, childNode: JSON.stringify(props.childNodeP) === '{}' || props.childNodeP === null ? null : props.childNodeP, nodeUserList: [], // 抄送人数据 } } emits('update:childNodeP', data) } else { emits('update:childNodeP', { // 条件 nodeName: '路由', type: 4, childNode: null, conditionNodes: [{ nodeName: '条件1', // 节点名称 error: true, // 控制空节点提示 type: 3, // 节点类型 priorityLevel: 1, // 优先级 conditionList: [], nodeUserList: [], childNode: JSON.stringify(props.childNodeP) === '{}' || props.childNodeP === null ? null : props.childNodeP, }, { nodeName: '条件2', type: 3, priorityLevel: 2, conditionList: [], nodeUserList: [], childNode: null, }], }) } } </script> <template> <div class="add-node-btn-box"> <div class="add-node-btn"> <el-popover v-model="visible" placement="right-start" width="auto"> <div class="add-node-popover-body"> <a class="add-node-popover-item approver" @click="addType(1)"> <div class="item-wrapper"> <span class="iconfont"></span> </div> <p>审批人</p> </a> <!-- <a class="add-node-popover-item notifier" @click="addType(2)"> <div class="item-wrapper"> <span class="iconfont"></span> </div> <p>抄送人</p> </a> --> <a class="add-node-popover-item condition" @click="addType(4)"> <div class="item-wrapper"> <span class="iconfont"></span> </div> <p>条件分支</p> </a> </div> <template #reference> <button class="btn" type="button"> <span class="iconfont"></span> </button> </template> </el-popover> </div> </div> </template> <style scoped lang="scss"> .add-node-btn-box { width: 240px; display: inline-box; display: inline-flexbox; display: inline-flex; -ms-flex-negative: 0; flex-shrink: 0; -webkit-box-flex: 1; -ms-flex-positive: 1; position: relative; &::before { content: ""; position: absolute; top: 0; left: 0; right: 0; bottom: 0; z-index: -1; margin: auto; width: 2px; height: 100%; background-color: #cacaca; } .add-node-btn { user-select: none; width: 240px; padding: 20px 0 32px; display: flex; -webkit-box-pack: center; justify-content: center; flex-shrink: 0; -webkit-box-flex: 1; flex-grow: 1; .btn { outline: none; box-shadow: 0 2px 4px 0 rgb(0 0 0 / 10%); width: 30px; height: 30px; background: #3296fa; border-radius: 50%; position: relative; border: none; line-height: 30px; transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); .iconfont { color: #fff; font-size: 16px; } &:hover { transform: scale(1.3); box-shadow: 0 13px 27px 0 rgb(0 0 0 / 10%); } &:active { transform: none; background: #1e83e9; box-shadow: 0 2px 4px 0 rgb(0 0 0 / 10%); } } } } </style> <style lang="scss"> .add-node-popover-body { display: flex; .add-node-popover-item { margin-right: 10px; cursor: pointer; text-align: center; flex: 1; color: #191f25 !important; .item-wrapper { user-select: none; display: inline-block; width: 80px; height: 80px; margin-bottom: 5px; background: #fff; border: 1px solid #e2e2e2; border-radius: 50%; transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); .iconfont { font-size: 35px; line-height: 80px; } } &.approver { .item-wrapper { color: #ff943e; } } &.notifier { .item-wrapper { color: #3296fa; } } &.condition { .item-wrapper { color: #15bc83; } } &:hover { .item-wrapper { background: #3296fa; box-shadow: 0 10px 20px 0 rgb(50 150 250 / 40%); } .iconfont { color: #fff; } } &:active { .item-wrapper { box-shadow: none; background: #eaeaea; } .iconfont { color: inherit; } } } } </style>