ProjectDetail.vue 5.6 KB

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