Newer
Older
xc-metering-front / src / components / dialog / selectRoleDialog.vue
liyaguang on 19 Jul 2023 4 KB first commit
<!-- 选择角色 -->
<script setup lang="ts" name="SelectRoleDialog">
import { computed, onMounted, reactive, ref, watch } from 'vue'
import type { IroleInfo } from './dialog'
import { getRoleList } from '@/api/system/role'
import { toTreeList } from '@/utils/structure'
import SearchArea from '@/components/SearchArea/index.vue'
const props = defineProps({
  visible: {
    type: Boolean,
    default: false,
  },
  data: {
    type: Array,
    default: () => [],
  },
  // 是否允许多选
  isMulti: {
    type: Boolean,
    default: true,
  },
})

const emits = defineEmits(['update:visible', 'change'])
const table = ref()// 表格ref
// 数据权限类型字典
const dataScopeTypeDict: { [key: number ]: string } = {
  1: '所有数据',
  2: '所属及下属部门',
  3: '本部门',
  4: '自定义',
}
// 表格表头
const columns = ref([
  { text: '角色名称', value: 'name', align: 'left' },
  { text: '所在组织机构', value: 'deptName' },
])
const loading = ref(false)

// 默认查询条件
const defaultQuery = {
  keyword: '',
}
// 角色列表数据
const roleList = ref([]) as any

// 查询条件
const listQuery = reactive({ ...defaultQuery })
const checkedRoleList = ref([])
// 多选的数据
const multipleTable = ref([])
const closeDialog = () => {
  emits('update:visible', false)
}
const visibleDialog = computed({
  get() {
    return props.visible
  },
  set() {
    closeDialog()
  },
})
watch(() => props.visible, (val) => {
  if (!val) {
    table.value!.clearSelection()
  }
})
const saveDialog = () => {
  const checkedList = multipleTable.value.map((item: any) => ({
    ...item,
    type: 2, // type:1.成员,2.角色
    targetId: item.id,
  }))

  emits('change', checkedList)
}

// 角色查询数据
function fetchRoleData() {
  loading.value = true
  getRoleList(listQuery).then((res) => {
    const data = res.data.map((item: IroleInfo) => {
      return {
        ...item,
        dataScopeTypeName: dataScopeTypeDict[parseInt(item.dataScopeType)],
      }
    })
    const treeData = toTreeList(data)
    roleList.value = treeData
    loading.value = false
  })
}
// 多选
const handleSelectionChange = (val: any) => {
  console.log('多选角色')
  console.log(val)
  multipleTable.value = val
}
// 搜索
function search() {
  fetchRoleData()
}
// 多选框单选功能
const selectClick = (selection: any, row: any) => {
  if (!props.isMulti) {
    console.log('selectClick')
    if (selection.length > 1) {
      const del_row = selection.shift()
      table.value?.toggleRowSelection(del_row, false) // 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)
    }
  }
}
onMounted(() => {
  search()
})
</script>

<template>
  <div class="select-role-dialog">
    <el-dialog v-model="visibleDialog" title="选择角色" max-width="80%" append-to-body custom-class="promoter_person">
      <search-area @search="search">
        <search-item>
          <el-input v-model="listQuery.keyword" placeholder="角色名称" clearable />
        </search-item>
      </search-area>
      <div style="padding: 12px;max-height: 500px;overflow: auto;">
        <el-table
          ref="table"
          v-loading="loading"
          show-overflow-tooltip
          :data="roleList"
          row-key="id"
          :border="false"
          style="width: 100%;"
          :default-expand-all="true"
          :tree-props="{ children: 'children' }"
          @selection-change="handleSelectionChange"
          @select="selectClick"
        >
          <el-table-column type="selection" width="55" />
          <el-table-column
            v-for="column of columns" :key="column.value" :label="column.text" :prop="column.value" :align="column.align"
          />
        </el-table>
      </div>

      <template #footer>
        <el-button @click="closeDialog">
          取 消
        </el-button>
        <el-button type="primary" @click="saveDialog">
          确 定
        </el-button>
      </template>
    </el-dialog>
  </div>
</template>

<style lang="scss">
@import "@/css/dialog.css";

.select-role-dialog {
  .el-table .cell {
    white-space: nowrap;
  }
}
</style>