vxe-table 4.5.0-beta.11 → 4.5.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +1 -1
  3. package/README.zh-TW.md +1 -1
  4. package/es/footer/src/footer.js +5 -1
  5. package/es/form/src/form.js +27 -5
  6. package/es/icon/style.css +1 -1
  7. package/es/input/src/input.js +4 -1
  8. package/es/locale/lang/en-US.js +4 -0
  9. package/es/locale/lang/es-ES.js +5 -0
  10. package/es/locale/lang/ja-JP.js +5 -0
  11. package/es/locale/lang/zh-CN.js +5 -0
  12. package/es/locale/lang/zh-TC.js +5 -0
  13. package/es/menu/src/hooks.js +3 -3
  14. package/es/select/src/select.js +4 -1
  15. package/es/style.css +1 -1
  16. package/es/style.min.css +1 -1
  17. package/es/table/src/body.js +7 -3
  18. package/es/table/src/table.js +30 -7
  19. package/es/table/style.css +14 -3
  20. package/es/textarea/src/textarea.js +4 -1
  21. package/es/tools/log.js +1 -1
  22. package/es/tooltip/style.css +0 -6
  23. package/es/v-x-e-table/index.js +4 -1
  24. package/es/v-x-e-table/src/conf.js +4 -1
  25. package/es/v-x-e-table/src/menus.js +48 -2
  26. package/es/v-x-e-table/src/store.js +4 -1
  27. package/es/v-x-e-table/src/validators.js +5 -0
  28. package/es/validator/src/hook.js +100 -22
  29. package/es/vxe-table/style.css +14 -3
  30. package/es/vxe-tooltip/style.css +0 -6
  31. package/lib/footer/src/footer.js +6 -1
  32. package/lib/footer/src/footer.min.js +1 -1
  33. package/lib/form/src/form.js +24 -4
  34. package/lib/form/src/form.min.js +1 -1
  35. package/lib/icon/style/style.css +1 -1
  36. package/lib/icon/style/style.min.css +1 -1
  37. package/lib/index.umd.js +271 -48
  38. package/lib/index.umd.min.js +1 -1
  39. package/lib/input/src/input.js +6 -1
  40. package/lib/input/src/input.min.js +1 -1
  41. package/lib/locale/lang/en-US.js +4 -0
  42. package/lib/locale/lang/en-US.min.js +1 -1
  43. package/lib/locale/lang/en-US.umd.js +4 -0
  44. package/lib/locale/lang/es-ES.js +5 -0
  45. package/lib/locale/lang/es-ES.min.js +1 -1
  46. package/lib/locale/lang/es-ES.umd.js +5 -0
  47. package/lib/locale/lang/ja-JP.js +5 -0
  48. package/lib/locale/lang/ja-JP.min.js +1 -1
  49. package/lib/locale/lang/ja-JP.umd.js +5 -0
  50. package/lib/locale/lang/zh-CN.js +5 -0
  51. package/lib/locale/lang/zh-CN.min.js +1 -1
  52. package/lib/locale/lang/zh-CN.umd.js +5 -0
  53. package/lib/locale/lang/zh-HK.min.js +1 -1
  54. package/lib/locale/lang/zh-HK.umd.js +5 -0
  55. package/lib/locale/lang/zh-MO.min.js +1 -1
  56. package/lib/locale/lang/zh-MO.umd.js +5 -0
  57. package/lib/locale/lang/zh-TC.js +5 -0
  58. package/lib/locale/lang/zh-TC.min.js +1 -1
  59. package/lib/locale/lang/zh-TC.umd.js +5 -0
  60. package/lib/locale/lang/zh-TW.min.js +1 -1
  61. package/lib/locale/lang/zh-TW.umd.js +5 -0
  62. package/lib/menu/src/hooks.js +3 -3
  63. package/lib/menu/src/hooks.min.js +1 -1
  64. package/lib/select/src/select.js +6 -1
  65. package/lib/select/src/select.min.js +1 -1
  66. package/lib/style.css +1 -1
  67. package/lib/style.min.css +1 -1
  68. package/lib/table/src/body.js +8 -2
  69. package/lib/table/src/body.min.js +1 -1
  70. package/lib/table/src/table.js +38 -9
  71. package/lib/table/src/table.min.js +1 -1
  72. package/lib/table/style/style.css +14 -3
  73. package/lib/table/style/style.min.css +1 -1
  74. package/lib/textarea/src/textarea.js +6 -1
  75. package/lib/textarea/src/textarea.min.js +1 -1
  76. package/lib/tools/log.js +1 -1
  77. package/lib/tools/log.min.js +1 -1
  78. package/lib/tooltip/style/style.css +0 -6
  79. package/lib/tooltip/style/style.min.css +1 -1
  80. package/lib/v-x-e-table/index.js +14 -1
  81. package/lib/v-x-e-table/index.min.js +1 -1
  82. package/lib/v-x-e-table/src/conf.js +4 -1
  83. package/lib/v-x-e-table/src/conf.min.js +1 -1
  84. package/lib/v-x-e-table/src/menus.js +48 -2
  85. package/lib/v-x-e-table/src/menus.min.js +1 -1
  86. package/lib/v-x-e-table/src/store.js +4 -1
  87. package/lib/v-x-e-table/src/store.min.js +1 -1
  88. package/lib/v-x-e-table/src/validators.js +15 -0
  89. package/lib/v-x-e-table/src/validators.min.js +1 -0
  90. package/lib/validator/src/hook.js +94 -20
  91. package/lib/validator/src/hook.min.js +1 -1
  92. package/lib/vxe-table/style/style.css +14 -3
  93. package/lib/vxe-table/style/style.min.css +1 -1
  94. package/lib/vxe-tooltip/style/style.css +0 -6
  95. package/lib/vxe-tooltip/style/style.min.css +1 -1
  96. package/package.json +2 -2
  97. package/packages/footer/src/footer.ts +5 -1
  98. package/packages/form/src/form.ts +24 -5
  99. package/packages/input/src/input.ts +4 -1
  100. package/packages/locale/lang/en-US.ts +4 -0
  101. package/packages/locale/lang/es-ES.ts +5 -0
  102. package/packages/locale/lang/ja-JP.ts +5 -0
  103. package/packages/locale/lang/zh-CN.ts +5 -0
  104. package/packages/locale/lang/zh-TC.ts +5 -0
  105. package/packages/menu/src/hooks.ts +3 -3
  106. package/packages/select/src/select.ts +4 -1
  107. package/packages/table/src/body.ts +7 -3
  108. package/packages/table/src/table.ts +34 -7
  109. package/packages/textarea/src/textarea.ts +4 -1
  110. package/packages/v-x-e-table/index.ts +3 -0
  111. package/packages/v-x-e-table/src/conf.ts +4 -1
  112. package/packages/v-x-e-table/src/menus.ts +52 -2
  113. package/packages/v-x-e-table/src/store.ts +3 -1
  114. package/packages/v-x-e-table/src/validators.ts +9 -0
  115. package/packages/validator/src/hook.ts +117 -36
  116. package/styles/cssvar.scss +1 -2
  117. package/styles/table.scss +27 -6
  118. package/styles/tooltip.scss +0 -8
  119. package/styles/variable.scss +1 -2
  120. package/types/form.d.ts +9 -12
  121. package/types/table.d.ts +20 -1
  122. package/types/v-x-e-table/index.d.ts +8 -1
  123. package/types/v-x-e-table/menus.d.ts +19 -7
  124. package/types/v-x-e-table/validators.d.ts +30 -0
  125. package/types/validator.d.ts +14 -1
  126. /package/es/icon/style/{iconfont.1689813279210.ttf → iconfont.1690032028705.ttf} +0 -0
  127. /package/es/icon/style/{iconfont.1689813279210.woff → iconfont.1690032028705.woff} +0 -0
  128. /package/es/icon/style/{iconfont.1689813279210.woff2 → iconfont.1690032028705.woff2} +0 -0
  129. /package/es/{iconfont.1689813279210.ttf → iconfont.1690032028705.ttf} +0 -0
  130. /package/es/{iconfont.1689813279210.woff → iconfont.1690032028705.woff} +0 -0
  131. /package/es/{iconfont.1689813279210.woff2 → iconfont.1690032028705.woff2} +0 -0
  132. /package/lib/icon/style/{iconfont.1689813279210.ttf → iconfont.1690032028705.ttf} +0 -0
  133. /package/lib/icon/style/{iconfont.1689813279210.woff → iconfont.1690032028705.woff} +0 -0
  134. /package/lib/icon/style/{iconfont.1689813279210.woff2 → iconfont.1690032028705.woff2} +0 -0
  135. /package/lib/{iconfont.1689813279210.ttf → iconfont.1690032028705.ttf} +0 -0
  136. /package/lib/{iconfont.1689813279210.woff → iconfont.1690032028705.woff} +0 -0
  137. /package/lib/{iconfont.1689813279210.woff2 → iconfont.1690032028705.woff2} +0 -0
