ProjectDetail.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <script setup lang="ts">
  2. import { ref, reactive, nextTick, computed } from 'vue'
  3. import Drawer from '@/components/Drawer/index.vue'
  4. import type { FormInstance, FormRules } from 'element-plus'
  5. import { ColumnProps } from '@/components/TableBase/interface/index'
  6. import { generateRandom } from '@/utils/common'
  7. const isNew = ref(true)
  8. const tableData = ref<any[]>([])
  9. const formLabelWidth = ref('120px')
  10. const ruleFormRef = ref<FormInstance>()
  11. const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
  12. const columns: ColumnProps[] = [
  13. { type: 'index', label: '序号', width: 80, align: 'center' },
  14. { prop: 'T_function', label: '功能与指标', align: 'center' },
  15. { prop: 'T_planned_time', label: '计划时间(工作日)', align: 'center', width: 160 },
  16. { prop: 'T_finish', label: '是否完成(原因)', align: 'center', width: 140 },
  17. { prop: 'operation', label: '操作', width: 160, fixed: 'right', align: 'center' }
  18. ]
  19. const form = reactive({
  20. id: '',
  21. T_function: '',
  22. T_planned_time: '',
  23. T_finish: ''
  24. })
  25. const rules = reactive<FormRules>({
  26. T_function: [{ required: true, message: '请输入功能与指标', trigger: 'blur' }],
  27. T_planned_time: [{ required: true, message: '请输入计划时间(工作日)', trigger: 'blur' }],
  28. T_finish: [{ required: true, message: '请选择是否完成(原因)', trigger: 'blur' }]
  29. })
  30. const openProductionDetailed = (type: string, row?: any) => {
  31. isNew.value = type === 'new' ? true : false
  32. if (!isNew.value) {
  33. form.id = row.id
  34. form.T_function = row.T_function
  35. form.T_planned_time = row.T_planned_time
  36. form.T_finish = row.T_finish
  37. }
  38. drawerRef.value?.openDrawer()
  39. }
  40. const callbackDrawer = (done: () => void) => {
  41. resetForm(ruleFormRef.value)
  42. done()
  43. }
  44. const resetForm = (formEl: FormInstance | undefined) => {
  45. if (!formEl) return
  46. formEl.resetFields()
  47. }
  48. // 删除
  49. const deleteProjectDetail = (id: string) => {
  50. tableData.value = tableData.value.filter((item: any) => item.id !== id)
  51. emit('onPlanning', tableData.value)
  52. }
  53. // 添加 编辑项目明细
  54. const addProjectDetail = (formEl: FormInstance | undefined) => {
  55. if (!formEl) return
  56. formEl.validate(async valid => {
  57. if (valid) {
  58. if (isNew.value) {
  59. tableData.value.push({ ...form, id: generateRandom() })
  60. } else {
  61. const index = tableData.value.findIndex(item => item.id === form.id)
  62. tableData.value[index] = { ...form }
  63. }
  64. emit('onPlanning', tableData.value)
  65. nextTick(() => {
  66. isNew.value = true
  67. drawerRef.value?.closeDrawer()
  68. resetForm(ruleFormRef.value)
  69. })
  70. } else return false
  71. })
  72. }
  73. const emit = defineEmits<{ (event: 'onPlanning', value: any): void }>()
  74. const getDetailInfo = () => tableData.value
  75. const clearDetail = () => (tableData.value = [])
  76. const setDetailData = (info: any[]) => {
  77. tableData.value = info.map((item: any) => {
  78. item.id = generateRandom()
  79. return item
  80. })
  81. }
  82. defineExpose({
  83. getDetailInfo,
  84. clearDetail,
  85. setDetailData
  86. })
  87. const props = defineProps<{ disabled: boolean; isShow?: boolean }>()
  88. const disabled = computed(() => props.disabled)
  89. const isShow = ref(props.isShow)
  90. </script>
  91. <template>
  92. <el-table
  93. stripe
  94. :data="tableData"
  95. style="width: 100%"
  96. :header-cell-style="{
  97. background: 'rgb(225 226 228)',
  98. color: '#000'
  99. }"
  100. >
  101. <template v-for="item in columns" :key="item.prop">
  102. <el-table-column v-bind="item" v-if="item.type === 'index'"></el-table-column>
  103. <el-table-column v-bind="item" v-if="item.fixed !== 'right' && item.type !== 'index'"> </el-table-column>
  104. <el-table-column v-bind="item" v-if="item.fixed === 'right' && isShow">
  105. <template #default="{ row }">
  106. <el-button size="small" :disabled="disabled" type="primary" @click="openProductionDetailed('edit', row)"
  107. >编辑</el-button
  108. >
  109. <el-button size="small" :disabled="disabled" type="danger" @click="deleteProjectDetail(row.id)"
  110. >删除</el-button
  111. >
  112. </template>
  113. </el-table-column>
  114. </template>
  115. <template #append v-if="isShow">
  116. <el-button type="primary" :disabled="disabled" @click="openProductionDetailed('new')">
  117. <el-icon><Plus /></el-icon><span style="margin-left: 6px">添加</span>
  118. </el-button>
  119. </template>
  120. </el-table>
  121. <Drawer ref="drawerRef" :handleClose="callbackDrawer">
  122. <template #header="{ params }">
  123. <h4 :id="params.titleId" :class="params.titleClass">{{ isNew ? '添加' : '编辑' }} - 项目明细</h4>
  124. </template>
  125. <el-form ref="ruleFormRef" :model="form" :rules="rules">
  126. <el-form-item label="功能与指标:" :label-width="formLabelWidth" prop="T_function">
  127. <el-input v-model="form.T_function" type="text" autocomplete="off" placeholder="请输入功能与指标" />
  128. </el-form-item>
  129. <el-form-item
  130. label="计划时间:"
  131. :label-width="formLabelWidth"
  132. prop="T_planned_time"
  133. :rules="[{ type: 'number', message: '必须是数字' }]"
  134. >
  135. <el-input v-model.number="form.T_planned_time" type="text" autocomplete="off" placeholder="请输入计划时间" />
  136. </el-form-item>
  137. <el-form-item label="是否完成:" :label-width="formLabelWidth" prop="T_finish">
  138. <el-input v-model="form.T_finish" type="text" autocomplete="off" placeholder="请输入完成与否" />
  139. </el-form-item>
  140. <el-form-item :label-width="formLabelWidth">
  141. <el-button v-if="isNew" class="btn" :disabled="disabled" type="primary" @click="addProjectDetail(ruleFormRef)"
  142. >添加</el-button
  143. >
  144. <el-button v-else class="btn" :disabled="disabled" type="primary" @click="addProjectDetail(ruleFormRef)"
  145. >修改</el-button
  146. >
  147. </el-form-item>
  148. </el-form>
  149. </Drawer>
  150. </template>
  151. <style scoped lang="scss">
  152. :deep(.el-drawer__body .el-table .cell) {
  153. white-space: normal !important;
  154. }
  155. .el-form-item {
  156. margin-bottom: 18px;
  157. }
  158. </style>