vxe-table 4.9.30 → 4.9.32

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 (53) hide show
  1. package/es/grid/src/grid.js +1 -1
  2. package/es/index.css +1 -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/edit/hook.js +40 -16
  7. package/es/table/module/export/hook.js +8 -5
  8. package/es/table/module/filter/panel.js +6 -4
  9. package/es/table/src/table.js +15 -8
  10. package/es/table/style.css +3 -25
  11. package/es/table/style.min.css +1 -1
  12. package/es/ui/index.js +2 -1
  13. package/es/ui/src/log.js +1 -1
  14. package/es/vxe-table/style.css +3 -25
  15. package/es/vxe-table/style.min.css +1 -1
  16. package/lib/grid/src/grid.js +1 -1
  17. package/lib/grid/src/grid.min.js +1 -1
  18. package/lib/index.css +1 -1
  19. package/lib/index.min.css +1 -1
  20. package/lib/index.umd.js +85 -35
  21. package/lib/index.umd.min.js +1 -1
  22. package/lib/style.css +1 -1
  23. package/lib/style.min.css +1 -1
  24. package/lib/table/module/edit/hook.js +50 -16
  25. package/lib/table/module/edit/hook.min.js +1 -1
  26. package/lib/table/module/export/hook.js +7 -4
  27. package/lib/table/module/export/hook.min.js +1 -1
  28. package/lib/table/module/filter/panel.js +9 -3
  29. package/lib/table/module/filter/panel.min.js +1 -1
  30. package/lib/table/src/table.js +15 -9
  31. package/lib/table/src/table.min.js +1 -1
  32. package/lib/table/style/style.css +3 -25
  33. package/lib/table/style/style.min.css +1 -1
  34. package/lib/ui/index.js +2 -1
  35. package/lib/ui/index.min.js +1 -1
  36. package/lib/ui/src/log.js +1 -1
  37. package/lib/ui/src/log.min.js +1 -1
  38. package/lib/vxe-table/style/style.css +3 -25
  39. package/lib/vxe-table/style/style.min.css +1 -1
  40. package/package.json +2 -2
  41. package/packages/grid/src/grid.ts +1 -1
  42. package/packages/table/module/edit/hook.ts +41 -17
  43. package/packages/table/module/export/hook.ts +11 -7
  44. package/packages/table/module/filter/panel.ts +6 -4
  45. package/packages/table/src/table.ts +15 -8
  46. package/packages/ui/index.ts +1 -0
  47. package/styles/components/table.scss +3 -22
  48. /package/es/{iconfont.1734489196175.ttf → iconfont.1734659096070.ttf} +0 -0
  49. /package/es/{iconfont.1734489196175.woff → iconfont.1734659096070.woff} +0 -0
  50. /package/es/{iconfont.1734489196175.woff2 → iconfont.1734659096070.woff2} +0 -0
  51. /package/lib/{iconfont.1734489196175.ttf → iconfont.1734659096070.ttf} +0 -0
  52. /package/lib/{iconfont.1734489196175.woff → iconfont.1734659096070.woff} +0 -0
  53. /package/lib/{iconfont.1734489196175.woff2 → iconfont.1734659096070.woff2} +0 -0
@@ -6,7 +6,7 @@ import { getCellValue, setCellValue, getRowid } from '../../src/util';
6
6
  import { browse, removeClass, addClass } from '../../../ui/src/dom';
7
7
  import { warnLog, errLog } from '../../../ui/src/log';
8
8
  const { getConfig, renderer, hooks, getI18n } = VxeUI;