@@ -1,8 +1,10 @@
1
1
  import { nextTick } from 'vue'
2
2
  import GlobalConfig from '../../v-x-e-table/src/conf'
3
3
  import XEUtils from 'xe-utils'
4
+ import { VXETable } from '../../v-x-e-table'
4
5
  import { getFuncText, eqEmptyValue } from '../../tools/utils'
5
6
  import { scrollToView } from '../../tools/dom'
7
+ import { errLog, warnLog } from '../../tools/log'
6
8
  import { handleFieldOrColumn, getRowid } from '../../table/src/util'
7
9
 
8
10
  import { VxeGlobalHooksHandles, TableValidatorMethods, TableValidatorPrivateMethods, VxeTableDefines } from '../../../types/all'
@@ -45,6 +47,7 @@ const tableValidatorMethodKeys: (keyof TableValidatorMethods)[] = ['fullValidate
45
47
  const validatorHook: VxeGlobalHooksHandles.HookOptions = {
46
48
  setupTable ($xetable) {
47
49
  const { props, reactData, internalData } = $xetable
50
+ const { refValidTooltip } = $xetable.getRefMaps()
48
51
  const { computeValidOpts, computeTreeOpts, computeEditOpts } = $xetable.getComputeMaps()
49
52
 
50
53
  let validatorMethods = {} as TableValidatorMethods
@@ -69,6 +72,30 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
69
72
  })
70
73
  }
