<template>
  <div id="add">
    <el-form
      ref="form"
      :model="form"
      :rules="rules"
      :label-width="labelWidth"
      class="form"
      size="small"
      @submit.native.prevent
      :style="styles"
      :inline="inline"
    >
      <template v-for="(item, index) in fields">
        <template v-if="!loading">
          <el-form-item v-if="display(item)" :key="'form-field-' + index" :label="getField('label', item)" :prop="item.model" :required="item.required">
            <template v-if="!item.custom">
              <template v-if="item.type !== 'text'">
                <!-- <el-tooltip class="item" effect="dark" :content="item.tip" placement="top-start" :disabled="!item.tip"> -->
                <template v-if="item.type === `date` || item.type === `datetime`">
                  <el-date-picker
                    v-model="form[item.model]"
                    :type="item.type"
                    placeholder="选择择"
                    format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd"
                    v-bind="item.options"
                  >
                  </el-date-picker>
                </template>
                <template v-else-if="item.type === `year` || item.type === `week` || item.type === `day`">
                  <el-date-picker
                    v-model="form[item.model]"
                    :type="item.type"
                    placeholder="选择择"
                    :format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
                    :value-format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
                    v-bind="item.options"
                  >
                  </el-date-picker>
                </template>
                <template v-else-if="item.type === 'radio'">
                  <el-radio-group v-model="form[item.model]" size="mini" v-bind="item.options">
                    <slot name="radios" v-bind="{ item, form, fieldChange }"></slot>
                  </el-radio-group>
                </template>
                <template v-else-if="item.type === 'select'">
                  <el-select v-model="form[item.model]" v-bind="item.options" filterable clearable>
                    <slot name="options" v-bind="{ item, form, fieldChange }"></slot>
                  </el-select>
                </template>
                <template v-else-if="item.type === 'textarea'">
                  <el-input clearable v-model="form[item.model]" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }"></el-input>
                </template>
                <template v-else-if="item.type === 'editor'">
                  <wang-editor v-model="form[item.model]"></wang-editor>
                </template>
                <template v-else-if="item.type === 'checkbox'">
                  <el-checkbox-group v-model="form[item.model]" v-bind="item.options">
                    <slot name="checkboxs" v-bind="{ item, form, fieldChange }"></slot>
                  </el-checkbox-group>
                </template>
                <template v-else>
                  <el-input
                    clearable
                    v-model="form[item.model]"
                    :type="getField('type', item)"
                    :placeholder="getField('placeholder', item)"
                    :show-password="getField('type', item) === 'password'"
                    v-bind="item.options"
                  ></el-input>
                </template>
                <!-- </el-tooltip> -->
              </template>
              <template v-else>
                {{ form[item.model] }}
              </template>
            </template>
            <template v-else>
              <slot name="custom" v-bind="{ item, form, fieldChange }"></slot>
            </template>
          </el-form-item>
        </template>
      </template>
      <el-form-item v-if="needSave" class="btn">
        <el-row type="flex" align="middle" justify="space-around">
          <el-col :span="6">
            <el-button type="primary" @click="save">{{ submitText }}</el-button>
          </el-col>
        </el-row>
      </el-form-item>
      <el-form-item v-else>
        <slot name="submit"></slot>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
import _ from 'lodash';
import wangEditor from './wang-editor.vue';
export default {
  name: 'add',
  props: {
    fields: { type: Array, default: () => [] },
    rules: { type: Object, default: () => {} },
    isNew: { type: Boolean, default: true },
    data: null,
    styles: { type: Object, default: () => {} },
    needSave: { type: Boolean, default: true },
    labelWidth: { type: String, default: '120px' },
    useEnter: { type: Boolean, default: true },
    submitText: { type: String, default: '保存' },
    inline: { type: Boolean, default: false },
    reset: { type: Boolean, default: true },
  },
  components: {
    wangEditor,
  },
  data: () => ({
    form: {},
    show: false,
    dateShow: false,
    loading: true,
  }),
  created() {
    if (this.useEnter) {
      document.onkeydown = () => {
        let key = window.event.keyCode;
        if (key == 13) {
          this.save();
        }
      };
    }
  },
  computed: {},
  mounted() {},
  watch: {
    fields: {
      handler(val) {
        this.checkType();
      },
      immediate: true,
    },
    data: {
      handler(val) {
        this.loading = true;
        if (val) this.$set(this, `form`, this.data);
        this.loading = false;
      },
      immediate: true,
      deep: true,
    },
  },
  methods: {
    getField(item, data) {
      let res = _.get(data, item, null);
      if (item === 'type') res = res === null ? `text` : res;
      if (item === 'placeholder') res = res === null ? `请输入${data.label}` : res;
      if (item === 'required') res = res === null ? false : res;
      if (item === `error`) res = res === null ? `${data.label}错误` : res;
      return res;
    },
    save() {
      this.$refs['form'].validate(valid => {
        if (valid) {
          this.$emit(`save`, { isNew: this.isNew, data: JSON.parse(JSON.stringify(this.form)) });
          if (this.reset) this.$refs.form.resetFields();
        } else {
          console.warn('form validate error!!!');
        }
      });
    },
    fieldChange({ model, value }) {
      this.$set(this.form, model, value);
    },
    checkType() {
      let arr = this.fields.filter(fil => fil.type === 'checkbox');
      if (arr.length > 0 && this.isNew) {
        for (const item of arr) {
          this.$set(this.form, `${item.model}`, []);
        }
      }
    },
    display(field) {
      let dis = _.get(field, `display`);
      if (!_.isFunction(dis)) return true;
      else return dis(field, this.form);
    },
  },
};
</script>

<style lang="less" scoped>
.form {
  padding: 2rem 1rem;
  background: #fff;
  border-radius: 20px;
}
/deep/.btn .el-form-item__content {
  margin-left: 0 !important;
}
</style>