IndexForm.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <template>
  2. <tf-dialog v-bind="$attrs" v-on="listeners" @submit="onSubmit" width="676px" top="7vh" v-if="$attrs.visible">
  3. <el-row :gutter="15">
  4. <el-col>
  5. <el-form
  6. class="form"
  7. ref="form"
  8. v-bind="{ labelWidth: 'auto', size: 'medium' }"
  9. :model="formData"
  10. :rules="rules"
  11. >
  12. <el-form-item
  13. v-for="{ name, label, type, required, options, onChange, disabled, ...rest } of formItems"
  14. :style="{ width: '50%', float: 'left' }"
  15. :key="name"
  16. :required="required"
  17. :label="label"
  18. :prop="name"
  19. >
  20. <el-date-picker
  21. v-if="type === 'date'"
  22. v-model="formData[name]"
  23. value-format="yyyy-MM-dd HH:mm:ss"
  24. format="yyyy-MM-dd"
  25. :disabled="disabled"
  26. :placeholder="`请选择${label}`"
  27. clearable
  28. size="medium"
  29. v-bind="rest"
  30. />
  31. <el-select
  32. v-else-if="type === 'select'"
  33. v-model="formData[name]"
  34. filterable
  35. :placeholder="`请选择${label}`"
  36. size="medium"
  37. clearable
  38. v-bind="rest"
  39. @change="onChange"
  40. style="width: 100%"
  41. >
  42. <el-option v-for="item in options" :key="item.id" :label="item.deviceTypeName" :value="item.id" />
  43. </el-select>
  44. <el-input
  45. v-else
  46. v-model="formData[name]"
  47. :type="type || 'text'"
  48. :disabled="disabled"
  49. :placeholder="name === 'no' ? '系统自动添加' : `请输入${label}`"
  50. size="medium"
  51. clearable
  52. v-bind="rest"
  53. />
  54. </el-form-item>
  55. <el-row style="display: inline-block; width: 100%">
  56. <el-form-item :key="'floatTips'" :label="'提示信息'" :prop="'floatTips'">
  57. <el-input
  58. v-model="formData['floatTips']"
  59. :type="'textarea'"
  60. :placeholder="`请输入提示信息`"
  61. size="medium"
  62. clearable
  63. :rows="1"
  64. />
  65. </el-form-item>
  66. </el-row>
  67. <el-row>
  68. <el-form-item :key="'note'" :label="'指标说明'" :prop="'note'">
  69. <el-input
  70. v-model="formData['note']"
  71. :type="'textarea'"
  72. :placeholder="`请输入指标说明`"
  73. size="medium"
  74. clearable
  75. :rows="3"
  76. />
  77. </el-form-item>
  78. </el-row>
  79. </el-form>
  80. </el-col>
  81. </el-row>
  82. </tf-dialog>
  83. </template>
  84. <script lang="ts">
  85. import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
  86. import { ElForm } from 'element-ui/types/form'
  87. import { IIndex } from '../commonAPI/common'
  88. const getDefaultValue = (): Partial<IIndex> => ({
  89. dataGroup: undefined,
  90. stsDate: undefined,
  91. projectCode: undefined,
  92. projectName: undefined,
  93. mangeField: undefined,
  94. indexType: undefined,
  95. indexCode: undefined,
  96. indexName: undefined,
  97. indexValue: undefined,
  98. unit: undefined,
  99. floatTips: undefined,
  100. note: undefined
  101. })
  102. @Component({ name: 'IndexForm' })
  103. export default class IndexForm extends Vue {
  104. @Prop({ type: Object, default: () => ({}) }) data!: object
  105. $refs!: { form: ElForm }
  106. formData: Partial<IIndex> = {
  107. ...getDefaultValue()
  108. }
  109. get listeners() {
  110. const { submit, ...rest } = this.$listeners
  111. return rest
  112. }
  113. get formItems() {
  114. return [
  115. { label: '分组', name: 'dataGroup' },
  116. { label: '统计日期', name: 'stsDate', type: 'date', required: true },
  117. { label: '项目编码', name: 'projectCode' },
  118. { label: '项目名称', name: 'projectName' },
  119. { label: '管理领域', name: 'mangeField' },
  120. { label: '指标分类', name: 'indexType' },
  121. { label: '指标代码', name: 'indexCode', required: true },
  122. { label: '指标名称', name: 'indexName', required: true },
  123. { label: '指标值', name: 'indexValue', required: true },
  124. { label: '指标单位', name: 'unit' }
  125. ]
  126. }
  127. rules = {
  128. stsDate: [{ required: true, message: '请选择统计日期' }],
  129. indexCode: [{ required: true, message: '请输入指标代码' }],
  130. indexName: [{ required: true, message: '请输入指标名称' }],
  131. indexValue: [{ required: true, message: '请输入指标值' }]
  132. }
  133. onSubmit() {
  134. this.$refs.form.validate((valid) => {
  135. if (valid) {
  136. const { ...rest } = this.formData
  137. this.$emit('submit', { ...rest })
  138. }
  139. })
  140. }
  141. @Watch('data', { immediate: true })
  142. setDefaultData(val: IIndex) {
  143. for (const key in val) {
  144. if (val[key] == '/') {
  145. val[key] = ''
  146. }
  147. }
  148. this.formData = val.id ? { ...val } : { ...getDefaultValue() }
  149. }
  150. }
  151. </script>
  152. <style lang="scss" scoped>
  153. </style>