index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. const verify = require('../../utils/deleteMark');
  2. Component({
  3. externalClasses: [],
  4. properties: {
  5. form: {
  6. type: Array
  7. },
  8. showAll: {
  9. type: Boolean,
  10. value: true
  11. }, //不显示必填项
  12. onConfirm: {
  13. type: Function
  14. },
  15. interrupt: {
  16. type: Function
  17. }, //打断处理,用于条件判断 把form返回到上个页面处理重新传入
  18. },
  19. lifetimes: {
  20. attached: function () {
  21. getApp().globalData.Language.getLanguagePackage(this)
  22. this.setData({
  23. languagecode: wx.getStorageSync('languagecode')
  24. })
  25. },
  26. },
  27. data: {
  28. temporary: null, //route选择暂存选中项
  29. voiceIndex: null,
  30. seconds: 60,
  31. },
  32. options: {
  33. multipleSlots: true, //允许使用多个slot
  34. addGlobalClass: true
  35. },
  36. methods: {
  37. onVoiceInput(e) {
  38. this.setData({
  39. [`form[${e.currentTarget.dataset.index}].value`]: e.detail
  40. });
  41. this.confirm();
  42. },
  43. toOptions(e) {
  44. const {
  45. item
  46. } = e.currentTarget.dataset;
  47. wx.navigateTo({
  48. url: '/packageA/options/index?data=' + JSON.stringify(item),
  49. })
  50. },
  51. route(e) {
  52. const {
  53. item
  54. } = e.currentTarget.dataset;
  55. if (item.disabled) return;
  56. getApp().globalData.handleSelect = this.handleRoute.bind(this);
  57. let result = (item.query && !item.query.indexOf("radio=true") && item.value[1]) ? `` : `&result=${JSON.stringify(item.value[1])}`
  58. wx.navigateTo({
  59. url: item.url + '?params=' + JSON.stringify(item.params) + (item.query || '') + result + `&value=${JSON.stringify(item.value)}`,
  60. fail(err) {
  61. console.log(err)
  62. }
  63. });
  64. this.setData({
  65. temporary: {
  66. item: item,
  67. index: this.data.form.findIndex(v => v.valueName == item.valueName)
  68. }
  69. })
  70. },
  71. /* 处理路由返回结果 */
  72. handleRoute(data) {
  73. let temporary = this.data.temporary;
  74. if (temporary.item.interrupt) {
  75. this.triggerEvent("interrupt", {
  76. data,
  77. form: this.data.form,
  78. temporary
  79. });
  80. } else {
  81. wx.navigateBack();
  82. this.setData({
  83. [`form[${temporary.index}].value`]: data.value
  84. });
  85. this.confirm()
  86. };
  87. this.data.temporary = null;
  88. },
  89. onBlur(e) {
  90. let item = e.target.dataset.item,
  91. index = this.data.form.findIndex(v => v.valueName === item.valueName);
  92. if (item.interrupt) this.triggerEvent("interrupt", {
  93. data: this.data.form[index],
  94. form: this.data.form,
  95. temporary: {
  96. item,
  97. index
  98. }
  99. });
  100. },
  101. /* 改变值 */
  102. inputChange(e) {
  103. let item = e.target.dataset.item,
  104. index = this.data.form.findIndex(v => v.valueName === item.valueName),
  105. value = e.detail;
  106. //校验规则 不填:不校验 "base":默认校验 "phone":手机号 "mail":邮箱 "telephone":固定电话 "正则表达式":以自定义内容为校验标准
  107. if (item.checking) {
  108. let reg = item.checking;
  109. switch (item.checking) {
  110. case 'base':
  111. value = verify.queryStr(value);
  112. break;
  113. case 'phone':
  114. reg = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/;
  115. this.setData({
  116. [`form[${index}].errMsg`]: !reg.test(value) ? getApp().globalData.Language.getMapText('号码格式错误') || '请输入正确的11位手机号码!' : ''
  117. });
  118. break;
  119. case "telephone":
  120. let i = e.target.dataset.i;
  121. value = item.value;
  122. value[i] = e.detail.value;
  123. let result = value[0] + "-" + value[1];
  124. reg = /^0\d{2,3}-[1-9]\d{6,7}$/
  125. this.setData({
  126. [`form[${index}].errMsg`]: !reg.test(result) ? getApp().globalData.Language.getMapText('号码格式错误') || '请填写正确的座机电话' : '',
  127. [`form[${index}].result`]: result,
  128. });
  129. break;
  130. case 'mail':
  131. reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
  132. this.setData({
  133. [`form[${index}].errMsg`]: !reg.test(value) ? getApp().globalData.Language.getMapText('请输入正确的邮箱格式') : ''
  134. });
  135. break;
  136. case 'twoDecimalPlaces':
  137. reg = /^(\d+(?:\.\d{0,2})?)?$/;
  138. this.setData({
  139. [`form[${index}].errMsg`]: !reg.test(value) ? '仅允许保留2位小数' : ''
  140. });
  141. break;
  142. default:
  143. reg = new RegExp(reg);
  144. this.setData({
  145. [`form[${index}].errMsg`]: !reg.test(value) ? item.hint || getApp().globalData.Language.getMapText('输入文本不符合条件!') || '输入文本不符合条件!' : ''
  146. });
  147. break;
  148. };
  149. };
  150. this.setData({
  151. [`form[${index}].value`]: value,
  152. [`form[${index}].error`]: false,
  153. });
  154. if (!item.required && value == '') this.setData({
  155. [`form[${index}].errMsg`]: "",
  156. });
  157. this.confirm();
  158. },
  159. /* 单列选择器 */
  160. bindSelectorChange(e) {
  161. let {
  162. item,
  163. index
  164. } = e.target.dataset,
  165. value = e.detail.value;
  166. this.setData({
  167. [`form[${index}].value`]: item.range[value][item.selectKey || item.rangeKey],
  168. [`form[${index}].rangeIndex`]: value,
  169. [`form[${index}].error`]: false,
  170. });
  171. if (item.interrupt) this.triggerEvent("interrupt", {
  172. data: this.data.form[index],
  173. form: this.data.form,
  174. temporary: {
  175. item,
  176. index
  177. }
  178. });
  179. this.confirm();
  180. },
  181. /* 日期,时间 选择器 */
  182. bindDateChange(e) {
  183. let item = e.target.dataset.item,
  184. index = this.data.form.findIndex(v => v.valueName === item.valueName),
  185. value = e.detail.value;
  186. this.setData({
  187. [`form[${index}].value`]: value,
  188. [`form[${index}].error`]: false,
  189. });
  190. if (item.interrupt) this.triggerEvent("interrupt", {
  191. data: this.data.form[index],
  192. form: this.data.form,
  193. temporary: {
  194. item,
  195. index
  196. }
  197. });
  198. this.confirm();
  199. },
  200. /* 时间范围选择器 */
  201. rangeDateChange(e) {
  202. let item = e.target.dataset.item,
  203. i = e.target.dataset.index,
  204. index = this.data.form.findIndex(v => v.valueName === item.valueName),
  205. value = e.detail.value;
  206. this.setData({
  207. [`form[${index}].value[${i}]`]: value,
  208. [`form[${index}].error`]: false,
  209. });
  210. this.confirm();
  211. },
  212. /* 省市县 */
  213. bindRegionChange(e) {
  214. let item = e.currentTarget.dataset.item,
  215. index = this.data.form.findIndex(v => v.valueName === item.valueName),
  216. value = e.detail.value;
  217. this.setData({
  218. [`form[${index}].value`]: value,
  219. [`form[${index}].error`]: false,
  220. });
  221. this.confirm();
  222. },
  223. /* 自定义选项 */
  224. setOption(item) {
  225. let i = this.data.form.findIndex(v => v.valueName == item.valueName);
  226. this.setData({
  227. [`form[${i}].value`]: item.value
  228. });
  229. this.confirm();
  230. },
  231. /* 是否完成必填项 */
  232. confirm() {
  233. this.triggerEvent("onConfirm", this.data.form.some(v => {
  234. if (v.type == "dateRange" && v.required) {
  235. return v.value[0] == "" || v.value[1] == "";
  236. } else {
  237. return v.required && v.value == '';
  238. }
  239. }))
  240. },
  241. /* 性别 */
  242. sexChange(e) {
  243. let item = e.currentTarget.dataset.item,
  244. index = this.data.form.findIndex(v => v.valueName === item.valueName);
  245. this.setData({
  246. [`form[${index}].value`]: e.detail,
  247. [`form[${index}].error`]: false,
  248. });
  249. this.confirm();
  250. },
  251. /* 单选 选择器改变 */
  252. radioChange(e) {
  253. let item = e.currentTarget.dataset.item,
  254. index = this.data.form.findIndex(v => v.valueName == item.valueName);
  255. if (this.data.form[index].value == e.detail) return;
  256. this.setData({
  257. [`form[${index}].value`]: e.detail,
  258. [`form[${index}].error`]: false,
  259. });
  260. if (item.interrupt) this.triggerEvent("interrupt", {
  261. data: this.data.form[index],
  262. form: this.data.form,
  263. temporary: {
  264. item,
  265. index
  266. }
  267. });
  268. this.confirm();
  269. },
  270. /* 提交 */
  271. submit() {
  272. let obj = {},
  273. isPass = false;
  274. this.data.form.forEach((v, i) => {
  275. obj[v.valueName] = v.value;
  276. // permit 无视errMsg 允许通过
  277. if (!v.permit && v.errMsg != '') {
  278. this.setData({
  279. [`form[${i}].error`]: true
  280. });
  281. isPass = true;
  282. }
  283. });
  284. if (isPass) {
  285. wx.showToast({
  286. title: getApp().globalData.Language.getMapText('请检查表单内容'),
  287. icon: "none"
  288. })
  289. } else {
  290. return obj;
  291. }
  292. },
  293. /* 查询结果 不验证是否必填 */
  294. query() {
  295. let obj = {};
  296. this.data.form.forEach(v => obj[v.valueName] = v.value);
  297. return obj;
  298. },
  299. clearItem(e) {
  300. const {
  301. index
  302. } = e.currentTarget.dataset;
  303. console.log(index)
  304. this.setData({
  305. [`form[${index}].value`]: ""
  306. })
  307. }
  308. }
  309. })