vxe-table 4.17.20 → 4.17.21

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 (34) hide show
  1. package/es/grid/src/grid.js +136 -30
  2. package/es/style.css +1 -1
  3. package/es/table/render/index.js +113 -4
  4. package/es/table/src/cell.js +3 -3
  5. package/es/table/src/table.js +27 -14
  6. package/es/ui/index.js +3 -2
  7. package/es/ui/src/log.js +1 -1
  8. package/lib/grid/src/grid.js +152 -43
  9. package/lib/grid/src/grid.min.js +1 -1
  10. package/lib/index.umd.js +310 -64
  11. package/lib/index.umd.min.js +1 -1
  12. package/lib/style.css +1 -1
  13. package/lib/table/render/index.js +140 -10
  14. package/lib/table/render/index.min.js +1 -1
  15. package/lib/table/src/cell.js +6 -3
  16. package/lib/table/src/cell.min.js +1 -1
  17. package/lib/table/src/table.js +5 -4
  18. package/lib/table/src/table.min.js +1 -1
  19. package/lib/ui/index.js +3 -2
  20. package/lib/ui/index.min.js +1 -1
  21. package/lib/ui/src/log.js +1 -1
  22. package/lib/ui/src/log.min.js +1 -1
  23. package/package.json +2 -2
  24. package/packages/grid/src/grid.ts +132 -29
  25. package/packages/table/render/index.ts +115 -4
  26. package/packages/table/src/cell.ts +3 -3
  27. package/packages/table/src/table.ts +26 -12
  28. package/packages/ui/index.ts +2 -1
  29. /package/es/{iconfont.1764045862093.ttf → iconfont.1764298161293.ttf} +0 -0
  30. /package/es/{iconfont.1764045862093.woff → iconfont.1764298161293.woff} +0 -0
  31. /package/es/{iconfont.1764045862093.woff2 → iconfont.1764298161293.woff2} +0 -0
  32. /package/lib/{iconfont.1764045862093.ttf → iconfont.1764298161293.ttf} +0 -0
  33. /package/lib/{iconfont.1764045862093.woff → iconfont.1764298161293.woff} +0 -0
  34. /package/lib/{iconfont.1764045862093.woff2 → iconfont.1764298161293.woff2} +0 -0
