You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
6.1 KiB

4 years ago
// Utils
import { createNamespace } from '../../utils';
import { isEmail } from '../../utils/validate/email';
import { isNumeric } from '../../utils/validate/number'; // Components
import Cell from '../../cell';
import Field from '../../field';
import SkuImgUploader from './SkuImgUploader';
import SkuDateTimeField from './SkuDateTimeField';
var _createNamespace = createNamespace('sku-messages'),
createComponent = _createNamespace[0],
bem = _createNamespace[1],
t = _createNamespace[2];
export default createComponent({
props: {
messageConfig: Object,
goodsId: [Number, String],
messages: {
type: Array,
default: function _default() {
return [];
}
}
},
data: function data() {
return {
messageValues: this.resetMessageValues(this.messages)
};
},
watch: {
messages: function messages(val) {
this.messageValues = this.resetMessageValues(val);
}
},
methods: {
resetMessageValues: function resetMessageValues(messages) {
var messageConfig = this.messageConfig;
var _messageConfig$initia = messageConfig.initialMessages,
initialMessages = _messageConfig$initia === void 0 ? {} : _messageConfig$initia;
return (messages || []).map(function (message) {
return {
value: initialMessages[message.name] || ''
};
});
},
getType: function getType(message) {
if (+message.multiple === 1) {
return 'textarea';
}
if (message.type === 'id_no') {
return 'text';
}
return message.datetime > 0 ? 'datetime' : message.type;
},
getMessages: function getMessages() {
var messages = {};
this.messageValues.forEach(function (item, index) {
messages["message_" + index] = item.value;
});
return messages;
},
getCartMessages: function getCartMessages() {
var _this = this;
var messages = {};
this.messageValues.forEach(function (item, index) {
var message = _this.messages[index];
messages[message.name] = item.value;
});
return messages;
},
getPlaceholder: function getPlaceholder(message) {
var type = +message.multiple === 1 ? 'textarea' : message.type;
var map = this.messageConfig.placeholderMap || {};
return message.placeholder || map[type] || t("placeholder." + type);
},
validateMessages: function validateMessages() {
var values = this.messageValues;
for (var i = 0; i < values.length; i++) {
var value = values[i].value;
var message = this.messages[i];
if (value === '') {
// 必填字段的校验
if (String(message.required) === '1') {
var textType = t(message.type === 'image' ? 'upload' : 'fill');
return textType + message.name;
}
} else {
if (message.type === 'tel' && !isNumeric(value)) {
return t('invalid.tel');
}
if (message.type === 'mobile' && !/^\d{6,20}$/.test(value)) {
return t('invalid.mobile');
}
if (message.type === 'email' && !isEmail(value)) {
return t('invalid.email');
}
if (message.type === 'id_no' && (value.length < 15 || value.length > 18)) {
return t('invalid.id_no');
}
}
}
},
/**
* The phone number copied from IOS mobile phone address book
* will add spaces and invisible Unicode characters
* which cannot pass the /^\d+$/ verification
* so keep numbers and dots
*/
getFormatter: function getFormatter(message) {
return function formatter(value) {
if (message.type === 'mobile' || message.type === 'tel') {
return value.replace(/[^\d.]/g, '');
}
return value;
};
},
genMessage: function genMessage(message, index) {
var _this2 = this;
var h = this.$createElement;
if (message.type === 'image') {
return h(Cell, {
"key": this.goodsId + "-" + index,
"attrs": {
"title": message.name,
"required": String(message.required) === '1',
"valueClass": bem('image-cell-value')
},
"class": bem('image-cell')
}, [h(SkuImgUploader, {
"attrs": {
"maxSize": this.messageConfig.uploadMaxSize,
"uploadImg": this.messageConfig.uploadImg
},
"model": {
value: _this2.messageValues[index].value,
callback: function callback($$v) {
_this2.$set(_this2.messageValues[index], "value", $$v);
}
}
}), h("div", {
"class": bem('image-cell-label')
}, [t('imageLabel')])]);
} // 时间和日期使用的vant选择器
var isDateOrTime = ['date', 'time'].indexOf(message.type) > -1;
if (isDateOrTime) {
return h(SkuDateTimeField, {
"attrs": {
"label": message.name,
"required": String(message.required) === '1',
"placeholder": this.getPlaceholder(message),
"type": this.getType(message)
},
"key": this.goodsId + "-" + index,
"model": {
value: _this2.messageValues[index].value,
callback: function callback($$v) {
_this2.$set(_this2.messageValues[index], "value", $$v);
}
}
});
}
return h(Field, {
"attrs": {
"maxlength": "200",
"center": !message.multiple,
"label": message.name,
"required": String(message.required) === '1',
"placeholder": this.getPlaceholder(message),
"type": this.getType(message),
"formatter": this.getFormatter(message)
},
"key": this.goodsId + "-" + index,
"model": {
value: _this2.messageValues[index].value,
callback: function callback($$v) {
_this2.$set(_this2.messageValues[index], "value", $$v);
}
}
});
}
},
render: function render() {
var h = arguments[0];
return h("div", {
"class": bem()
}, [this.messages.map(this.genMessage)]);
}
});