form-item-rules.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // 可以转换的validateType
  2. import {
  3. emailValidator,
  4. identityCardValidator,
  5. mobilePhoneValidator,
  6. sqlSimpleValidator
  7. } from '@cip/utils/form-validator'
  8. const validatorMap = {
  9. email: emailValidator,
  10. identityCard: identityCardValidator,
  11. mobilePhone: mobilePhoneValidator,
  12. sql: sqlSimpleValidator
  13. }
  14. const isInputType = (config) => {
  15. if (config.triggerType === 'input') { return true }
  16. if (config.triggerType === 'select') { return false }
  17. // 兼容老的未设置triggerType的表单数据验证
  18. return ['input', 'textarea', 'number', 'numberRange', 'table', 'password', undefined].includes(config.type)
  19. }
  20. // 获取单字段规则
  21. export const getRulesByFieldConfig = (config, otherValue, dependOnValues, outDependOnValues) => {
  22. const rules = []
  23. if (config.required) { // 必填
  24. const defaultPreText = isInputType(config) ? '请输入' : '请选择'
  25. const requiredMessage = config.requiredErrorMessage || `${defaultPreText}${config.label}`
  26. const requiredRule = { required: true, message: requiredMessage, ...config.requiredRuleConfig }
  27. if (config.requiredType) {
  28. requiredRule.type = config.requiredType
  29. }
  30. rules.push(requiredRule)
  31. // 双值验证
  32. if (config.type === 'dateRange' && config.otherKey) { // 日期范围
  33. const validator = (rule, value, cb) => {
  34. if (value) {
  35. if (otherValue) {
  36. cb()
  37. } else {
  38. cb(new Error(requiredMessage + '-结束时间'))
  39. }
  40. } else {
  41. cb()
  42. }
  43. }
  44. const otherRules = { validator }
  45. rules.push(otherRules)
  46. }
  47. }
  48. // 提取公共函数
  49. const pushValidatorFunction = (validator, type) => {
  50. const message = config.validateValueErrorMessage
  51. const rule = {
  52. validator,
  53. trigger: type || 'blur'
  54. }
  55. if (message) {
  56. rule.message = message
  57. }
  58. return rule
  59. }
  60. if (config.validateValue && validatorMap[config.validateValue]) { // 内置值类型校验
  61. const validator = validatorMap[config.validateValue]
  62. if (validator) {
  63. rules.push(pushValidatorFunction(validator))
  64. }
  65. }
  66. // 正则校验
  67. if (config.regexpValidate) {
  68. try {
  69. const reg = new RegExp(config.regexpValidate)
  70. const rule = {
  71. pattern: reg,
  72. message: config.regexpValidateErrorMessage || `未能通过${reg.toString()}校验`,
  73. trigger: 'blur'
  74. }
  75. rules.push(rule)
  76. } catch (e) { console.log(e.message) }
  77. }
  78. // 远程校验值是否已经存在
  79. if (config.validateExistRemote) {
  80. const validator = async (rule, value, callback) => {
  81. const { data } = await config.validateExistRemote(value, dependOnValues, outDependOnValues)
  82. console.log(data)
  83. if (data) {
  84. callback(new Error(config.validateExistRemoteErrorMessage || rule.message || '已存在'))
  85. } else {
  86. callback()
  87. }
  88. }
  89. rules.push(pushValidatorFunction(validator))
  90. }
  91. return rules
  92. }