index.js 10 KB

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