vxe-table 3.19.39 → 3.20.0-beta.1

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 (109) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.esm.js +2 -1
  3. package/es/index.min.css +1 -1
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/table/module/custom/mixin.js +6 -4
  7. package/es/table/module/custom/panel.js +806 -799
  8. package/es/table/module/edit/mixin.js +43 -31
  9. package/es/table/module/export/export-panel.js +511 -458
  10. package/es/table/module/export/import-panel.js +224 -192
  11. package/es/table/module/keyboard/mixin.js +2 -2
  12. package/es/table/module/menu/panel.js +165 -161
  13. package/es/table/module/validator/mixin.js +255 -236
  14. package/es/table/src/body.js +2 -1
  15. package/es/table/src/cell.js +2 -2
  16. package/es/table/src/methods.js +33 -43
  17. package/es/table/src/table.js +13 -249
  18. package/es/table/src/util.js +242 -0
  19. package/es/table/style.css +23 -50
  20. package/es/table/style.min.css +1 -1
  21. package/es/ui/index.js +2 -2
  22. package/es/ui/src/dom.js +22 -0
  23. package/es/ui/src/log.js +1 -1
  24. package/es/vxe-table/style.css +23 -50
  25. package/es/vxe-table/style.min.css +1 -1
  26. package/lib/index.common.js +2 -1
  27. package/lib/index.css +1 -1
  28. package/lib/index.min.css +1 -1
  29. package/lib/index.umd.js +3640 -4790
  30. package/lib/index.umd.min.js +1 -1
  31. package/lib/style.css +1 -1
  32. package/lib/style.min.css +1 -1
  33. package/lib/table/module/custom/mixin.js +6 -4
  34. package/lib/table/module/custom/mixin.min.js +1 -1
  35. package/lib/table/module/custom/panel.js +693 -685
  36. package/lib/table/module/custom/panel.min.js +1 -1
  37. package/lib/table/module/edit/mixin.js +47 -31
  38. package/lib/table/module/edit/mixin.min.js +1 -1
  39. package/lib/table/module/export/export-panel.js +450 -384
  40. package/lib/table/module/export/export-panel.min.js +1 -1
  41. package/lib/table/module/export/import-panel.js +200 -159
  42. package/lib/table/module/export/import-panel.min.js +1 -1
  43. package/lib/table/module/keyboard/mixin.js +2 -2
  44. package/lib/table/module/keyboard/mixin.min.js +1 -1
  45. package/lib/table/module/menu/panel.js +119 -114
  46. package/lib/table/module/menu/panel.min.js +1 -1
  47. package/lib/table/module/validator/mixin.js +271 -259
  48. package/lib/table/module/validator/mixin.min.js +1 -1
  49. package/lib/table/src/body.js +2 -1
  50. package/lib/table/src/body.min.js +1 -1
  51. package/lib/table/src/cell.js +2 -2
  52. package/lib/table/src/cell.min.js +1 -1
  53. package/lib/table/src/methods.js +33 -45
  54. package/lib/table/src/methods.min.js +1 -1
  55. package/lib/table/src/table.js +12 -248
  56. package/lib/table/src/table.min.js +1 -1
  57. package/lib/table/src/util.js +243 -0
  58. package/lib/table/src/util.min.js +1 -1
  59. package/lib/table/style/style.css +23 -50
  60. package/lib/table/style/style.min.css +1 -1
  61. package/lib/ui/index.js +2 -2
  62. package/lib/ui/index.min.js +1 -1
  63. package/lib/ui/src/dom.js +22 -0
  64. package/lib/ui/src/dom.min.js +1 -1
  65. package/lib/ui/src/log.js +1 -1
  66. package/lib/ui/src/log.min.js +1 -1
  67. package/lib/v-x-e-table/index.js +2 -1
  68. package/lib/v-x-e-table/index.min.js +1 -1
  69. package/lib/vxe-colgroup/index.js +2 -1
  70. package/lib/vxe-colgroup/index.min.js +1 -1
  71. package/lib/vxe-column/index.js +2 -1
  72. package/lib/vxe-column/index.min.js +1 -1
  73. package/lib/vxe-grid/index.js +2 -1
  74. package/lib/vxe-grid/index.min.js +1 -1
  75. package/lib/vxe-table/index.js +2 -1
  76. package/lib/vxe-table/index.min.js +1 -1
  77. package/lib/vxe-table/style/style.css +23 -50
  78. package/lib/vxe-table/style/style.min.css +1 -1
  79. package/lib/vxe-toolbar/index.js +2 -1
  80. package/lib/vxe-toolbar/index.min.js +1 -1
  81. package/lib/vxe-ui/index.js +2 -1
  82. package/lib/vxe-ui/index.min.js +1 -1
  83. package/lib/vxe-v-x-e-table/index.js +2 -1
  84. package/lib/vxe-v-x-e-table/index.min.js +1 -1
  85. package/package.json +1 -1
  86. package/packages/table/module/custom/mixin.ts +7 -4
  87. package/packages/table/module/custom/panel.ts +846 -839
  88. package/packages/table/module/edit/mixin.ts +55 -35
  89. package/packages/table/module/export/export-panel.ts +545 -469
  90. package/packages/table/module/export/import-panel.ts +245 -202
  91. package/packages/table/module/filter/panel.ts +4 -18
  92. package/packages/table/module/keyboard/mixin.ts +2 -2
  93. package/packages/table/module/menu/panel.ts +171 -163
  94. package/packages/table/module/validator/mixin.ts +279 -240
  95. package/packages/table/src/body.ts +2 -1
  96. package/packages/table/src/cell.ts +2 -2
  97. package/packages/table/src/methods.ts +43 -45
  98. package/packages/table/src/table.ts +14 -260
  99. package/packages/table/src/util.ts +254 -0
  100. package/packages/ui/index.ts +1 -1
  101. package/packages/ui/src/dom.ts +22 -0
  102. package/styles/components/table.scss +5 -2
  103. package/styles/theme/base.scss +2 -1
  104. /package/es/{iconfont.1767145426781.ttf → iconfont.1767492234857.ttf} +0 -0
  105. /package/es/{iconfont.1767145426781.woff → iconfont.1767492234857.woff} +0 -0
  106. /package/es/{iconfont.1767145426781.woff2 → iconfont.1767492234857.woff2} +0 -0
  107. /package/lib/{iconfont.1767145426781.ttf → iconfont.1767492234857.ttf} +0 -0
  108. /package/lib/{iconfont.1767145426781.woff → iconfont.1767492234857.woff} +0 -0
  109. /package/lib/{iconfont.1767145426781.woff2 → iconfont.1767492234857.woff2} +0 -0
