index.vue 2.11 KB
<template>
  <section class="form-designer">
    <field-group class="left" />
    <field-container
      ref="fieldContainer"
      v-model="fields"
      class="middle"
      :form-config="formConfig"
      @deleteAllFields="deleteAllFields"
      @fieldRemove="fieldRemove"
      @groupFieldChange="groupFieldChange"
      @fieldChange="fieldChange"
    />
    <field-config
      :project-stage-options="projectStageOptions"
      class="right"
      :form-config="formConfig"
      :cur-field="curField"
    />
  </section>
</template>
<script>
import fieldGroup from './fieldGroup/index'
import fieldContainer from './fieldContainer/index'
import fieldConfig from './fieldConfig/index'
export default {
  name: 'FormDesigner',
  components: {
    fieldGroup,
    fieldContainer,
    fieldConfig
  },
  props: {
    value: {
      type: Array,
      default: () => []
    },
    formConfig: {
      type: Object,
      default() {
        return {
          labelAlign: 'left',
          labelWidth: '100'
        }
      }
    }
  },
  data() {
    return {
      curField: null,
      fields: this.value,
      projectStageOptions: []
    }
  },
  computed: {},
  watch: {
    fields: {
      handler(val) {
        this.$emit('input', val)
      },
      deep: true
    },
    formConfig: {
      deep: true,
      handler(val) {
        this.$emit('formConfigChange', val)
      }
    }
  },
  created() {},
  beforeMount() {
  },
  mounted() {},
  methods: {
    deleteAllFields(fields) {
      this.$emit('deleteAllFields', fields)
    },
    fieldChange(index) {
      if (index !== null) {
        this.curField = this.fields[index]
      } else {
        this.curField = null
      }
    },
    groupFieldChange(field) {
      this.curField = field
    },
    fieldRemove(field) {
      this.$emit('fieldDel', field)
    }
  }
}
</script>
<style lang="stylus" scoped>
  .form-designer {
    width: 100%;
    height: 100%;
    min-height 500px;
    display: flex;
    flex-direction: row
    .middle {
      flex: 1
    }
  }
</style>
<style>
    .el-date-editor.el-input, .el-date-editor.el-input__inner {
        width: 182px;
    }
</style>