import { MessageBox } from 'element-ui'

export default {
  data() {
    return {
      items: null,
      recordCount: null,
      listLoading: true,
      dialogStatus: '',
      dialogFormVisible: false,
      temp: {},
      textMap: {
        update: '修改',
        create: '新增'
      },
      dialogPvVisible: false,
      listQuery: {
        pageIndex: 1,
        pageSize: 20
      },
      height: 500
    }
  }
}

export function crudPageList(page, _pagelist, _callback) {
  page.listLoading = true
  _pagelist(Object.assign({}, page.listQuery)).then(response => {
    page.items = response.items
    page.listLoading = false
    page.recordCount = response.recordCount
    page.pageIndex = response.pageIndex
    page.pageSize = response.pageSize
    if (typeof _callback === 'function') {
      _callback()
    }
  })
}
export function crudGetItem(page, _get, rowid, initData) {
  if (rowid) {
    _get({ id: rowid }).then(response => {
      if (!response.data) {
        MessageBox.alert('数据不存在，请确认是否已删除。', '消息', {
          confirmButtonText: '确定'
        })
        return
      }
      page.temp = response.data
      page.dialogFormVisible = true
      page.$nextTick(() => {
        page.$refs['dataForm'].clearValidate()
      })
    })
  } else {
    page.temp = Object.assign({}, initData)
    page.dialogFormVisible = true
    page.$nextTick(() => {
      page.$refs['dataForm'].clearValidate()
    })
  }
}
export function crudCreate(page, _create, _callback) {
  page.$refs['dataForm'].validate((valid) => {
    if (valid) {
      _create(page.temp).then(response => {
        if (typeof _callback === 'function') {
          _callback()
        }
        page.dialogFormVisible = false
        page.$notify({
          title: '成功',
          message: (page.dialogStatus === 'create') ? '创建成功' : '修改成功',
          type: 'success',
          duration: 2000
        })
      })
    }
  })
}
export function crudDelete(page, _delete, rowid, _callback) {
  MessageBox.confirm('确认删除记录吗？', '删除', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    _delete({ id: rowid }).then(response => {
      if (typeof _callback === 'function') {
        _callback()
      }
      page.$notify({
        title: '成功',
        message: '删除成功',
        type: 'success',
        duration: 2000
      })
    })
  })
}