@@ -16,7 +16,9 @@ const { getConfig, getI18n, commands, hooks, useFns, createEvent, globalEvents,
16
16
  const tableComponentPropKeys = Object.keys(tableProps);
17
17
  const tableComponentMethodKeys = ['clearAll', 'syncData', 'updateData', 'loadData', 'reloadData', 'reloadRow', 'loadColumn', 'reloadColumn', 'getRowNode', 'getColumnNode', 'getRowIndex', 'getVTRowIndex', 'getVMRowIndex', 'getColumnIndex', 'getVTColumnIndex', 'getVMColumnIndex', 'setRow', 'createData', 'createRow', 'revertData', 'clearData', 'isRemoveByRow', 'isInsertByRow', 'isUpdateByRow', 'getColumns', 'getColumnById', 'getColumnByField', 'getTableColumn', 'getFullColumns', 'getData', 'getCheckboxRecords', 'getParentRow', 'getTreeRowChildren', 'getTreeRowLevel', 'getTreeParentRow', 'getRowSeq', 'getRowById', 'getRowid', 'getTableData', 'getFullData', 'setColumnFixed', 'clearColumnFixed', 'setColumnWidth', 'getColumnWidth', 'recalcRowHeight', 'setRowHeightConf', 'getRowHeightConf', 'setRowHeight', 'getRowHeight', 'hideColumn', 'showColumn', 'resetColumn', 'refreshColumn', 'refreshScroll', 'recalculate', 'closeTooltip', 'isAllCheckboxChecked', 'isAllCheckboxIndeterminate', 'getCheckboxIndeterminateRecords', 'setCheckboxRow', 'setCheckboxRowKey', 'isCheckedByCheckboxRow', 'isCheckedByCheckboxRowKey', 'isIndeterminateByCheckboxRow', 'isIndeterminateByCheckboxRowKey', 'toggleCheckboxRow', 'setAllCheckboxRow', 'getRadioReserveRecord', 'clearRadioReserve', 'getCheckboxReserveRecords', 'clearCheckboxReserve', 'toggleAllCheckboxRow', 'clearCheckboxRow', 'setCurrentRow', 'isCheckedByRadioRow', 'isCheckedByRadioRowKey', 'setRadioRow', 'setRadioRowKey', 'clearCurrentRow', 'clearRadioRow', 'getCurrentRecord', 'getRadioRecord', 'getCurrentColumn', 'setCurrentColumn', 'clearCurrentColumn', 'setPendingRow', 'togglePendingRow', 'hasPendingByRow', 'isPendingByRow', 'getPendingRecords', 'clearPendingRow', 'setFilterByEvent', 'sort', 'setSort', 'setSortByEvent', 'clearSort', 'clearSortByEvent', 'isSort', 'getSortColumns', 'closeFilter', 'isFilter', 'clearFilterByEvent', 'isActiveFilterByColumn', 'isRowExpandLoaded', 'clearRowExpandLoaded', 'reloadRowExpand', 'reloadRowExpand', 'toggleRowExpand', 'setAllRowExpand', 'setRowExpand', 'isExpandByRow', 'isRowExpandByRow', 'clearRowExpand', 'clearRowExpandReserve', 'getRowExpandRecords', 'getTreeExpandRecords', 'isTreeExpandLoaded', 'clearTreeExpandLoaded', 'reloadTreeExpand', 'reloadTreeChilds', 'toggleTreeExpand', 'setAllTreeExpand', 'setTreeExpand', 'isTreeExpandByRow', 'clearTreeExpand', 'clearTreeExpandReserve', 'getScroll', 'getScrollData', 'scrollTo', 'scrollToRow', 'scrollToColumn', 'clearScroll', 'updateFooter', 'updateStatus', 'setMergeCells', 'removeInsertRow', 'removeMergeCells', 'getMergeCells', 'setMergeHeaderCells', 'removeMergeHeaderCells', 'getMergeHeaderCells', 'clearMergeHeaderCells', 'clearMergeCells', 'setMergeFooterItems', 'removeMergeFooterItems', 'getMergeFooterItems', 'clearMergeFooterItems', 'getCustomStoreData', 'setRowGroupExpand', 'setRowGroupExpandByField', 'setAllRowGroupExpand', 'clearRowGroupExpand', 'isRowGroupExpandByRow', 'isRowGroupRecord', 'isAggregateRecord', 'isAggregateExpandByRow', 'getAggregateContentByRow', 'getAggregateRowChildren', 'setRowGroups', 'clearRowGroups', 'openTooltip', 'moveColumnTo', 'moveRowTo', 'getCellLabel', 'getCellElement', 'focus', 'blur', 'connect', 'connectToolbar'];
18
18
  function createInternalData() {
19
- return {};
19
+ return {
20
+ uFoot: false
21
+ };
20
22
  }
21
23
  export default defineVxeComponent({
22
24
  name: 'VxeGrid',
@@ -39,6 +41,7 @@ export default defineVxeComponent({
39
41
  filterData: [],
40
42
  formData: {},
41
43
  sortData: [],
44
+ footerData: [],
42
45
  tZindex: 0,
43
46
  tablePage: {
44
47
  total: 0,
@@ -122,20 +125,30 @@ export default defineVxeComponent({
122
125
  const computeTableExtendProps = computed(() => {
123
126
  const rest = {};
124
127
  tableComponentPropKeys.forEach((key) => {
125
- rest[key] = props[key];
128
+ if (props[key] !== undefined) {
129
+ rest[key] = props[key];
130
+ }
126
131
  });
127
132
  return rest;
128
133
  });
129
134
  const computeTableProps = computed(() => {
130
- const { seqConfig, pagerConfig, editConfig, proxyConfig } = props;
131
- const { isZMax, tablePage } = reactData;
135
+ const { showFooter, seqConfig, pagerConfig, editConfig, proxyConfig } = props;
136
+ const { isZMax, tablePage, footerData } = reactData;
132
137
  const tableExtendProps = computeTableExtendProps.value;
133
138
  const proxyOpts = computeProxyOpts.value;
134
139
  const pagerOpts = computePagerOpts.value;
135
140
  const isLoading = computeIsLoading.value;
136
141
  const tProps = Object.assign({}, tableExtendProps);
142
+ if (showFooter && !tProps.footerData) {
143
+ // 如果未设置自己的标位数据,则使用代理的
144
+ tProps.footerData = footerData;
145
+ }
146
+ else if (proxyOpts.footer && footerData.length) {
147
+ // 如果代理标为数据,且未请求到数据,则用自己的
148
+ tProps.footerData = footerData;
149
+ }
137
150
  if (isZMax) {
138
- if (tableExtendProps.maxHeight) {
151
+ if (tProps.maxHeight) {
139
152
  tProps.maxHeight = '100%';
140
153
  }
141
154
  else {
@@ -382,9 +395,12 @@ export default defineVxeComponent({
382
395
  reactData.filterData = params.filterList;
383
396
  if (proxyConfig && isEnableConf(proxyOpts)) {
384
397
  reactData.tablePage.currentPage = 1;
398
+ internalData.uFoot = true;
385
399
  $xeGrid.commitProxy('query').then((rest) => {
386
400
  $xeGrid.dispatchEvent('proxy-query', rest, params.$event);
387
401
  });
402
+ internalData.uFoot = false;
403
+ updateQueryFooter();
388
404
  }
389
405
  }
390
406
  };
@@ -403,9 +419,12 @@ export default defineVxeComponent({
403
419
  return;
404
420
  }
405
421
  if (proxyConfig && isEnableConf(proxyOpts)) {
422
+ internalData.uFoot = true;
406
423
  $xeGrid.commitProxy('reload').then((rest) => {
407
424
  $xeGrid.dispatchEvent('proxy-query', Object.assign(Object.assign({}, rest), { isReload: true }), params.$event);
408
425
  });
426
+ internalData.uFoot = false;
427
+ updateQueryFooter();
409
428
  }
410
429
  $xeGrid.dispatchEvent('form-submit', params, params.$event);
411
430
  };
@@ -418,9 +437,12 @@ export default defineVxeComponent({
418
437
  if ($xeTable) {
419
438
  $xeTable.clearScroll();
420
439
  }
440
+ internalData.uFoot = true;
421
441
  $xeGrid.commitProxy('reload').then((rest) => {
422
442
  $xeGrid.dispatchEvent('proxy-query', Object.assign(Object.assign({}, rest), { isReload: true }), $event);
423
443
  });
444
+ internalData.uFoot = false;
445
+ updateQueryFooter();
424
446
  }
425
447
  $xeGrid.dispatchEvent('form-reset', params, $event);
426
448
  };
@@ -820,13 +842,26 @@ export default defineVxeComponent({
820
842
  if (!proxyInited) {
821
843
  reactData.proxyInited = true;
822
844
  if (proxyOpts.autoLoad !== false) {
823
- nextTick().then(() => $xeGrid.commitProxy('initial')).then((rest) => {
845
+ nextTick().then(() => {
846
+ internalData.uFoot = true;
847
+ const rest = $xeGrid.commitProxy('initial');
848
+ internalData.uFoot = false;
849
+ updateQueryFooter();
850
+ return rest;
851
+ }).then((rest) => {
824
852
  dispatchEvent('proxy-query', Object.assign(Object.assign({}, rest), { isInited: true }), new Event('initial'));
825
853
  });
826
854
  }
827
855
  }
828
856
  }
829
857
  };
858
+ const updateQueryFooter = () => {
859
+ const proxyOpts = computeProxyOpts.value;
860
+ const { ajax } = proxyOpts;
861
+ if (ajax && ajax.queryFooter) {
862
+ return $xeGrid.commitProxy('queryFooter');
863
+ }
864
+ };
830
865
  const handleGlobalKeydownEvent = (evnt) => {
831
866
  const zoomOpts = computeZoomOpts.value;
832
867
  const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE);
@@ -847,15 +882,15 @@ export default defineVxeComponent({
847
882
  * @param {String/Object} code 字符串或对象
848
883
  */
849
884
  commitProxy(proxyTarget, ...args) {
850
- const { proxyConfig, toolbarConfig, pagerConfig, editRules, validConfig } = props;
885
+ const { showFooter, proxyConfig, toolbarConfig, pagerConfig, editRules, validConfig } = props;
851
886
  const { tablePage } = reactData;
852
887
  const isActiveMsg = computeIsActiveMsg.value;
853
888
  const isRespMsg = computeIsRespMsg.value;
854
889
  const proxyOpts = computeProxyOpts.value;
855
890
  const pagerOpts = computePagerOpts.value;
856
891
  const toolbarOpts = computeToolbarOpts.value;
857
- const { beforeQuery, afterQuery, beforeDelete, afterDelete, beforeSave, afterSave, ajax = {} } = proxyOpts;
858
- const resConfigs = proxyOpts.response || proxyOpts.props || {};
892
+ const { beforeQuery, afterQuery, beforeQueryFooter, afterQueryFooter, beforeDelete, afterDelete, beforeSave, afterSave, ajax = {} } = proxyOpts;
893
+ const resConfigs = (proxyOpts.response || proxyOpts.props || {});
859
894
  const $xeTable = refTable.value;
860
895
  if (!$xeTable) {
861
896
  return nextTick();
@@ -905,10 +940,10 @@ export default defineVxeComponent({
905
940
  case 'initial':
906
941
  case 'reload':
907
942
  case 'query': {
908
- const ajaxMethods = ajax.query;
909
- const querySuccessMethods = ajax.querySuccess;
910
- const queryErrorMethods = ajax.queryError;
911
- if (ajaxMethods) {
943
+ const qMethods = ajax.query;
944
+ const qsMethods = ajax.querySuccess;
945
+ const qeMethods = ajax.queryError;
946
+ if (qMethods) {
912
947
  const isInited = code === 'initial';
913
948
  const isReload = code === 'reload';
914
949
  if (!isInited && reactData.tableLoading) {
@@ -990,24 +1025,25 @@ export default defineVxeComponent({
990
1025
  sorts: sortList,
991
1026
  filters: filterList,
992
1027
  form: formData,
993
- options: ajaxMethods
1028
+ options: qMethods
994
1029
  };
995
1030
  reactData.sortData = sortList;
996
1031
  reactData.filterData = filterList;
997
1032
  reactData.tableLoading = true;
998
1033
  return Promise.all([
999
- Promise.resolve((beforeQuery || ajaxMethods)(commitParams, ...args)),
1034
+ Promise.resolve((beforeQuery || qMethods)(commitParams, ...args)),
1000
1035
  operPromise
1001
1036
  ]).then(([rest]) => {
1002
1037
  let tableData = [];
1003
1038
  reactData.tableLoading = false;
1004
1039
  if (rest) {
1040
+ const reParams = { data: rest, $table: $xeTable, $grid: $xeGrid, $gantt: null };
1005
1041
  if (pagerConfig && isEnableConf(pagerOpts)) {
1006
1042
  const totalProp = resConfigs.total;
1007
- const total = (XEUtils.isFunction(totalProp) ? totalProp({ data: rest, $table: $xeTable, $grid: $xeGrid, $gantt: null }) : XEUtils.get(rest, totalProp || 'page.total')) || 0;
1043
+ const total = (XEUtils.isFunction(totalProp) ? totalProp(reParams) : XEUtils.get(rest, totalProp || 'page.total')) || 0;
1008
1044
  tablePage.total = XEUtils.toNumber(total);
1009
1045
  const resultProp = resConfigs.result;
1010
- tableData = (XEUtils.isFunction(resultProp) ? resultProp({ data: rest, $table: $xeTable, $grid: $xeGrid, $gantt: null }) : XEUtils.get(rest, resultProp || 'result')) || [];
1046
+ tableData = (XEUtils.isFunction(resultProp) ? resultProp(reParams) : XEUtils.get(rest, resultProp || 'result')) || [];
1011
1047
  // 检验当前页码,不能超出当前最大页数
1012
1048
  const pageCount = Math.max(Math.ceil(total / tablePage.pageSize), 1);
1013
1049
  if (tablePage.currentPage > pageCount) {
@@ -1016,7 +1052,19 @@ export default defineVxeComponent({
1016
1052
  }
1017
1053
  else {
1018
1054
  const listProp = resConfigs.list;
1019
- tableData = (listProp ? (XEUtils.isFunction(listProp) ? listProp({ data: rest, $table: $xeTable, $grid: $xeGrid, $gantt: null }) : XEUtils.get(rest, listProp)) : rest) || [];
1055
+ if (XEUtils.isArray(rest)) {
1056
+ tableData = rest;
1057
+ }
1058
+ else if (listProp) {
1059
+ tableData = (XEUtils.isFunction(listProp) ? listProp(reParams) : XEUtils.get(rest, listProp)) || [];
1060
+ }
1061
+ }
1062
+ if (showFooter) {
1063
+ const fdProp = resConfigs.footerData;
1064
+ const footerList = fdProp ? (XEUtils.isFunction(fdProp) ? fdProp(reParams) : XEUtils.get(rest, fdProp)) : [];
1065
+ if (XEUtils.isArray(footerList)) {
1066
+ reactData.footerData = footerList;
1067
+ }
1020
1068
  }
1021
1069
  }
1022
1070
  if ($xeTable) {
@@ -1033,14 +1081,14 @@ export default defineVxeComponent({
1033
1081
  if (afterQuery) {
1034
1082
  afterQuery(commitParams, ...args);
1035
1083
  }
1036
- if (querySuccessMethods) {
1037
- querySuccessMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
1084
+ if (qsMethods) {
1085
+ qsMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
1038
1086
  }
1039
1087
  return { status: true };
1040
1088
  }).catch((rest) => {
1041
1089
  reactData.tableLoading = false;
1042
- if (queryErrorMethods) {
1043
- queryErrorMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
1090
+ if (qeMethods) {
1091
+ qeMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
1044
1092
  }
1045
1093
  return { status: false };
1046
1094
  });
@@ -1050,11 +1098,51 @@ export default defineVxeComponent({
1050
1098
  }
1051
1099
  break;
1052
1100
  }
1101
+ case 'queryFooter': {
1102
+ const qfMethods = ajax.queryFooter;
1103
+ const qfSuccessMethods = ajax.queryFooterSuccess;
1104
+ const qfErrorMethods = ajax.queryFooterError;
1105
+ if (qfMethods) {
1106
+ let filterList = [];
1107
+ if ($xeTable) {
1108
+ filterList = $xeTable.getCheckedFilters();
1109
+ }
1110
+ const commitParams = {
1111
+ $table: $xeTable,
1112
+ $grid: $xeGrid,
1113
+ $gantt: null,
1114
+ code,
1115
+ button,
1116
+ filters: filterList,
1117
+ form: formData,
1118
+ options: qfMethods
1119
+ };
1120
+ return Promise.resolve((beforeQueryFooter || qfMethods)(commitParams, ...args)).then(rest => {
1121
+ reactData.footerData = XEUtils.isArray(rest) ? rest : [];
1122
+ if (afterQueryFooter) {
1123
+ afterQueryFooter(commitParams, ...args);
1124
+ }
1125
+ if (qfSuccessMethods) {
1126
+ qfSuccessMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
1127
+ }
1128
+ return { status: true };
1129
+ }).catch((rest) => {
1130
+ if (qfErrorMethods) {
1131
+ qfErrorMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
1132
+ }
1133
+ return { status: false };
1134
+ });
1135
+ }
1136
+ else {
1137
+ errLog('vxe.error.notFunc', ['[grid] proxy-config.ajax.queryFooter']);
1138
+ }
1139
+ break;
1140
+ }
1053
1141
  case 'delete': {
1054
- const ajaxMethods = ajax.delete;
1142
+ const dMethods = ajax.delete;
1055
1143
  const deleteSuccessMethods = ajax.deleteSuccess;
1056
1144
  const deleteErrorMethods = ajax.deleteError;
1057
- if (ajaxMethods) {
1145
+ if (dMethods) {
1058
1146
  const selectRecords = $xeGrid.getCheckboxRecords();
1059
1147
  const removeRecords = selectRecords.filter(row => !$xeTable.isInsertByRow(row));
1060
1148
  const body = { removeRecords };
@@ -1066,7 +1154,7 @@ export default defineVxeComponent({
1066
1154
  button,
1067
1155
  body,
1068
1156
  form: formData,
1069
- options: ajaxMethods
1157
+ options: dMethods
1070
1158
  };
1071
1159
  if (selectRecords.length) {
1072
1160
  return handleDeleteRow(code, 'vxe.grid.deleteSelectRecord', () => {
@@ -1074,7 +1162,7 @@ export default defineVxeComponent({
1074
1162
  return $xeTable.remove(selectRecords);
1075
1163
  }
1076
1164
  reactData.tableLoading = true;
1077
- return Promise.resolve((beforeDelete || ajaxMethods)(commitParams, ...args))
1165
+ return Promise.resolve((beforeDelete || dMethods)(commitParams, ...args))
1078
1166
  .then(rest => {
1079
1167
  reactData.tableLoading = false;
1080
1168
  $xeTable.setPendingRow(removeRecords, false);
@@ -1087,7 +1175,10 @@ export default defineVxeComponent({
1087
1175
  afterDelete(commitParams, ...args);
1088
1176
  }
1089
1177
  else {
1178
+ internalData.uFoot = true;
1090
1179
  $xeGrid.commitProxy('query');
1180
+ internalData.uFoot = false;
1181
+ updateQueryFooter();
1091
1182
  }
1092
1183
  if (deleteSuccessMethods) {
1093
1184
  deleteSuccessMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
@@ -1171,7 +1262,10 @@ export default defineVxeComponent({
1171
1262
  afterSave(commitParams, ...args);
1172
1263
  }
1173
1264
  else {
1265
+ internalData.uFoot = true;
1174
1266
  $xeGrid.commitProxy('query');
1267
+ internalData.uFoot = false;
1268
+ updateQueryFooter();
1175
1269
  }
1176
1270
  if (saveSuccessMethods) {
1177
1271
  saveSuccessMethods(Object.assign(Object.assign({}, commitParams), { response: rest }));
@@ -1411,11 +1505,23 @@ export default defineVxeComponent({
1411
1505
  },
1412
1506
  triggerToolbarCommitEvent(params, evnt) {
1413
1507
  const { code } = params;
1414
- return $xeGrid.commitProxy(params, evnt).then((rest) => {
1415
- if (code && rest && rest.status && ['query', 'reload', 'delete', 'save'].includes(code)) {
1416
- $xeGrid.dispatchEvent(code === 'delete' || code === 'save' ? `proxy-${code}` : 'proxy-query', Object.assign(Object.assign({}, rest), { isReload: code === 'reload' }), evnt);
1508
+ if (code) {
1509
+ const isUf = ['reload', 'delete', 'save'].includes(code);
1510
+ if (isUf) {
1511
+ internalData.uFoot = true;
1417
1512
  }
1418
- });
1513
+ const rest = $xeGrid.commitProxy(params, evnt).then((rest) => {
1514
+ if (rest && rest.status && ['query', 'reload', 'delete', 'save'].includes(code)) {
1515
+ $xeGrid.dispatchEvent(code === 'delete' || code === 'save' ? `proxy-${code}` : 'proxy-query', Object.assign(Object.assign({}, rest), { isReload: code === 'reload' }), evnt);
1516
+ }
1517
+ });
1518
+ internalData.uFoot = false;
1519
+ if (isUf) {
1520
+ updateQueryFooter();
1521
+ }
1522
+ return rest;
1523
+ }
1524
+ return nextTick();
1419
1525
  },
1420
1526
  triggerToolbarBtnEvent(button, evnt) {
1421
1527
  $xeGrid.triggerToolbarCommitEvent(button, evnt);