import { defineComponent, computed, watch, provide, reactive, toRefs, openBlock, createElementBlock, normalizeClass, unref, renderSlot } from 'vue';
|
import '../../../utils/index.mjs';
|
import '../../../hooks/index.mjs';
|
import './hooks/index.mjs';
|
import { formContextKey } from './constants.mjs';
|
import { formProps, formEmits } from './form.mjs';
|
import { filterFields, useFormLabelWidth } from './utils.mjs';
|
import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
|
import { useFormSize } from './hooks/use-form-common-props.mjs';
|
import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
|
import { debugWarn } from '../../../utils/error.mjs';
|
import { isFunction } from '@vue/shared';
|
|
const COMPONENT_NAME = "ElForm";
|
const __default__ = defineComponent({
|
name: COMPONENT_NAME
|
});
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
...__default__,
|
props: formProps,
|
emits: formEmits,
|
setup(__props, { expose, emit }) {
|
const props = __props;
|
const fields = [];
|
const formSize = useFormSize();
|
const ns = useNamespace("form");
|
const formClasses = computed(() => {
|
const { labelPosition, inline } = props;
|
return [
|
ns.b(),
|
ns.m(formSize.value || "default"),
|
{
|
[ns.m(`label-${labelPosition}`)]: labelPosition,
|
[ns.m("inline")]: inline
|
}
|
];
|
});
|
const addField = (field) => {
|
fields.push(field);
|
};
|
const removeField = (field) => {
|
if (field.prop) {
|
fields.splice(fields.indexOf(field), 1);
|
}
|
};
|
const resetFields = (properties = []) => {
|
if (!props.model) {
|
debugWarn(COMPONENT_NAME, "model is required for resetFields to work.");
|
return;
|
}
|
filterFields(fields, properties).forEach((field) => field.resetField());
|
};
|
const clearValidate = (props2 = []) => {
|
filterFields(fields, props2).forEach((field) => field.clearValidate());
|
};
|
const isValidatable = computed(() => {
|
const hasModel = !!props.model;
|
if (!hasModel) {
|
debugWarn(COMPONENT_NAME, "model is required for validate to work.");
|
}
|
return hasModel;
|
});
|
const obtainValidateFields = (props2) => {
|
if (fields.length === 0)
|
return [];
|
const filteredFields = filterFields(fields, props2);
|
if (!filteredFields.length) {
|
debugWarn(COMPONENT_NAME, "please pass correct props!");
|
return [];
|
}
|
return filteredFields;
|
};
|
const validate = async (callback) => validateField(void 0, callback);
|
const doValidateField = async (props2 = []) => {
|
if (!isValidatable.value)
|
return false;
|
const fields2 = obtainValidateFields(props2);
|
if (fields2.length === 0)
|
return true;
|
let validationErrors = {};
|
for (const field of fields2) {
|
try {
|
await field.validate("");
|
} catch (fields3) {
|
validationErrors = {
|
...validationErrors,
|
...fields3
|
};
|
}
|
}
|
if (Object.keys(validationErrors).length === 0)
|
return true;
|
return Promise.reject(validationErrors);
|
};
|
const validateField = async (modelProps = [], callback) => {
|
const shouldThrow = !isFunction(callback);
|
try {
|
const result = await doValidateField(modelProps);
|
if (result === true) {
|
callback == null ? void 0 : callback(result);
|
}
|
return result;
|
} catch (e) {
|
if (e instanceof Error)
|
throw e;
|
const invalidFields = e;
|
if (props.scrollToError) {
|
scrollToField(Object.keys(invalidFields)[0]);
|
}
|
callback == null ? void 0 : callback(false, invalidFields);
|
return shouldThrow && Promise.reject(invalidFields);
|
}
|
};
|
const scrollToField = (prop) => {
|
var _a;
|
const field = filterFields(fields, prop)[0];
|
if (field) {
|
(_a = field.$el) == null ? void 0 : _a.scrollIntoView(props.scrollIntoViewOptions);
|
}
|
};
|
watch(() => props.rules, () => {
|
if (props.validateOnRuleChange) {
|
validate().catch((err) => debugWarn(err));
|
}
|
}, { deep: true });
|
provide(formContextKey, reactive({
|
...toRefs(props),
|
emit,
|
resetFields,
|
clearValidate,
|
validateField,
|
addField,
|
removeField,
|
...useFormLabelWidth()
|
}));
|
expose({
|
validate,
|
validateField,
|
resetFields,
|
clearValidate,
|
scrollToField
|
});
|
return (_ctx, _cache) => {
|
return openBlock(), createElementBlock("form", {
|
class: normalizeClass(unref(formClasses))
|
}, [
|
renderSlot(_ctx.$slots, "default")
|
], 2);
|
};
|
}
|
});
|
var Form = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "/home/runner/work/element-plus/element-plus/packages/components/form/src/form.vue"]]);
|
|
export { Form as default };
|
//# sourceMappingURL=form2.mjs.map
|