You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

222 lines
9.8 KiB

2 years ago
  1. <template>
  2. <section>
  3. <el-row>
  4. <el-row v-if="field.extType=='row'" :gutter="gutter">
  5. <el-col v-for="child,idx in field.children" :key="idx" :span="calcSpan(child,field)">
  6. <mdp-form-data-item :field="child" :parent-field="field" :gutter="gutter" :span="span" v-model="myVal" @change="onChildChange" ></mdp-form-data-item>
  7. </el-col>
  8. </el-row>
  9. <el-card v-else-if="field.extType=='card'" :gutter="gutter">
  10. <div slot="header" class="clearfix">
  11. <span>{{ field.title }}</span>
  12. </div>
  13. <el-row :gutter="gutter" v-if="field.children && field.children.length>0">
  14. <el-col v-for="child,idx in field.children" :key="idx" :span="calcSpan(child,field)">
  15. <mdp-form-data-item :field="child" :parent-field="field" :gutter="gutter" :span="span" v-model="myVal" @change="onChildChange" ></mdp-form-data-item>
  16. </el-col>
  17. </el-row>
  18. </el-card>
  19. <el-tabs v-else-if="field.extType=='tabs'" v-model="myVal">
  20. <el-tab-pane :label="tab" v-for=" tab,tidx in tabListCpd" :key="tidx" :name="tab">
  21. <el-row :gutter="gutter">
  22. <el-col v-for="child,idx in field.children.filter(c=>c.gname==tab||!c.gname)" :key="idx" :span="calcSpan(child,field)">
  23. <mdp-form-data-item :field="child" :parent-field="field" :gutter="gutter" :span="span" v-model="myVal" @change="onChildChange" ></mdp-form-data-item>
  24. </el-col>
  25. </el-row>
  26. </el-tab-pane>
  27. </el-tabs>
  28. <el-form-item v-else :label="field.title" :prop="field.idCamel">
  29. <div v-if="field.nr"></div>
  30. <!--用户-->
  31. <mdp-select-user v-else-if=" field.extType=='user'" :show-style="field.showStyle" :disabled="field.ne" :multiple="field.mul=='1'" v-model="myVal" :label-width="labelWidthCpd" :label="field.title" :placeholder="field.hol" split="," @change="onFieldChange">
  32. </mdp-select-user>
  33. <!--部门-->
  34. <mdp-selecct-dept v-else-if=" field.extType=='deppt'" :show-style="field.showStyle" :disabled="field.ne" :branch-id="userInfo.branchId" :show-checkbox="field.mul=='1'" :multiple="field.mul=='1'" split="," @change="onFieldChange"></mdp-selecct-dept>
  35. <!--标签-->
  36. <mdp-select-tag v-else-if=" field.extType=='tag'" :show-style="field.showStyle" :disabled="field.ne" :multiple="field.mul=='1'" v-model="myVal" :label-width="labelWidthCpd" :label="field.title" :placeholder="field.hol" split="," @change="onFieldChange">
  37. </mdp-select-tag>
  38. <!--下拉框-->
  39. <mdp-select v-else-if=" ['select','radio','checkbox'].some(k=>k==field.typ)" :show-style="field.showStyle" :disabled="field.ne" :show-type="field.typ" :item-code="field.dict" :multiple="field.mul=='1'" v-model="myVal" :label-width="labelWidthCpd" :label="field.title" :placeholder="field.hol" split="," @change="onFieldChange">
  40. </mdp-select>
  41. <!--html-->
  42. <el-popover v-else-if=" field.extType=='html'"
  43. placement="top-start"
  44. width="400"
  45. trigger="hover">
  46. <el-input type="textarea" rows="4" v-model="myVal" :disabled="field.ne" @change="onFieldChange"></el-input>
  47. <div slot="reference" v-html="myVal||field.defaultValue||'无'"></div>
  48. </el-popover>
  49. <!--link 链接-->
  50. <el-popover v-else-if=" field.extType=='link'"
  51. placement="top-start"
  52. width="400"
  53. trigger="hover">
  54. <el-input v-model="myVal" :disabled="field.ne" @change="onFieldChange"></el-input>
  55. <el-link slot="reference" :href="myVal" target="_blank">{{ myVal||field.title }}</el-link>
  56. </el-popover>
  57. <!--image-->
  58. <el-popover v-else-if=" field.extType=='image'"
  59. placement="top-start"
  60. trigger="hover">
  61. <el-button @click="$refs['imageDialog'].open({formData:editForm,item:item})" :disabled="field.ne">上传图片</el-button>
  62. <el-image slot="reference" :style="field.styleObj||{maxHeight:'100px',maxWidth:'100px'}"
  63. :src="myVal"
  64. fit="contain" >
  65. </el-image>
  66. </el-popover>
  67. <!--att 附件-->
  68. <el-popover v-else-if=" field.extType=='att'"
  69. placement="top-start"
  70. trigger="hover">
  71. <el-button @click="$refs['attDialog'].open({formData:editForm,item:item})" :disabled="field.ne">上传附件</el-button>
  72. <el-link slot="reference" :href="myVal" target="_blank">{{ myVal||field.title }}</el-link>
  73. </el-popover>
  74. <!--其它类型-->
  75. <mdp-input :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='text'" style="width: 90%;" v-model="myVal" :label-width="labelWidthCpd" :label="field.title" auto-complete="off" :placeholder="field.hol" clearable @change="onFieldChange"> </mdp-input>
  76. <mdp-number :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='number'" v-model="myVal" :label-width="labelWidthCpd" :label="field.title" auto-complete="off" placeholder="请输入内容" clearable @change="onFieldChange"></mdp-number>
  77. <mdp-number :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='amount'" v-model="myVal" :label-width="labelWidthCpd" :label="field.title" auto-complete="off" placeholder="请输入内容" clearable @change="onFieldChange"></mdp-number>
  78. <mdp-input :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='textarea'" type="textarea" :rows="2" v-model="myVal" :label-width="labelWidthCpd" :label="field.title" placeholder="请输入内容" @change="onFieldChange"></mdp-input>
  79. <el-time-picker :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='time'" v-model="myVal" placeholder="任意时间点" value-format="HH:mm:ss" format="HH:mm:ss" @change="onFieldChange"> </el-time-picker>
  80. <mdp-date :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='date'" v-model="myVal" align="right" type="date" value-format="yyyy-MM-dd" format="yyyy-MM-dd" placeholder="选择日期" :picker-options="pickerOptions" @change="onFieldChange"> </mdp-date>
  81. <mdp-date :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='datetime'" v-model="myVal" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间" align="right" :picker-options="pickerOptions" @change="onFieldChange"> </mdp-date>
  82. <mdp-date :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='month'" v-model="myVal" type="month" value-format="yyyy-MM" format="yyyy-MM" placeholder="选择月份" @change="onFieldChange"></mdp-date>
  83. <mdp-date :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='year'" v-model="myVal" type="month" value-format="yyyy" format="yyyy" placeholder="选择年" @change="onFieldChange"></mdp-date>
  84. <mdp-date-range :show-style="field.showStyle" :disabled="field.ne" v-else-if="field.typ=='daterange'" :value="myVal?myVal.split(','):[]" align="right" type="daterange" value-format="yyyy-MM-dd" format="yyyy-MM-dd" placeholder="选择日期" :picker-options="pickerOptions" @change="(vs)=>{myVal=vs.join(',');onFieldChange(vs)}"> </mdp-date-range>
  85. </el-form-item>
  86. </el-row>
  87. <mdp-dialog ref="imageDialog" title="选择图片" width="80%" :modal="false">
  88. <template v-slot="{visible,data,dialog}">
  89. <mdp-select-image v-if="visible" :visible="visible" @select="(imgs)=>{
  90. if(data.field.mul=='1'){
  91. data.formData[data.field.idCamel]=imgs&&imgs.length>0?imgs.map(i=>i.url).join(','):null
  92. }else{
  93. data.formData[data.field.idCamel]=imgs&&imgs.length>0?imgs[0].url:null
  94. }
  95. dialog.close();
  96. }"></mdp-select-image>
  97. </template>
  98. </mdp-dialog>
  99. <mdp-dialog ref="attDialog" title="选择文件" width="80%" :modal="false">
  100. <template v-slot="{visible,data,dialog}">
  101. <mdp-select-att v-if="visible" :visible="visible" :multiple="data.field.mul=='1'" @select="(imgs)=>{
  102. if(data.field.mul=='1'){
  103. data.formData[data.field.idCamel]=imgs&&imgs.length>0?imgs.map(i=>i.url).join(','):null
  104. }else{
  105. data.formData[data.field.idCamel]= (imgs?imgs.url:null)
  106. }
  107. dialog.close();
  108. }" split=","></mdp-select-att>
  109. </template>
  110. </mdp-dialog>
  111. </section>
  112. </template>
  113. <script>
  114. import { mapGetters } from 'vuex'
  115. /**
  116. * 表单数据填单
  117. */
  118. export default {
  119. computed: {
  120. ...mapGetters([
  121. 'userInfo'
  122. ]),
  123. labelWidthCpd:function(){
  124. if(this.labelWidth){
  125. return this.labelWidth
  126. }
  127. return this.labelWidthCalc();
  128. },
  129. tabListCpd(){
  130. if(!this.field.gname){
  131. return []
  132. }
  133. return this.field.gname.split(",")
  134. }
  135. },
  136. props:{
  137. value:{type:[Object,String,Array,Number],default:null},
  138. field:{type:Object,default:null},
  139. labelWidth:{type:String,default:null},
  140. labelPosition:{type:String,default:null},
  141. span:{
  142. type:Number,
  143. default:24
  144. },
  145. parentField:{
  146. type:Object,
  147. default:function(){
  148. return {}
  149. }
  150. },
  151. },
  152. watch: {
  153. value:function(){
  154. this.initData()
  155. },
  156. field:function(field) {
  157. },
  158. },
  159. data() {
  160. return {
  161. pickerOptions: this.$mdp.getPickerOptions(),
  162. myVal:null,
  163. }
  164. },
  165. methods: {
  166. labelWidthCalc:function(){
  167. if (screen.width <=375){
  168. return "80px"
  169. }else if (screen.width <= 500){
  170. return "80px"
  171. }else if (screen.width<=1024){
  172. return "100px"
  173. }else {
  174. return "120px"
  175. }
  176. } ,
  177. initData(){
  178. if(this.value){
  179. this.editForm=Object.assign({},this.value)
  180. }else{
  181. this.editForm={}
  182. }
  183. },
  184. onChildChange(val,field){
  185. this.$emit('input',val)
  186. this.$emit('change',val,field)
  187. },
  188. calcSpan(child,parent){
  189. if(child.span>0){
  190. return child.span
  191. }else{
  192. return this.span
  193. }
  194. },
  195. onFieldChange(val){
  196. this.$emit('input',this.myVal)
  197. this.$emit('change',this.myVal,this.field)
  198. },
  199. },//end method
  200. components: {
  201. "mdp-form-data-item": ()=>import('@/components/mdp-ui-ext/mdp-expand/FormDataItem.vue'),
  202. },
  203. mounted() {
  204. this.initData();
  205. }//end mounted
  206. }
  207. </script>
  208. <style scoped>
  209. </style>