71
74
 
75
+ const handleErrMsgMode = (validErrMaps: Record<string, {
76
+ row: any;
77
+ column: any;
78
+ rule: any;
79
+ content: any;
80
+ }>) => {
81
+ const validOpts = computeValidOpts.value
82
+ if (validOpts.msgMode === 'single') {
83
+ const keys = Object.keys(validErrMaps)
84
+ const resMaps: Record<string, {
85
+ row: any;
86
+ column: any;
87
+ rule: any;
88
+ content: any;
89
+ }> = validErrMaps
90
+ if (keys.length) {
91
+ const firstKey = keys[0]
92
+ resMaps[firstKey] = validErrMaps[firstKey]
93
+ }
94
+ return resMaps
95
+ }
96
+ return validErrMaps
97
+ }
98
+
72
99
  /**
73
100
  * 对表格数据进行校验
74
101
  * 如果不指定数据,则默认只校验临时变动的数据,例如新增或修改
@@ -105,14 +132,12 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
105
132
  internalData._lastCallTime = Date.now()
106
133
  validRuleErr = false // 如果为快速校验,当存在某列校验不通过时将终止执行
107
134
  validatorMethods.clearValidate()
108
- const validErrMaps: {
109
- [key: string]: {
110
- row: any;
111
- column: any;
112
- rule: any,
113
- content: any;
114
- }
115
- } = {}
135
+ const validErrMaps: Record<string, {
136
+ row: any;
137
+ column: any;
138
+ rule: any;
139
+ content: any;
140
+ }> = {}
116
141
  if (editRules) {
117
142
  const columns = $xetable.getColumns()
118
143
  const handleVaild = (row: any) => {
@@ -161,7 +186,7 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
161
186
  }
162
187
  return Promise.all(rowValids).then(() => {
163
188
  const ruleProps = Object.keys(validRest)
164
- reactData.validErrorMaps = validErrMaps
189
+ reactData.validErrorMaps = handleErrMsgMode(validErrMaps)
165
190
  return nextTick().then(() => {
166
191
  if (ruleProps.length) {
167
192
  return Promise.reject(validRest[ruleProps[0]][0])
@@ -200,7 +225,6 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
200
225
  const row = firstErrParams.row
201
226
  const rowIndex = afterFullData.indexOf(row)
202
227
  const locatRow = rowIndex > 0 ? afterFullData[rowIndex - 1] : row
203
- reactData.validErrorMaps = validErrMaps
204
228
  if (validOpts.autoPos === false) {
205
229
  finish()
206
230
  } else {
@@ -212,8 +236,9 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
212
236
  }
213
237
  })
214
238
  })
239
+ } else {
240
+ reactData.validErrorMaps = {}
215
241
  }
216
- // reactData.validErrorMaps = validErrMaps
217
242
  return nextTick().then(() => {
218
243
  if (cb) {
219
244
  cb()
@@ -235,18 +260,27 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
235
260
  return beginValidate(rows, cb)
236
261
  },
237
262
  clearValidate (rows, fieldOrColumn) {
263
+ const { validErrorMaps } = reactData
264
+ const validTip = refValidTooltip.value
265
+ const validOpts = computeValidOpts.value
238
266
  const rowList = XEUtils.isArray(rows) ? rows : (rows ? [rows] : [])
239
267
  const colList = (XEUtils.isArray(fieldOrColumn) ? fieldOrColumn : (fieldOrColumn ? [fieldOrColumn] : []).map(column => handleFieldOrColumn($xetable, column))) as VxeTableDefines.ColumnInfo<any>[]
240
- let validErrMaps: {
241
- [key: string]: {
242
- row: any;
243
- column: any;
244
- rule: any;
245
- content: any;
246
- }
247
- } = {}
268
+ let validErrMaps: Record<string, {
269
+ row: any;
270
+ column: any;
271
+ rule: any;
272
+ content: any;
273
+ }> = {}
274
+ if (validTip && validTip.reactData.visible) {
275
+ validTip.close()
276
+ }
277
+ // 如果是单个提示模式
278
+ if (validOpts.msgMode === 'single') {
279
+ reactData.validErrorMaps = {}
280
+ return nextTick()
281
+ }
248
282
  if (rowList.length && colList.length) {
249
- validErrMaps = Object.assign({}, reactData.validErrorMaps)
283
+ validErrMaps = Object.assign({}, validErrorMaps)
250
284
  rowList.forEach(row => {
251
285
  colList.forEach((column) => {
252
286
  const vaildKey = `${getRowid($xetable, row)}:${column.id}`
@@ -257,14 +291,14 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
257
291
  })
258
292
  } else if (rowList.length) {
259
293
  const rowidList = rowList.map(row => `${getRowid($xetable, row)}`)
260
- XEUtils.each(reactData.validErrorMaps, (item, key) => {
294
+ XEUtils.each(validErrorMaps, (item, key) => {
261
295
  if (rowidList.indexOf(key.split(':')[0]) > -1) {
262
296
  validErrMaps[key] = item
263
297
  }
264
298
  })
265
299
  } else if (colList.length) {
266
300
  const colidList = colList.map(column => `${column.id}`)
267
- XEUtils.each(reactData.validErrorMaps, (item, key) => {
301
+ XEUtils.each(validErrorMaps, (item, key) => {
268
302
  if (colidList.indexOf(key.split(':')[1]) > -1) {
269
303
  validErrMaps[key] = item
270
304
  }
@@ -323,10 +357,10 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
323
357
  if (rules) {
324
358
  const cellValue = XEUtils.isUndefined(val) ? XEUtils.get(row, field) : val
325
359
  rules.forEach((rule) => {
326
- const { type, trigger, required } = rule
360
+ const { type, trigger, required, validator } = rule
327
361
  if (validType === 'all' || !trigger || validType === trigger) {
328
- if (XEUtils.isFunction(rule.validator)) {
329
- const customValid = rule.validator({
362
+ if (validator) {
363
+ const validParams = {
330
364
  cellValue,
331
365
  rule,
332
366
  rules,
@@ -334,9 +368,29 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
334
368
  rowIndex: $xetable.getRowIndex(row),
335
369
  column,
336
370
  columnIndex: $xetable.getColumnIndex(column),
337
- field: column.property,
338
- $table: $xetable
339
- })
371
+ field: column.field,
372
+ $table: $xetable,
373
+ $grid: $xetable.xegrid
374
+ }
375
+ let customValid: any
376
+ if (XEUtils.isString(validator)) {
377
+ const gvItem = VXETable.validators.get(validator)
378
+ if (gvItem) {
379
+ if (gvItem.cellValidatorMethod) {
380
+ customValid = gvItem.cellValidatorMethod(validParams)
381
+ } else {
382
+ if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
383
+ warnLog('vxe.error.notValidators', [validator])
384
+ }
385
+ }
386
+ } else {
387
+ if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
388
+ errLog('vxe.error.notValidators', [validator])
389
+ }
390
+ }
391
+ } else {
392
+ customValid = validator(validParams)
393
+ }
340
394
  if (customValid) {
341
395
  if (XEUtils.isError(customValid)) {
342
396
  validRuleErr = true
@@ -395,6 +449,13 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
395
449
  const { editStore } = reactData
396
450
  const { actived } = editStore
397
451
  const editOpts = computeEditOpts.value
452
+ const validOpts = computeValidOpts.value
453
+ // 检查清除校验消息
454
+ if (editRules && validOpts.msgMode === 'single') {
455
+ reactData.validErrorMaps = {}
456
+ }
457
+
458
+ // 校验单元格
398
459
  if (editConfig && editRules && actived.row) {
399
460
  const { row, column, cell } = actived.args
400
461
  if (validatorPrivateMethods.hasCellRules(type, row, column)) {
@@ -419,17 +480,37 @@ const validatorHook: VxeGlobalHooksHandles.HookOptions = {
419
480
  * 弹出校验错误提示
420
481
  */
