Newer
Older
xc-business-system / src / views / quality / internal / scene / components / scheduleList.vue
lyg on 22 Feb 2024 5 KB 质量活动模块修改
<!-- 日程安排 -->
<script name="scheduleList" lang="ts" setup>
import { ElMessage, ElMessageBox } from 'element-plus'
import { useCheckList, useCheckNoTips } from '@/commonMethods/useCheckList'

const $props = defineProps({
  data: {
    type: Array,
    required: true,
  },
})
const $route = useRoute()
const $router = useRouter()
const list = ref<any[]>([])
watch(() => $props.data, (newVal) => {
  if (newVal.length) {
    list.value = $props.data
  }
  else {
    // if ($route.path.includes('detail')) { return }
    // list.value.push({
    //   inspectionContent: '',
    //   inspectionMethod: '',
    //   inspectionRes: '',
    //   refStandard: '',
    //   editable: true,
    // })
  }
}, {
  deep: true,
})
const columns = ref<any[]>([
  { text: '日期', value: 'scheduleDay', required: true, day: true },
  { text: '时间', value: 'scheduleHour', required: true, time: true },
  { text: '工作安排', value: 'workContent', required: true },
  { text: '地点', value: 'location', required: true },
  { text: '人员', value: 'participant', required: true, area: true },
])
// 多选
const selectList = ref()
const handleSelectionChange = (data: any) => {
  selectList.value = data
}
// 检查数据列表
function checkCertificateList() {
  return useCheckList(list.value, columns.value, '日程安排')
}
// 将列表置为不可编辑状态
function setAllRowReadable() {
  for (const item of list.value) {
    item.editable = false
  }
}
// 编辑行
const dblclickRow = (row: any) => {
  if ($route.path.includes('detail')) { return }
  setAllRowReadable()
  row.editable = true
}
// 删除行
const deleteRow = () => {
  list.value = list.value.filter((item: any) => {
    return !selectList.value.includes(item)
  })
}
const handler = (type: string, index: number) => {
  if (type === 'insert') {
    if (!checkCertificateList()) { return }
    setAllRowReadable()
    list.value.splice(index + 1, 0, {
      scheduleDay: '',
      scheduleHour: '',
      workContent: '',
      location: '',
      participant: '',
      editable: true,
    })
  }
  // else if (type === 'delete') {
  //   deleteRow(list.value[index])
  // }
  else if (type === 'update') {
    if (!checkCertificateList()) { return }
    dblclickRow(list.value[index])
  }
}
// 鼠标移出表格 自动置为不可编辑状态
const eventBlur = () => {
  if ($route.path.includes('detail')) { return }
  if (useCheckNoTips(list.value, columns.value)) {
    setAllRowReadable()
  }
}
defineExpose({
  list,
  checkCertificateList,
})
</script>

<template>
  <detail-block title="日程安排" class="schedule">
    <template v-if="!$route.path.includes('detail')" #btns>
      <el-button type="primary" @click="handler('insert', list.length - 1)">
        添加行
      </el-button>
      <el-button type="primary" @click="deleteRow">
        删除行
      </el-button>
    </template>
    <el-table
      ref="multipleTableRef" :data="list" style="width: 100%;" border
      @selection-change="handleSelectionChange"
      @row-dblclick="dblclickRow"
    >
      <el-table-column v-if="!$route.path.includes('detail')" type="selection" width="55" />
      <el-table-column align="center" label="序号" width="80" type="index" />
      <el-table-column
        v-for="item in columns" :key="item.value" :prop="item.value" :label="item.text"
        align="center"
      >
        <template #header>
          <span v-show="item.required && !$route.path.includes('detail')" style="color: red;">*</span><span>{{ item.text }}</span>
        </template>
        <template #default="scope">
          <span v-if="!scope.row.editable">{{ typeof scope.row[item.value] === 'string' ? scope.row[item.value] : `${scope.row[item.value][0]}~${scope.row[item.value][1]}` }}</span>
          <el-input
            v-if="scope.row.editable && !item.day && !item.time && !item.area" v-model="scope.row[item.value]" :autofocus="true"
            :placeholder="`${item.text}`" class="input"
          />
          <el-input
            v-if="scope.row.editable && item.area" v-model="scope.row[item.value]" :autofocus="true"
            :placeholder="`${item.text}`" class="input" type="textarea" :rows="1"
          />
          <el-date-picker
            v-if="scope.row.editable && item.day"
            v-model="scope.row[item.value]"
            type="date"
            :placeholder="`${item.text}`"
            format="YYYY-MM-DD"
            value-format="YYYY-MM-DD"
            style="width: 90%;"
          />
          <!-- <el-time-picker
            v-if="scope.row.editable && item.time"
            v-model="scope.row[item.value]"
            arrow-control
            :placeholder="`${item.text}`"
            format="HH:mm"
            value-format="HH:mm"
            style="width: 90%;"
          /> -->
          <el-time-picker
            v-if="scope.row.editable && item.time"
            v-model="scope.row[item.value]"
            is-range
            range-separator="至"
            start-placeholder="开始"
            end-placeholder="结束"
            style="width: 90%;"
            :placeholder="`${item.text}`"
            format="HH:mm"
            value-format="HH:mm"
          />
        </template>
      </el-table-column>
    </el-table>
  </detail-block>
</template>

<style lang="scss" scoped>
.schedule {
  // margin-top: -24px;

  ::v-deep(.header) {
    .title {
      display: none;
    }
  }
}
</style>