vxe-table 3.12.14 → 3.12.15

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 (41) hide show
  1. package/es/style.css +1 -1
  2. package/es/table/module/edit/mixin.js +31 -15
  3. package/es/table/module/export/mixin.js +3 -2
  4. package/es/table/module/validator/mixin.js +6 -1
  5. package/es/table/src/body.js +1 -0
  6. package/es/table/src/methods.js +123 -88
  7. package/es/table/src/table.js +0 -1
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/lib/index.umd.js +212 -149
  11. package/lib/index.umd.min.js +1 -1
  12. package/lib/style.css +1 -1
  13. package/lib/table/module/edit/mixin.js +37 -15
  14. package/lib/table/module/edit/mixin.min.js +1 -1
  15. package/lib/table/module/export/mixin.js +3 -2
  16. package/lib/table/module/export/mixin.min.js +1 -1
  17. package/lib/table/module/validator/mixin.js +8 -0
  18. package/lib/table/module/validator/mixin.min.js +1 -1
  19. package/lib/table/src/body.js +1 -0
  20. package/lib/table/src/body.min.js +1 -1
  21. package/lib/table/src/methods.js +161 -129
  22. package/lib/table/src/methods.min.js +1 -1
  23. package/lib/table/src/table.js +0 -1
  24. package/lib/table/src/table.min.js +1 -1
  25. package/lib/ui/index.js +1 -1
  26. package/lib/ui/index.min.js +1 -1
  27. package/lib/ui/src/log.js +1 -1
  28. package/lib/ui/src/log.min.js +1 -1
  29. package/package.json +1 -1
  30. package/packages/table/module/edit/mixin.ts +37 -15
  31. package/packages/table/module/export/mixin.ts +3 -2
  32. package/packages/table/module/validator/mixin.ts +6 -1
  33. package/packages/table/src/body.ts +1 -0
  34. package/packages/table/src/methods.ts +127 -84
  35. package/packages/table/src/table.ts +0 -1
  36. /package/es/{iconfont.1739181382716.ttf → iconfont.1739257460253.ttf} +0 -0
  37. /package/es/{iconfont.1739181382716.woff → iconfont.1739257460253.woff} +0 -0
  38. /package/es/{iconfont.1739181382716.woff2 → iconfont.1739257460253.woff2} +0 -0
  39. /package/lib/{iconfont.1739181382716.ttf → iconfont.1739257460253.ttf} +0 -0
  40. /package/lib/{iconfont.1739181382716.woff → iconfont.1739257460253.woff} +0 -0
  41. /package/lib/{iconfont.1739181382716.woff2 → iconfont.1739257460253.woff2} +0 -0
@@ -5,6 +5,15 @@ import { getCellValue, setCellValue, getRowid } from '../../src/util';
5
5
  import { browse, removeClass, addClass } from '../../../ui/src/dom';
6
6
  import { warnLog, errLog } from '../../../ui/src/log';
7
7
  const { getConfig, renderer, getI18n } = VxeUI;
