Newer
Older
IntegratedFront / src / components / workFlow / nodeWrapBan.vue
lyg on 1 Nov 5 KB first
<script setup lang="ts" name="NodeWrapBan">
import { computed, ref, watch } from 'vue'
import $func from '@/plugins/preload'
const props = defineProps({
  nodeConfig: {
    type: Object,
    default: () => ({}),
  },
  flowPermission: {
    type: Object,
    default: () => {},
  },
})

const emits = defineEmits(['update:flowPermission', 'update:nodeConfig'])

const bgColors = ['87, 106, 149', '255, 148, 62', '50, 150, 250'] // 节点背景色
const placeholderList = ['发起人', '审核人', '抄送人'] // 节点默认名字
const defaultText = computed(() => { // 节点默认名字
  return placeholderList[props.nodeConfig.type]
})
const showText = computed(() => {
  // 设置发起人节点的showText显示文字
  if (props.nodeConfig.type == 0) {
    // return $func.arrToStr(props.flowPermission) || '所有人'
    // return props.flowPermission.name || userStore.name
    return '所有人'
  }
  // 设置审批节点的showText显示文字
  if (props.nodeConfig.type == 1) {
    return $func.setApproverStr(props.nodeConfig)
  }
  // 设置审批节点的showText显示文字
  return $func.copyerStr(props.nodeConfig)
})

// 监听到节点配置的变化,重新设置节点文字内容
watch(() => props.nodeConfig, (val) => {
  if (props.nodeConfig.type == 1) {
    return $func.setApproverStr(props.nodeConfig) // 审批
  }
  return $func.copyerStr(props.nodeConfig) // 抄送
}, {
  deep: true, // 深度监听的参数
})

const isInputList = ref<{ [key: number]: boolean }>([]) // 条件控制节点显示输入框的字段{0: true}
const isInput = ref(false) // 审批和抄送控制节点名称显示输入框的字段
</script>

<template>
  <div v-if="nodeConfig.type < 3" class="node-wrap">
    <div class="node-wrap-box" :class="(nodeConfig.type === 0 ? 'start-node ' : '') + (nodeConfig.error ? 'active error' : '')">
      <div class="title" :style="`background: rgb(${bgColors[nodeConfig.type]});`">
        <span v-if="nodeConfig.type === 0">{{ nodeConfig.nodeName }}</span>
        <template v-else>
          <span class="iconfont">{{ nodeConfig.type === 1 ? '' : '' }}</span>
          <input
            v-if="isInput"
            v-model="nodeConfig.nodeName"
            v-focus
            type="text"
            class="ant-input editable-title-input"
            :placeholder="defaultText"
          >
          <span v-else class="editable-title">{{ nodeConfig.nodeName }}</span>
        </template>
      </div>
      <div class="content">
        <div class="text">
          <span v-if="!showText" class="placeholder">请选择{{ defaultText }}</span>
          {{ showText }}
        </div>
      </div>
    </div>
    <add-node-ban v-model:childNodeP="nodeConfig.childNode" />
  </div>
  <div v-if="nodeConfig.type === 4" class="branch-wrap">
    <div class="branch-box-wrap">
      <div class="branch-box">
        <button class="add-branch">
          添加条件
        </button>
        <div v-for="(item, index) in nodeConfig.conditionNodes" :key="index" class="col-box">
          <div class="condition-node">
            <div class="condition-node-box">
              <div class="auto-judge" :class="item.error ? 'error active' : ''">
                <div class="title-wrapper">
                  <input
                    v-if="isInputList[index]"
                    v-model="item.nodeName"
                    v-focus
                    type="text"
                    class="ant-input editable-title-input"
                  >
                  <span v-else class="editable-title">{{ item.nodeName }}</span>
                  <span class="priority-title">优先级{{ item.priorityLevel }}</span>
                </div>
                <div class="content">
                  {{ $func.conditionStr(nodeConfig, index) }}
                </div>
              </div>
              <add-node-ban v-model:childNodeP="item.childNode" />
            </div>
          </div>
          <node-wrap-ban v-if="item.childNode" v-model:nodeConfig="item.childNode" />
          <template v-if="index === 0">
            <div class="top-left-cover-line" />
            <div class="bottom-left-cover-line" />
          </template>
          <template v-if="index === nodeConfig.conditionNodes.length - 1">
            <div class="top-right-cover-line" />
            <div class="bottom-right-cover-line" />
          </template>
        </div>
      </div>
      <add-node-ban v-model:childNodeP="nodeConfig.childNode" />
    </div>
  </div>
  <node-wrap-ban v-if="nodeConfig.childNode" v-model:nodeConfig="nodeConfig.childNode" />
</template>

<style>
.error_tip {
  position: absolute;
  top: 0;
  right: 0;
  transform: translate(150%, 0);
  font-size: 24px;
}

.promoter_person .el-dialog__body {
  padding: 10px 20px 14px;
}

.selected_list {
  margin-bottom: 20px;
  line-height: 30px;
}

.selected_list span {
  margin-right: 10px;
  padding: 3px 6px 3px 9px;
  line-height: 12px;
  white-space: nowrap;
  border-radius: 2px;
  border: 1px solid rgb(220 220 220 / 100%);
}

.selected_list img {
  margin-left: 5px;
  width: 7px;
  height: 7px;
  cursor: pointer;
}
</style>