Newer
Older
xc-metering-front / src / views / tested / MeasurementPlan / task / components / tableList.vue
<!-- 任务单列表 -->
<script lang="ts" setup name="EditPlatform">
import { ElMessage, ElMessageBox } from 'element-plus'
const $props = defineProps({
  data: {
    type: Array,
    default: () => ([]),
  },
  status: {
    type: String,
    required: true,
  },
})
const dialogStatus = ref('update') // 对话框类型:create,update
// 表头显示标题
const columns = ref([
  {
    text: '统一编号',
    value: 'name',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '设备名称',
    value: 'information',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '型号',
    value: 'location',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '附件',
    value: 'location',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '接收状态',
    value: 'location',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '接受状态说明',
    value: 'location',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '检定结果',
    value: 'location',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '检定完成时间',
    value: 'location',
    required: true,
    isSelect: false, // 是否下拉框
  },
  {
    text: '检定说明',
    value: 'location',
    required: true,
    isSelect: false, // 是否下拉框
  },
])
const list = ref([])
// 检查数据列表
function checkCertificateList() {
  for (let index = 0; index < list.value.length; index++) {
    const item = list.value[index]
    for (const prop of columns.value) {
      // 检查必填
      if (prop.required && !item[prop.value]) {
        ElMessage.warning(`请先完善第${index + 1}行中${prop.text}`)
        return false
      }
    }
  }
  return true
}
// 将列表置为不可编辑状态
function setAllRowReadable() {
  for (const item of list.value) {
    item.editable = false
  }
}
// 双击行显示输入框
const dblclickRow = (row: any) => {
  if (dialogStatus.value == 'detail') {
    return
  }
  setAllRowReadable()
  row.editable = true
}
const SelectionList = ref()
// 表格选中
const handleSelectionChange = (e: any[]) => {
  SelectionList.value = e
}
// 添加行
const addRow = () => {
  // certificateRef.value.initDialog({ title: '添加' })
  if (checkCertificateList()) {
    setAllRowReadable()
    list.value.push({
      name: '',
      information: '',
      location: '',
      editable: true,
    })
  }
}
// 删除行
const removeRow = () => {
  list.value = list.value.filter((item) => {
    return !SelectionList.value.includes(item)
  })
}
const initDialog = () => {
  list.value = $props.data
  dialogStatus.value = $props.status
}
initDialog()
defineExpose({
  list,
})
</script>

<template>
  <detail-block-switch title="任务单列表">
    <template v-if="dialogStatus !== 'detail'" #btns>
      <el-button type="primary">
        二维码扫描增加
      </el-button>
      <el-button type="primary">
        RFID扫描增加
      </el-button>
      <el-button type="primary">
        批量增加
      </el-button>
      <el-button type="primary" @click="addRow">
        增加行
      </el-button>
      <el-button type="info" @click="removeRow">
        删除行
      </el-button>
    </template>
    <el-table
      ref="multipleTableRef" :data="list" style="width: 100%;" border @selection-change="handleSelectionChange"
      @row-dblclick="dblclickRow"
    >
      <el-table-column v-if="dialogStatus !== 'detail'" type="selection" width="38" />
      <el-table-column align="center" label="序号" width="80" type="index" />
      <el-table-column
        v-for="item in columns" :key="item.id" :width="item.width" :prop="item.value" :label="item.text"
        align="center"
      >
        <template #header>
          <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
        </template>
        <template #default="scope">
          <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
          <el-input
            v-if="scope.row.editable && !item.isSelect" v-model="scope.row[item.value]" :autofocus="true"
            :placeholder="`${item.text}`" class="input"
          />
          <el-date-picker v-if="scope.row.editable && item.Select" v-model="scope.row[item.value]" type="date"
              format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" :placeholder="`${item.text}`" />
        </template>
      </el-table-column>
    </el-table>
  </detail-block-switch>
</template>

<style lang="scss" scoped>
.el-dialog {
  width: 700px;
}

.el-select {
  width: 100%;
}
</style>