import html from "html"; import { defineAsyncComponent, ref, reactive, watch } from "vue"; import { format } from "../../utils/index.js"; import { messages } from "../../utils/validation.js"; export default { name: "formItem", components: { AppFormInput: defineAsyncComponent(() => import("./form-input.js")) }, template: html` `, props: ["modelValue", "mode", "parentSchema", "schema", "prop", "errors"], emit: ["update:modelValue"], setup(props, context) { const model = reactive(props.modelValue); watch(model, (value) => { context.emit("update:modelValue", value); }); /*start*/ const showItem = () => { if (props.schema.hidden) { return false; } if (props.schema.readOnly && (props.mode === "create" || props.mode === "update")) { return false; } return true; }; // const getProp = (prop) => { return prop; }; // const getError = (prop) => { return props.errors[prop]; }; // const getRules = (parentSchema, property, data) => { if (props.mode === "query" || props.mode === "details" || !property.rules) { return null; } const rules = [...(Array.isArray(property.rules) ? property.rules : [property.rules])].map((o) => JSON.parse(JSON.stringify(o)) ); Object.values(rules).forEach((rule) => { rule.data = data; rule.schema = parentSchema; rule.title = rule.title ?? property.title; rule.type = property.type; if (rule.validator) { rule.validator = validators[rule.validator]; } if (!rule.message) { if (rule.required) { rule.message = format(messages.required, property.title); } else if (rule.pattern) { rule.message = format(messages.pattern, property.title); } else if (property.type === "string" || property.type === "number" || property.type === "array") { if (rule.len) { rule.message = format(messages[property.type].len, property.title, rule.len); } else if (rule.min) { rule.message = format(messages[property.type].min, property.title, rule.min); } else if (rule.max) { rule.message = format(messages[property.type].max, property.title, rule.max); } else if (rule.range) { rule.message = format(messages[property.type].range, property.title, rule.range); } } } }); return rules; }; /*end*/ return { model, showItem, getProp, getError, getRules, }; }, };