9
- const tableEditMethodKeys = ['insert', 'insertAt', 'insertNextAt', 'remove', 'removeCheckboxRow', 'removeRadioRow', 'removeCurrentRow', 'getRecordset', 'getInsertRecords', 'getRemoveRecords', 'getUpdateRecords', 'getEditRecord', 'getActiveRecord', 'getSelectedCell', 'clearEdit', 'clearActived', 'clearSelected', 'isEditByRow', 'isActiveByRow', 'setEditRow', 'setActiveRow', 'setEditCell', 'setActiveCell', 'setSelectCell'];
9
+ const tableEditMethodKeys = ['insert', 'insertAt', 'insertNextAt', 'insertChild', 'insertChildAt', 'insertChildNextAt', 'remove', 'removeCheckboxRow', 'removeRadioRow', 'removeCurrentRow', 'getRecordset', 'getInsertRecords', 'getRemoveRecords', 'getUpdateRecords', 'getEditRecord', 'getActiveRecord', 'getSelectedCell', 'clearEdit', 'clearActived', 'clearSelected', 'isEditByRow', 'isActiveByRow', 'setEditRow', 'setActiveRow', 'setEditCell', 'setActiveCell', 'setSelectCell'];
10
10
  hooks.add('tableEditModule', {
11
11
  setupTable($xeTable) {
12
12
  const { props, reactData, internalData } = $xeTable;
@@ -94,7 +94,7 @@ hooks.add('tableEditModule', {
94
94
  }
95
95
  });
96
96
  }
97
- const handleInsertRowAt = (records, row, isInsertNextRow) => {
97
+ const handleInsertRowAt = (records, targetRow, isInsertNextRow) => {
98
98
  const { treeConfig } = props;
99
99
  const { mergeList, editStore } = reactData;
100
100
  const { tableFullTreeData, afterFullData, tableFullData, fullDataRowIdData, fullAllDataRowIdData } = internalData;
@@ -105,7 +105,7 @@ hooks.add('tableEditModule', {
105
105
  records = [records];
106
106
  }
107
107
  const newRecords = reactive($xeTable.defineField(records.map((record) => Object.assign(treeConfig && transform ? { [mapChildrenField]: [], [childrenField]: [] } : {}, record))));
108
- if (XEUtils.eqNull(row)) {
108
+ if (XEUtils.eqNull(targetRow)) {
109
109
  // 如果为虚拟树
110
110
  if (treeConfig && transform) {
111
111
  insertTreeRow(newRecords, false);
@@ -129,7 +129,7 @@ hooks.add('tableEditModule', {
129
129
  }
130
130
  }
131
131
  else {
132
- if (row === -1) {
132
+ if (targetRow === -1) {
133
133
  // 如果为虚拟树
134
134
  if (treeConfig && transform) {
135
135
  insertTreeRow(newRecords, true);
@@ -155,7 +155,7 @@ hooks.add('tableEditModule', {
155
155
  else {
156
156
  // 如果为虚拟树
157
157
  if (treeConfig && transform) {
158
- const matchMapObj = XEUtils.findTree(tableFullTreeData, item => row[rowField] === item[rowField], { children: mapChildrenField });
158
+ const matchMapObj = XEUtils.findTree(tableFullTreeData, item => targetRow[rowField] === item[rowField], { children: mapChildrenField });
159
159
  if (matchMapObj) {
160
160
  const { parent: parentRow } = matchMapObj;
161
161
  const parentMapChilds = parentRow ? parentRow[mapChildrenField] : tableFullTreeData;
@@ -184,7 +184,7 @@ hooks.add('tableEditModule', {
184
184
  });
185
185
  // 源
186
186
  if (parentRow) {
187
- const matchObj = XEUtils.findTree(tableFullTreeData, item => row[rowField] === item[rowField], { children: childrenField });
187
+ const matchObj = XEUtils.findTree(tableFullTreeData, item => targetRow[rowField] === item[rowField], { children: childrenField });
188
188
  if (matchObj) {
189
189
  const parentChilds = matchObj.items;
190
190
  let targetIndex = matchObj.index;
@@ -208,13 +208,13 @@ hooks.add('tableEditModule', {
208
208
  }
209
209
  let afIndex = -1;
210
210
  // 如果是可视索引
211
- if (XEUtils.isNumber(row)) {
212
- if (row < afterFullData.length) {
213
- afIndex = row;
211
+ if (XEUtils.isNumber(targetRow)) {
212
+ if (targetRow < afterFullData.length) {
213
+ afIndex = targetRow;
214
214
  }
215
215
  }
216
216
  else {
217
- afIndex = $xeTable.findRowIndexOf(afterFullData, row);
217
+ afIndex = $xeTable.findRowIndexOf(afterFullData, targetRow);
218
218
  }
219
219
  // 如果是插入指定行的下一行
220
220
  if (isInsertNextRow) {
@@ -224,7 +224,7 @@ hooks.add('tableEditModule', {
224
224
  throw new Error(getI18n('vxe.error.unableInsert'));
225
225
  }
226
226
  afterFullData.splice(afIndex, 0, ...newRecords);
227
- tableFullData.splice($xeTable.findRowIndexOf(tableFullData, row), 0, ...newRecords);
227
+ tableFullData.splice($xeTable.findRowIndexOf(tableFullData, targetRow), 0, ...newRecords);
228
228
  // 刷新单元格合并
229
229
  mergeList.forEach((mergeItem) => {
230
230
  const { row: mergeRowIndex, rowspan: mergeRowspan } = mergeItem;
@@ -264,6 +264,21 @@ hooks.add('tableEditModule', {
264
264
  };
265
265
  });
266
266
  };
267
+ const handleInsertChildRowAt = (records, parentRow, targetRow, isInsertNextRow) => {
268
+ const { treeConfig } = props;
269
+ const treeOpts = computeTreeOpts.value;
270
+ const { transform, rowField, parentField } = treeOpts;
271
+ if (treeConfig && transform) {
272
+ if (!XEUtils.isArray(records)) {
273
+ records = [records];
274
+ }
275
+ return handleInsertRowAt(records.map((item) => Object.assign({}, item, { [parentField]: parentRow[rowField] })), targetRow, isInsertNextRow);
276
+ }
277
+ else {
278
+ errLog('vxe.error.errProp', ['tree-config.treeConfig=false', 'tree-config.treeConfig=true']);
279
+ }
280
+ return Promise.resolve({ row: null, rows: [] });
281
+ };
267
282
  const handleClearEdit = (evnt, targetRow) => {
268
283
  const { mouseConfig } = props;
269
284
  const { editStore } = reactData;
@@ -320,13 +335,22 @@ hooks.add('tableEditModule', {
320
335
  * 如果 row 为 -1 则从插入到底部,如果为树结构,则插入到目标节点底部
321
336
  * 如果 row 为有效行则插入到该行的位置,如果为树结构,则有插入到效的目标节点该行的位置
322
337
  * @param {Object/Array} records 新的数据
323
- * @param {Row} row 指定行
338
+ * @param {Row} targetRow 指定行
324
339
  */
325
- insertAt(records, row) {
326
- return handleInsertRowAt(records, row);
340
+ insertAt(records, targetRow) {
341
+ return handleInsertRowAt(records, targetRow);
342
+ },
343
+ insertNextAt(records, targetRow) {
344
+ return handleInsertRowAt(records, targetRow, true);
345
+ },
346
+ insertChild(records, parentRow) {
347
+ return handleInsertChildRowAt(records, parentRow, null);
348
+ },
349
+ insertChildAt(records, parentRow, targetRow) {
350
+ return handleInsertChildRowAt(records, parentRow, targetRow);
327
351
  },
328
- insertNextAt(records, row) {
329
- return handleInsertRowAt(records, row, true);
352
+ insertChildNextAt(records, parentRow, targetRow) {
353
+ return handleInsertChildRowAt(records, parentRow, targetRow, true);
330
354
  },
331
355
  /**
332
356
  * 删除指定行数据
@@ -2,7 +2,7 @@ import { inject, nextTick } from 'vue';
2
2
  import XEUtils from 'xe-utils';
3
3
  import { VxeUI } from '../../../ui';
4
4
  import { isColumnInfo, mergeBodyMethod, getCellValue } from '../../src/util';
5
- import { parseFile, formatText } from '../../../ui/src/utils';
5
+ import { parseFile, formatText, eqEmptyValue } from '../../../ui/src/utils';
6
6
  import { createHtmlPage, getExportBlobByContent } from './util';
7
7
  import { warnLog, errLog } from '../../../ui/src/log';
8
8
  const { getI18n, hooks, renderer } = VxeUI;
@@ -287,6 +287,9 @@ hooks.add('tableExportModule', {
287
287
  const toBooleanValue = (cellValue) => {
288
288
  return XEUtils.isBoolean(cellValue) ? (cellValue ? 'TRUE' : 'FALSE') : cellValue;
289
289
  };
290
+ const toStringValue = (cellValue) => {
291
+ return eqEmptyValue(cellValue) ? '' : `${cellValue}`;
292
+ };
290
293
  const getBodyLabelData = (opts, columns, datas) => {
291
294
  const { isAllExpand, mode } = opts;
292
295
  const { treeConfig } = props;
@@ -351,7 +354,7 @@ hooks.add('tableExportModule', {
351
354
  cellValue = getCellValue(row, column);
352
355
  }
353
356
  else {
354
- cellValue = `${$xeTable.getCellLabel(row, column)}`;
357
+ cellValue = $xeTable.getCellLabel(row, column);
355
358
  if (column.type === 'html') {
356
359
  htmlCellElem.innerHTML = cellValue;
357
360
  cellValue = htmlCellElem.innerText.trim();
@@ -365,7 +368,7 @@ hooks.add('tableExportModule', {
365
368
  }
366
369
  }
367
370
  }
368
- item[column.id] = XEUtils.toValueString(cellValue);
371
+ item[column.id] = toStringValue(cellValue);
369
372
  });
370
373
  expandMaps.set(row, 1);
371
374
  rest.push(Object.assign(item, row));
@@ -412,7 +415,7 @@ hooks.add('tableExportModule', {
412
415
  cellValue = getCellValue(row, column);
413
416
  }
414
417
  else {
415
- cellValue = `${$xeTable.getCellLabel(row, column)}`;
418
+ cellValue = $xeTable.getCellLabel(row, column);
416
419
  if (column.type === 'html') {
417
420
  htmlCellElem.innerHTML = cellValue;
418
421
  cellValue = htmlCellElem.innerText.trim();
@@ -426,7 +429,7 @@ hooks.add('tableExportModule', {
426
429
  }
427
430
  }
428
431
  }
429
- item[column.id] = XEUtils.toValueString(cellValue);
432
+ item[column.id] = toStringValue(cellValue);
430
433
  });
431
434
  return item;
432
435
  });
@@ -184,11 +184,13 @@ export default defineComponent({
184
184
  const renderVN = () => {
185
185
  const { filterStore } = props;
186
186
  const { initStore } = tableReactData;
187
- const { column } = filterStore;
187
+ const { visible, multiple, column } = filterStore;
188
188
  const filterRender = column ? column.filterRender : null;
189
189
  const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null;
190
190
  const filterClassName = compConf ? (compConf.tableFilterClassName || compConf.filterClassName) : '';
191
191
  const params = Object.assign({}, tableInternalData._currFilterParams, { $panel, $table: $xeTable });
192
+ const filterOpts = computeFilterOpts.value;
193
+ const { destroyOnClose } = filterOpts;
192
194
  return h('div', {
193
195
  class: [
194
196
  'vxe-table--filter-wrapper',
@@ -196,12 +198,12 @@ export default defineComponent({
196
198
  getPropClass(filterClassName, params),
197
199
  {
198
200
  'is--animat': $xeTable.props.animat,
199
- 'is--multiple': filterStore.multiple,
200
- 'is--active': filterStore.visible
201
+ 'is--multiple': multiple,
202
+ 'is--active': visible
201
203
  }
202
204
  ],
203
205
  style: filterStore.style
204
- }, initStore.filter && column ? renderOptions(filterRender, compConf).concat(renderFooters()) : []);
206
+ }, initStore.filter && (destroyOnClose ? visible : true) && column ? renderOptions(filterRender, compConf).concat(renderFooters()) : []);
205
207
  };
206
208
  return renderVN;
207
209
  }
@@ -4823,18 +4823,25 @@ export default defineComponent({
4823
4823
  const rowRest = fullAllDataRowIdData[getRowid($xeTable, row)];
4824
4824
  return rowRest && !!rowRest.treeLoaded;
4825
4825
  },
4826
- clearTreeExpandLoaded(row) {
4826
+ clearTreeExpandLoaded(rows) {
4827
4827
  const { treeExpandedMaps } = reactData;
4828
4828
  const { fullAllDataRowIdData } = internalData;
4829
4829
  const treeOpts = computeTreeOpts.value;
4830
- const { transform, lazy } = treeOpts;
4831
- const rowid = getRowid($xeTable, row);
4832
- const rowRest = fullAllDataRowIdData[rowid];
4833
- if (lazy && rowRest) {
4834
- rowRest.treeLoaded = false;
4835
- if (treeExpandedMaps[rowid]) {
4836
- delete treeExpandedMaps[rowid];
4830
+ const { transform } = treeOpts;
4831
+ if (rows) {
4832
+ if (!XEUtils.isArray(rows)) {
4833
+ rows = [rows];
4837
4834
  }
4835
+ rows.forEach((row) => {
4836
+ const rowid = getRowid($xeTable, row);
4837
+ const rowRest = fullAllDataRowIdData[rowid];
4838
+ if (rowRest) {
4839
+ rowRest.treeLoaded = false;
4840
+ if (treeExpandedMaps[rowid]) {
4841
+ delete treeExpandedMaps[rowid];
4842
+ }
4843
+ }
4844
+ });
4838
4845
  }
4839
4846
  if (transform) {
4840
4847
  handleVirtualTreeToList();
@@ -1772,22 +1772,6 @@
1772
1772
  .vxe-footer--column.fixed--width > .vxe-cell .vxe-ico-picker {
1773
1773
  width: 100%;
1774
1774
  }
1775
- .vxe-header--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-input,
1776
- .vxe-header--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-textarea,
1777
- .vxe-header--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-select,
1778
- .vxe-header--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-tree-select,
1779
- .vxe-header--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-date-picker,
1780
- .vxe-header--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-number-input,
1781
- .vxe-header--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-ico-picker,
1782
- .vxe-footer--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-input,
1783
- .vxe-footer--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-textarea,
1784
- .vxe-footer--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-select,
1785
- .vxe-footer--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-tree-select,
1786
- .vxe-footer--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-date-picker,
1787
- .vxe-footer--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-number-input,
1788
- .vxe-footer--column.fixed--width > .vxe-cell .vxe-cell--tree-node .vxe-ico-picker {
1789
- width: 100%;
1790
- }
1791
1775
 
1792
1776
  .vxe-body--column.fixed--width > .vxe-cell > .vxe-default-input, .vxe-body--column.fixed--width > .vxe-cell > .vxe-default-textarea, .vxe-body--column.fixed--width > .vxe-cell > .vxe-default-select {
1793
1777
  width: 100%;
@@ -1795,6 +1779,9 @@
1795
1779
  .vxe-body--column.fixed--width > .vxe-cell > .vxe-input, .vxe-body--column.fixed--width > .vxe-cell > .vxe-textarea, .vxe-body--column.fixed--width > .vxe-cell > .vxe-select, .vxe-body--column.fixed--width > .vxe-cell > .vxe-tree-select, .vxe-body--column.fixed--width > .vxe-cell > .vxe-date-picker, .vxe-body--column.fixed--width > .vxe-cell > .vxe-number-input, .vxe-body--column.fixed--width > .vxe-cell > .vxe-ico-picker {
1796
1780
  width: 100%;
1797
1781
  }
1782
+ .vxe-body--column.fixed--width > .vxe-cell > .vxe-cell--tree-node .vxe-default-input,
1783
+ .vxe-body--column.fixed--width > .vxe-cell > .vxe-cell--tree-node .vxe-default-textarea,
1784
+ .vxe-body--column.fixed--width > .vxe-cell > .vxe-cell--tree-node .vxe-default-select,
1798
1785
  .vxe-body--column.fixed--width > .vxe-cell > .vxe-cell--tree-node .vxe-input,
1799
1786
  .vxe-body--column.fixed--width > .vxe-cell > .vxe-cell--tree-node .vxe-textarea,
1800
1787
  .vxe-body--column.fixed--width > .vxe-cell > .vxe-cell--tree-node .vxe-select,
@@ -1811,15 +1798,6 @@
1811
1798
  .vxe-table--filter-template > .vxe-input, .vxe-table--filter-template > .vxe-textarea, .vxe-table--filter-template > .vxe-select, .vxe-table--filter-template > .vxe-tree-select, .vxe-table--filter-template > .vxe-date-picker, .vxe-table--filter-template > .vxe-number-input, .vxe-table--filter-template > .vxe-ico-picker {
1812
1799
  width: 100%;
1813
1800
  }
1814
- .vxe-table--filter-template > .vxe-cell--tree-node .vxe-input,
1815
- .vxe-table--filter-template > .vxe-cell--tree-node .vxe-textarea,
1816
- .vxe-table--filter-template > .vxe-cell--tree-node .vxe-select,
1817
- .vxe-table--filter-template > .vxe-cell--tree-node .vxe-tree-select,
1818
- .vxe-table--filter-template > .vxe-cell--tree-node .vxe-date-picker,
1819
- .vxe-table--filter-template > .vxe-cell--tree-node .vxe-number-input,
1820
- .vxe-table--filter-template > .vxe-cell--tree-node .vxe-ico-picker {
1821
- width: 100%;
1822
- }
1823
1801
 
1824
1802
  .vxe-cell .vxe-default-input,
1825
1803
  .vxe-cell .vxe-default-textarea,