form-item-rules.js 3.1 KB

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