import { MessageBox } from 'element-ui'

export default {
  data() {
    return {
      items: null,
      pagedata: {},
      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
    page.pagedata = response
    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
      })
    })
  })
}