@@ -137,240 +137,243 @@ function checkRuleStatus(rule, val) {
137
137
  }
138
138
  return true;
139
139
  }
140
+ /**
141
+ * 聚焦到校验通过的单元格并弹出校验错误提示
142
+ */
143
+ function handleValidError($xeTable, params) {
144
+ return new Promise(resolve => {
145
+ const validOpts = $xeTable.computeValidOpts;
146
+ if (validOpts.autoPos === false) {
147
+ $xeTable.dispatchEvent('valid-error', params, null);
148
+ resolve();
149
+ }
150
+ else {
151
+ $xeTable.handleEdit(params, { type: 'valid-error', trigger: 'call' }).then(() => {
152
+ setTimeout(() => {
153
+ resolve($xeTable.showValidTooltip(params));
154
+ }, 10);
155
+ });
156
+ }
157
+ });
158
+ }
159
+ function handleErrMsgMode($xeTable, validErrMaps) {
160
+ const validOpts = $xeTable.computeValidOpts;
161
+ if (validOpts.msgMode === 'single') {
162
+ const keys = Object.keys(validErrMaps);
163
+ const resMaps = {};
164
+ if (keys.length) {
165
+ const firstKey = keys[0];
166
+ resMaps[firstKey] = validErrMaps[firstKey];
167
+ }
168
+ return resMaps;
169
+ }
170
+ return validErrMaps;
171
+ }
172
+ /**
173
+ * 对表格数据进行校验
174
+ * 如果不指定数据,则默认只校验临时变动的数据,例如新增或修改
175
+ * 如果传 true 则校验当前表格数据
176
+ * 如果传 row 指定行记录,则只验证传入的行
177
+ * 如果传 rows 为多行记录,则只验证传入的行
178
+ * 如果只传 callback 否则默认验证整个表格数据
179
+ * 返回 Promise 对象,或者使用回调方式
180
+ */
181
+ function beginValidate($xeTable, rows, cols, cb, isFull) {
182
+ const props = $xeTable;
183
+ const reactData = $xeTable;
184
+ const internalData = $xeTable;
185
+ const validRest = {};
186
+ const { editRules, treeConfig } = props;
187
+ const { isRowGroupStatus } = reactData;
188
+ const { afterFullData, pendingRowMaps, removeRowMaps } = internalData;
189
+ const treeOpts = $xeTable.computeTreeOpts;
190
+ const aggregateOpts = $xeTable.computeAggregateOpts;
191
+ const validOpts = $xeTable.computeValidOpts;
192
+ let validList;
193
+ if (rows === true) {
194
+ validList = afterFullData;
195
+ }
196
+ else if (rows) {
197
+ if (XEUtils.isFunction(rows)) {
198
+ cb = rows;
199
+ }
200
+ else {
201
+ validList = XEUtils.isArray(rows) ? rows : [rows];
202
+ }
203
+ }
204
+ if (!validList) {
205
+ validList = $xeTable.getInsertRecords().concat($xeTable.getUpdateRecords());
206
+ }
207
+ const rowValidErrs = [];
208
+ internalData._lastCallTime = Date.now();
209
+ internalData.validRuleErr = false; // 如果为快速校验,当存在某列校验不通过时将终止执行
210
+ $xeTable.clearValidate();
211
+ const validErrMaps = {};
212
+ if (editRules) {
213
+ const columns = cols && cols.length ? cols : $xeTable.getColumns();
214
+ const handleVaild = (row) => {
215
+ const rowid = getRowid($xeTable, row);
216
+ // 是否删除
217
+ if (removeRowMaps[rowid]) {
218
+ return;
219
+ }
220
+ // 是否标记删除
221
+ if (pendingRowMaps[rowid]) {
222
+ return;
223
+ }
224
+ if ($xeTable.isAggregateRecord(row)) {
225
+ return;
226
+ }
227
+ if (isFull || !internalData.validRuleErr) {
228
+ const colVailds = [];
229
+ columns.forEach((column) => {
230
+ const field = XEUtils.isString(column) ? column : column.field;
231
+ if ((isFull || !internalData.validRuleErr) && XEUtils.has(editRules, field)) {
232
+ colVailds.push($xeTable.validCellRules('all', row, column)
233
+ .catch(({ rule, rules }) => {
234
+ const rest = {
235
+ rule,
236
+ rules,
237
+ rowIndex: $xeTable.getRowIndex(row),
238
+ row,
239
+ columnIndex: $xeTable.getColumnIndex(column),
240
+ column,
241
+ field,
242
+ $table: $xeTable
243
+ };
244
+ if (!validRest[field]) {
245
+ validRest[field] = [];
246
+ }
247
+ validErrMaps[`${getRowid($xeTable, row)}:${column.id}`] = {
248
+ column,
249
+ row,
250
+ rule,
251
+ content: rule.content
252
+ };
253
+ validRest[field].push(rest);
254
+ if (!isFull) {
255
+ internalData.validRuleErr = true;
256
+ return Promise.reject(rest);
257
+ }
258
+ }));
259
+ }
260
+ });
261
+ rowValidErrs.push(Promise.all(colVailds));
262
+ }
263
+ };
264
+ if (isRowGroupStatus) {
265
+ XEUtils.eachTree(validList, handleVaild, { children: aggregateOpts.mapChildrenField });
266
+ }
267
+ else if (treeConfig) {
268
+ const childrenField = treeOpts.children || treeOpts.childrenField;
269
+ XEUtils.eachTree(validList, handleVaild, { children: childrenField });
270
+ }
271
+ else {
272
+ validList.forEach(handleVaild);
273
+ }
274
+ return Promise.all(rowValidErrs).then(() => {
275
+ const ruleProps = Object.keys(validRest);
276
+ reactData.validErrorMaps = handleErrMsgMode($xeTable, validErrMaps);
277
+ return $xeTable.$nextTick().then(() => {
278
+ if (ruleProps.length) {
279
+ return Promise.reject(validRest[ruleProps[0]][0]);
280
+ }
281
+ if (cb) {
282
+ cb();
283
+ }
284
+ });
285
+ }).catch(firstErrParams => {
286
+ return new Promise((resolve, reject) => {
287
+ const finish = () => {
288
+ $xeTable.$nextTick(() => {
289
+ if (cb) {
290
+ cb(validRest);
291
+ resolve();
292
+ }
293
+ else {
294
+ if (getConfig().validToReject === 'obsolete') {
295
+ // 已废弃,校验失败将不会执行catch
296
+ reject(validRest);
297
+ }
298
+ else {
299
+ resolve(validRest);
300
+ }
301
+ }
302
+ });
303
+ };
304
+ const posAndFinish = () => {
305
+ firstErrParams.cell = $xeTable.getCellElement(firstErrParams.row, firstErrParams.column);
306
+ scrollToView(firstErrParams.cell);
307
+ handleValidError($xeTable, firstErrParams).then(finish);
308
+ };
309
+ /**
310
+ * 当校验不通过时
311
+ * 将表格滚动到可视区
312
+ * 由于提示信息至少需要占一行,定位向上偏移一行
313
+ */
314
+ if (validOpts.autoPos === false) {
315
+ finish();
316
+ }
317
+ else {
318
+ const row = firstErrParams.row;
319
+ const column = firstErrParams.column;
320
+ $xeTable.scrollToRow(row, column).then(posAndFinish);
321
+ }
322
+ });
323
+ });
324
+ }
325
+ else {
326
+ reactData.validErrorMaps = {};
327
+ }
328
+ return $xeTable.$nextTick().then(() => {
329
+ if (cb) {
330
+ cb();
331
+ }
332
+ });
333
+ }
140
334
  export default {
141
335
  methods: {
142
336
  /**
143
337
  * 完整校验,和 validate 的区别就是会给有效数据中的每一行进行校验
144
338
  */
145
339
  _fullValidate(rows, cb) {
340
+ const $xeTable = this;
146
341
  if (XEUtils.isFunction(cb)) {
147
342
  warnLog('vxe.error.notValidators', ['fullValidate(rows, callback)', 'fullValidate(rows)']);
148
343
  }
149
- return this.beginValidate(rows, null, cb, true);
344
+ return beginValidate($xeTable, rows, null, cb, true);
150
345
  },
151
346
  /**
152
347
  * 快速校验,如果存在记录不通过的记录,则返回不再继续校验(异步校验除外)
153
348
  */
154
349
  _validate(rows, cb) {
350
+ const $xeTable = this;
155
351
  if (XEUtils.isFunction(cb)) {
156
352
  warnLog('vxe.error.notValidators', ['validate(rows, callback)', 'validate(rows)']);
157
353
  }
158
- return this.beginValidate(rows, null, cb);
354
+ return beginValidate($xeTable, rows, null, cb);
159
355
  },
160
356
  /**
161
357
  * 完整校验单元格,和 validateField 的区别就是会给有效数据中的每一行进行校验
162
358
  */
163
359
  _fullValidateField(rows, fieldOrColumn) {
360
+ const $xeTable = this;
164
361
  const colList = (XEUtils.isArray(fieldOrColumn) ? fieldOrColumn : (fieldOrColumn ? [fieldOrColumn] : [])).map(column => handleFieldOrColumn(this, column));
165
362
  if (colList.length) {
166
- return this.beginValidate(rows, colList, null, true);
363
+ return beginValidate($xeTable, rows, colList, null, true);
167
364
  }
168
- return this.$nextTick();
365
+ return $xeTable.$nextTick();
169
366
  },
170
367
  /**
171
368
  * 快速校验单元格,如果存在记录不通过的记录,则返回不再继续校验(异步校验除外)
172
369
  */
173
370
  _validateField(rows, fieldOrColumn) {
371
+ const $xeTable = this;
174
372
  const colList = (XEUtils.isArray(fieldOrColumn) ? fieldOrColumn : (fieldOrColumn ? [fieldOrColumn] : [])).map(column => handleFieldOrColumn(this, column));
175
373
  if (colList.length) {
176
- return this.beginValidate(rows, colList, null);
177
- }
178
- return this.$nextTick();
179
- },
180
- /**
181
- * 聚焦到校验通过的单元格并弹出校验错误提示
182
- */
183
- handleValidError(params) {
184
- const $xeTable = this;
185
- const { validOpts } = this;
186
- return new Promise(resolve => {
187
- if (validOpts.autoPos === false) {
188
- $xeTable.dispatchEvent('valid-error', params, null);
189
- resolve();
190
- }
191
- else {
192
- this.handleEdit(params, { type: 'valid-error', trigger: 'call' }).then(() => {
193
- setTimeout(() => {
194
- resolve(this.showValidTooltip(params));
195
- }, 10);
196
- });
197
- }
198
- });
199
- },
200
- handleErrMsgMode(validErrMaps) {
201
- const { validOpts } = this;
202
- if (validOpts.msgMode === 'single') {
203
- const keys = Object.keys(validErrMaps);
204
- const resMaps = {};
205
- if (keys.length) {
206
- const firstKey = keys[0];
207
- resMaps[firstKey] = validErrMaps[firstKey];
208
- }
209
- return resMaps;
374
+ return beginValidate($xeTable, rows, colList, null);
210
375
  }
211
- return validErrMaps;
212
- },
213
- /**
214
- * 对表格数据进行校验
215
- * 如果不指定数据,则默认只校验临时变动的数据,例如新增或修改
216
- * 如果传 true 则校验当前表格数据
217
- * 如果传 row 指定行记录,则只验证传入的行
218
- * 如果传 rows 为多行记录,则只验证传入的行
219
- * 如果只传 callback 否则默认验证整个表格数据
220
- * 返回 Promise 对象,或者使用回调方式
221
- */
222
- beginValidate(rows, cols, cb, isFull) {
223
- const $xeTable = this;
224
- const props = $xeTable;
225
- const reactData = $xeTable;
226
- const internalData = $xeTable;
227
- const validRest = {};
228
- const { editRules, treeConfig } = props;
229
- const { isRowGroupStatus } = reactData;
230
- const { afterFullData, pendingRowMaps, removeRowMaps } = internalData;
231
- const treeOpts = $xeTable.computeTreeOpts;
232
- const aggregateOpts = $xeTable.computeAggregateOpts;
233
- let validList;
234
- if (rows === true) {
235
- validList = afterFullData;
236
- }
237
- else if (rows) {
238
- if (XEUtils.isFunction(rows)) {
239
- cb = rows;
240
- }
241
- else {
242
- validList = XEUtils.isArray(rows) ? rows : [rows];
243
- }
244
- }
245
- if (!validList) {
246
- validList = this.getInsertRecords().concat(this.getUpdateRecords());
247
- }
248
- const rowValidErrs = [];
249
- this.lastCallTime = Date.now();
250
- this.validRuleErr = false; // 如果为快速校验,当存在某列校验不通过时将终止执行
251
- this.clearValidate();
252
- const validErrMaps = {};
253
- if (editRules) {
254
- const columns = cols && cols.length ? cols : this.getColumns();
255
- const handleVaild = (row) => {
256
- const rowid = getRowid($xeTable, row);
257
- // 是否删除
258
- if (removeRowMaps[rowid]) {
259
- return;
260
- }
261
- // 是否标记删除
262
- if (pendingRowMaps[rowid]) {
263
- return;
264
- }
265
- if ($xeTable.isAggregateRecord(row)) {
266
- return;
267
- }
268
- if (isFull || !this.validRuleErr) {
269
- const colVailds = [];
270
- columns.forEach((column) => {
271
- const field = XEUtils.isString(column) ? column : column.field;
272
- if ((isFull || !this.validRuleErr) && XEUtils.has(editRules, field)) {
273
- colVailds.push(this.validCellRules('all', row, column)
274
- .catch(({ rule, rules }) => {
275
- const rest = {
276
- rule,
277
- rules,
278
- rowIndex: this.getRowIndex(row),
279
- row,
280
- columnIndex: this.getColumnIndex(column),
281
- column,
282
- field,
283
- $table: this
284
- };
285
- if (!validRest[field]) {
286
- validRest[field] = [];
287
- }
288
- validErrMaps[`${getRowid(this, row)}:${column.id}`] = {
289
- column,
290
- row,
291
- rule,
292
- content: rule.content
293
- };
294
- validRest[field].push(rest);
295
- if (!isFull) {
296
- this.validRuleErr = true;
297
- return Promise.reject(rest);
298
- }
299
- }));
300
- }
301
- });
302
- rowValidErrs.push(Promise.all(colVailds));
303
- }
304
- };
305
- if (isRowGroupStatus) {
306
- XEUtils.eachTree(validList, handleVaild, { children: aggregateOpts.mapChildrenField });
307
- }
308
- else if (treeConfig) {
309
- const childrenField = treeOpts.children || treeOpts.childrenField;
310
- XEUtils.eachTree(validList, handleVaild, { children: childrenField });
311
- }
312
- else {
313
- validList.forEach(handleVaild);
314
- }
315
- return Promise.all(rowValidErrs).then(() => {
316
- const ruleProps = Object.keys(validRest);
317
- this.validErrorMaps = this.handleErrMsgMode(validErrMaps);
318
- return this.$nextTick().then(() => {
319
- if (ruleProps.length) {
320
- return Promise.reject(validRest[ruleProps[0]][0]);
321
- }
322
- if (cb) {
323
- cb();
324
- }
325
- });
326
- }).catch(firstErrParams => {
327
- return new Promise((resolve, reject) => {
328
- const finish = () => {
329
- this.$nextTick(() => {
330
- if (cb) {
331
- cb(validRest);
332
- resolve();
333
- }
334
- else {
335
- if (getConfig().validToReject === 'obsolete') {
336
- // 已废弃,校验失败将不会执行catch
337
- reject(validRest);
338
- }
339
- else {
340
- resolve(validRest);
341
- }
342
- }
343
- });
344
- };
345
- const posAndFinish = () => {
346
- firstErrParams.cell = this.getCellElement(firstErrParams.row, firstErrParams.column);
347
- scrollToView(firstErrParams.cell);
348
- this.handleValidError(firstErrParams).then(finish);
349
- };
350
- /**
351
- * 当校验不通过时
352
- * 将表格滚动到可视区
353
- * 由于提示信息至少需要占一行,定位向上偏移一行
354
- */
355
- if (this.validOpts.autoPos === false) {
356
- finish();
357
- }
358
- else {
359
- const row = firstErrParams.row;
360
- const column = firstErrParams.column;
361
- this.scrollToRow(row, column).then(posAndFinish);
362
- }
363
- });
364
- });
365
- }
366
- else {
367
- this.validErrorMaps = {};
368
- }
369
- return this.$nextTick().then(() => {
370
- if (cb) {
371
- cb();
372
- }
373
- });
376
+ return $xeTable.$nextTick();
374
377
  },
375
378
  hasCellRules(type, row, column) {
376
379
  const { editRules } = this;
@@ -396,14 +399,17 @@ export default {
396
399
  * trigger=blur|change 触发方式(除非特殊场景,否则默认为空就行)
397
400
  */
398
401
  validCellRules(validType, row, column, val) {
399
- const { editRules } = this;
400
- const { property } = column;
402
+ const $xeTable = this;
403
+ const props = $xeTable;
404
+ const internalData = $xeTable;
405
+ const { editRules } = props;
406
+ const { field } = column;
401
407
  const errorRules = [];
402
408
  const syncValidList = [];
403
- if (property && editRules) {
404
- const rules = XEUtils.get(editRules, property);
409
+ if (field && editRules) {
410
+ const rules = XEUtils.get(editRules, field);
405
411
  if (rules) {
406
- const cellValue = XEUtils.isUndefined(val) ? XEUtils.get(row, property) : val;
412
+ const cellValue = XEUtils.isUndefined(val) ? XEUtils.get(row, field) : val;
407
413
  rules.forEach((rule) => {
408
414
  const { trigger, validator } = rule;
409
415
  if (validType === 'all' || !trigger || validType === trigger) {
@@ -413,11 +419,11 @@ export default {
413
419
  rule,
414
420
  rules,
415
421
  row,
416
- rowIndex: this.getRowIndex(row),
422
+ rowIndex: $xeTable.getRowIndex(row),
417
423
  column,
418
- columnIndex: this.getColumnIndex(column),
419
- field: column.property,
420
- $table: this
424
+ columnIndex: $xeTable.getColumnIndex(column),
425
+ field: column.field,
426
+ $table: $xeTable
421
427
  };
422
428
  let customValid;
423
429
  if (XEUtils.isString(validator)) {
@@ -440,13 +446,13 @@ export default {
440
446
  }
441
447
  if (customValid) {
442
448
  if (XEUtils.isError(customValid)) {
443
- this.validRuleErr = true;
449
+ internalData.validRuleErr = true;
444
450
  errorRules.push(new Rule({ type: 'custom', trigger, content: customValid.message, rule: new Rule(rule) }));
445
451
  }
446
452
  else if (customValid.catch) {
447
453
  // 如果为异步校验(注:异步校验是并发无序的)
448
454
  syncValidList.push(customValid.catch((e) => {
449
- this.validRuleErr = true;
455
+ internalData.validRuleErr = true;
450
456
  errorRules.push(new Rule({ type: 'custom', trigger, content: e && e.message ? e.message : (rule.content || rule.message), rule: new Rule(rule) }));
451
457
  }));
452
458
  }
@@ -454,7 +460,7 @@ export default {
454
460
  }
455
461
  else {
456
462
  if (!checkRuleStatus(rule, cellValue)) {
457
- this.validRuleErr = true;
463
+ internalData.validRuleErr = true;
458
464
  errorRules.push(new Rule(rule));
459
465
  }
460
466
  }
@@ -470,24 +476,27 @@ export default {
470
476
  });
471
477
  },
472
478
  _clearValidate(rows, fieldOrColumn) {
473
- const { validOpts, validErrorMaps } = this;
474
- const validTip = this.$refs.refValidTooltip;
479
+ const $xeTable = this;
480
+ const reactData = $xeTable;
481
+ const { validErrorMaps } = reactData;
482
+ const validTip = $xeTable.$refs.refValidTooltip;
483
+ const validOpts = $xeTable.computeValidOpts;
475
484
  const rowList = XEUtils.isArray(rows) ? rows : (rows ? [rows] : []);
476
- const colList = (XEUtils.isArray(fieldOrColumn) ? fieldOrColumn : (fieldOrColumn ? [fieldOrColumn] : [])).map(column => handleFieldOrColumn(this, column));
485
+ const colList = (XEUtils.isArray(fieldOrColumn) ? fieldOrColumn : (fieldOrColumn ? [fieldOrColumn] : [])).map(column => handleFieldOrColumn($xeTable, column));
477
486
  let validErrMaps = {};
478
- if (validTip && validTip.visible) {
487
+ if (validTip && validTip.reactData.visible) {
479
488
  validTip.close();
480
489
  }
481
490
  // 如果是单个提示模式
482
491
  if (validOpts.msgMode === 'single') {
483
- this.validErrorMaps = {};
484
- return this.$nextTick();
492
+ reactData.validErrorMaps = {};
493
+ return $xeTable.$nextTick();
485
494
  }
486
495
  if (rowList.length && colList.length) {
487
496
  validErrMaps = Object.assign({}, validErrorMaps);
488
497
  rowList.forEach(row => {
489
498
  colList.forEach((column) => {
490
- const validKey = `${getRowid(this, row)}:${column.id}`;
499
+ const validKey = `${getRowid($xeTable, row)}:${column.id}`;
491
500
  if (validErrMaps[validKey]) {
492
501
  delete validErrMaps[validKey];
493
502
  }
@@ -495,7 +504,7 @@ export default {
495
504
  });
496
505
  }
497
506
  else if (rowList.length) {
498
- const rowIdList = rowList.map(row => `${getRowid(this, row)}`);
507
+ const rowIdList = rowList.map(row => `${getRowid($xeTable, row)}`);
499
508
  XEUtils.each(validErrorMaps, (item, key) => {
500
509
  if (rowIdList.indexOf(key.split(':')[0]) > -1) {
501
510
  validErrMaps[key] = item;
@@ -510,32 +519,38 @@ export default {
510
519
  }
511
520
  });
512
521
  }
513
- this.validErrorMaps = validErrMaps;
514
- return this.$nextTick();
522
+ reactData.validErrorMaps = validErrMaps;
523
+ return $xeTable.$nextTick();
515
524
  },
516
525
  /**
517
526
  * 触发校验
518
527
  */
519
528
  triggerValidate(type) {
520
- const { editConfig, editStore, editRules, editOpts, validOpts } = this;
529
+ const $xeTable = this;
530
+ const props = $xeTable;
531
+ const reactData = $xeTable;
532
+ const { editConfig, editRules } = props;
533
+ const { editStore } = reactData;
521
534
  const { actived } = editStore;
535
+ const editOpts = $xeTable.computeEditOpts;
536
+ const validOpts = $xeTable.computeValidOpts;
522
537
  // 检查清除校验消息
523
538
  if (editRules && validOpts.msgMode === 'single') {
524
- this.validErrorMaps = {};
539
+ reactData.validErrorMaps = {};
525
540
  }
526
541
  // 校验单元格
527
542
  if (editConfig && editRules && actived.row) {
528
543
  const { row, column, cell } = actived.args;
529
- if (this.hasCellRules(type, row, column)) {
530
- return this.validCellRules(type, row, column).then(() => {
544
+ if ($xeTable.hasCellRules(type, row, column)) {
545
+ return $xeTable.validCellRules(type, row, column).then(() => {
531
546
  if (editOpts.mode === 'row') {
532
- this.clearValidate(row, column);
547
+ $xeTable.clearValidate(row, column);
533
548
  }
534
549
  }).catch(({ rule }) => {
535
550
  // 如果校验不通过与触发方式一致,则聚焦提示错误,否则跳过并不作任何处理
536
551
  if (!rule.trigger || type === rule.trigger) {
537
552
  const rest = { rule, row, column, cell };
538
- this.showValidTooltip(rest);
553
+ $xeTable.showValidTooltip(rest);
539
554
  return Promise.reject(rest);
540
555
  }
541
556
  return Promise.resolve();
@@ -549,14 +564,18 @@ export default {
549
564
  */
550
565
  showValidTooltip(params) {
551
566
  const $xeTable = this;
552
- const { $refs, height, validStore, validErrorMaps, tableData, validOpts } = this;
567
+ const props = $xeTable;
568
+ const reactData = $xeTable;
569
+ const { height } = props;
570
+ const { tableData, validStore, validErrorMaps } = reactData;
553
571
  const { rule, row, column, cell } = params;
554
- const validTip = $refs.refValidTooltip;
572
+ const validOpts = $xeTable.computeValidOpts;
573
+ const validTip = $xeTable.$refs.refValidTooltip;
555
574
  const content = rule.content;
556
575
  validStore.visible = true;
557
576
  if (validOpts.msgMode === 'single') {
558
- this.validErrorMaps = {
559
- [`${getRowid(this, row)}:${column.id}`]: {
577
+ reactData.validErrorMaps = {
578
+ [`${getRowid($xeTable, row)}:${column.id}`]: {
560
579
  column,
561
580
  row,
562
581
  rule,
@@ -565,8 +584,8 @@ export default {
565
584
  };
566
585
  }
567
586
  else {
568
- this.validErrorMaps = Object.assign({}, validErrorMaps, {
569
- [`${getRowid(this, row)}:${column.id}`]: {
587
+ reactData.validErrorMaps = Object.assign({}, validErrorMaps, {
588
+ [`${getRowid($xeTable, row)}:${column.id}`]: {
570
589
  column,
571
590
  row,
572
591
  rule,
@@ -580,7 +599,7 @@ export default {
580
599
  return validTip.open(cell, content);
581
600
  }
582
601
  }
583
- return this.$nextTick();
602
+ return $xeTable.$nextTick();
584
603
  }
585
604
  }
586
605
  };
@@ -129,7 +129,7 @@ function renderTdColumn(h, $xeTable, seq, rowid, fixedType, isOptimizeMode, rowL
129
129
  const cellAlign = align || (compConf ? compConf.tableCellAlign : '') || allAlign;
130
130
  const cellVerticalAlign = XEUtils.eqNull(verticalAlign) ? allVerticalAlign : verticalAlign;
131
131
  const errorValidItem = validErrorMaps[`${rowid}:${colid}`];
132
- const showValidTip = editRules && validOpts.showMessage && (validOpts.message === 'default' ? (height || tableData.length > 1) : validOpts.message === 'inline');
132
+ const showValidTip = editRules && validOpts.showErrorMessage && (validOpts.message === 'default' ? (height || tableData.length > 1) : validOpts.message === 'inline');
133
133
  const tdAttrs = { colid };
134
134
  const cellParams = {
135
135
  $table: $xeTable,
@@ -417,6 +417,7 @@ function renderTdColumn(h, $xeTable, seq, rowid, fixedType, isOptimizeMode, rowL
417
417
  'col--dirty': isDirty,
418
418
  'col--active': editConfig && isEdit && (actived.row === row && (actived.column === column || editOpts.mode === 'row')),
419
419
  'col--valid-error': !!errorValidItem,
420
+ 'show--valid-bg': errorValidItem && validOpts.showErrorBackground,
420
421
  'col--current': currentColumn === column
421
422
  },
422
423
  getClass(compCellClassName, cellParams),
@@ -472,7 +472,7 @@ export const Cell = {
472
472
  ]);
473
473
  },
474
474
  renderDeepCell(h, params) {
475
- return Cell.renderDeepNodeBtn(h, params, Cell.renderDefaultCell.call(this, h, params));
475
+ return Cell.renderDeepNodeBtn(h, params, Cell.renderDefaultCell(h, params));
476
476
  },
477
477
  renderDefaultFooter(h, params) {
478
478
  return getFooterContent(h, params);
@@ -1224,7 +1224,7 @@ export const Cell = {
1224
1224
  }, [getDefaultCellLabel(cellParams)])
1225
1225
  ]);
1226
1226
  }
1227
- return Cell.renderDefaultCell.call($table, h, cellParams);
1227
+ return Cell.renderDefaultCell(h, cellParams);
1228
1228
  }
1229
1229
  };
1230
1230
  export default Cell;