vxe-table 4.1.0 → 4.1.1-1.beta.0
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/README.en.md +3 -3
- package/README.md +3 -2
- package/README.zh-TW.md +2 -2
- package/es/button/src/button.js +14 -14
- package/es/edit/src/hook.js +193 -82
- package/es/export/src/hook.js +41 -6
- package/es/export/src/util.js +20 -8
- package/es/filter/src/hook.js +21 -2
- package/es/footer/src/footer.js +4 -4
- package/es/form/src/form.js +15 -8
- package/es/form/src/render.js +4 -4
- package/es/grid/src/grid.js +54 -3
- package/es/header/src/header.js +7 -5
- package/es/input/src/input.js +8 -2
- package/es/select/src/select.js +6 -6
- package/es/table/src/body.js +36 -26
- package/es/table/src/cell.js +86 -68
- package/es/table/src/props.js +10 -7
- package/es/table/src/table.js +438 -233
- package/es/table/src/util.js +4 -1
- package/es/tools/dom.js +2 -8
- package/es/v-x-e-table/src/conf.js +8 -5
- package/es/validator/src/hook.js +15 -8
- package/helper/vetur/attributes.json +16 -8
- package/helper/vetur/tags.json +2 -0
- package/lib/button/src/button.js +15 -14
- package/lib/button/src/button.min.js +1 -1
- package/lib/edit/src/hook.js +248 -85
- package/lib/edit/src/hook.min.js +1 -1
- package/lib/export/src/hook.js +53 -10
- package/lib/export/src/hook.min.js +1 -1
- package/lib/export/src/util.js +21 -7
- package/lib/export/src/util.min.js +1 -1
- package/lib/filter/src/hook.js +24 -1
- package/lib/filter/src/hook.min.js +1 -1
- package/lib/footer/src/footer.js +4 -4
- package/lib/footer/src/footer.min.js +1 -1
- package/lib/form/src/form.js +25 -8
- package/lib/form/src/form.min.js +1 -1
- package/lib/form/src/render.js +4 -4
- package/lib/form/src/render.min.js +1 -1
- package/lib/grid/src/grid.js +62 -4
- package/lib/grid/src/grid.min.js +1 -1
- package/lib/header/src/header.js +7 -5
- package/lib/header/src/header.min.js +1 -1
- package/lib/index.umd.js +1705 -572
- package/lib/index.umd.min.js +2 -1
- package/lib/input/src/input.js +10 -2
- package/lib/input/src/input.min.js +1 -1
- package/lib/select/src/select.js +6 -6
- package/lib/select/src/select.min.js +1 -1
- package/lib/table/src/body.js +35 -28
- package/lib/table/src/body.min.js +1 -1
- package/lib/table/src/cell.js +108 -51
- package/lib/table/src/cell.min.js +1 -1
- package/lib/table/src/props.js +10 -7
- package/lib/table/src/props.min.js +1 -1
- package/lib/table/src/table.js +573 -304
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +8 -1
- package/lib/table/src/util.min.js +1 -1
- package/lib/tools/dom.js +2 -9
- package/lib/tools/dom.min.js +1 -1
- package/lib/v-x-e-table/src/conf.js +8 -5
- package/lib/v-x-e-table/src/conf.min.js +1 -1
- package/lib/validator/src/hook.js +15 -8
- package/lib/validator/src/hook.min.js +1 -1
- package/package.json +6 -29
- package/packages/button/src/button.ts +14 -14
- package/packages/edit/src/hook.ts +187 -82
- package/packages/export/src/hook.ts +41 -6
- package/packages/export/src/util.ts +17 -5
- package/packages/filter/src/hook.ts +21 -2
- package/packages/footer/src/footer.ts +4 -4
- package/packages/form/src/form.ts +12 -8
- package/packages/form/src/render.ts +4 -4
- package/packages/grid/src/grid.ts +54 -3
- package/packages/header/src/header.ts +7 -5
- package/packages/input/src/input.ts +9 -2
- package/packages/select/src/select.ts +6 -6
- package/packages/table/src/body.ts +36 -26
- package/packages/table/src/cell.ts +93 -58
- package/packages/table/src/props.ts +10 -7
- package/packages/table/src/table.ts +451 -243
- package/packages/table/src/util.ts +5 -1
- package/packages/tools/dom.ts +2 -7
- package/packages/v-x-e-table/src/conf.ts +8 -5
- package/packages/v-x-e-table/src/renderer.ts +1 -1
- package/packages/validator/src/hook.ts +12 -8
- package/types/column.d.ts +6 -1
- package/types/edit.d.ts +6 -3
- package/types/filter.d.ts +5 -0
- package/types/form-item.d.ts +5 -1
- package/types/form.d.ts +5 -1
- package/types/index.d.ts +1 -1
- package/types/modal.d.ts +4 -5
- package/types/plugins/pro.d.ts +11 -6
- package/types/table.d.ts +71 -17
- package/types/v-x-e-table/renderer.d.ts +4 -2
- package/types/validator.d.ts +5 -1
package/README.en.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](https://github.com/x-extends/vxe-table/pulls?q=is%3Apr+is%3Aclosed)
|
|
13
13
|
[](LICENSE)
|
|
14
14
|
|
|
15
|
-
A [vue](https://www.npmjs.com/package/vue) based PC form component, support add, delete, change, virtual
|
|
15
|
+
A [vue](https://www.npmjs.com/package/vue) based PC form component, support add, delete, change, virtual list, virtual tree, lazy load, shortcut menu, data validation, print export, form rendering, data paging, modal window, custom template, renderer, flexible configuration items, extension interface, etc...
|
|
16
16
|
|
|
17
17
|
* Design concept
|
|
18
18
|
* Efficient and concise API design for modern browsers.
|
|
@@ -66,9 +66,9 @@ Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |
|
|
|
66
66
|
* [x] Form
|
|
67
67
|
* [x] Toolbar
|
|
68
68
|
* [x] Pulldown
|
|
69
|
-
* [x]
|
|
69
|
+
* [x] Virtual list
|
|
70
|
+
* [x] Virtual tree
|
|
70
71
|
* [x] Editable CRUD
|
|
71
|
-
* [x] Tree table
|
|
72
72
|
* [x] Validate
|
|
73
73
|
* [x] Data Proxy
|
|
74
74
|
* [x] Keyboard navigation
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](https://github.com/x-extends/vxe-table/pulls?q=is%3Apr+is%3Aclosed)
|
|
13
13
|
[](LICENSE)
|
|
14
14
|
|
|
15
|
-
一个基于 [vue](https://www.npmjs.com/package/vue) 的 PC
|
|
15
|
+
一个基于 [vue](https://www.npmjs.com/package/vue) 的 PC 端表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、贼灵活的配置项、扩展接口等...
|
|
16
16
|
|
|
17
17
|
* 设计理念
|
|
18
18
|
* 面向现代浏览器,高效的简洁 API 设计
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* [x] v2.0 基于 vue2.6+,支持所有主流的浏览器,同时兼具功能与性能
|
|
25
25
|
* [x] v3.0 基于 vue2.6+,支持现代浏览器并保留兼容 IE11,提升渲染性能
|
|
26
26
|
* [x] v4.0 基于 vue3.0+,只支持现代浏览器,不支持 IE
|
|
27
|
+
* [ ] 下一阶段:sticky 表格、css 变量、虚拟滚动与动态行高、数据可视化
|
|
27
28
|
|
|
28
29
|
## QQ 交流群
|
|
29
30
|
|
|
@@ -71,8 +72,8 @@ Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |
|
|
|
71
72
|
* [x] 工具栏
|
|
72
73
|
* [x] 下拉容器
|
|
73
74
|
* [x] 虚拟列表
|
|
75
|
+
* [x] 虚拟树
|
|
74
76
|
* [x] 增删改查
|
|
75
|
-
* [x] 树表格
|
|
76
77
|
* [x] 数据校验
|
|
77
78
|
* [x] 数据代理
|
|
78
79
|
* [x] 键盘导航
|
package/README.zh-TW.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](https://github.com/x-extends/vxe-table/pulls?q=is%3Apr+is%3Aclosed)
|
|
13
13
|
[](LICENSE)
|
|
14
14
|
|
|
15
|
-
一個基於 [vue](https://www.npmjs.com/package/vue) 的PC
|
|
15
|
+
一個基於 [vue](https://www.npmjs.com/package/vue) 的PC端表格組件,支持增删改查、虛擬清單、虛擬樹、懶加載、快捷選單、數據校驗、列印匯出、表單渲染、數據分頁、彈窗、自定義範本、渲染器、賊靈活的配寘項、擴展接口等…
|
|
16
16
|
|
|
17
17
|
* 設計理念
|
|
18
18
|
* 面向現代瀏覽器,高效的簡潔 API 設計
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* [x] v2.0 基於 vue2.6+,支持所有主流的瀏覽器,同時兼具功能與效能
|
|
25
25
|
* [x] v3.0 基於 vue2.6+,支持現代瀏覽器並保留相容IE11,提升渲染效能
|
|
26
26
|
* [x] v4.0 基于 vue3.0+,只支持現代瀏覽器,不支持IE
|
|
27
|
+
* [ ] 下一阶段:sticky 表格、css 变量、虚拟滚动与动态行高、数据可视化
|
|
27
28
|
|
|
28
29
|
## QQ 交流群
|
|
29
30
|
|
|
@@ -72,7 +73,6 @@ Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |
|
|
|
72
73
|
* [x] 下拉容器
|
|
73
74
|
* [x] 虛擬清單
|
|
74
75
|
* [x] 增删改查
|
|
75
|
-
* [x] 樹表格
|
|
76
76
|
* [x] 數據校驗
|
|
77
77
|
* [x] 數據代理
|
|
78
78
|
* [x] 鍵盤導航
|
package/es/button/src/button.js
CHANGED
|
@@ -127,39 +127,39 @@ export default defineComponent({
|
|
|
127
127
|
var panelStyle = {
|
|
128
128
|
zIndex: panelIndex
|
|
129
129
|
};
|
|
130
|
-
var _a = getAbsolutePos(targetElem),
|
|
130
|
+
var _a = getAbsolutePos(targetElem), top_1 = _a.top, left = _a.left, boundingTop = _a.boundingTop, visibleHeight = _a.visibleHeight, visibleWidth = _a.visibleWidth;
|
|
131
131
|
var panelPlacement = 'bottom';
|
|
132
132
|
if (transfer) {
|
|
133
|
-
var
|
|
134
|
-
var
|
|
133
|
+
var btnLeft = left + targetWidth - panelWidth;
|
|
134
|
+
var btnTop = top_1 + targetHeight;
|
|
135
135
|
if (placement === 'top') {
|
|
136
136
|
panelPlacement = 'top';
|
|
137
|
-
|
|
137
|
+
btnTop = top_1 - panelHeight;
|
|
138
138
|
}
|
|
139
139
|
else if (!placement) {
|
|
140
140
|
// 如果下面不够放,则向上
|
|
141
|
-
if (
|
|
141
|
+
if (boundingTop + targetHeight + panelHeight + marginSize > visibleHeight) {
|
|
142
142
|
panelPlacement = 'top';
|
|
143
|
-
|
|
143
|
+
btnTop = top_1 - panelHeight;
|
|
144
144
|
}
|
|
145
145
|
// 如果上面不够放,则向下(优先)
|
|
146
|
-
if (
|
|
146
|
+
if (btnTop < marginSize) {
|
|
147
147
|
panelPlacement = 'bottom';
|
|
148
|
-
|
|
148
|
+
btnTop = top_1 + targetHeight;
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
// 如果溢出右边
|
|
152
|
-
if (
|
|
153
|
-
|
|
152
|
+
if (btnLeft + panelWidth + marginSize > visibleWidth) {
|
|
153
|
+
btnLeft -= btnLeft + panelWidth + marginSize - visibleWidth;
|
|
154
154
|
}
|
|
155
155
|
// 如果溢出左边
|
|
156
|
-
if (
|
|
157
|
-
|
|
156
|
+
if (btnLeft < marginSize) {
|
|
157
|
+
btnLeft = marginSize;
|
|
158
158
|
}
|
|
159
159
|
Object.assign(panelStyle, {
|
|
160
|
-
left:
|
|
160
|
+
left: btnLeft + "px",
|
|
161
161
|
right: 'auto',
|
|
162
|
-
top:
|
|
162
|
+
top: btnTop + "px",
|
|
163
163
|
minWidth: targetWidth + "px"
|
|
164
164
|
});
|
|
165
165
|
}
|
package/es/edit/src/hook.js
CHANGED
|
@@ -17,15 +17,15 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
|
17
17
|
import { nextTick } from 'vue';
|
|
18
18
|
import XEUtils from 'xe-utils';
|
|
19
19
|
import { renderer } from '../../v-x-e-table';
|
|
20
|
-
import { errLog, getLog, isEnableConf } from '../../tools/utils';
|
|
21
|
-
import { getCellValue, setCellValue } from '../../table/src/util';
|
|
20
|
+
import { errLog, getLog, isEnableConf, warnLog } from '../../tools/utils';
|
|
21
|
+
import { getCellValue, setCellValue, getRowid } from '../../table/src/util';
|
|
22
22
|
import { browse, removeClass, addClass } from '../../tools/dom';
|
|
23
23
|
var tableEditMethodKeys = ['insert', 'insertAt', 'remove', 'removeCheckboxRow', 'removeRadioRow', 'removeCurrentRow', 'getRecordset', 'getInsertRecords', 'getRemoveRecords', 'getUpdateRecords', 'getActiveRecord', 'getSelectedCell', 'clearActived', 'clearSelected', 'isActiveByRow', 'setActiveRow', 'setActiveCell', 'setSelectCell'];
|
|
24
24
|
var editHook = {
|
|
25
25
|
setupTable: function ($xetable) {
|
|
26
26
|
var props = $xetable.props, reactData = $xetable.reactData, internalData = $xetable.internalData;
|
|
27
27
|
var refElem = $xetable.getRefMaps().refElem;
|
|
28
|
-
var _a = $xetable.getComputeMaps(), computeMouseOpts = _a.computeMouseOpts, computeEditOpts = _a.computeEditOpts, computeCheckboxOpts = _a.computeCheckboxOpts,
|
|
28
|
+
var _a = $xetable.getComputeMaps(), computeMouseOpts = _a.computeMouseOpts, computeEditOpts = _a.computeEditOpts, computeCheckboxOpts = _a.computeCheckboxOpts, computeTreeOpts = _a.computeTreeOpts;
|
|
29
29
|
var editMethods = {};
|
|
30
30
|
var editPrivateMethods = {};
|
|
31
31
|
var getEditColumnModel = function (row, column) {
|
|
@@ -66,6 +66,41 @@ var editHook = {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
+
function insertTreeRow(newRecords, isAppend) {
|
|
70
|
+
var tableFullTreeData = internalData.tableFullTreeData, afterFullData = internalData.afterFullData, fullDataRowIdData = internalData.fullDataRowIdData, fullAllDataRowIdData = internalData.fullAllDataRowIdData;
|
|
71
|
+
var treeOpts = computeTreeOpts.value;
|
|
72
|
+
var funcName = isAppend ? 'push' : 'unshift';
|
|
73
|
+
newRecords.forEach(function (item) {
|
|
74
|
+
var parentRowId = item[treeOpts.parentField];
|
|
75
|
+
var rowid = getRowid($xetable, item);
|
|
76
|
+
var matchObj = parentRowId ? XEUtils.findTree(tableFullTreeData, function (item) { return parentRowId === item[treeOpts.rowField]; }, treeOpts) : null;
|
|
77
|
+
if (matchObj) {
|
|
78
|
+
var parentRow = matchObj.item;
|
|
79
|
+
var parentRest = fullAllDataRowIdData[getRowid($xetable, parentRow)];
|
|
80
|
+
var parentLevel = parentRest ? parentRest.level : 0;
|
|
81
|
+
var parentChilds = parentRow[treeOpts.children];
|
|
82
|
+
if (!XEUtils.isArray(parentChilds)) {
|
|
83
|
+
parentChilds = parentRow[treeOpts.children] = [];
|
|
84
|
+
}
|
|
85
|
+
parentChilds[funcName](item);
|
|
86
|
+
var rest = { row: item, rowid: rowid, seq: -1, index: -1, _index: -1, $index: -1, items: parentChilds, parent: parent, level: parentLevel + 1 };
|
|
87
|
+
fullDataRowIdData[rowid] = rest;
|
|
88
|
+
fullAllDataRowIdData[rowid] = rest;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (process.env.NODE_ENV === 'development') {
|
|
92
|
+
if (parentRowId) {
|
|
93
|
+
warnLog('vxe.error.unableInsert');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
afterFullData[funcName](item);
|
|
97
|
+
tableFullTreeData[funcName](item);
|
|
98
|
+
var rest = { row: item, rowid: rowid, seq: -1, index: -1, _index: -1, $index: -1, items: tableFullTreeData, parent: null, level: 0 };
|
|
99
|
+
fullDataRowIdData[rowid] = rest;
|
|
100
|
+
fullAllDataRowIdData[rowid] = rest;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
69
104
|
editMethods = {
|
|
70
105
|
/**
|
|
71
106
|
* 往表格中插入临时数据
|
|
@@ -77,75 +112,121 @@ var editHook = {
|
|
|
77
112
|
},
|
|
78
113
|
/**
|
|
79
114
|
* 往表格指定行中插入临时数据
|
|
80
|
-
* 如果 row
|
|
81
|
-
* 如果 row 为 -1
|
|
82
|
-
* 如果 row
|
|
115
|
+
* 如果 row 为空则从插入到顶部,如果为树结构,则插入到目标节点顶部
|
|
116
|
+
* 如果 row 为 -1 则从插入到底部,如果为树结构,则插入到目标节点底部
|
|
117
|
+
* 如果 row 为有效行则插入到该行的位置,如果为树结构,则有插入到效的目标节点该行的位置
|
|
83
118
|
* @param {Object/Array} records 新的数据
|
|
84
119
|
* @param {Row} row 指定行
|
|
85
120
|
*/
|
|
86
121
|
insertAt: function (records, row) {
|
|
87
122
|
var _a;
|
|
88
123
|
var treeConfig = props.treeConfig;
|
|
89
|
-
var mergeList = reactData.mergeList, editStore = reactData.editStore
|
|
90
|
-
var afterFullData = internalData.afterFullData, tableFullData = internalData.tableFullData;
|
|
91
|
-
var
|
|
124
|
+
var mergeList = reactData.mergeList, editStore = reactData.editStore;
|
|
125
|
+
var tableFullTreeData = internalData.tableFullTreeData, afterFullData = internalData.afterFullData, tableFullData = internalData.tableFullData, fullDataRowIdData = internalData.fullDataRowIdData, fullAllDataRowIdData = internalData.fullAllDataRowIdData;
|
|
126
|
+
var treeOpts = computeTreeOpts.value;
|
|
127
|
+
var transform = treeOpts.transform;
|
|
92
128
|
if (!XEUtils.isArray(records)) {
|
|
93
129
|
records = [records];
|
|
94
130
|
}
|
|
95
131
|
var newRecords = records.map(function (record) { return $xetable.defineField(Object.assign({}, record)); });
|
|
96
132
|
if (!row) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
if (row === -1) {
|
|
109
|
-
afterFullData.push.apply(afterFullData, newRecords);
|
|
110
|
-
tableFullData.push.apply(tableFullData, newRecords);
|
|
133
|
+
// 如果为虚拟树
|
|
134
|
+
if (treeConfig && transform) {
|
|
135
|
+
insertTreeRow(newRecords, false);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
afterFullData.unshift.apply(afterFullData, newRecords);
|
|
139
|
+
tableFullData.unshift.apply(tableFullData, newRecords);
|
|
111
140
|
// 刷新单元格合并
|
|
112
141
|
mergeList.forEach(function (mergeItem) {
|
|
113
|
-
var mergeRowIndex = mergeItem.row
|
|
114
|
-
if (mergeRowIndex
|
|
115
|
-
mergeItem.
|
|
142
|
+
var mergeRowIndex = mergeItem.row;
|
|
143
|
+
if (mergeRowIndex > 0) {
|
|
144
|
+
mergeItem.row = mergeRowIndex + newRecords.length;
|
|
116
145
|
}
|
|
117
146
|
});
|
|
118
147
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
if (row === -1) {
|
|
151
|
+
// 如果为虚拟树
|
|
152
|
+
if (treeConfig && transform) {
|
|
153
|
+
insertTreeRow(newRecords, true);
|
|
122
154
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
155
|
+
else {
|
|
156
|
+
afterFullData.push.apply(afterFullData, newRecords);
|
|
157
|
+
tableFullData.push.apply(tableFullData, newRecords);
|
|
158
|
+
// 刷新单元格合并
|
|
159
|
+
mergeList.forEach(function (mergeItem) {
|
|
160
|
+
var mergeRowIndex = mergeItem.row, mergeRowspan = mergeItem.rowspan;
|
|
161
|
+
if (mergeRowIndex + mergeRowspan > afterFullData.length) {
|
|
162
|
+
mergeItem.rowspan = mergeRowspan + newRecords.length;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
126
165
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
//
|
|
130
|
-
|
|
131
|
-
var
|
|
132
|
-
if (
|
|
133
|
-
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// 如果为虚拟树
|
|
169
|
+
if (treeConfig && transform) {
|
|
170
|
+
var matchObj_1 = XEUtils.findTree(tableFullTreeData, function (item) { return row[treeOpts.rowField] === item[treeOpts.rowField]; }, treeOpts);
|
|
171
|
+
if (matchObj_1) {
|
|
172
|
+
var parentRow_1 = matchObj_1.parent;
|
|
173
|
+
var parentChilds_1 = matchObj_1.items;
|
|
174
|
+
var parentRest = fullAllDataRowIdData[getRowid($xetable, parentRow_1)];
|
|
175
|
+
var parentLevel_1 = parentRest ? parentRest.level : 0;
|
|
176
|
+
newRecords.forEach(function (item, i) {
|
|
177
|
+
var rowid = getRowid($xetable, item);
|
|
178
|
+
if (process.env.NODE_ENV === 'development') {
|
|
179
|
+
if (item[treeOpts.parentField]) {
|
|
180
|
+
if (parentRow_1 && item[treeOpts.parentField] !== parentRow_1[treeOpts.rowField]) {
|
|
181
|
+
errLog('vxe.error.errProp', [treeOpts.parentField + "=" + item[treeOpts.parentField], treeOpts.parentField + "=" + parentRow_1[treeOpts.rowField]]);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (parentRow_1) {
|
|
186
|
+
item[treeOpts.parentField] = parentRow_1[treeOpts.rowField];
|
|
187
|
+
}
|
|
188
|
+
parentChilds_1.splice(matchObj_1.index + i, 0, item);
|
|
189
|
+
var rest = { row: item, rowid: rowid, seq: -1, index: -1, _index: -1, $index: -1, items: parentChilds_1, parent: parentRow_1, level: parentLevel_1 + 1 };
|
|
190
|
+
fullDataRowIdData[rowid] = rest;
|
|
191
|
+
fullAllDataRowIdData[rowid] = rest;
|
|
192
|
+
});
|
|
134
193
|
}
|
|
135
|
-
else
|
|
136
|
-
|
|
194
|
+
else {
|
|
195
|
+
if (process.env.NODE_ENV === 'development') {
|
|
196
|
+
warnLog('vxe.error.unableInsert');
|
|
197
|
+
}
|
|
198
|
+
insertTreeRow(newRecords, true);
|
|
137
199
|
}
|
|
138
|
-
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
if (treeConfig) {
|
|
203
|
+
throw new Error(getLog('vxe.error.noTree', ['insert']));
|
|
204
|
+
}
|
|
205
|
+
var afIndex_1 = $xetable.findRowIndexOf(afterFullData, row);
|
|
206
|
+
if (afIndex_1 === -1) {
|
|
207
|
+
throw new Error(errLog('vxe.error.unableInsert'));
|
|
208
|
+
}
|
|
209
|
+
afterFullData.splice.apply(afterFullData, __spreadArray([afIndex_1, 0], newRecords));
|
|
210
|
+
tableFullData.splice.apply(tableFullData, __spreadArray([$xetable.findRowIndexOf(tableFullData, row), 0], newRecords));
|
|
211
|
+
// 刷新单元格合并
|
|
212
|
+
mergeList.forEach(function (mergeItem) {
|
|
213
|
+
var mergeRowIndex = mergeItem.row, mergeRowspan = mergeItem.rowspan;
|
|
214
|
+
if (mergeRowIndex > afIndex_1) {
|
|
215
|
+
mergeItem.row = mergeRowIndex + newRecords.length;
|
|
216
|
+
}
|
|
217
|
+
else if (mergeRowIndex + mergeRowspan > afIndex_1) {
|
|
218
|
+
mergeItem.rowspan = mergeRowspan + newRecords.length;
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
139
222
|
}
|
|
140
223
|
}
|
|
141
224
|
(_a = editStore.insertList).unshift.apply(_a, newRecords);
|
|
142
|
-
reactData.scrollYLoad = !treeConfig && sYOpts.gt > -1 && sYOpts.gt < tableFullData.length;
|
|
143
225
|
$xetable.updateFooter();
|
|
144
|
-
$xetable.
|
|
145
|
-
$xetable.handleTableData();
|
|
146
|
-
$xetable.updateAfterDataIndex();
|
|
226
|
+
$xetable.cacheRowMap();
|
|
227
|
+
$xetable.handleTableData(treeConfig && treeOpts.transform);
|
|
147
228
|
$xetable.checkSelectionStatus();
|
|
148
|
-
if (scrollYLoad) {
|
|
229
|
+
if (reactData.scrollYLoad) {
|
|
149
230
|
$xetable.updateScrollYSpace();
|
|
150
231
|
}
|
|
151
232
|
return nextTick().then(function () {
|
|
@@ -166,10 +247,11 @@ var editHook = {
|
|
|
166
247
|
*/
|
|
167
248
|
remove: function (rows) {
|
|
168
249
|
var treeConfig = props.treeConfig;
|
|
169
|
-
var mergeList = reactData.mergeList, editStore = reactData.editStore, selection = reactData.selection
|
|
170
|
-
var afterFullData = internalData.afterFullData, tableFullData = internalData.tableFullData;
|
|
250
|
+
var mergeList = reactData.mergeList, editStore = reactData.editStore, selection = reactData.selection;
|
|
251
|
+
var tableFullTreeData = internalData.tableFullTreeData, afterFullData = internalData.afterFullData, tableFullData = internalData.tableFullData;
|
|
171
252
|
var checkboxOpts = computeCheckboxOpts.value;
|
|
172
|
-
var
|
|
253
|
+
var treeOpts = computeTreeOpts.value;
|
|
254
|
+
var transform = treeOpts.transform;
|
|
173
255
|
var actived = editStore.actived, removeList = editStore.removeList, insertList = editStore.insertList;
|
|
174
256
|
var property = checkboxOpts.checkField;
|
|
175
257
|
var rest = [];
|
|
@@ -202,27 +284,44 @@ var editHook = {
|
|
|
202
284
|
$xetable.clearMergeCells();
|
|
203
285
|
}
|
|
204
286
|
else {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
var
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
287
|
+
// 如果为虚拟树
|
|
288
|
+
if (treeConfig && transform) {
|
|
289
|
+
rows.forEach(function (row) {
|
|
290
|
+
var rowid = getRowid($xetable, row);
|
|
291
|
+
var matchObj = XEUtils.findTree(tableFullTreeData, function (item) { return rowid === getRowid($xetable, item); }, treeOpts);
|
|
292
|
+
if (matchObj) {
|
|
293
|
+
var rItems = matchObj.items.splice(matchObj.index, 1);
|
|
294
|
+
rest.push(rItems[0]);
|
|
295
|
+
}
|
|
296
|
+
var afIndex = $xetable.findRowIndexOf(afterFullData, row);
|
|
297
|
+
if (afIndex > -1) {
|
|
298
|
+
afterFullData.splice(afIndex, 1);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
rows.forEach(function (row) {
|
|
304
|
+
var tfIndex = $xetable.findRowIndexOf(tableFullData, row);
|
|
305
|
+
if (tfIndex > -1) {
|
|
306
|
+
var rItems = tableFullData.splice(tfIndex, 1);
|
|
307
|
+
rest.push(rItems[0]);
|
|
308
|
+
}
|
|
309
|
+
var afIndex = $xetable.findRowIndexOf(afterFullData, row);
|
|
310
|
+
if (afIndex > -1) {
|
|
311
|
+
// 刷新单元格合并
|
|
312
|
+
mergeList.forEach(function (mergeItem) {
|
|
313
|
+
var mergeRowIndex = mergeItem.row, mergeRowspan = mergeItem.rowspan;
|
|
314
|
+
if (mergeRowIndex > afIndex) {
|
|
315
|
+
mergeItem.row = mergeRowIndex - 1;
|
|
316
|
+
}
|
|
317
|
+
else if (mergeRowIndex + mergeRowspan > afIndex) {
|
|
318
|
+
mergeItem.rowspan = mergeRowspan - 1;
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
afterFullData.splice(afIndex, 1);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
}
|
|
226
325
|
}
|
|
227
326
|
// 如果当前行被激活编辑,则清除激活状态
|
|
228
327
|
if (actived.row && $xetable.findRowIndexOf(rows, actived.row) > -1) {
|
|
@@ -235,13 +334,11 @@ var editHook = {
|
|
|
235
334
|
insertList.splice(iIndex, 1);
|
|
236
335
|
}
|
|
237
336
|
});
|
|
238
|
-
reactData.scrollYLoad = !treeConfig && sYOpts.gt > -1 && sYOpts.gt < tableFullData.length;
|
|
239
337
|
$xetable.updateFooter();
|
|
240
|
-
$xetable.
|
|
241
|
-
$xetable.handleTableData();
|
|
242
|
-
$xetable.updateAfterDataIndex();
|
|
338
|
+
$xetable.cacheRowMap();
|
|
339
|
+
$xetable.handleTableData(treeConfig && treeOpts.transform);
|
|
243
340
|
$xetable.checkSelectionStatus();
|
|
244
|
-
if (scrollYLoad) {
|
|
341
|
+
if (reactData.scrollYLoad) {
|
|
245
342
|
$xetable.updateScrollYSpace();
|
|
246
343
|
}
|
|
247
344
|
return nextTick().then(function () {
|
|
@@ -294,16 +391,30 @@ var editHook = {
|
|
|
294
391
|
* 获取新增的临时数据
|
|
295
392
|
*/
|
|
296
393
|
getInsertRecords: function () {
|
|
394
|
+
var treeConfig = props.treeConfig;
|
|
297
395
|
var editStore = reactData.editStore;
|
|
298
|
-
var tableFullData = internalData.tableFullData;
|
|
396
|
+
var tableFullTreeData = internalData.tableFullTreeData, tableFullData = internalData.tableFullData;
|
|
397
|
+
var treeOpts = computeTreeOpts.value;
|
|
299
398
|
var insertList = editStore.insertList;
|
|
300
399
|
var insertRecords = [];
|
|
301
400
|
if (insertList.length) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
401
|
+
// 如果为虚拟树
|
|
402
|
+
if (treeConfig && treeOpts.transform) {
|
|
403
|
+
insertList.forEach(function (row) {
|
|
404
|
+
var rowid = getRowid($xetable, row);
|
|
405
|
+
var matchObj = XEUtils.findTree(tableFullTreeData, function (item) { return rowid === getRowid($xetable, item); }, treeOpts);
|
|
406
|
+
if (matchObj) {
|
|
407
|
+
insertRecords.push(row);
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
insertList.forEach(function (row) {
|
|
413
|
+
if ($xetable.findRowIndexOf(tableFullData, row) > -1) {
|
|
414
|
+
insertRecords.push(row);
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
}
|
|
307
418
|
}
|
|
308
419
|
return insertRecords;
|
|
309
420
|
},
|
package/es/export/src/hook.js
CHANGED
|
@@ -2,7 +2,7 @@ import { inject, nextTick } from 'vue';
|
|
|
2
2
|
import XEUtils from 'xe-utils';
|
|
3
3
|
import GlobalConfig from '../../v-x-e-table/src/conf';
|
|
4
4
|
import { VXETable } from '../../v-x-e-table';
|
|
5
|
-
import { isColumnInfo, mergeBodyMethod, getCellValue } from '../../table/src/util';
|
|
5
|
+
import { isColumnInfo, mergeBodyMethod, getCellValue, toTreePathSeq } from '../../table/src/util';
|
|
6
6
|
import { errLog, warnLog, parseFile, formatText } from '../../tools/utils';
|
|
7
7
|
import { readLocalFile, handlePrint, saveLocalFile, createHtmlPage, getExportBlobByContent } from './util';
|
|
8
8
|
var htmlCellElem;
|
|
@@ -86,6 +86,9 @@ function getFooterData(opts, footerTableData) {
|
|
|
86
86
|
}
|
|
87
87
|
function getCsvCellTypeLabel(column, cellValue) {
|
|
88
88
|
if (cellValue) {
|
|
89
|
+
if (column.type === 'seq') {
|
|
90
|
+
return "\t" + cellValue;
|
|
91
|
+
}
|
|
89
92
|
switch (column.cellType) {
|
|
90
93
|
case 'string':
|
|
91
94
|
if (!isNaN(cellValue)) {
|
|
@@ -262,10 +265,16 @@ var tableExportHook = {
|
|
|
262
265
|
var treeOpts = computeTreeOpts.value;
|
|
263
266
|
return row[treeOpts.children] && row[treeOpts.children].length;
|
|
264
267
|
};
|
|
265
|
-
var getSeq = function (row, rowIndex, column, columnIndex) {
|
|
268
|
+
var getSeq = function (row, rowIndex, column, columnIndex, path) {
|
|
266
269
|
var seqOpts = computeSeqOpts.value;
|
|
267
270
|
var seqMethod = seqOpts.seqMethod || column.seqMethod;
|
|
268
|
-
|
|
271
|
+
if (seqMethod) {
|
|
272
|
+
return seqMethod({ row: row, rowIndex: rowIndex, column: column, columnIndex: columnIndex });
|
|
273
|
+
}
|
|
274
|
+
if (path) {
|
|
275
|
+
return toTreePathSeq(path);
|
|
276
|
+
}
|
|
277
|
+
return seqOpts.startIndex + rowIndex + 1;
|
|
269
278
|
};
|
|
270
279
|
var toBooleanValue = function (cellValue) {
|
|
271
280
|
return XEUtils.isBoolean(cellValue) ? (cellValue ? 'TRUE' : 'FALSE') : cellValue;
|
|
@@ -282,10 +291,11 @@ var tableExportHook = {
|
|
|
282
291
|
if (treeConfig) {
|
|
283
292
|
// 如果是树表格只允许导出数据源
|
|
284
293
|
var rest_1 = [];
|
|
294
|
+
var expandMaps_1 = new Map();
|
|
285
295
|
XEUtils.eachTree(datas, function (item, rowIndex, items, path, parent, nodes) {
|
|
286
296
|
var row = item._row || item;
|
|
287
297
|
var parentRow = parent && parent._row ? parent._row : parent;
|
|
288
|
-
if ((isAllExpand || !parentRow || $xetable.isTreeExpandByRow(parentRow))) {
|
|
298
|
+
if ((isAllExpand || !parentRow || (expandMaps_1.has(parentRow) && $xetable.isTreeExpandByRow(parentRow)))) {
|
|
289
299
|
var hasRowChild = hasTreeChildren(row);
|
|
290
300
|
var item_3 = {
|
|
291
301
|
_row: row,
|
|
@@ -309,7 +319,7 @@ var tableExportHook = {
|
|
|
309
319
|
else {
|
|
310
320
|
switch (column.type) {
|
|
311
321
|
case 'seq':
|
|
312
|
-
cellValue = getSeq(row, rowIndex, column, columnIndex);
|
|
322
|
+
cellValue = getSeq(row, rowIndex, column, columnIndex, path);
|
|
313
323
|
break;
|
|
314
324
|
case 'checkbox':
|
|
315
325
|
cellValue = toBooleanValue($xetable.isCheckedByCheckboxRow(row));
|
|
@@ -342,6 +352,7 @@ var tableExportHook = {
|
|
|
342
352
|
}
|
|
343
353
|
item_3[column.id] = XEUtils.toValueString(cellValue);
|
|
344
354
|
});
|
|
355
|
+
expandMaps_1.set(row, 1);
|
|
345
356
|
rest_1.push(Object.assign(item_3, row));
|
|
346
357
|
}
|
|
347
358
|
}, treeOpts);
|
|
@@ -367,7 +378,7 @@ var tableExportHook = {
|
|
|
367
378
|
else {
|
|
368
379
|
switch (column.type) {
|
|
369
380
|
case 'seq':
|
|
370
|
-
cellValue = getSeq(row, rowIndex, column, columnIndex);
|
|
381
|
+
cellValue = getSeq(row, rowIndex, column, columnIndex, []);
|
|
371
382
|
break;
|
|
372
383
|
case 'checkbox':
|
|
373
384
|
cellValue = toBooleanValue($xetable.isCheckedByCheckboxRow(row));
|
|
@@ -688,6 +699,12 @@ var tableExportHook = {
|
|
|
688
699
|
}
|
|
689
700
|
saveLocalFile({ filename: filename, type: type, content: content }).then(function () {
|
|
690
701
|
if (opts.message !== false) {
|
|
702
|
+
// 检测弹窗模块
|
|
703
|
+
if (process.env.NODE_ENV === 'development') {
|
|
704
|
+
if (!VXETable.modal) {
|
|
705
|
+
errLog('vxe.error.reqModule', ['Modal']);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
691
708
|
VXETable.modal.message({ content: GlobalConfig.i18n('vxe.table.expSuccess'), status: 'success' });
|
|
692
709
|
}
|
|
693
710
|
});
|
|
@@ -754,6 +771,12 @@ var tableExportHook = {
|
|
|
754
771
|
loadRest = $xetable.reloadData(data);
|
|
755
772
|
}
|
|
756
773
|
if (opts.message !== false) {
|
|
774
|
+
// 检测弹窗模块
|
|
775
|
+
if (process.env.NODE_ENV === 'development') {
|
|
776
|
+
if (!VXETable.modal) {
|
|
777
|
+
errLog('vxe.error.reqModule', ['Modal']);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
757
780
|
VXETable.modal.message({ content: GlobalConfig.i18n('vxe.table.impSuccess', [rows.length]), status: 'success' });
|
|
758
781
|
}
|
|
759
782
|
return loadRest.then(function () {
|
|
@@ -764,6 +787,12 @@ var tableExportHook = {
|
|
|
764
787
|
});
|
|
765
788
|
}
|
|
766
789
|
else if (opts.message !== false) {
|
|
790
|
+
// 检测弹窗模块
|
|
791
|
+
if (process.env.NODE_ENV === 'development') {
|
|
792
|
+
if (!VXETable.modal) {
|
|
793
|
+
errLog('vxe.error.reqModule', ['Modal']);
|
|
794
|
+
}
|
|
795
|
+
}
|
|
767
796
|
VXETable.modal.message({ content: GlobalConfig.i18n('vxe.error.impFields'), status: 'error' });
|
|
768
797
|
if (_importReject) {
|
|
769
798
|
_importReject({ status: false });
|
|
@@ -776,6 +805,12 @@ var tableExportHook = {
|
|
|
776
805
|
// 检查类型,如果为自定义导出,则不需要校验类型
|
|
777
806
|
if (!importMethod && !XEUtils.includes(VXETable.config.importTypes, type)) {
|
|
778
807
|
if (opts.message !== false) {
|
|
808
|
+
// 检测弹窗模块
|
|
809
|
+
if (process.env.NODE_ENV === 'development') {
|
|
810
|
+
if (!VXETable.modal) {
|
|
811
|
+
errLog('vxe.error.reqModule', ['Modal']);
|
|
812
|
+
}
|
|
813
|
+
}
|
|
779
814
|
VXETable.modal.message({ content: GlobalConfig.i18n('vxe.error.notType', [type]), status: 'error' });
|
|
780
815
|
}
|
|
781
816
|
var params = { status: false };
|