8
+ function removeCellSelectedClass($xeTable) {
9
+ const el = $xeTable.$refs.refElem;
10
+ if (el) {
11
+ const cell = el.querySelector('.col--selected');
12
+ if (cell) {
13
+ removeClass(cell, 'col--selected');
14
+ }
15
+ }
16
+ }
8
17
  function insertTreeRow(_vm, newRecords, isAppend) {
9
18
  const { tableFullTreeData, afterFullData, fullDataRowIdData, fullAllDataRowIdData, treeOpts } = _vm;
10
19
  const { rowField, parentField, mapChildrenField } = treeOpts;
@@ -293,7 +302,7 @@ export default {
293
302
  const treeOpts = $xeTable.computeTreeOpts;
294
303
  const { transform, mapChildrenField } = treeOpts;
295
304
  const childrenField = treeOpts.children || treeOpts.childrenField;
296
- const { actived, removeList, insertMaps } = editStore;
305
+ const { actived, removeMaps, insertMaps } = editStore;
297
306
  const { checkField } = checkboxOpts;
298
307
  let delList = [];
299
308
  if (!rows) {
@@ -305,7 +314,8 @@ export default {
305
314
  // 如果是新增,则保存记录
306
315
  rows.forEach(row => {
307
316
  if (!$xeTable.isInsertByRow(row)) {
308
- removeList.push(row);
317
+ const rowid = getRowid($xeTable, row);
318
+ removeMaps[rowid] = row;
309
319
  }
310
320
  });
311
321
  // 如果绑定了多选属性,则更新状态
@@ -467,7 +477,15 @@ export default {
467
477
  * 获取已删除的数据
468
478
  */
469
479
  _getRemoveRecords() {
470
- return this.editStore.removeList;
480
+ const $xeTable = this;
481
+ const reactData = $xeTable;
482
+ const { editStore } = reactData;
483
+ const { removeMaps } = editStore;
484
+ const removeRecords = [];
485
+ XEUtils.each(removeMaps, (row) => {
486
+ removeRecords.push(row);
487
+ });
488
+ return removeRecords;
471
489
  },
472
490
  /**
473
491
  * 获取更新数据
@@ -829,7 +847,7 @@ export default {
829
847
  selected.row = row;
830
848
  selected.column = column;
831
849
  if (isMouseSelected) {
832
- this.addColSdCls();
850
+ this.addCellSelectedClass();
833
851
  }
834
852
  this.focus();
835
853
  if (evnt) {
@@ -855,11 +873,12 @@ export default {
855
873
  * 清除所选中源状态
856
874
  */
857
875
  _clearSelected() {
876
+ const $xeTable = this;
858
877
  const { selected } = this.editStore;
859
878
  selected.row = null;
860
879
  selected.column = null;
861
880
  this.reColTitleSdCls();
862
- this.reColSdCls();
881
+ removeCellSelectedClass($xeTable);
863
882
  return this.$nextTick();
864
883
  },
865
884
  reColTitleSdCls() {
@@ -868,18 +887,15 @@ export default {
868
887
  XEUtils.arrayEach(headerElem.querySelectorAll('.col--title-selected'), elem => removeClass(elem, 'col--title-selected'));
869
888
  }
870
889
  },
871
- reColSdCls() {
872
- const cell = this.$el.querySelector('.col--selected');
873
- if (cell) {
874
- removeClass(cell, 'col--selected');
875
- }
876
- },
877
- addColSdCls() {
878
- const { selected } = this.editStore;
890
+ addCellSelectedClass() {
891
+ const $xeTable = this;
892
+ const reactData = $xeTable;
893
+ const { editStore } = reactData;
894
+ const { selected } = editStore;
879
895
  const { row, column } = selected;
880
- this.reColSdCls();
896
+ removeCellSelectedClass($xeTable);
881
897
  if (row && column) {
882
- const cell = this.getCellElement(row, column);
898
+ const cell = $xeTable.getCellElement(row, column);
883
899
  if (cell) {
884
900
  addClass(cell, 'col--selected');
885
901
  }
@@ -2,6 +2,7 @@ import XEUtils from 'xe-utils';
2
2
  import { VxeUI } from '../../../ui';
3
3
  import { isColumnInfo, mergeBodyMethod, getCellValue } from '../../src/util';
4
4
  import { parseFile, formatText, eqEmptyValue } from '../../../ui/src/utils';
5
+ import { hasClass } from '../../../ui/src/dom';
5
6
  import { createHtmlPage, getExportBlobByContent } from './util';
6
7
  import { warnLog, errLog } from '../../../ui/src/log';
7
8
  const { getI18n, renderer } = VxeUI;
@@ -121,7 +122,7 @@ function getBodyLabelData($xeTable, opts, columns, datas) {
121
122
  }
122
123
  else {
123
124
  const cell = $xeTable.getCellElement(row, column);
124
- if (cell) {
125
+ if (cell && !hasClass(cell, 'is--progress')) {
125
126
  cellValue = cell.innerText.trim();
126
127
  }
127
128
  }
@@ -182,7 +183,7 @@ function getBodyLabelData($xeTable, opts, columns, datas) {
182
183
  }
183
184
  else {
184
185
  const cell = $xeTable.getCellElement(row, column);
185
- if (cell) {
186
+ if (cell && !hasClass(cell, 'is--progress')) {
186
187
  cellValue = cell.innerText.trim();
187
188
  }
188
189
  }
@@ -153,8 +153,9 @@ export default {
153
153
  const internalData = $xeTable;
154
154
  const validRest = {};
155
155
  const { editRules, treeConfig } = props;
156
- const { pendingRowMaps } = reactData;
156
+ const { editStore, pendingRowMaps } = reactData;
157
157
  const { afterFullData } = internalData;
158
+ const { removeMaps } = editStore;
158
159
  const treeOpts = $xeTable.computeTreeOpts;
159
160
  const childrenField = treeOpts.children || treeOpts.childrenField;
160
161
  let validList;
@@ -181,6 +182,10 @@ export default {
181
182
  const columns = cols && cols.length ? cols : this.getColumns();
182
183
  const handleVaild = (row) => {
183
184
  const rowid = getRowid($xeTable, row);
185
+ // 是否删除
186
+ if (removeMaps[rowid]) {
187
+ return;
188
+ }
184
189
  // 是否标记删除
185
190
  if (pendingRowMaps[rowid]) {
186
191
  return;
@@ -357,6 +357,7 @@ function renderTdColumn(h, _vm, seq, rowid, fixedType, isOptimizeMode, rowLevel,
357
357
  'fixed--width': !isAutoCellWidth,
358
358
  'fixed--hidden': fixedHiddenColumn,
359
359
  'is--padding': isCellPadding,
360
+ 'is--progress': (fixedHiddenColumn && isAllOverflow) || isVNPreEmptyStatus,
360
361
  'is--drag-cell': isRowDragCell && (isCrossDrag || isPeerDrag || !rowLevel),
361
362
  'is--drag-disabled': isDisabledDrag,
362
363
  'col--dirty': isDirty,
@@ -1065,7 +1065,7 @@ const calcCellHeight = ($xeTable) => {
1065
1065
  reactData.calcCellHeightFlag++;
1066
1066
  }
1067
1067
  };
1068
- function getOrderField(_vm, column) {
1068
+ function getOrderField($xeTable, column) {
1069
1069
  const { sortBy, sortType } = column;
1070
1070
  return (row) => {
1071
1071
  let cellValue;
@@ -1073,7 +1073,7 @@ function getOrderField(_vm, column) {
1073
1073
  cellValue = XEUtils.isFunction(sortBy) ? sortBy({ row, column }) : XEUtils.get(row, sortBy);
1074
1074
  }
1075
1075
  else {
1076
- cellValue = _vm.getCellLabel(row, column);
1076
+ cellValue = $xeTable.getCellLabel(row, column);
1077
1077
  }
1078
1078
  if (!sortType || sortType === 'auto') {
1079
1079
  return isNaN(cellValue) ? cellValue : XEUtils.toNumber(cellValue);
@@ -2887,76 +2887,146 @@ const Methods = {
2887
2887
  */
2888
2888
  updateAfterFullData() {
2889
2889
  const $xeTable = this;
2890
- const { tableFullColumn, tableFullData, filterOpts, sortOpts, treeConfig, treeOpts, tableFullTreeData } = this;
2890
+ const props = $xeTable;
2891
+ const internalData = $xeTable;
2892
+ const { treeConfig } = props;
2893
+ const { tableFullColumn, tableFullData, tableFullTreeData } = internalData;
2894
+ const filterOpts = $xeTable.computeFilterOpts;
2895
+ const sortOpts = $xeTable.computeSortOpts;
2896
+ const treeOpts = $xeTable.computeTreeOpts;
2897
+ const childrenField = treeOpts.children || treeOpts.childrenField;
2898
+ const { transform, rowField, parentField, mapChildrenField } = treeOpts;
2891
2899
  const { remote: allRemoteFilter, filterMethod: allFilterMethod } = filterOpts;
2892
2900
  const { remote: allRemoteSort, sortMethod: allSortMethod, multiple: sortMultiple, chronological } = sortOpts;
2893
- const { transform } = treeOpts;
2894
- const childrenField = treeOpts.children || treeOpts.childrenField;
2895
2901
  let tableData = [];
2896
2902
  let tableTree = [];
2897
- const filterColumns = [];
2898
- let orderColumns = [];
2899
- tableFullColumn.forEach((column) => {
2900
- const { field, sortable, order, filters } = column;
2901
- if (!allRemoteFilter && filters && filters.length) {
2902
- const valueList = [];
2903
- const itemList = [];
2904
- filters.forEach((item) => {
2905
- if (item.checked) {
2906
- itemList.push(item);
2907
- valueList.push(item.value);
2903
+ // 处理数据
2904
+ if (!allRemoteFilter || !allRemoteSort) {
2905
+ const filterColumns = [];
2906
+ let orderColumns = [];
2907
+ tableFullColumn.forEach((column) => {
2908
+ const { field, sortable, order, filters } = column;
2909
+ if (!allRemoteFilter && filters && filters.length) {
2910
+ const valueList = [];
2911
+ const itemList = [];
2912
+ filters.forEach((item) => {
2913
+ if (item.checked) {
2914
+ itemList.push(item);
2915
+ valueList.push(item.value);
2916
+ }
2917
+ });
2918
+ if (itemList.length) {
2919
+ filterColumns.push({ column, valueList, itemList });
2908
2920
  }
2909
- });
2910
- if (itemList.length) {
2911
- filterColumns.push({ column, valueList, itemList });
2912
2921
  }
2913
- }
2914
- if (!allRemoteSort && sortable && order) {
2915
- orderColumns.push({ column, field, property: field, order, sortTime: column.sortTime });
2916
- }
2917
- });
2918
- if (sortMultiple && chronological && orderColumns.length > 1) {
2919
- orderColumns = XEUtils.orderBy(orderColumns, 'sortTime');
2920
- }
2921
- if (filterColumns.length) {
2922
- const handleFilter = (row) => {
2923
- return filterColumns.every(({ column, valueList, itemList }) => {
2924
- if (valueList.length && !allRemoteFilter) {
2925
- const { filterMethod, filterRender, field } = column;
2922
+ if (!allRemoteSort && sortable && order) {
2923
+ orderColumns.push({ column, field, property: field, order: order, sortTime: column.sortTime });
2924
+ }
2925
+ });
2926
+ if (sortMultiple && chronological && orderColumns.length > 1) {
2927
+ orderColumns = XEUtils.orderBy(orderColumns, 'sortTime');
2928
+ }
2929
+ // 处理筛选
2930
+ // 支持单列、多列、组合筛选
2931
+ if (!allRemoteFilter && filterColumns.length) {
2932
+ const handleFilter = (row) => {
2933
+ return filterColumns.every(({ column, valueList, itemList }) => {
2934
+ const { filterMethod, filterRender } = column;
2926
2935
  const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null;
2927
2936
  const compFilterMethod = compConf ? (compConf.tableFilterMethod || compConf.filterMethod) : null;
2928
2937
  const tdFilterMethod = compConf ? (compConf.tableFilterDefaultMethod || compConf.defaultTableFilterMethod || compConf.defaultFilterMethod) : null;
2929
2938
  const cellValue = getCellValue(row, column);
2930
2939
  if (filterMethod) {
2931
- return itemList.some((item) => filterMethod({ value: item.value, option: item, cellValue, row, column, $table: this }));
2940
+ return itemList.some((item) => filterMethod({ value: item.value, option: item, cellValue, row, column, $table: $xeTable }));
2932
2941
  }
2933
2942
  else if (compFilterMethod) {
2934
- return itemList.some((item) => compFilterMethod({ value: item.value, option: item, cellValue, row, column, $table: this }));
2943
+ return itemList.some((item) => compFilterMethod({ value: item.value, option: item, cellValue, row, column, $table: $xeTable }));
2935
2944
  }
2936
2945
  else if (allFilterMethod) {
2937
2946
  return allFilterMethod({ options: itemList, values: valueList, cellValue, row, column });
2938
2947
  }
2939
2948
  else if (tdFilterMethod) {
2940
- return itemList.some((item) => tdFilterMethod({ value: item.value, option: item, cellValue, row, column, $table: this }));
2949
+ return itemList.some((item) => tdFilterMethod({ value: item.value, option: item, cellValue, row, column, $table: $xeTable }));
2941
2950
  }
2942
- return valueList.indexOf(XEUtils.get(row, field)) > -1;
2943
- }
2944
- return true;
2945
- });
2946
- };
2947
- if (treeConfig && transform) {
2948
- // 筛选虚拟树
2949
- tableTree = XEUtils.searchTree(tableFullTreeData, handleFilter, {
2950
- original: true,
2951
- isEvery: true,
2952
- children: treeOpts.mapChildrenField,
2953
- mapChildren: childrenField
2954
- });
2955
- tableData = tableTree;
2951
+ return valueList.indexOf(XEUtils.get(row, column.field)) > -1;
2952
+ });
2953
+ };
2954
+ if (treeConfig && transform) {
2955
+ // 筛选虚拟树
2956
+ tableTree = XEUtils.searchTree(tableFullTreeData, handleFilter, {
2957
+ original: true,
2958
+ isEvery: true,
2959
+ children: mapChildrenField,
2960
+ mapChildren: childrenField
2961
+ });
2962
+ tableData = tableTree;
2963
+ }
2964
+ else {
2965
+ tableData = treeConfig ? tableFullTreeData.filter(handleFilter) : tableFullData.filter(handleFilter);
2966
+ tableTree = tableData;
2967
+ }
2956
2968
  }
2957
2969
  else {
2958
- tableData = treeConfig ? tableFullTreeData.filter(handleFilter) : tableFullData.filter(handleFilter);
2959
- tableTree = tableData;
2970
+ if (treeConfig && transform) {
2971
+ // 还原虚拟树
2972
+ tableTree = XEUtils.searchTree(tableFullTreeData, () => true, {
2973
+ original: true,
2974
+ isEvery: true,
2975
+ children: mapChildrenField,
2976
+ mapChildren: childrenField
2977
+ });
2978
+ tableData = tableTree;
2979
+ }
2980
+ else {
2981
+ tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
2982
+ tableTree = tableData;
2983
+ }
2984
+ }
2985
+ // 处理排序(不能用于树形结构)
2986
+ // 支持单列、多列、组合排序
2987
+ if (!allRemoteSort && orderColumns.length) {
2988
+ if (treeConfig && transform) {
2989
+ // 虚拟树和列表一样,只能排序根级节点
2990
+ if (allSortMethod) {
2991
+ const sortRests = allSortMethod({ data: tableTree, sortList: orderColumns, $table: $xeTable });
2992
+ tableTree = XEUtils.isArray(sortRests) ? sortRests : tableTree;
2993
+ }
2994
+ else {
2995
+ const treeList = XEUtils.toTreeArray(tableTree, {
2996
+ children: mapChildrenField
2997
+ });
2998
+ tableTree = XEUtils.toArrayTree(XEUtils.orderBy(treeList, orderColumns.map(({ column, order }) => [getOrderField($xeTable, column), order])), {
2999
+ key: rowField,
3000
+ parentKey: parentField,
3001
+ children: childrenField,
3002
+ mapChildren: mapChildrenField
3003
+ });
3004
+ }
3005
+ tableData = tableTree;
3006
+ }
3007
+ else {
3008
+ if (allSortMethod) {
3009
+ const sortRests = allSortMethod({ data: tableData, sortList: orderColumns, $table: $xeTable });
3010
+ tableData = XEUtils.isArray(sortRests) ? sortRests : tableData;
3011
+ }
3012
+ else {
3013
+ // 兼容 v4
3014
+ if (sortMultiple) {
3015
+ tableData = XEUtils.orderBy(tableData, orderColumns.map(({ column, order }) => [getOrderField(this, column), order]));
3016
+ }
3017
+ else {
3018
+ const firstOrderColumn = orderColumns[0];
3019
+ let sortByConfs;
3020
+ // 已废弃,兼容 v2,在 v4 中废弃, sortBy 不能为数组
3021
+ if (XEUtils.isArray(firstOrderColumn.sortBy)) {
3022
+ sortByConfs = firstOrderColumn.sortBy.map((item) => [item, firstOrderColumn.order]);
3023
+ }
3024
+ tableData = XEUtils.orderBy(tableData, sortByConfs || [firstOrderColumn].map(({ column, order }) => [getOrderField(this, column), order]));
3025
+ }
3026
+ tableData = XEUtils.orderBy(tableData, orderColumns.map(({ column, order }) => [getOrderField($xeTable, column), order]));
3027
+ }
3028
+ tableTree = tableData;
3029
+ }
2960
3030
  }
2961
3031
  }
2962
3032
  else {
@@ -2975,43 +3045,8 @@ const Methods = {
2975
3045
  tableTree = tableData;
2976
3046
  }
2977
3047
  }
2978
- const firstOrderColumn = orderColumns[0];
2979
- if (!allRemoteSort && firstOrderColumn) {
2980
- if (treeConfig && transform) {
2981
- // 虚拟树和列表一样,只能排序根级节点
2982
- if (allSortMethod) {
2983
- const sortRests = allSortMethod({ data: tableTree, sortList: orderColumns, $table: this });
2984
- tableTree = XEUtils.isArray(sortRests) ? sortRests : tableTree;
2985
- }
2986
- else {
2987
- tableTree = XEUtils.orderBy(tableTree, orderColumns.map(({ column, order }) => [getOrderField(this, column), order]));
2988
- }
2989
- tableData = tableTree;
2990
- }
2991
- else {
2992
- if (allSortMethod) {
2993
- const sortRests = allSortMethod({ data: tableData, column: firstOrderColumn.column, property: firstOrderColumn.field, field: firstOrderColumn.field, order: firstOrderColumn.order, sortList: orderColumns, $table: this });
2994
- tableData = XEUtils.isArray(sortRests) ? sortRests : tableData;
2995
- }
2996
- else {
2997
- // 兼容 v4
2998
- if (sortMultiple) {
2999
- tableData = XEUtils.orderBy(tableData, orderColumns.map(({ column, order }) => [getOrderField(this, column), order]));
3000
- }
3001
- else {
3002
- // 兼容 v2,在 v4 中废弃, sortBy 不能为数组
3003
- let sortByConfs;
3004
- if (XEUtils.isArray(firstOrderColumn.sortBy)) {
3005
- sortByConfs = firstOrderColumn.sortBy.map((item) => [item, firstOrderColumn.order]);
3006
- }
3007
- tableData = XEUtils.orderBy(tableData, sortByConfs || [firstOrderColumn].map(({ column, order }) => [getOrderField(this, column), order]));
3008
- }
3009
- }
3010
- tableTree = tableData;
3011
- }
3012
- }
3013
- this.afterFullData = tableData;
3014
- this.afterTreeFullData = tableTree;
3048
+ internalData.afterFullData = tableData;
3049
+ internalData.afterTreeFullData = tableTree;
3015
3050
  updateAfterDataIndex($xeTable);
3016
3051
  },
3017
3052
  /**
@@ -496,7 +496,6 @@ export default {
496
496
  column: null
497
497
  },
498
498
  insertMaps: {},
499
- removeList: [],
500
499
  removeMaps: {}
501
500
  },
502
501
  // 存放 tooltip 相关信息
package/es/ui/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  import { getFuncText } from './src/utils';
3
- export const version = "3.12.14";
3
+ export const version = "3.12.15";
4
4
  VxeUI.version = version;
5
5
  VxeUI.tableVersion = version;
6
6
  VxeUI.setConfig({
package/es/ui/src/log.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  const { log } = VxeUI;
3
- const version = `table v${"3.12.14"}`;
3
+ const version = `table v${"3.12.15"}`;
4
4
  export const warnLog = log.create('warn', version);
5
5
  export const errLog = log.create('error', version);