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.
- package/es/index.css +1 -1
- package/es/index.esm.js +2 -1
- package/es/index.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/module/custom/mixin.js +6 -4
- package/es/table/module/custom/panel.js +806 -799
- package/es/table/module/edit/mixin.js +43 -31
- package/es/table/module/export/export-panel.js +511 -458
- package/es/table/module/export/import-panel.js +224 -192
- package/es/table/module/keyboard/mixin.js +2 -2
- package/es/table/module/menu/panel.js +165 -161
- package/es/table/module/validator/mixin.js +255 -236
- package/es/table/src/body.js +2 -1
- package/es/table/src/cell.js +2 -2
- package/es/table/src/methods.js +33 -43
- package/es/table/src/table.js +13 -249
- package/es/table/src/util.js +242 -0
- package/es/table/style.css +23 -50
- package/es/table/style.min.css +1 -1
- package/es/ui/index.js +2 -2
- package/es/ui/src/dom.js +22 -0
- package/es/ui/src/log.js +1 -1
- package/es/vxe-table/style.css +23 -50
- package/es/vxe-table/style.min.css +1 -1
- package/lib/index.common.js +2 -1
- package/lib/index.css +1 -1
- package/lib/index.min.css +1 -1
- package/lib/index.umd.js +3640 -4790
- package/lib/index.umd.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table/module/custom/mixin.js +6 -4
- package/lib/table/module/custom/mixin.min.js +1 -1
- package/lib/table/module/custom/panel.js +693 -685
- package/lib/table/module/custom/panel.min.js +1 -1
- package/lib/table/module/edit/mixin.js +47 -31
- package/lib/table/module/edit/mixin.min.js +1 -1
- package/lib/table/module/export/export-panel.js +450 -384
- package/lib/table/module/export/export-panel.min.js +1 -1
- package/lib/table/module/export/import-panel.js +200 -159
- package/lib/table/module/export/import-panel.min.js +1 -1
- package/lib/table/module/keyboard/mixin.js +2 -2
- package/lib/table/module/keyboard/mixin.min.js +1 -1
- package/lib/table/module/menu/panel.js +119 -114
- package/lib/table/module/menu/panel.min.js +1 -1
- package/lib/table/module/validator/mixin.js +271 -259
- package/lib/table/module/validator/mixin.min.js +1 -1
- package/lib/table/src/body.js +2 -1
- package/lib/table/src/body.min.js +1 -1
- package/lib/table/src/cell.js +2 -2
- package/lib/table/src/cell.min.js +1 -1
- package/lib/table/src/methods.js +33 -45
- package/lib/table/src/methods.min.js +1 -1
- package/lib/table/src/table.js +12 -248
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +243 -0
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +23 -50
- package/lib/table/style/style.min.css +1 -1
- package/lib/ui/index.js +2 -2
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/dom.js +22 -0
- package/lib/ui/src/dom.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/v-x-e-table/index.js +2 -1
- package/lib/v-x-e-table/index.min.js +1 -1
- package/lib/vxe-colgroup/index.js +2 -1
- package/lib/vxe-colgroup/index.min.js +1 -1
- package/lib/vxe-column/index.js +2 -1
- package/lib/vxe-column/index.min.js +1 -1
- package/lib/vxe-grid/index.js +2 -1
- package/lib/vxe-grid/index.min.js +1 -1
- package/lib/vxe-table/index.js +2 -1
- package/lib/vxe-table/index.min.js +1 -1
- package/lib/vxe-table/style/style.css +23 -50
- package/lib/vxe-table/style/style.min.css +1 -1
- package/lib/vxe-toolbar/index.js +2 -1
- package/lib/vxe-toolbar/index.min.js +1 -1
- package/lib/vxe-ui/index.js +2 -1
- package/lib/vxe-ui/index.min.js +1 -1
- package/lib/vxe-v-x-e-table/index.js +2 -1
- package/lib/vxe-v-x-e-table/index.min.js +1 -1
- package/package.json +1 -1
- package/packages/table/module/custom/mixin.ts +7 -4
- package/packages/table/module/custom/panel.ts +846 -839
- package/packages/table/module/edit/mixin.ts +55 -35
- package/packages/table/module/export/export-panel.ts +545 -469
- package/packages/table/module/export/import-panel.ts +245 -202
- package/packages/table/module/filter/panel.ts +4 -18
- package/packages/table/module/keyboard/mixin.ts +2 -2
- package/packages/table/module/menu/panel.ts +171 -163
- package/packages/table/module/validator/mixin.ts +279 -240
- package/packages/table/src/body.ts +2 -1
- package/packages/table/src/cell.ts +2 -2
- package/packages/table/src/methods.ts +43 -45
- package/packages/table/src/table.ts +14 -260
- package/packages/table/src/util.ts +254 -0
- package/packages/ui/index.ts +1 -1
- package/packages/ui/src/dom.ts +22 -0
- package/styles/components/table.scss +5 -2
- package/styles/theme/base.scss +2 -1
- /package/es/{iconfont.1767145426781.ttf → iconfont.1767492234857.ttf} +0 -0
- /package/es/{iconfont.1767145426781.woff → iconfont.1767492234857.woff} +0 -0
- /package/es/{iconfont.1767145426781.woff2 → iconfont.1767492234857.woff2} +0 -0
- /package/lib/{iconfont.1767145426781.ttf → iconfont.1767492234857.ttf} +0 -0
- /package/lib/{iconfont.1767145426781.woff → iconfont.1767492234857.woff} +0 -0
- /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
|
|
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
|
|
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
|
|
363
|
+
return beginValidate($xeTable, rows, colList, null, true);
|
|
167
364
|
}
|
|
168
|
-
return
|
|
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
|
|
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
|
|
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
|
|
400
|
-
const
|
|
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 (
|
|
404
|
-
const rules = XEUtils.get(editRules,
|
|
409
|
+
if (field && editRules) {
|
|
410
|
+
const rules = XEUtils.get(editRules, field);
|
|
405
411
|
if (rules) {
|
|
406
|
-
const cellValue = XEUtils.isUndefined(val) ? XEUtils.get(row,
|
|
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:
|
|
422
|
+
rowIndex: $xeTable.getRowIndex(row),
|
|
417
423
|
column,
|
|
418
|
-
columnIndex:
|
|
419
|
-
field: column.
|
|
420
|
-
$table:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
474
|
-
const
|
|
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(
|
|
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
|
-
|
|
484
|
-
return
|
|
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(
|
|
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(
|
|
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
|
-
|
|
514
|
-
return
|
|
522
|
+
reactData.validErrorMaps = validErrMaps;
|
|
523
|
+
return $xeTable.$nextTick();
|
|
515
524
|
},
|
|
516
525
|
/**
|
|
517
526
|
* 触发校验
|
|
518
527
|
*/
|
|
519
528
|
triggerValidate(type) {
|
|
520
|
-
const
|
|
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
|
-
|
|
539
|
+
reactData.validErrorMaps = {};
|
|
525
540
|
}
|
|
526
541
|
// 校验单元格
|
|
527
542
|
if (editConfig && editRules && actived.row) {
|
|
528
543
|
const { row, column, cell } = actived.args;
|
|
529
|
-
if (
|
|
530
|
-
return
|
|
544
|
+
if ($xeTable.hasCellRules(type, row, column)) {
|
|
545
|
+
return $xeTable.validCellRules(type, row, column).then(() => {
|
|
531
546
|
if (editOpts.mode === 'row') {
|
|
532
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
559
|
-
[`${getRowid(
|
|
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
|
-
|
|
569
|
-
[`${getRowid(
|
|
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
|
|
602
|
+
return $xeTable.$nextTick();
|
|
584
603
|
}
|
|
585
604
|
}
|
|
586
605
|
};
|
package/es/table/src/body.js
CHANGED
|
@@ -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.
|
|
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),
|
package/es/table/src/cell.js
CHANGED
|
@@ -472,7 +472,7 @@ export const Cell = {
|
|
|
472
472
|
]);
|
|
473
473
|
},
|
|
474
474
|
renderDeepCell(h, params) {
|
|
475
|
-
return Cell.renderDeepNodeBtn(h, params, Cell.renderDefaultCell
|
|
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
|
|
1227
|
+
return Cell.renderDefaultCell(h, cellParams);
|
|
1228
1228
|
}
|
|
1229
1229
|
};
|
|
1230
1230
|
export default Cell;
|