@ -25,7 +25,7 @@
< component :is = "getEditComponent(key)" mode = "edit" :title = "value.title" :name = "key" :value . sync = "data.model[key]" :data = "data.data" :nullable = "value.nullable" @ change = "change" / >
< component :is = "getEditComponent(key)" mode = "edit" :title = "value.title" :name = "key" :value . sync = "data.model[key]" :data = "data.data" :nullable = "value.nullable" @ change = "change" / >
< / template >
< / template >
< div style = "height:1em;" >
< div style = "height:1em;" >
< span v-if = "hasErrors(key)" class = "field-validation-error text-danger" > {{getErrorLi st (key)}}< / span >
< span v-if = "hasErrors(key)" class = "field-validation-error text-danger" > {{getProperty Errors(key)}}< / span >
< span v-else class = "text-danger field-validation-valid" > < / span >
< span v-else class = "text-danger field-validation-valid" > < / span >
< / div >
< / div >
< / div >
< / div >
@ -76,7 +76,7 @@
return this.data.schema ? this.data.schema.title : '';
return this.data.schema ? this.data.schema.title : '';
},
},
title: function () {
title: function () {
return this.name + '列表' ;
return this.name + (this.mode === 'edit' ? '编辑' : '新建') ;
}
}
},
},
mounted: function () {
mounted: function () {
@ -99,120 +99,9 @@
getErrors: function () {
getErrors: function () {
return this.data.errors;
return this.data.errors;
},
},
change: function (name) {
hasErrors: function (key) {
var vm = this;
key = key.toLowerCase();
var schema = this.getSchema();
return Enumerable.from(this.getErrors()).any(o => o.key.toLowerCase() === key);
var model = this.getModel();
var property = schema.properties[name];
var value = model[name];
var list = [];
list.push(
this.validInternal(property.required, name, o => Promise.resolve(value !== undefined & & value !== null))
);
if (value) {
list.push(
this.validInternal(property.email, name, o => Promise.resolve(/^[a-zA-Z0-9.!#$%& '*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value)))
);
list.push(
this.validInternal(property.url, name, o => Promise.resolve(/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value)))
);
list.push(
this.validInternal(property.date, name, o => Promise.resolve(!/Invalid|NaN/.test(new Date(value).toString())))
);
list.push(
this.validInternal(property.number, name, o => Promise.resolve(/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value)))
);
list.push(
this.validInternal(property.digits, name, o => Promise.resolve(/^\d+$/.test(value)))
);
//dateiso
//creditcard
//accept
list.push(
this.validInternal(property.pattern, name, o => Promise.resolve(new RegExp(property.pattern.regex).test(value)))
);
list.push(
this.validInternal(property.minLength, name, o => Promise.resolve(value.length >= property.minLength.min))
);
list.push(
this.validInternal(property.maxLength, name, o => Promise.resolve(value.length < = property.maxLength.max))
);
list.push(
this.validInternal(property.rangeLength, name, o => Promise.resolve(value.length >= property.rangeLength.min & & value.length < = property.rangeLength.max))
);
list.push(
this.validInternal(property.range, name, o => Promise.resolve(parseFloat(value) >= property.range.min & & parseFloat(value) < = property.range.max))
);
list.push(this.validInternal(property.equalTo, name, o => Promise.resolve(o === vm.data.model[vm.camelCased(name)]))
);
list.push(
this.validInternal(property.remote, name, o => new Promise((resolve, reject) => {
var url = property.remote.url + '?' + name + '=' + value;
if (property.remote.additionalFields) {
var keys = property.remote.additionalFields.split(',');
for (var i = 0; i < keys.length ; i + + ) {
var key = keys[i];
url = url + '& ' + key + '=' + vm.data.model[vm.camelCased(key)];
}
}
axios.get(url).then(function (response) {
resolve(response.data === true);
}).catch(function () {
resolve(false);
});
}))
);
}
return Promise.all(list);
},
valid: function () {
var vm = this;
var schema = this.getSchema();
var list = [];
_.forIn(schema.properties, function (value, key) {
list.push(vm.change(key));
});
return Promise.all(list);
},
validInternal: function (validator, name, valid, message) {
if (validator) {
var vm = this;
message = message || validator.message;
return valid().then(function (value) {
var error = Enumerable.from(vm.data.errors).firstOrDefault(o => o.key.toLowerCase() === name.toLowerCase());
if (value) {
if (error) {
if (Enumerable.from(error.value.errors).any(o => o.errorMessage === message)) {
error.value.errors = Enumerable.from(error.value.errors).where(o => o.errorMessage !== message).toArray();
}
if (error.value.errors.length === 0) {
var index = _.findIndex(vm.data.errors, o => o.key.toLowerCase() === name.toLowerCase());
vm.getErrors().splice(index, 1);
}
}
}
else {
if (!error) {
error = {
key: name,
value: {
errors: [{ errorMessage: message }]
}
};
vm.data.errors.push(error);
}
else {
if (!Enumerable.from(error.value.errors).any(o => o.errorMessage === message)) {
error.value.errors.push({ errorMessage: message });
}
}
}
});
}
return Promise.resolve('');
},
camelCased: function (name) {
return name[0].toLowerCase() + name.substr(1);
},
},
getValidationSummary: function (excludePropertyErrors) {
getValidationSummary: function (excludePropertyErrors) {
var query = Enumerable.from(this.getErrors());
var query = Enumerable.from(this.getErrors());
@ -221,15 +110,14 @@
}
}
return query.select(o => o.value.errors[0].errorMessage).toArray();
return query.select(o => o.value.errors[0].errorMessage).toArray();
},
},
hasErrors: function (key) {
getPropertyErrors: function (key) {
key = key.toLowerCase();
return Enumerable.from(this.getErrors()).any(o => o.key.toLowerCase() === key);
},
getErrorList: function (key) {
key = key.toLowerCase();
key = key.toLowerCase();
return Enumerable.from(this.getErrors())
return Enumerable.from(this.getErrors())
.where(o => o.key.toLowerCase() === key).selectMany(o => o.value.errors).select(o => o.errorMessage).toArray().join(',');
.where(o => o.key.toLowerCase() === key).selectMany(o => o.value.errors).select(o => o.errorMessage).toArray().join(',');
},
},
change: function (name) {
return this.$validProperty(name);
},
hasPermission: function () {
hasPermission: function () {
var permission = this.mode + '-' + this.entity;
var permission = this.mode + '-' + this.entity;
return Enumerable.from(store.state.permissions).any(o => o.toLowerCase() === permission.toLowerCase());
return Enumerable.from(store.state.permissions).any(o => o.toLowerCase() === permission.toLowerCase());
@ -249,7 +137,7 @@
},
},
onSubmit: function (e) {
onSubmit: function (e) {
var vm = this;
var vm = this;
vm.valid().then(function (value) {
vm.$ valid().then(function (value) {
if (vm.data.errors.length === 0) {
if (vm.data.errors.length === 0) {
axios.post(e.target.action, vm.data.model).then(function (response) {
axios.post(e.target.action, vm.data.model).then(function (response) {
if (response.status === 204) {
if (response.status === 204) {