UNPKG

element-plus

Version:

A Component Library for Vue3.0

209 lines (198 loc) 6.71 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var mitt = require('mitt'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var mitt__default = /*#__PURE__*/_interopDefaultLegacy(mitt); const elFormKey = 'elForm'; const elFormItemKey = 'elFormItem'; const elFormEvents = { addField: 'el.form.addField', removeField: 'el.form.removeField', }; function useFormLabelWidth() { const potentialLabelWidthArr = vue.ref([]); const autoLabelWidth = vue.computed(() => { if (!potentialLabelWidthArr.value.length) return '0'; const max = Math.max(...potentialLabelWidthArr.value); return max ? `${max}px` : ''; }); function getLabelWidthIndex(width) { const index = potentialLabelWidthArr.value.indexOf(width); if (index === -1) { console.warn('[Element Warn][ElementForm]unexpected width ' + width); } return index; } function registerLabelWidth(val, oldVal) { if (val && oldVal) { const index = getLabelWidthIndex(oldVal); potentialLabelWidthArr.value.splice(index, 1, val); } else if (val) { potentialLabelWidthArr.value.push(val); } } function deregisterLabelWidth(val) { const index = getLabelWidthIndex(val); index > -1 && potentialLabelWidthArr.value.splice(index, 1); } return { autoLabelWidth, registerLabelWidth, deregisterLabelWidth, }; } var script = vue.defineComponent({ name: 'ElForm', props: { model: Object, rules: Object, labelPosition: String, labelWidth: String, labelSuffix: { type: String, default: '', }, inline: Boolean, inlineMessage: Boolean, statusIcon: Boolean, showMessage: { type: Boolean, default: true, }, size: String, disabled: Boolean, validateOnRuleChange: { type: Boolean, default: true, }, hideRequiredAsterisk: { type: Boolean, default: false, }, }, emits: ['validate'], setup(props, { emit }) { const formMitt = mitt__default['default'](); const fields = []; vue.watch(() => props.rules, () => { fields.forEach(field => { field.removeValidateEvents(); field.addValidateEvents(); }); if (props.validateOnRuleChange) { validate(() => ({})); } }); formMitt.on(elFormEvents.addField, field => { if (field) { fields.push(field); } }); formMitt.on(elFormEvents.removeField, field => { if (field.prop) { fields.splice(fields.indexOf(field), 1); } }); const resetFields = () => { if (!props.model) { console.warn('[Element Warn][Form]model is required for resetFields to work.'); return; } fields.forEach(field => { field.resetField(); }); }; const clearValidate = (props = []) => { const fds = props.length ? typeof props === 'string' ? fields.filter(field => props === field.prop) : fields.filter(field => props.indexOf(field.prop) > -1) : fields; fds.forEach(field => { field.clearValidate(); }); }; const validate = (callback) => { if (!props.model) { console.warn('[Element Warn][Form]model is required for validate to work!'); return; } let promise; if (typeof callback !== 'function') { promise = new Promise((resolve, reject) => { callback = function (valid, invalidFields) { if (valid) { resolve(true); } else { reject(invalidFields); } }; }); } if (fields.length === 0) { callback(true); } let valid = true; let count = 0; let invalidFields = {}; for (const field of fields) { field.validate('', (message, field) => { if (message) { valid = false; } invalidFields = Object.assign(Object.assign({}, invalidFields), field); if (++count === fields.length) { callback(valid, invalidFields); } }); } return promise; }; const validateField = (props, cb) => { props = [].concat(props); const fds = fields.filter(field => props.indexOf(field.prop) !== -1); if (!fields.length) { console.warn('[Element Warn]please pass correct props!'); return; } fds.forEach(field => { field.validate('', cb); }); }; const elForm = vue.reactive(Object.assign(Object.assign(Object.assign({ formMitt }, vue.toRefs(props)), { resetFields, clearValidate, validateField, emit }), useFormLabelWidth())); vue.provide(elFormKey, elForm); return { validate, resetFields, clearValidate, validateField, }; }, }); function render(_ctx, _cache, $props, $setup, $data, $options) { return (vue.openBlock(), vue.createBlock("form", { class: ["el-form", [ _ctx.labelPosition ? 'el-form--label-' + _ctx.labelPosition : '', { 'el-form--inline': _ctx.inline } ]] }, [ vue.renderSlot(_ctx.$slots, "default") ], 2 /* CLASS */)) } script.render = render; script.__file = "packages/form/src/form.vue"; script.install = (app) => { app.component(script.name, script); }; const _Form = script; exports.default = _Form; exports.elFormEvents = elFormEvents; exports.elFormItemKey = elFormItemKey; exports.elFormKey = elFormKey;