421
482
  showValidTooltip (params) {
422
- const { validStore } = reactData
483
+ const { height } = props
484
+ const { tableData, validStore, validErrorMaps } = reactData
485
+ const validOpts = computeValidOpts.value
486
+ const validTip = refValidTooltip.value
423
487
  validStore.visible = true
424
- reactData.validErrorMaps = Object.assign({}, reactData.validErrorMaps, {
425
- [`${getRowid($xetable, params.row)}:${params.column.id}`]: {
426
- column: params.column,
427
- row: params.row,
428
- rule: params.rule,
429
- content: params.rule.content
488
+ if (validOpts.msgMode === 'single') {
489
+ reactData.validErrorMaps = {
490
+ [`${getRowid($xetable, params.row)}:${params.column.id}`]: {
491
+ column: params.column,
492
+ row: params.row,
493
+ rule: params.rule,
494
+ content: params.rule.content
495
+ }
430
496
  }
431
- })
497
+ } else {
498
+ reactData.validErrorMaps = Object.assign({}, validErrorMaps, {
499
+ [`${getRowid($xetable, params.row)}:${params.column.id}`]: {
500
+ column: params.column,
501
+ row: params.row,
502
+ rule: params.rule,
503
+ content: params.rule.content
504
+ }
505
+ })
506
+ }
432
507
  $xetable.dispatchEvent('valid-error', params, null)
508
+ if (validTip) {
509
+ const { cell } = params
510
+ if (validTip && (validOpts.message === 'tooltip' || (validOpts.message === 'default' && !height && tableData.length < 2))) {
511
+ return validTip.open(cell, params.rule.content)
512
+ }
513
+ }
433
514
  return nextTick()
434
515
  }
435
516
  }
