SkuMessages.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Utils
  2. import { createNamespace } from '../../utils';
  3. import { isEmail } from '../../utils/validate/email';
  4. import { isNumeric } from '../../utils/validate/number'; // Components
  5. import Cell from '../../cell';
  6. import Field from '../../field';
  7. import SkuImgUploader from './SkuImgUploader';
  8. import SkuDateTimeField from './SkuDateTimeField';
  9. var _createNamespace = createNamespace('sku-messages'),
  10. createComponent = _createNamespace[0],
  11. bem = _createNamespace[1],
  12. t = _createNamespace[2];
  13. export default createComponent({
  14. props: {
  15. messageConfig: Object,
  16. goodsId: [Number, String],
  17. messages: {
  18. type: Array,
  19. default: function _default() {
  20. return [];
  21. }
  22. }
  23. },
  24. data: function data() {
  25. return {
  26. messageValues: this.resetMessageValues(this.messages)
  27. };
  28. },
  29. watch: {
  30. messages: function messages(val) {
  31. this.messageValues = this.resetMessageValues(val);
  32. }
  33. },
  34. methods: {
  35. resetMessageValues: function resetMessageValues(messages) {
  36. var messageConfig = this.messageConfig;
  37. var _messageConfig$initia = messageConfig.initialMessages,
  38. initialMessages = _messageConfig$initia === void 0 ? {} : _messageConfig$initia;
  39. return (messages || []).map(function (message) {
  40. return {
  41. value: initialMessages[message.name] || ''
  42. };
  43. });
  44. },
  45. getType: function getType(message) {
  46. if (+message.multiple === 1) {
  47. return 'textarea';
  48. }
  49. if (message.type === 'id_no') {
  50. return 'text';
  51. }
  52. return message.datetime > 0 ? 'datetime' : message.type;
  53. },
  54. getMessages: function getMessages() {
  55. var messages = {};
  56. this.messageValues.forEach(function (item, index) {
  57. messages["message_" + index] = item.value;
  58. });
  59. return messages;
  60. },
  61. getCartMessages: function getCartMessages() {
  62. var _this = this;
  63. var messages = {};
  64. this.messageValues.forEach(function (item, index) {
  65. var message = _this.messages[index];
  66. messages[message.name] = item.value;
  67. });
  68. return messages;
  69. },
  70. getPlaceholder: function getPlaceholder(message) {
  71. var type = +message.multiple === 1 ? 'textarea' : message.type;
  72. var map = this.messageConfig.placeholderMap || {};
  73. return message.placeholder || map[type] || t("placeholder." + type);
  74. },
  75. validateMessages: function validateMessages() {
  76. var values = this.messageValues;
  77. for (var i = 0; i < values.length; i++) {
  78. var value = values[i].value;
  79. var message = this.messages[i];
  80. if (value === '') {
  81. // 必填字段的校验
  82. if (String(message.required) === '1') {
  83. var textType = t(message.type === 'image' ? 'upload' : 'fill');
  84. return textType + message.name;
  85. }
  86. } else {
  87. if (message.type === 'tel' && !isNumeric(value)) {
  88. return t('invalid.tel');
  89. }
  90. if (message.type === 'mobile' && !/^\d{6,20}$/.test(value)) {
  91. return t('invalid.mobile');
  92. }
  93. if (message.type === 'email' && !isEmail(value)) {
  94. return t('invalid.email');
  95. }
  96. if (message.type === 'id_no' && (value.length < 15 || value.length > 18)) {
  97. return t('invalid.id_no');
  98. }
  99. }
  100. }
  101. },
  102. /**
  103. * The phone number copied from IOS mobile phone address book
  104. * will add spaces and invisible Unicode characters
  105. * which cannot pass the /^\d+$/ verification
  106. * so keep numbers and dots
  107. */
  108. getFormatter: function getFormatter(message) {
  109. return function formatter(value) {
  110. if (message.type === 'mobile' || message.type === 'tel') {
  111. return value.replace(/[^\d.]/g, '');
  112. }
  113. return value;
  114. };
  115. },
  116. genMessage: function genMessage(message, index) {
  117. var _this2 = this;
  118. var h = this.$createElement;
  119. if (message.type === 'image') {
  120. return h(Cell, {
  121. "key": this.goodsId + "-" + index,
  122. "attrs": {
  123. "title": message.name,
  124. "required": String(message.required) === '1',
  125. "valueClass": bem('image-cell-value')
  126. },
  127. "class": bem('image-cell')
  128. }, [h(SkuImgUploader, {
  129. "attrs": {
  130. "maxSize": this.messageConfig.uploadMaxSize,
  131. "uploadImg": this.messageConfig.uploadImg
  132. },
  133. "model": {
  134. value: _this2.messageValues[index].value,
  135. callback: function callback($$v) {
  136. _this2.$set(_this2.messageValues[index], "value", $$v);
  137. }
  138. }
  139. }), h("div", {
  140. "class": bem('image-cell-label')
  141. }, [t('imageLabel')])]);
  142. } // 时间和日期使用的vant选择器
  143. var isDateOrTime = ['date', 'time'].indexOf(message.type) > -1;
  144. if (isDateOrTime) {
  145. return h(SkuDateTimeField, {
  146. "attrs": {
  147. "label": message.name,
  148. "required": String(message.required) === '1',
  149. "placeholder": this.getPlaceholder(message),
  150. "type": this.getType(message)
  151. },
  152. "key": this.goodsId + "-" + index,
  153. "model": {
  154. value: _this2.messageValues[index].value,
  155. callback: function callback($$v) {
  156. _this2.$set(_this2.messageValues[index], "value", $$v);
  157. }
  158. }
  159. });
  160. }
  161. return h(Field, {
  162. "attrs": {
  163. "maxlength": "200",
  164. "center": !message.multiple,
  165. "label": message.name,
  166. "required": String(message.required) === '1',
  167. "placeholder": this.getPlaceholder(message),
  168. "type": this.getType(message),
  169. "formatter": this.getFormatter(message)
  170. },
  171. "key": this.goodsId + "-" + index,
  172. "model": {
  173. value: _this2.messageValues[index].value,
  174. callback: function callback($$v) {
  175. _this2.$set(_this2.messageValues[index], "value", $$v);
  176. }
  177. }
  178. });
  179. }
  180. },
  181. render: function render() {
  182. var h = arguments[0];
  183. return h("div", {
  184. "class": bem()
  185. }, [this.messages.map(this.genMessage)]);
  186. }
  187. });