diff --git a/io.sc.platform.core.frontend/src/platform/components/form/WForm.vue b/io.sc.platform.core.frontend/src/platform/components/form/WForm.vue
index fa372782..6648daf5 100644
--- a/io.sc.platform.core.frontend/src/platform/components/form/WForm.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/form/WForm.vue
@@ -2,7 +2,7 @@
-
+
@@ -51,7 +52,8 @@ const props = defineProps({
const formRef = ref();
const formStatus = ref(PageStatusEnum.新增);
const formModel: any = {};
-const formFieldsMap = new Map();
+const formFields = {};
+const fields_ = ref([...props.fields]);
// 不同屏幕尺寸下 colsNum 为 0 时一行显示的字段个数
const screenCols = { xs: 1, sm: 2, md: 3, lg: 4, xl: 6 };
const fiedType = {
@@ -75,23 +77,23 @@ const defaultValueHandler = (field) => {
};
watch(
- () => props.fields,
+ () => fields_.value,
(newVal, oldVal) => {
if (newVal) {
- for (const field of props.fields as any) {
+ for (const field of fields_.value as any) {
if (field.name) {
formModel[field.name] = defaultValueHandler(field);
- formFieldsMap.set(field.name, field);
+ formFields[field.name] = field;
}
}
}
},
);
-for (const field of props.fields as any) {
+for (const field of fields_.value as any) {
if (field.name) {
formModel[field.name] = defaultValueHandler(field);
- formFieldsMap.set(field.name, field);
+ formFields[field.name] = field;
}
}
@@ -118,6 +120,13 @@ const formLayoutComputed = computed(() => {
return className;
});
+const updateModelValue = (name, value) => {
+ if (formFields[name].error) {
+ formFields[name].error = false;
+ formFields[name].errorMessage = undefined;
+ }
+};
+
/**
* 对外暴露方法-获取form所有数据
*/
@@ -130,7 +139,7 @@ const getData = () => {
* @param data 数据对象(JSON格式)
*/
const setData = (data) => {
- for (const field of props.fields as any) {
+ for (const field of fields_.value as any) {
formData[field.name] = data[field.name];
}
};
@@ -139,7 +148,7 @@ const setData = (data) => {
*/
const reset = () => {
Object.keys(formData).forEach((key) => {
- formData[key] = defaultValueHandler(formFieldsMap.get(key));
+ formData[key] = defaultValueHandler(formFields[key]);
});
};
const formValidate = async () => {
@@ -164,8 +173,7 @@ const validate = async () => {
* @param value 字段值
*/
const setFieldValue = (fieldName, value) => {
- const field = formFieldsMap.get(fieldName);
- formData[field.name] = value;
+ formData[fieldName] = value;
};
/**
* 对外暴露方法-获取字段值
@@ -194,9 +202,44 @@ const getRowColsNum = () => {
return screenColsNumComputed.value;
};
+/**
+ * 错误消息类型
+ *
+ * @param fieldName 字段名
+ * @param errorMessage 错误消息
+ */
+type errorType = {
+ fieldName: string;
+ errorMessage: string;
+};
+
+/**
+ * 对外暴露方法-设置后台校验错误信息
+ * @param errors 错误消息集合
+ */
+const setValidationErrors = (errors: errorType[]) => {
+ if (errors && errors.length > 0) {
+ const grouped = {};
+ errors.map(({ fieldName, ...rest }) => {
+ grouped[fieldName] = grouped[fieldName] || [];
+ grouped[fieldName].push(rest);
+ });
+ for (let name in grouped) {
+ if (formFields[name]) {
+ formFields[name].error = true;
+ formFields[name].errorMessage = grouped[name]
+ .map((obj) => {
+ return obj.errorMessage;
+ })
+ .join('、');
+ }
+ }
+ }
+};
+
defineExpose({
data: formData,
- fieldsMap: formFieldsMap,
+ fields: formFields,
getData,
setData,
reset,
@@ -206,5 +249,6 @@ defineExpose({
setStatus,
getStatus,
getRowColsNum,
+ setValidationErrors,
});
diff --git a/io.sc.platform.core.frontend/src/platform/components/form/elements/WCheckbox.vue b/io.sc.platform.core.frontend/src/platform/components/form/elements/WCheckbox.vue
index fa2ea5d4..f1fa28c7 100644
--- a/io.sc.platform.core.frontend/src/platform/components/form/elements/WCheckbox.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/form/elements/WCheckbox.vue
@@ -27,6 +27,9 @@ const props = defineProps({
const rulesComputed = computed(() => {
let rules = inRules || [];
+ if (hideIfComputed.value) {
+ rules = [];
+ }
return rules;
});
diff --git a/io.sc.platform.core.frontend/src/platform/components/form/elements/WDate.vue b/io.sc.platform.core.frontend/src/platform/components/form/elements/WDate.vue
index 5801934c..aa8e5f28 100644
--- a/io.sc.platform.core.frontend/src/platform/components/form/elements/WDate.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/form/elements/WDate.vue
@@ -2,6 +2,7 @@
{
- return false;
- },
+ default: undefined,
},
readonlyIf: {
type: Function,
@@ -73,8 +77,11 @@ const rulesComputed = computed(() => {
let rules = inRules || [];
if (!hideIfComputed.value && requiredIfComputed.value) {
rules.push(FormValidators.required());
- } else {
- rules.splice(rules.length - 1, 1);
+ } else if (hideIfComputed.value) {
+ rules = [];
+ }
+ if (dateRef?.value) {
+ dateRef.value.resetValidation();
}
return rules;
});
@@ -83,7 +90,12 @@ const hideIfComputed = computed(() => {
return props.hideIf();
});
const requiredIfComputed = computed(() => {
- return props.requiredIf();
+ if (props.requiredIf) {
+ return props.requiredIf() || false;
+ } else if (props.required) {
+ return true;
+ }
+ return false;
});
const readonlyIfComputed = computed(() => {
return props.readonlyIf();
diff --git a/io.sc.platform.core.frontend/src/platform/components/form/elements/WNumber.vue b/io.sc.platform.core.frontend/src/platform/components/form/elements/WNumber.vue
index 2f502373..5c7735c8 100644
--- a/io.sc.platform.core.frontend/src/platform/components/form/elements/WNumber.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/form/elements/WNumber.vue
@@ -2,6 +2,7 @@