@@ -135,6 +135,7 @@
135
135
 
136
136
  /*validate*/
137
137
  --vxe-table-validate-error-color: #{$vxe-table-validate-error-color};
138
+ --vxe-table-validate-error-background-color: #{$vxe-table-validate-error-background-color};
138
139
 
139
140
  /*grid*/
140
141
  --vxe-grid-maximize-background-color: #{$vxe-grid-maximize-background-color};
@@ -148,8 +149,6 @@
148
149
  --vxe-tooltip-dark-color: #{$vxe-tooltip-dark-color};
149
150
  --vxe-tooltip-dark-background-color: #{$vxe-tooltip-dark-background-color};
150
151
  --vxe-tooltip-light-background-color: #{$vxe-tooltip-light-background-color};
151
- --vxe-tooltip-validate-error-color: #{$vxe-tooltip-validate-error-color};
152
- --vxe-tooltip-validate-error-background-color: #{$vxe-tooltip-validate-error-background-color};
153
152
 
154
153
  /*pager*/
155
154
  --vxe-pager-background-color: #{$vxe-pager-background-color};
package/styles/table.scss CHANGED
@@ -1190,6 +1190,7 @@
1190
1190
  display: inline-block;
1191
1191
  border-radius: var(--vxe-border-radius);
1192
1192
  color: var(--vxe-table-validate-error-color);
1193
+ background-color: var(--vxe-table-validate-error-background-color);
1193
1194
  pointer-events: auto;
1194
1195
  }
1195
1196
  }
@@ -1206,10 +1207,21 @@
1206
1207
 
1207
1208
  }
1208
1209
  }
1209
- .vxe-body--row {
1210
- &:last-child {
1211
- .vxe-cell--valid {
1212
- top: calc(100% - 1.3em);
1210
+ &.vaild-msg--single {
1211
+ .vxe-body--row {
1212
+ &:last-child {
1213
+ .vxe-cell--valid {
1214
+ bottom: calc(100%);
1215
+ }
1216
+ }
1217
+ }
1218
+ }
1219
+ &.vaild-msg--full {
1220
+ .vxe-body--row {
1221
+ &:last-child {
1222
+ .vxe-cell--valid {
1223
+ top: calc(100% - 1.3em);
1224
+ }
1213
1225
  }
1214
1226
  }
1215
1227
  }
@@ -1221,8 +1233,8 @@
1221
1233
  position: relative;
1222
1234
  &:before {
1223
1235
  content: "";
1224
- top: var(--vxe-table-cell-dirty-width);
1225
- left: var(--vxe-table-cell-dirty-width);
1236
+ top: calc(var(--vxe-table-cell-dirty-width) * -1);
1237
+ left: calc(var(--vxe-table-cell-dirty-width) * -1);
1226
1238
  position: absolute;
1227
1239
  border-width: var(--vxe-table-cell-dirty-width);
1228
1240
  border-style: solid;
@@ -1291,6 +1303,15 @@
1291
1303
  }
1292
1304
  }
1293
1305
 
1306
+ /*valid error*/
1307
+ div.vxe-table--tooltip-wrapper {
1308
+ &.vxe-table--valid-error {
1309
+ padding: 0;
1310
+ color: var(--vxe-table-validate-error-color);
1311
+ background-color: var(--vxe-table-validate-error-background-color);
1312
+ }
1313
+ }
1314
+
1294
1315
  /*footer*/
1295
1316
  .vxe-table--footer-wrapper {
1296
1317
  color: var(--vxe-table-footer-font-color);
@@ -125,11 +125,3 @@
125
125
  }
126
126
  }
127
127
  }
