<template>
  <el-row :gutter="10">
    <el-col :span="12">
      <el-card>
        <div slot="header">
          <span>{{ titles[0] }}</span>
          <el-button type="primary" class="pull-right" style="margin-top: 5px" size="mini" @click="addItems"
            >移入
            <i class="el-icon-right"></i>
          </el-button>
        </div>
        <div style="height: 360px; overflow-y: auto">
          <el-row v-for="(item, key) in source" :key="key">
            <el-col :span="24" class="cell-title">{{ prefix }}{{ key }}</el-col>
            <el-col class="cell" :span="24" v-for="(cell, key) in item" :key="key">
              <el-checkbox v-model="cell.checked">{{ cell[label] }}</el-checkbox>
            </el-col>
          </el-row>
        </div>
      </el-card>
    </el-col>
    <el-col :span="12">
      <el-card>
        <div slot="header">
          <span class="pull-right">{{ titles[1] }}</span>
          <el-button type="danger" size="mini" @click="removeItems">
            <i class="el-icon-back"></i>
            移除
          </el-button>
        </div>
        <div style="height: 360px; overflow-y: auto">
          <el-row v-for="(item, key) in target" :key="key">
            <el-col :span="24" class="cell-title">{{ prefix }}{{ key }}</el-col>
            <el-col class="cell" :span="24" v-for="(cell, key) in item" :key="`${key}${item.name}`">
              <el-checkbox v-model="cell.checked">{{ cell[label] }}</el-checkbox>
            </el-col>
          </el-row>
        </div>
      </el-card>
    </el-col>
  </el-row>
</template>

<script>
export default {
  model: {
    prop: 'checkedIds',
    event: 'change'
  },
  props: {
    titles: {
      type: Array,
      default: function () {
        return ['列表1', '列表2']
      }
    },
    label: {
      type: String,
      default: 'name'
    },
    value: {
      type: String,
      default: 'id'
    },
    data: {
      type: Array,
      required: true
    },
    groupKey: {
      type: String,
      default: 'group'
    },
    prefix: {
      type: String,
      default: ''
    },
    checkedIds: {
      type: Array,
      default: function () {
        return []
      }
    }
  },
  data() {
    return {
      selectList: [],
      sourceList: []
    }
  },
  created() {
    this.init()
  },
  watch: {
    data: {
      handler(newVal, oldVal) {
        this.selectList = []
        this.sourceList = []
        this.init()
      }
    }
  },
  computed: {
    source() {
      return this.formatData(this.sourceList)
    },
    target() {
      return this.formatData(this.selectList)
    }
  },
  methods: {
    init() {
      ;[...this.data].forEach((item, key) => {
        const result = {
          ...item,
          checked: false,
          orderKey: key
        }
        if (this.checkedIds.includes(item[this.value])) {
          this.selectList.push(result)
        } else {
          this.sourceList.push(result)
        }
      })
    },
    formatData(data) {
      const source = {}
      data.forEach((item) => {
        const key = item[this.groupKey]
        if (source[key]) {
          source[key].push(item)
        } else {
          source[key] = [item]
        }
      })
      return source
    },
    addItems() {
      const list = []
      this.sourceList.forEach((item) => {
        if (item.checked) {
          this.selectList.push({
            ...item,
            checked: false
          })
        } else {
          list.push(item)
        }
      })
      this.sourceList = [...list].sort((a, b) => {
        return a.orderKey - b.orderKey
      })
      this.getChekckIds()
    },
    removeItems() {
      const list = []
      this.selectList.forEach((item) => {
        if (item.checked) {
          this.sourceList.push({
            ...item,
            checked: false
          })
        } else {
          list.push(item)
        }
      })
      this.selectList = [...list]
      this.getChekckIds()
    },
    getChekckIds() {
      const checkedIds = this.selectList.map((item) => item[this.value])
      this.$emit('change', checkedIds)
    }
  }
}
</script>

<style scoped>
.cell-title {
  font-size: 12px;
  font-weight: bold;
}
.cell {
  padding: 5px;
  color: #606266;
  font-weight: 500;
  white-space: nowrap;
  font-size: 14px;
  overflow: hidden;
  text-overflow: ellipsis;
}
</style>
