@form-create/ant-design-vue
Version:
AntDesignVue版本低代码表单|FormCreate 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的低代码表单生成组件。支持6个UI框架,适配移动端,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。
137 lines (133 loc) • 4.95 kB
JavaScript
import extend from '@form-create/utils/lib/extend';
import is from '@form-create/utils/lib/type';
import {invoke} from '@form-create/core/src/frame/util';
import toArray from '@form-create/utils/lib/toarray';
function tidyBtnProp(btn, def) {
if (is.Boolean(btn))
btn = {show: btn};
else if (!is.Undef(btn) && !is.Object(btn)) btn = {show: def};
return btn;
}
export default function extendApi(api, h) {
extend(api, {
formEl() {
return h.$manager.form();
},
wrapEl(id) {
const ctx = h.getFieldCtx(id);
if (!ctx) return;
return h.vm.$refs[ctx.wrapRef];
},
validate(callback) {
return new Promise((resolve, reject) => {
const forms = api.children;
const all = [h.$manager.validate()];
forms.forEach(v => {
all.push(v.validate());
})
Promise.all(all).then(() => {
resolve(true);
callback && callback(true);
}).catch((e) => {
reject(e);
callback && callback(false, e);
h.vm.$emit('validate-fail', e, {api});
})
});
},
validateField: (field, callback) => {
return new Promise((resolve, reject) => {
const ctx = h.getFieldCtx(field);
if (!ctx) return;
const sub = h.subForm[ctx.id];
const all = [h.$manager.validateField(ctx.id)];
toArray(sub).forEach(v => {
all.push(v.validate().catch(() => {
return Promise.reject('子表单验证未通过');
}));
})
Promise.all(all).then(() => {
resolve(null);
callback && callback(null);
}).catch((e) => {
reject(e);
callback && callback(e);
h.vm.$emit('validate-field-fail', e, {field, api});
})
});
},
clearValidateState(fields, clearSub = true) {
api.helper.tidyFields(fields).forEach(field => {
if (clearSub) this.clearSubValidateState(field);
h.getCtxs(field).forEach(ctx => {
h.$manager.clearValidateState(ctx);
});
});
},
clearSubValidateState(fields) {
api.helper.tidyFields(fields).forEach(field => {
h.getCtxs(field).forEach(ctx => {
const subForm = h.subForm[ctx.id];
if (!subForm) return;
if (Array.isArray(subForm)) {
subForm.forEach(form => {
form.clearValidateState();
})
} else if (subForm) {
subForm.clearValidateState();
}
});
})
},
btn: {
loading: (loading = true) => {
api.submitBtnProps({loading: !!loading});
},
disabled: (disabled = true) => {
api.submitBtnProps({disabled: !!disabled});
},
show: (isShow = true) => {
api.submitBtnProps({show: !!isShow});
}
},
resetBtn: {
loading: (loading = true) => {
api.resetBtnProps({loading: !!loading});
},
disabled: (disabled = true) => {
api.resetBtnProps({disabled: !!disabled});
},
show: (isShow = true) => {
api.resetBtnProps({show: !!isShow});
}
},
submitBtnProps: (props = {}) => {
let btn = tidyBtnProp(h.options.submitBtn, true);
extend(btn, props);
h.options.submitBtn = btn;
api.refreshOptions();
},
resetBtnProps: (props = {}) => {
let btn = tidyBtnProp(h.options.resetBtn, false);
extend(btn, props);
h.options.resetBtn = btn;
api.refreshOptions();
},
submit(successFn, failFn) {
api.validate((valid) => {
if (valid) {
let formData = api.formData();
if (is.Function(successFn))
invoke(() => successFn(formData, this));
else {
is.Function(h.options.onSubmit) && invoke(() => h.options.onSubmit(formData, this));
h.vm.$emit('submit', formData, this);
}
} else {
is.Function(failFn) && invoke(() => failFn(this, ...arguments));
}
}).catch(e=>{});
},
});
return api;
}