Newer
Older
smart-metering-front / src / components / dialog / employeesDialog.vue
<script setup>
import { computed, ref, watch } from 'vue'
import { departments, getDebounceData, getDepartmentList, searchVal } from './common'
import selectResult from '@/components/workFlow/selectResult.vue'
import selectBox from '@/components/workFlow/selectBox.vue'
import $func from '@/plugins/preload.js'
const props = defineProps({
  visible: {
    type: Boolean,
    default: false,
  },
  data: {
    type: Array,
    default: () => [],
  },
  isDepartment: {
    type: Boolean,
    default: false,
  },
})
const emits = defineEmits(['update:visible', 'change'])
const closeDialog = () => {
  emits('update:visible', false)
}
const visibleDialog = computed({
  get() {
    return props.visible
  },
  set() {
    closeDialog()
  },
})
const checkedDepartmentList = ref([])
const checkedEmployessList = ref([])
const list = computed(() => {
  return [{
    isDepartment: props.isDepartment,
    type: 'department',
    data: departments.value.childDepartments,
    isActive: item => $func.toggleClass(checkedDepartmentList.value, item),
    change: item => $func.toChecked(checkedDepartmentList.value, item),
    next: item => getDepartmentList(item.id),
  }, {
    type: 'employee',
    data: departments.value.employees,
    isActive: item => $func.toggleClass(checkedEmployessList.value, item),
    change: item => $func.toChecked(checkedEmployessList.value, item),
  }]
})
const resList = computed(() => {
  const data = [{
    type: 'employee',
    data: checkedEmployessList.value,
    cancel: item => $func.removeEle(checkedEmployessList.value, item),
  }]
  if (props.isDepartment) {
    data.unshift({
      type: 'department',
      data: checkedDepartmentList.value,
      cancel: item => $func.removeEle(checkedDepartmentList.value, item),
    })
  }
  return data
})
watch(() => props.visible, (val) => {
  if (val) {
    getDepartmentList()
    searchVal.value = ''
    checkedEmployessList.value = props.data.filter(item => item.type === 1).map(({ name, targetId }) => ({
      employeeName: name,
      id: targetId,
    }))
    checkedDepartmentList.value = props.data.filter(item => item.type === 3).map(({ name, targetId }) => ({
      departmentName: name,
      id: targetId,
    }))
  }
})

const total = computed(() => checkedDepartmentList.value.length + checkedEmployessList.value.length)

const saveDialog = () => {
  const checkedList = [
    ...checkedDepartmentList.value,
    ...checkedEmployessList.value,
  ].map(item => ({
    type: item.employeeName ? 1 : 3,
    targetId: item.id,
    name: item.employeeName || item.departmentName,
  }))
  emits('change', checkedList)
}
const delList = () => {
  checkedDepartmentList.value = []
  checkedEmployessList.value = []
}
</script>

<template>
  <el-dialog v-model="visibleDialog" title="选择成员" width="600px" append-to-body custom-class="promoter_person">
    <div class="person_body clear">
      <div class="person_tree l">
        <input v-model="searchVal" type="text" placeholder="搜索成员" @input="getDebounceData($event)">
        <p v-if="!searchVal" class="ellipsis tree_nav">
          <span class="ellipsis" @click="getDepartmentList(0)">天下</span>
          <span
            v-for="(item, index) in departments.titleDepartments" :key="`${index}a`"
            class="ellipsis" @click="getDepartmentList(item.id)"
          >{{ item.departmentName }}</span>
        </p>
        <select-box :list="list" />
      </div>
      <select-result :total="total" :list="resList" @del="delList" />
    </div>
    <template #footer>
      <el-button @click="$emit('update:visible', false)">
        取 消
      </el-button>
      <el-button type="primary" @click="saveDialog">
        确 定
      </el-button>
    </template>
  </el-dialog>
</template>

<style>
@import "@/css/dialog.css";
</style>