UNPKG

vue-django

Version:

个人实验项目, 本框架的目标是借鉴并超越django admin的自动化思想, 实现UI前端的极简快速定制开发

184 lines (176 loc) 6.11 kB
/** * Created by denishuang on 2018/4/20. */ import ServerResponse from './server_response' import Schema from 'async-validator' export default{ mixins: [ ServerResponse ], props: { formItems: Array, formUrl: String, formMethod: { type: String, default: 'post' }, formSubmit: Function, formSubmitName: { type: String, default: '提交' }, formInline: { type: Boolean, default: false }, formHideRequiredAsterisk:{ type: Boolean, default: false }, formSize: { type: String, default: null }, formLabelWidth: { type: String, default: '160px' }, formTextareaSize: { type: Object, default () { return {minRows: 4, maxRows: 8} } }, formNoLabel: {type: Boolean, default: false}, formItemStyle: { type: Object, default () { return {minWidth: '350px'} } } }, data () { return { formErrors: {}, formValue: {}, } }, components: {}, methods: { _formSubmit () { this.$emit('beforesubmit', this.formValue) this.loading = `正在${this.formSubmitName}` if (this.formSubmit) { return this.formSubmit().then(this._formSubmitSuccess) } else { let action = this.formMethod === 'post' ? this.$http.post : this.$http.put return action(this.formUrl, this.formValue).then(({data}) => { return this._formSubmitSuccess(data) }) } }, _formSubmitSuccess (data) { this.loading = false this.$message({message: `${this.formSubmitName}成功`, type: 'success'}) this.$emit('form-posted', data) return data }, onSubmit () { let procedure = (valid) => { if (valid) { this.formErrors = {} this._formSubmit().catch(e => { let error = this.onServerResponseError(e) if (error.code === 400) { this.formErrors = this.joinErrors(error.msg) } }) } else { this.$message({message: '表单检验未通过,请按提示修改', type: 'error'}) return false } } let formValid = this.$refs.form && this.$refs.form.validate if (formValid) { formValid(procedure) } else { let validator = new Schema(this.formRules) validator.validate(this.formValue, (errors) => { let valid = true if (errors) { this.formErrors = errors var fs = this.$refs errors.forEach((f) => { let v = fs[f.field][0] // v.focus() && v.blur() try { v.onBlur() } catch (error) { console.error(error) } }) valid = false } procedure(valid) }) } }, formDefaultWidget (f) { return f.type === 'boolean' ? 'checkbox' : (['date', 'datetime', 'time'].includes(f.type) ? f.type : ( ['integer','decimal'].includes(f.type) ? 'number' : 'text')) }, formDefaultRuleType (f) { if (f.multiple) { return 'array' } if (f.choices && f.choices.length > 0) { return typeof (f.choices[0][0] || f.choices[0]) } return f.model ? 'number' : (['field','time'].includes(f.type) ? 'string' : (['integer', 'decimal'].includes(f.type) ? 'number' : (f.type || 'string'))) }, formDefaultSpan (f) { return f.widget === 'textarea' ? {xs: 24, sm: 24, md: 24, lg: 24, xl: 24} : {xs: 24, sm: 24, md: 12, lg: 12, xl: 8} }, formDefaultRules (f) { let rs = [] if (f.required) { rs.push({ type: this.formDefaultRuleType(f), required: true, message: `不能为空` }) } if (f.min_length) { rs.push({min: f.min_length, message: `长度最小为${f.min_length}`}) } if (f.max_length) { rs.push({max: f.max_length, message: `长度最大为${f.max_length}`}) } return rs }, formNormalizeItem (i) { let a = Object.assign({}, i) a.type = a.type || 'string' a.label = a.label || a.name a.rules = a.rules || this.formDefaultRules(a) a.widget = a.widget || this.formDefaultWidget(a) let sp = a.span a.span = sp && (typeof sp === 'number' && {xs:sp,sm:sp,md:sp,lg:sp,xl:sp} || sp) || {} a.span = Object.assign({}, this.formDefaultSpan(a), a.span) return a }, formNormalizeItems (formItems) { return formItems.map((i) => { return this.formNormalizeItem(i) }) } }, computed: { formRules () { let d = {} Object.keys(this._formItems).forEach((i) => { let f = this._formItems[i] let n = f.name let rs = d[n] = f.rules || [] rs.concat(this.formDefaultRules(f)) }) return d }, _formItems () { return this.formNormalizeItems(this.formItems) } } }