128
-
129
- /*valid error*/
130
- .vxe-table--tooltip-wrapper {
131
- &.vxe-table--valid-error {
132
- background-color: var(--vxe-tooltip-validate-error-background-color);
133
- color: var(--vxe-tooltip-validate-error-color);
134
- }
135
- }
@@ -132,6 +132,7 @@ $vxe-loading-z-index: 999 !default;
132
132
 
133
133
  /*validate*/
134
134
  $vxe-table-validate-error-color: #f56c6c !default;
135
+ $vxe-table-validate-error-background-color: $vxe-table-body-background-color !default;
135
136
 
136
137
  /*grid*/
137
138
  $vxe-grid-maximize-background-color: #fff !default;
@@ -145,8 +146,6 @@ $vxe-toolbar-panel-background-color: #fff !default;
145
146
  $vxe-tooltip-dark-color: #fff !default;
146
147
  $vxe-tooltip-dark-background-color: #303133 !default;
147
148
  $vxe-tooltip-light-background-color: #fff !default;
148
- $vxe-tooltip-validate-error-color: #fff !default;
149
- $vxe-tooltip-validate-error-background-color: #f56c6c !default;
150
149
 
151
150
  /*pager*/
152
151
  $vxe-pager-background-color: #fff !default;
package/types/form.d.ts CHANGED
@@ -262,18 +262,7 @@ export namespace VxeFormDefines {
262
262
  * 使用自定义校验函数,接收一个 Promise
263
263
  * @param params 参数
264
264
  */
265
- validator?(params: {
266
- $form: VxeFormConstructor,
267
- itemValue: any,
268
- rule: VxeFormDefines.FormRule
269
- rules: VxeFormDefines.FormRule[]
270
- data: any
271
- field: string,
272
- /**
273
- * @deprecated
274
- */
275
- property: string
276
- }): void | Error | Promise<any>
265
+ validator?: string | ((params: RuleValidatorParams) => void | Error | Promise<any>)
277
266
  /**
278
267
  * 提示消息
279
268
  */
@@ -286,6 +275,14 @@ export namespace VxeFormDefines {
286
275
  message?: string
287
276
  }
288
277
 
278
+ export interface RuleValidatorParams {
279
+ $form: VxeFormConstructor
280
+ itemValue: any
281
+ rule: VxeFormDefines.FormRule
282
+ rules: VxeFormDefines.FormRule[]
283
+ data: any
284
+ field: string
285
+ }
289
286
  export interface ValidateErrorParams {
290
287
  $form: VxeFormConstructor,
291
288
  rule: VxeFormDefines.FormRule
package/types/table.d.ts CHANGED
@@ -40,6 +40,7 @@ export interface VxeTableConstructor<D = any> extends VxeComponentBase, VxeTable
40
40
  export interface TablePrivateRef {
41
41
  refElem: Ref<HTMLDivElement>
42
42
  refTooltip: Ref<VxeTooltipInstance>
43
+ refValidTooltip: Ref<VxeTooltipInstance>
43
44
  refTableFilter: Ref<ComponentPublicInstance>
44
45
  refTableMenu: Ref<VxeMenuPanelInstance>
45
46
  refTableHeader: Ref<ComponentPublicInstance>
@@ -2013,14 +2014,32 @@ export namespace VxeTablePropTypes {
2013
2014
  * 校验配置项
2014
2015
  */
2015
2016
  export interface ValidConfig {
2017
+ /**
2018
+ * 是否自动定位到校验不通过的单元格
2019
+ */
2016
2020
  autoPos?: boolean
2021
+ /**
2022
+ * 是否显示错误显示
2023
+ */
2017
2024
  showMessage?: boolean
2025
+ /**
2026
+ * 校验消息提示方式
2027
+ */
2028
+ msgMode?: 'single' | 'full' | null | ''
2029
+ /**
2030
+ * 当点击表格之外或者其他列之后,是否自动清除单元格的校验消息
2031
+ */
2032
+ autoClear?: boolean
2033
+ /**
2034
+ * 校验提示框的最大宽度
2035
+ */
2036
+ maxWidth?: number
2037
+
2018
2038
  /**
2019
2039
  * 不建议使用,后续废弃
2020
2040
  * @deprecated
2021
2041
  */
2022
2042
  message?: string
2023
- maxWidth?: number
2024
2043
  }
2025
2044
  export interface ValidOpts extends ValidConfig { }
2026
2045
 
@@ -6,6 +6,7 @@ import { VxeGlobalInterceptor } from './interceptor'
6
6
  import { VxeGlobalCommands } from './commands'
7
7
  import { VxeGlobalFormats } from './formats'
8
8
  import { VxeGlobalMenus } from './menus'
9
+ import { VxeGlobalValidators } from './validators'
9
10
  import { VxeGlobalHooks } from './hooks'
10
11
  import { VxeGlobalSetup } from './setup'
11
12
 
@@ -39,6 +40,7 @@ export const renderer: VxeGlobalRenderer
39
40
  export const commands: VxeGlobalCommands
40
41
  export const formats: VxeGlobalFormats
41
42
  export const menus: VxeGlobalMenus
43
+ export const validators: VxeGlobalValidators
42
44
  export const hooks: VxeGlobalHooks
43
45
  export const modal: ModalController
44
46
  export const saveFile: SaveFileFunction
@@ -93,6 +95,10 @@ export interface VXETableCore {
93
95
  * Table context menu
94
96
  */
95
97
  menus: VxeGlobalMenus
98
+ /**
99
+ * Validators table/form
100
+ */
101
+ validators: VxeGlobalValidators
96
102
  /**
97
103
  * Table VxeGlobalHooks API
98
104
  */
@@ -131,7 +137,7 @@ export interface VXETableCore {
131
137
  }
132
138
 
133
139
  /**
134
- * 一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、弹窗、自定义模板、渲染器、贼灵活的配置项等...
140
+ * 一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式为零代码而设计...
135
141
  */
136
142
  export const VXETable: VXETableCore
137
143
 
@@ -140,6 +146,7 @@ export * from './interceptor'
140
146
  export * from './commands'
141
147
  export * from './formats'
142
148
  export * from './menus'
149
+ export * from './validators'
143
150
  export * from './hooks'
144
151
  export * from './setup'
145
152
 
@@ -5,18 +5,30 @@ import { VxeGlobalRendererHandles } from './renderer'
5
5
  /* eslint-disable no-use-before-define */
6
6
 
7
7
  export namespace VxeGlobalMenusHandles {
8
- export type MenusCallback<D = VxeTableDataRow> = (params: MenusCallbackParams<D>, event: Event) => any
9
-
8
+ export type MenusOption<D = VxeTableDataRow> = {
9
+ menuMethod?: (params: MenuMethodParams<D>, event: Event) => any
10
+ }
10
11
  interface MenusParams<D = VxeTableDataRow> {
11
12
  $grid: VxeGridConstructor<D> | null
12
13
  $table: VxeTableConstructor<D> & VxeTablePrivateMethods<D>
13
14
  }
14
- export interface MenusCallbackParams<D = VxeTableDataRow> extends MenusParams<D>, VxeGlobalRendererHandles.RenderCellParams<D> {
15
+ export interface MenuMethodParams<D = VxeTableDataRow> extends MenusParams<D>, VxeGlobalRendererHandles.RenderCellParams<D> {
15
16
  $grid: VxeGridConstructor<D> | null
16
17
  $table: VxeTableConstructor<D> & VxeTablePrivateMethods<D>
17
18
  $event: MouseEvent
18
19
  menu: VxeTableDefines.MenuFirstOption | VxeTableDefines.MenuChildOption
19
20
  }
21
+
22
+ /**
23
+ * 请使用 MenusOption
24
+ * @deprecated
25
+ */
26
+ export type MenusCallback = MenusOption
27
+ /**
28
+ * 请使用 MenuMethodParams
29
+ * @deprecated
30
+ */
31
+ export interface MenusCallbackParams<D = VxeTableDataRow> extends MenuMethodParams<D> {}
20
32
  }
21
33
 
22
34
  /**
@@ -24,11 +36,11 @@ export namespace VxeGlobalMenusHandles {
24
36
  */
25
37
  export interface VxeGlobalMenus {
26
38
  mixin(options: {
27
- [code: string]: VxeGlobalMenusHandles.MenusCallback<any>
39
+ [code: string]: VxeGlobalMenusHandles.MenusOption<any> | ((params: VxeGlobalMenusHandles.MenuMethodParams<any>, event: Event) => any)
28
40
  }): VxeGlobalMenus
29
41
  has(code: string): boolean
30
- get(code: string): VxeGlobalMenusHandles.MenusCallback<any>
31
- add(code: string, callback: VxeGlobalMenusHandles.MenusCallback<any>): VxeGlobalMenus
42
+ get(code: string): VxeGlobalMenusHandles.MenusOption<any>
43
+ add(code: string, options: VxeGlobalMenusHandles.MenusOption<any> | ((params: VxeGlobalMenusHandles.MenuMethodParams<any>, event: Event) => any)): VxeGlobalMenus
32
44
  delete(code: string): void
33
- forEach(callback: (options: VxeGlobalMenusHandles.MenusCallback<any>, code: string) => void): void
45
+ forEach(callback: (options: VxeGlobalMenusHandles.MenusOption<any>, code: string) => void): void
34
46
  }
@@ -0,0 +1,30 @@
1
+ import { VxeTableDefines, VxeTableDataRow } from '../table'
2
+ import { VxeFormDefines } from '../form'
3
+
4
+ /* eslint-disable no-use-before-define */
5
+
6
+ export namespace VxeGlobalValidatorsHandles {
7
+ export interface ValidatorsOptions<D = VxeTableDataRow> {
8
+ itemValidatorMethod?: ItemValidatorMethod
9
+ cellValidatorMethod?: CellValidatorMethod<D>
10
+ }
11
+
12
+ export type ItemValidatorMethod = (params: ItemValidatorParams, ...args: any[]) => void | Error | Promise<any>
13
+ export type CellValidatorMethod<D = VxeTableDataRow> = (params: CellValidatorParams<D>, ...args: any[]) => void | Error | Promise<any>
14
+ export interface ItemValidatorParams extends VxeFormDefines.RuleValidatorParams {}
15
+ export interface CellValidatorParams<D = VxeTableDataRow> extends VxeTableDefines.RuleValidatorParams<D> {}
16
+ }
17
+
18
+ /**
19
+ * 全局快捷菜单
20
+ */
21
+ export interface VxeGlobalValidators {
22
+ mixin(options: {
23
+ [code: string]: VxeGlobalValidatorsHandles.ValidatorsOptions<any>
24
+ }): VxeGlobalValidators
25
+ has(code: string): boolean
26
+ get(code: string): VxeGlobalValidatorsHandles.ValidatorsOptions<any>
27
+ add(code: string, callback: VxeGlobalValidatorsHandles.ValidatorsOptions<any>): VxeGlobalValidators
28
+ delete(code: string): void
29
+ forEach(callback: (options: VxeGlobalValidatorsHandles.ValidatorsOptions<any>, code: string) => void): void
30
+ }
@@ -1,5 +1,6 @@
1
1
  import { VXEComponent } from './component'
2
2
  import { VxeTableDefines, VxeTableDataRow, VxeTableConstructor } from './table'
3
+ import { VxeGridConstructor } from './grid'
3
4
  import { VxeColumnPropTypes } from './column'
4
5
 
5
6
  /* eslint-disable no-use-before-define */
@@ -71,7 +72,7 @@ declare module './table' {
71
72
  * 使用自定义校验函数,接收一个 Promise
72
73
  * @param params 参数
73
74
  */
74
- validator?(params: VxeTableDefines.ValidatorErrorParams<D>): void | Error | Promise<void>
75
+ validator?: string | ((params: RuleValidatorParams<D>) => void | Error | Promise<void>)
75
76
  /**
76
77
  * 提示消息
77
78
  */
@@ -83,6 +84,18 @@ declare module './table' {
83
84
  */
84
85
  message?: string
85
86
  }
87
+ export interface RuleValidatorParams<D = VxeTableDataRow> {
88
+ $table: VxeTableConstructor<D>
89
+ $grid: VxeGridConstructor<D> | null
90
+ cellValue: any
91
+ rule: ValidatorRule<D>
92
+ rules: ValidatorRule<D>[]
93
+ column: VxeTableDefines.ColumnInfo<D>
94
+ columnIndex: number
95
+ row: D
96
+ rowIndex: number
97
+ field: string
98
+ }
86
99
  export interface ValidatorErrorParams<D = VxeTableDataRow> {
87
100
  $table: VxeTableConstructor<D>
88
101
  cellValue: any