123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <template>
- <div class="fm-style">
- <el-form ref="generateForm"
- label-suffix=":"
- :size="data.config.size"
- :model="models" :rules="rules" :label-position="data.config.labelPosition" :label-width="data.config.labelWidth + 'px'">
- <template v-for="item in data.list">
- <template v-if="item.type == 'grid'">
- <el-row
- :key="item.key"
- type="flex"
- :gutter="item.options.gutter ? item.options.gutter : 0"
- :justify="item.options.justify"
- :align="item.options.align"
- >
- <el-col v-for="(col, colIndex) in item.columns" :key="colIndex" :span="col.span">
- <template v-for="citem in col.list" >
- <el-form-item v-if="citem.type=='blank'" :label="citem.name" :prop="citem.model" :key="citem.key">
- <slot :name="citem.model" :model="models"></slot>
- </el-form-item>
- <genetate-form-item v-else
- :key="citem.key"
- :models.sync="models"
- :remote="remote"
- :rules="rules"
- :widget="citem"
- @input-change="onInputChange">
- </genetate-form-item>
- </template>
- </el-col>
- </el-row>
- </template>
- <template v-else-if="item.type == 'blank'">
- <el-form-item :label="item.name" :prop="item.model" :key="item.key">
- <slot :name="item.model" :model="models"></slot>
- </el-form-item>
- </template>
- <template v-else>
- <genetate-form-item
- :key="item.key"
- :models.sync="models"
- :rules="rules"
- :widget="item"
- @input-change="onInputChange"
- :remote="remote">
- </genetate-form-item>
- </template>
- </template>
- </el-form>
- </div>
- </template>
- <script>
- import GenetateFormItem from './GenerateFormItem'
- import {loadJs} from '../util/index.js'
- export default {
- name: 'fm-generate-form',
- components: {
- GenetateFormItem
- },
- props: ['data', 'remote', 'value', 'insite'],
- data () {
- return {
- models: {},
- rules: {}
- }
- },
- created () {
- console.log(this.data)
- this.generateModle(this.data.list)
- },
- mounted () {
- },
- methods: {
- generateModle (genList) {
- console.log(genList)
- for (let i = 0; i < genList.length; i++) {
- if (genList[i].type === 'grid') {
- genList[i].columns.forEach(item => {
- this.generateModle(item.list)
- })
- } else {
- if (this.value && Object.keys(this.value).indexOf(genList[i].model) >= 0) {
- this.models[genList[i].model] = this.value[genList[i].model]
- } else {
- if (genList[i].type === 'blank') {
- this.$set(this.models, genList[i].model, genList[i].options.defaultType === 'String' ? '' : (genList[i].options.defaultType === 'Object' ? {} : []))
- } else {
- this.models[genList[i].model] = genList[i].options.defaultValue
- }
- }
- if (this.rules[genList[i].model]) {
- this.rules[genList[i].model] = [...this.rules[genList[i].model], ...genList[i].rules.map(item => {
- if (item.pattern) {
- return {...item, pattern: new RegExp(item.pattern)}
- } else {
- return {...item}
- }
- })]
- } else {
- this.rules[genList[i].model] = [...genList[i].rules.map(item => {
- if (item.pattern) {
- return {...item, pattern: new RegExp(item.pattern)}
- } else {
- return {...item}
- }
- })]
- }
- }
- }
- },
- getData () {
- console.log(this.models)
- return new Promise((resolve, reject) => {
- this.$refs.generateForm.validate(valid => {
- if (valid) {
- resolve(this.models)
- } else {
- reject(new Error(this.$t('fm.message.validError')).message)
- }
- })
- })
- },
- reset () {
- this.$refs.generateForm.resetFields()
- },
- onInputChange (value, field) {
- this.$emit('on-change', field, value, this.models)
- },
- refresh () {
- }
- },
- watch: {
- data: {
- deep: true,
- handler (val) {
- this.generateModle(val.list)
- }
- },
- value: {
- deep: true,
- handler (val) {
- console.log(JSON.stringify(val))
- this.models = {...this.models, ...val}
- }
- }
- }
- }
- </script>
- <style lang="scss">
- // @import '../styles/cover.scss';
- </style>
|