UNPKG

@opensig/opendesign

Version:

231 lines (230 loc) 8.2 kB
import { defineComponent, inject, computed, ref, onMounted, onBeforeUnmount, provide, createElementBlock, openBlock, normalizeStyle, normalizeClass, createElementVNode, renderSlot, createTextVNode, toDisplayString, createCommentVNode, unref, Fragment, renderList } from "vue"; import { formItemProps } from "./types.mjs"; import { formInjectKey, formItemInjectKey } from "./provide.mjs"; import { getFlexValue, groupRules } from "./form.mjs"; import { isArray } from "../_utils/is.mjs"; import { moveToFirst, getValueByPath, asyncSome, setValueByPath } from "../_utils/helper.mjs"; import { log } from "../_utils/log.mjs"; const _hoisted_1 = { class: "o-form-item-label" }; const _hoisted_2 = { class: "o-form-item-main" }; const _hoisted_3 = { class: "o-form-item-main-wrap" }; const _hoisted_4 = { key: 0 }; const _hoisted_5 = { key: 1, class: "o-form-item-extra" }; const requireSymbol = "*"; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "OFormItem", props: formItemProps, setup(__props) { var _a; const props = __props; const formInject = inject(formInjectKey, {}); const align = computed(() => getFlexValue(props.labelAlign)); const justify = computed(() => getFlexValue(props.labelJustify)); const isRequired = computed(() => { if (props.required) { return true; } else if (isArray(props.rules)) { return props.rules.some((item) => item.required === true); } return false; }); const rules = computed(() => groupRules(props.rules, props.required)); const ruleTriggers = computed(() => { const t = Object.keys(rules.value); return moveToFirst(t, "change"); }); const fieldResult = ref(null); const initialVal = ((_a = formInject.model) == null ? void 0 : _a.value) && props.field ? getValueByPath(formInject.model.value, props.field) : void 0; const runValidate = async (trigger) => { var _a2; if (!props.field || !((_a2 = formInject.model) == null ? void 0 : _a2.value)) { return null; } const validators = rules.value[trigger || props.defaultTrigger || ruleTriggers.value[0]]; if (!validators || validators.length === 0) { return null; } const value = getValueByPath(formInject.model.value, props.field); fieldResult.value = null; await asyncSome(validators, async (validatorFn) => { var _a3; try { const rlt = await (validatorFn == null ? void 0 : validatorFn(value)); if ((rlt == null ? void 0 : rlt.type) === "danger") { fieldResult.value = { type: "danger", message: rlt.message ? [rlt.message] : [] }; return true; } else if ((rlt == null ? void 0 : rlt.type) === "warning") { if (!fieldResult.value) { fieldResult.value = { type: "warning", message: rlt.message ? [rlt.message] : [] }; } else if (rlt.message) { (_a3 = fieldResult.value.message) == null ? void 0 : _a3.push(rlt.message); } return false; } } catch (_e) { log.error("failed to validate rules"); } }); return fieldResult.value; }; const clearValidate = () => { var _a2; if (!props.field || !((_a2 = formInject.model) == null ? void 0 : _a2.value)) { return; } fieldResult.value = null; }; const resetFiled = () => { var _a2; if (((_a2 = formInject.model) == null ? void 0 : _a2.value) && props.field) { setValueByPath(formInject.model.value, props.field, initialVal); } }; const fieldHandlers = { runValidate, onChange() { runValidate("change"); }, onFocus() { runValidate("focus"); }, onInput() { runValidate("input"); }, onBlur() { runValidate("blur"); } }; onMounted(() => { var _a2; if (props.field) { (_a2 = formInject.addFiled) == null ? void 0 : _a2.call(formInject, { filed: props.field, validate: runValidate, clearValidate, resetFiled }); } }); onBeforeUnmount(() => { var _a2; if (props.field) { (_a2 = formInject.removeFiled) == null ? void 0 : _a2.call(formInject, props.field); } }); provide(formItemInjectKey, { fieldHandlers, fieldResult }); return (_ctx, _cache) => { var _a2, _b, _c, _d, _e; return openBlock(), createElementBlock( "div", { class: normalizeClass(["o-form-item", [ { "o-form-item-required": isRequired.value, "o-form-item-danger": ((_a2 = fieldResult.value) == null ? void 0 : _a2.type) === "danger", "o-form-item-warning": ((_b = fieldResult.value) == null ? void 0 : _b.type) === "warning" } ]]), style: normalizeStyle({ "--form-label-width": props.labelWidth, "--form-label-align": align.value, "--form-label-justify": justify.value }) }, [ createElementVNode("div", _hoisted_1, [ createElementVNode( "span", { class: normalizeClass(["o-form-require-symbol", { visible: isRequired.value }]) }, [ renderSlot(_ctx.$slots, "symbol", {}, () => [ createTextVNode(toDisplayString(requireSymbol)) ]) ], 2 /* CLASS */ ), renderSlot(_ctx.$slots, "label", {}, () => [ createElementVNode( "span", null, toDisplayString(props.label), 1 /* TEXT */ ) ]) ]), createElementVNode("div", _hoisted_2, [ createElementVNode("div", _hoisted_3, [ renderSlot(_ctx.$slots, "default") ]), ((_c = fieldResult.value) == null ? void 0 : _c.message) ? (openBlock(), createElementBlock( "div", { key: 0, class: normalizeClass(["o-form-item-message", `type-${fieldResult.value.type}`]) }, [ renderSlot(_ctx.$slots, "message", { message: (_d = fieldResult.value) == null ? void 0 : _d.message, type: (_e = fieldResult.value) == null ? void 0 : _e.type }, () => { var _a3, _b2, _c2; return [ !unref(isArray)((_a3 = fieldResult.value) == null ? void 0 : _a3.message) ? (openBlock(), createElementBlock( "div", _hoisted_4, toDisplayString((_b2 = fieldResult.value) == null ? void 0 : _b2.message), 1 /* TEXT */ )) : (openBlock(true), createElementBlock( Fragment, { key: 1 }, renderList((_c2 = fieldResult.value) == null ? void 0 : _c2.message, (item) => { return openBlock(), createElementBlock( "div", { key: item }, toDisplayString(item), 1 /* TEXT */ ); }), 128 /* KEYED_FRAGMENT */ )) ]; }) ], 2 /* CLASS */ )) : createCommentVNode("v-if", true), _ctx.$slots.extra ? (openBlock(), createElementBlock("div", _hoisted_5, [ renderSlot(_ctx.$slots, "extra") ])) : createCommentVNode("v-if", true) ]) ], 6 /* CLASS, STYLE */ ); }; } }); export { _sfc_main as default };