e-virt-table 0.0.3
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/LICENSE +21 -0
- package/README.md +2 -0
- package/dist/index.cjs.js +14 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.es.js +5422 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +14 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/lib/Autofill.d.ts +20 -0
- package/dist/lib/Autofill.js +185 -0
- package/dist/lib/Autofill.js.map +1 -0
- package/dist/lib/BaseCell.d.ts +22 -0
- package/dist/lib/BaseCell.js +111 -0
- package/dist/lib/BaseCell.js.map +1 -0
- package/dist/lib/Body.d.ts +29 -0
- package/dist/lib/Body.js +382 -0
- package/dist/lib/Body.js.map +1 -0
- package/dist/lib/Cell.d.ts +101 -0
- package/dist/lib/Cell.js +943 -0
- package/dist/lib/Cell.js.map +1 -0
- package/dist/lib/CellHeader.d.ts +64 -0
- package/dist/lib/CellHeader.js +355 -0
- package/dist/lib/CellHeader.js.map +1 -0
- package/dist/lib/Config.d.ts +106 -0
- package/dist/lib/Config.js +617 -0
- package/dist/lib/Config.js.map +1 -0
- package/dist/lib/Context.d.ts +123 -0
- package/dist/lib/Context.js +419 -0
- package/dist/lib/Context.js.map +1 -0
- package/dist/lib/Database.d.ts +228 -0
- package/dist/lib/Database.js +931 -0
- package/dist/lib/Database.js.map +1 -0
- package/dist/lib/EVirtTable.d.ts +61 -0
- package/dist/lib/EVirtTable.js +321 -0
- package/dist/lib/EVirtTable.js.map +1 -0
- package/dist/lib/Editor.d.ts +16 -0
- package/dist/lib/Editor.js +251 -0
- package/dist/lib/Editor.js.map +1 -0
- package/dist/lib/Empty.d.ts +7 -0
- package/dist/lib/Empty.js +45 -0
- package/dist/lib/Empty.js.map +1 -0
- package/dist/lib/EventBrowser.d.ts +17 -0
- package/dist/lib/EventBrowser.js +79 -0
- package/dist/lib/EventBrowser.js.map +1 -0
- package/dist/lib/EventBus.d.ts +12 -0
- package/dist/lib/EventBus.js +58 -0
- package/dist/lib/EventBus.js.map +1 -0
- package/dist/lib/EventTable.d.ts +26 -0
- package/dist/lib/EventTable.js +358 -0
- package/dist/lib/EventTable.js.map +1 -0
- package/dist/lib/Footer.d.ts +17 -0
- package/dist/lib/Footer.js +138 -0
- package/dist/lib/Footer.js.map +1 -0
- package/dist/lib/Header.d.ts +37 -0
- package/dist/lib/Header.js +482 -0
- package/dist/lib/Header.js.map +1 -0
- package/dist/lib/History.d.ts +27 -0
- package/dist/lib/History.js +106 -0
- package/dist/lib/History.js.map +1 -0
- package/dist/lib/Icons.d.ts +15 -0
- package/dist/lib/Icons.js +145 -0
- package/dist/lib/Icons.js.map +1 -0
- package/dist/lib/Overlayer.d.ts +10 -0
- package/dist/lib/Overlayer.js +267 -0
- package/dist/lib/Overlayer.js.map +1 -0
- package/dist/lib/Paint.d.ts +65 -0
- package/dist/lib/Paint.js +223 -0
- package/dist/lib/Paint.js.map +1 -0
- package/dist/lib/Row.d.ts +22 -0
- package/dist/lib/Row.js +125 -0
- package/dist/lib/Row.js.map +1 -0
- package/dist/lib/Scroller.d.ts +20 -0
- package/dist/lib/Scroller.js +448 -0
- package/dist/lib/Scroller.js.map +1 -0
- package/dist/lib/Selector.d.ts +38 -0
- package/dist/lib/Selector.js +532 -0
- package/dist/lib/Selector.js.map +1 -0
- package/dist/lib/Tooltip.d.ts +13 -0
- package/dist/lib/Tooltip.js +204 -0
- package/dist/lib/Tooltip.js.map +1 -0
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/types.d.ts +160 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/util.d.ts +15 -0
- package/dist/lib/util.js +113 -0
- package/dist/lib/util.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,931 @@
|
|
|
1
|
+
import Schema from 'async-validator';
|
|
2
|
+
import { generateShortUUID } from './util';
|
|
3
|
+
export default class Database {
|
|
4
|
+
constructor(ctx, options) {
|
|
5
|
+
Object.defineProperty(this, "loading", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true,
|
|
9
|
+
value: false
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(this, "ctx", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: void 0
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(this, "data", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: void 0
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "columns", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: void 0
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(this, "footerData", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true,
|
|
33
|
+
value: []
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(this, "rowKeyMap", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
value: new Map()
|
|
40
|
+
});
|
|
41
|
+
Object.defineProperty(this, "colIndexKeyMap", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: true,
|
|
45
|
+
value: new Map()
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "headerMap", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: new Map()
|
|
52
|
+
});
|
|
53
|
+
Object.defineProperty(this, "rowIndexRowKeyMap", {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
configurable: true,
|
|
56
|
+
writable: true,
|
|
57
|
+
value: new Map()
|
|
58
|
+
});
|
|
59
|
+
Object.defineProperty(this, "checkboxKeyMap", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
value: new Map()
|
|
64
|
+
});
|
|
65
|
+
Object.defineProperty(this, "originalDataMap", {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
configurable: true,
|
|
68
|
+
writable: true,
|
|
69
|
+
value: new Map()
|
|
70
|
+
});
|
|
71
|
+
Object.defineProperty(this, "changedDataMap", {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
configurable: true,
|
|
74
|
+
writable: true,
|
|
75
|
+
value: new Map()
|
|
76
|
+
});
|
|
77
|
+
Object.defineProperty(this, "validationErrorMap", {
|
|
78
|
+
enumerable: true,
|
|
79
|
+
configurable: true,
|
|
80
|
+
writable: true,
|
|
81
|
+
value: new Map()
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(this, "itemRowKeyMap", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
configurable: true,
|
|
86
|
+
writable: true,
|
|
87
|
+
value: new WeakMap()
|
|
88
|
+
});
|
|
89
|
+
Object.defineProperty(this, "bufferData", {
|
|
90
|
+
enumerable: true,
|
|
91
|
+
configurable: true,
|
|
92
|
+
writable: true,
|
|
93
|
+
value: []
|
|
94
|
+
});
|
|
95
|
+
Object.defineProperty(this, "sumHeight", {
|
|
96
|
+
enumerable: true,
|
|
97
|
+
configurable: true,
|
|
98
|
+
writable: true,
|
|
99
|
+
value: 0
|
|
100
|
+
});
|
|
101
|
+
Object.defineProperty(this, "filterMethod", {
|
|
102
|
+
enumerable: true,
|
|
103
|
+
configurable: true,
|
|
104
|
+
writable: true,
|
|
105
|
+
value: void 0
|
|
106
|
+
});
|
|
107
|
+
Object.defineProperty(this, "positions", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
configurable: true,
|
|
110
|
+
writable: true,
|
|
111
|
+
value: []
|
|
112
|
+
}); //虚拟滚动位置
|
|
113
|
+
this.ctx = ctx;
|
|
114
|
+
const { data = [], columns = [], footerData = [] } = options;
|
|
115
|
+
this.data = data;
|
|
116
|
+
this.footerData = footerData;
|
|
117
|
+
this.columns = columns;
|
|
118
|
+
this.setLoading(true);
|
|
119
|
+
this.init();
|
|
120
|
+
}
|
|
121
|
+
init() {
|
|
122
|
+
this.clearBufferData();
|
|
123
|
+
this.rowKeyMap.clear();
|
|
124
|
+
this.checkboxKeyMap.clear();
|
|
125
|
+
this.colIndexKeyMap.clear();
|
|
126
|
+
this.rowIndexRowKeyMap.clear();
|
|
127
|
+
this.originalDataMap.clear();
|
|
128
|
+
this.changedDataMap.clear();
|
|
129
|
+
this.validationErrorMap.clear();
|
|
130
|
+
this.itemRowKeyMap = new WeakMap();
|
|
131
|
+
this.initData(this.data);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 清除缓存数据
|
|
135
|
+
*/
|
|
136
|
+
clearBufferData() {
|
|
137
|
+
this.bufferData = [];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 初始化数据
|
|
141
|
+
* @param dataList
|
|
142
|
+
* @param level
|
|
143
|
+
*/
|
|
144
|
+
initData(dataList, level = 0) {
|
|
145
|
+
dataList.forEach((item, index) => {
|
|
146
|
+
let hasChildren = false;
|
|
147
|
+
if (Array.isArray(item.children)) {
|
|
148
|
+
hasChildren = true;
|
|
149
|
+
this.initData(item.children, level + 1);
|
|
150
|
+
}
|
|
151
|
+
const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;
|
|
152
|
+
const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey
|
|
153
|
+
const rowKey = _rowKey !== undefined && _rowKey !== null ? _rowKey : generateShortUUID();
|
|
154
|
+
this.itemRowKeyMap.set(item, rowKey);
|
|
155
|
+
const height = item._height || CELL_HEIGHT;
|
|
156
|
+
const readonly = item._readonly;
|
|
157
|
+
let selectable = true;
|
|
158
|
+
if (typeof SELECTABLE_METHOD === 'function') {
|
|
159
|
+
const selectableMethod = SELECTABLE_METHOD;
|
|
160
|
+
selectable = selectableMethod;
|
|
161
|
+
}
|
|
162
|
+
// 存储checkboxKey,处理合并单元格选中
|
|
163
|
+
if (CHECKBOX_KEY) {
|
|
164
|
+
const checkboxKey = item[CHECKBOX_KEY];
|
|
165
|
+
if (this.checkboxKeyMap.has(checkboxKey)) {
|
|
166
|
+
const checkboxKeys = this.checkboxKeyMap.get(checkboxKey);
|
|
167
|
+
checkboxKeys.push(rowKey);
|
|
168
|
+
this.checkboxKeyMap.set(checkboxKey, checkboxKeys);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
this.checkboxKeyMap.set(checkboxKey, [rowKey]);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
this.rowKeyMap.set(rowKey, {
|
|
175
|
+
readonly,
|
|
176
|
+
index,
|
|
177
|
+
rowIndex: index,
|
|
178
|
+
level,
|
|
179
|
+
height,
|
|
180
|
+
check: false,
|
|
181
|
+
selectable,
|
|
182
|
+
expand: DEFAULT_EXPAND_ALL,
|
|
183
|
+
expandLazy: false,
|
|
184
|
+
hasChildren,
|
|
185
|
+
expandLoading: false,
|
|
186
|
+
item,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
*
|
|
192
|
+
* @param rowKey 设置Row高度
|
|
193
|
+
* @param height
|
|
194
|
+
*/
|
|
195
|
+
setRowHeight(rowIndex, height) {
|
|
196
|
+
const rowKey = this.rowIndexRowKeyMap.get(rowIndex);
|
|
197
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
198
|
+
row.height = height;
|
|
199
|
+
row.item._height = height;
|
|
200
|
+
this.clearBufferData(); // 清除缓存数据
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
*
|
|
204
|
+
* @returns 获取转化平铺数据
|
|
205
|
+
*/
|
|
206
|
+
getAllRowsData() {
|
|
207
|
+
let list = [];
|
|
208
|
+
const recursiveData = (data) => {
|
|
209
|
+
data.forEach((item) => {
|
|
210
|
+
list.push(item);
|
|
211
|
+
if (Array.isArray(item.children)) {
|
|
212
|
+
recursiveData(item.children);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
recursiveData(this.data);
|
|
217
|
+
return list;
|
|
218
|
+
}
|
|
219
|
+
getColumns() {
|
|
220
|
+
return this.columns;
|
|
221
|
+
}
|
|
222
|
+
setColumns(columns) {
|
|
223
|
+
this.columns = columns;
|
|
224
|
+
this.clearBufferData();
|
|
225
|
+
}
|
|
226
|
+
setData(data) {
|
|
227
|
+
this.data = data;
|
|
228
|
+
if (this.columns.length) {
|
|
229
|
+
this.init();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* 统一转化数据,给画body使用,包括过滤树状等,统一入口
|
|
234
|
+
* @returns
|
|
235
|
+
*/
|
|
236
|
+
getData() {
|
|
237
|
+
if (this.bufferData.length > 0) {
|
|
238
|
+
return {
|
|
239
|
+
data: this.bufferData,
|
|
240
|
+
sumHeight: this.sumHeight,
|
|
241
|
+
positions: this.positions,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
let list = [];
|
|
245
|
+
let rowIndex = 0;
|
|
246
|
+
this.sumHeight = 0;
|
|
247
|
+
this.positions = [];
|
|
248
|
+
const recursiveData = (data) => {
|
|
249
|
+
data.forEach((item) => {
|
|
250
|
+
list.push(item);
|
|
251
|
+
const rowKey = this.itemRowKeyMap.get(item);
|
|
252
|
+
const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);
|
|
253
|
+
const top = this.sumHeight;
|
|
254
|
+
this.sumHeight += height;
|
|
255
|
+
this.rowIndexRowKeyMap.set(rowIndex, rowKey);
|
|
256
|
+
this.positions.push({
|
|
257
|
+
top,
|
|
258
|
+
height,
|
|
259
|
+
bottom: this.sumHeight,
|
|
260
|
+
});
|
|
261
|
+
rowIndex += 1;
|
|
262
|
+
if (expand && hasChildren) {
|
|
263
|
+
recursiveData(item.children);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
};
|
|
267
|
+
this.rowIndexRowKeyMap.clear();
|
|
268
|
+
let _data = this.data;
|
|
269
|
+
if (typeof this.filterMethod === 'function') {
|
|
270
|
+
_data = this.filterMethod(_data);
|
|
271
|
+
}
|
|
272
|
+
recursiveData(_data);
|
|
273
|
+
this.bufferData = list;
|
|
274
|
+
return {
|
|
275
|
+
data: list,
|
|
276
|
+
sumHeight: this.sumHeight,
|
|
277
|
+
positions: this.positions,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
setFooterData(data) {
|
|
281
|
+
this.footerData = data;
|
|
282
|
+
}
|
|
283
|
+
getFooterData() {
|
|
284
|
+
return this.footerData;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* 设置过滤方法
|
|
288
|
+
*/
|
|
289
|
+
setFilterMethod(filterMethod) {
|
|
290
|
+
this.filterMethod = filterMethod;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* 清空过滤方法
|
|
294
|
+
*/
|
|
295
|
+
clearFilterMethod() {
|
|
296
|
+
this.filterMethod = undefined;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* 根据rowKey,控制指定展开行
|
|
300
|
+
* @param rowKey
|
|
301
|
+
* @param expand
|
|
302
|
+
*/
|
|
303
|
+
expandItem(rowKey, expand = false) {
|
|
304
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
305
|
+
row.expand = expand;
|
|
306
|
+
this.clearBufferData(); // 清除缓存数据
|
|
307
|
+
this.ctx.emit('draw');
|
|
308
|
+
}
|
|
309
|
+
expandAll(expand) {
|
|
310
|
+
this.rowKeyMap.forEach((row) => {
|
|
311
|
+
row.expand = expand;
|
|
312
|
+
});
|
|
313
|
+
this.clearBufferData(); // 清除缓存数据
|
|
314
|
+
this.ctx.emit('draw');
|
|
315
|
+
}
|
|
316
|
+
expandLoading(rowKey, loading = false) {
|
|
317
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
318
|
+
row.expandLoading = loading;
|
|
319
|
+
this.clearBufferData(); // 清除缓存数据
|
|
320
|
+
this.ctx.emit('draw');
|
|
321
|
+
}
|
|
322
|
+
setExpandChildren(rowKey, children) {
|
|
323
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
324
|
+
row.expand = true;
|
|
325
|
+
row.expandLazy = true;
|
|
326
|
+
row.item.children = children;
|
|
327
|
+
this.initData(row.item.children, row.level + 1);
|
|
328
|
+
this.clearBufferData(); // 清除缓存数据
|
|
329
|
+
}
|
|
330
|
+
getIsExpandLoading(rowKey) {
|
|
331
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
332
|
+
return row.expandLoading;
|
|
333
|
+
}
|
|
334
|
+
getIsExpandLazy(rowKey) {
|
|
335
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
336
|
+
return row.expandLazy;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* 根据rowKey获取是否展开
|
|
340
|
+
* @param rowKey
|
|
341
|
+
* @returns
|
|
342
|
+
*/
|
|
343
|
+
getIsExpand(rowKey) {
|
|
344
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
345
|
+
return row.expand;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* 根据rowKey获取行数据
|
|
349
|
+
* @param rowKey
|
|
350
|
+
* @returns
|
|
351
|
+
*/
|
|
352
|
+
getRowForRowKey(rowKey) {
|
|
353
|
+
return this.rowKeyMap.get(rowKey);
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* 根据rowIndex获取rowKey
|
|
357
|
+
* @param rowKey
|
|
358
|
+
* @returns
|
|
359
|
+
*/
|
|
360
|
+
getRowKeyForRowIndex(rowIndex) {
|
|
361
|
+
return this.rowIndexRowKeyMap.get(rowIndex);
|
|
362
|
+
}
|
|
363
|
+
getRowKeyByItem(item) {
|
|
364
|
+
return this.itemRowKeyMap.get(item);
|
|
365
|
+
}
|
|
366
|
+
getRowIndexForRowKey(rowKey) {
|
|
367
|
+
return this.rowKeyMap.get(rowKey).index;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* 根据rowIndex和colIndex获取单元格数据
|
|
371
|
+
* @param rowIndex
|
|
372
|
+
* @param colIndex
|
|
373
|
+
* @returns
|
|
374
|
+
*/
|
|
375
|
+
getItemValueForRowIndexAndColIndex(rowIndex, colIndex) {
|
|
376
|
+
const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);
|
|
377
|
+
if (!has) {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
const rowKey = this.rowIndexRowKeyMap.get(rowIndex);
|
|
381
|
+
const key = this.colIndexKeyMap.get(colIndex);
|
|
382
|
+
return {
|
|
383
|
+
rowKey,
|
|
384
|
+
key,
|
|
385
|
+
value: this.getItemValue(rowKey, key),
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* 根据rowKey和key获取单元格数据
|
|
390
|
+
* @param rowKey
|
|
391
|
+
* @param key
|
|
392
|
+
* @returns
|
|
393
|
+
*/
|
|
394
|
+
getItemValue(rowKey, key) {
|
|
395
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
396
|
+
if (row && row.item) {
|
|
397
|
+
if (row.item[key] === undefined) {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
return row.item[key];
|
|
401
|
+
}
|
|
402
|
+
return null;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* 批量设置数据
|
|
406
|
+
* @param list
|
|
407
|
+
* @param history
|
|
408
|
+
* @returns
|
|
409
|
+
*/
|
|
410
|
+
batchSetItemValue(list, history = false) {
|
|
411
|
+
let changeList = [];
|
|
412
|
+
const rowKeyList = new Set();
|
|
413
|
+
list.forEach((data) => {
|
|
414
|
+
const { value, rowKey, key } = data;
|
|
415
|
+
const { oldValue, newValue } = this.setItemValue(rowKey, key, value);
|
|
416
|
+
rowKeyList.add(rowKey);
|
|
417
|
+
changeList.push({
|
|
418
|
+
rowKey,
|
|
419
|
+
key,
|
|
420
|
+
oldValue,
|
|
421
|
+
newValue,
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
// 触发change事件
|
|
425
|
+
let rows = [];
|
|
426
|
+
const _changeList = changeList.map((item) => {
|
|
427
|
+
const row = this.ctx.database.getRowDataItemForRowKey(item.rowKey);
|
|
428
|
+
return {
|
|
429
|
+
rowKey: item.rowKey,
|
|
430
|
+
key: item.key,
|
|
431
|
+
value: item.newValue,
|
|
432
|
+
row,
|
|
433
|
+
};
|
|
434
|
+
});
|
|
435
|
+
rowKeyList.forEach((rowKey) => {
|
|
436
|
+
rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));
|
|
437
|
+
});
|
|
438
|
+
this.ctx.emit('change', _changeList, rows);
|
|
439
|
+
// 推历史记录
|
|
440
|
+
if (history) {
|
|
441
|
+
this.ctx.history.pushState({
|
|
442
|
+
changeList,
|
|
443
|
+
scrollX: this.ctx.scrollX,
|
|
444
|
+
scrollY: this.ctx.scrollY,
|
|
445
|
+
type: 'multiple',
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
return changeList;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
*设置单一数据
|
|
452
|
+
* @param rowKey
|
|
453
|
+
* @param key
|
|
454
|
+
* @param value
|
|
455
|
+
* @param history 是否添加历史记录
|
|
456
|
+
* @param reDraw 是否刷新重绘
|
|
457
|
+
* @param isEditor 是否是编辑器
|
|
458
|
+
* @returns
|
|
459
|
+
*/
|
|
460
|
+
setItemValue(rowKey, key, value, history = false, reDraw = false, isEditor = false) {
|
|
461
|
+
// 异常情况
|
|
462
|
+
if (!this.rowKeyMap.has(rowKey)) {
|
|
463
|
+
return {};
|
|
464
|
+
}
|
|
465
|
+
const { item } = this.rowKeyMap.get(rowKey);
|
|
466
|
+
let oldValue = item[key];
|
|
467
|
+
// 只读返回旧值
|
|
468
|
+
if (this.ctx.database.getReadonly(rowKey, key)) {
|
|
469
|
+
return {
|
|
470
|
+
oldValue,
|
|
471
|
+
newValue: oldValue,
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
// 处理对象
|
|
475
|
+
if (item[key] !== null && typeof item[key] === 'object') {
|
|
476
|
+
oldValue = JSON.parse(JSON.stringify(item[key]));
|
|
477
|
+
}
|
|
478
|
+
const changeKey = `${rowKey}_${key}`;
|
|
479
|
+
// 设置原始值,只设置一次
|
|
480
|
+
if (!this.originalDataMap.has(changeKey)) {
|
|
481
|
+
this.originalDataMap.set(changeKey, oldValue);
|
|
482
|
+
}
|
|
483
|
+
this.changedDataMap.set(changeKey, value);
|
|
484
|
+
item[key] = value;
|
|
485
|
+
// 是否是否是编辑器进来的
|
|
486
|
+
if (isEditor) {
|
|
487
|
+
const row = this.ctx.database.getRowDataItemForRowKey(rowKey);
|
|
488
|
+
const changeItem = {
|
|
489
|
+
rowKey,
|
|
490
|
+
key,
|
|
491
|
+
value,
|
|
492
|
+
row,
|
|
493
|
+
};
|
|
494
|
+
this.ctx.emit('change', [changeItem], [row]);
|
|
495
|
+
this.ctx.emit('editChange', {
|
|
496
|
+
rowKey,
|
|
497
|
+
key,
|
|
498
|
+
oldValue,
|
|
499
|
+
value,
|
|
500
|
+
originalValue: this.originalDataMap.get(changeKey),
|
|
501
|
+
row,
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
// 迭代改变值事件,有改变一次值就触发,包括批量的
|
|
505
|
+
if (this.ctx.hasEvent('iterationChange')) {
|
|
506
|
+
this.ctx.emit('iterationChange', {
|
|
507
|
+
rowKey,
|
|
508
|
+
key,
|
|
509
|
+
oldValue,
|
|
510
|
+
value,
|
|
511
|
+
originalValue: this.originalDataMap.get(changeKey),
|
|
512
|
+
row: this.ctx.database.getRowDataItemForRowKey(rowKey),
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
// 添加历史记录
|
|
516
|
+
if (history) {
|
|
517
|
+
this.ctx.history.pushState({
|
|
518
|
+
type: 'single',
|
|
519
|
+
scrollX: this.ctx.scrollX,
|
|
520
|
+
scrollY: this.ctx.scrollY,
|
|
521
|
+
changeList: [
|
|
522
|
+
{
|
|
523
|
+
rowKey,
|
|
524
|
+
key,
|
|
525
|
+
oldValue,
|
|
526
|
+
newValue: value,
|
|
527
|
+
},
|
|
528
|
+
],
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
// 重绘
|
|
532
|
+
if (reDraw) {
|
|
533
|
+
this.ctx.emit('draw');
|
|
534
|
+
}
|
|
535
|
+
return {
|
|
536
|
+
oldValue,
|
|
537
|
+
newValue: value,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* 根据rowKey 获取行数据
|
|
542
|
+
* @param rowKey
|
|
543
|
+
* @returns
|
|
544
|
+
*/
|
|
545
|
+
getRowDataItemForRowKey(rowKey) {
|
|
546
|
+
if (!this.rowKeyMap.has(rowKey)) {
|
|
547
|
+
return {};
|
|
548
|
+
}
|
|
549
|
+
const { item } = this.rowKeyMap.get(rowKey);
|
|
550
|
+
return item;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
*
|
|
554
|
+
* @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key
|
|
555
|
+
* @param check
|
|
556
|
+
*/
|
|
557
|
+
setRowSelectionByCheckboxKey(rowKey, check) {
|
|
558
|
+
const { CHECKBOX_KEY } = this.ctx.config;
|
|
559
|
+
if (CHECKBOX_KEY) {
|
|
560
|
+
if (!this.rowKeyMap.has(rowKey)) {
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
const { item } = this.rowKeyMap.get(rowKey);
|
|
564
|
+
const checkboxKey = item[CHECKBOX_KEY];
|
|
565
|
+
if (this.checkboxKeyMap.has(checkboxKey)) {
|
|
566
|
+
const rowKeys = this.checkboxKeyMap.get(checkboxKey);
|
|
567
|
+
rowKeys.forEach((rowKey) => {
|
|
568
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
569
|
+
row.check = check;
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* 根据rowKey 取反选中
|
|
576
|
+
* @param rowKey
|
|
577
|
+
*/
|
|
578
|
+
toggleRowSelection(rowKey) {
|
|
579
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
580
|
+
row.check = !row.check;
|
|
581
|
+
this.setRowSelectionByCheckboxKey(rowKey, row.check);
|
|
582
|
+
this.ctx.emit('toggleRowSelection', row);
|
|
583
|
+
const rows = this.getSelectionRows();
|
|
584
|
+
this.ctx.emit('selectionChange', rows);
|
|
585
|
+
this.ctx.emit('draw');
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* 根据rowKey 设置选中状态
|
|
589
|
+
* @param rowKey
|
|
590
|
+
*/
|
|
591
|
+
setRowSelection(rowKey, check) {
|
|
592
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
593
|
+
row.check = check;
|
|
594
|
+
this.setRowSelectionByCheckboxKey(rowKey, row.check);
|
|
595
|
+
const rows = this.getSelectionRows();
|
|
596
|
+
this.ctx.emit('setRowSelection', rows);
|
|
597
|
+
this.ctx.emit('draw');
|
|
598
|
+
}
|
|
599
|
+
getSelectionRows() {
|
|
600
|
+
let rows = [];
|
|
601
|
+
this.rowKeyMap.forEach((row) => {
|
|
602
|
+
if (row.check) {
|
|
603
|
+
rows.push(row.item);
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
return rows;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* 根据rowKey 获取选中状态
|
|
610
|
+
* @param rowKey
|
|
611
|
+
*/
|
|
612
|
+
getRowSelection(rowKey) {
|
|
613
|
+
const { check } = this.rowKeyMap.get(rowKey);
|
|
614
|
+
return check;
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* 根据rowKey 获取选中状态
|
|
618
|
+
* @param rowKey
|
|
619
|
+
*/
|
|
620
|
+
getRowSelectable(rowKey) {
|
|
621
|
+
const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);
|
|
622
|
+
if (typeof selectable === 'function') {
|
|
623
|
+
return selectable({
|
|
624
|
+
row: item,
|
|
625
|
+
rowIndex,
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
return selectable;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* 全选
|
|
632
|
+
* @param rowKey
|
|
633
|
+
*/
|
|
634
|
+
toggleAllSelection() {
|
|
635
|
+
this.rowKeyMap.forEach((row) => {
|
|
636
|
+
const _selectable = row.selectable;
|
|
637
|
+
if (typeof _selectable === 'function') {
|
|
638
|
+
const selectable = _selectable({
|
|
639
|
+
row: row.item,
|
|
640
|
+
rowIndex: row.rowIndex,
|
|
641
|
+
});
|
|
642
|
+
if (selectable) {
|
|
643
|
+
row.check = true;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
if (_selectable) {
|
|
648
|
+
row.check = true;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
const rows = this.getSelectionRows();
|
|
653
|
+
this.ctx.emit('toggleAllSelection', rows);
|
|
654
|
+
this.ctx.emit('selectionChange', rows);
|
|
655
|
+
this.ctx.emit('draw');
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* 清除选中
|
|
659
|
+
* @param rowKey
|
|
660
|
+
*/
|
|
661
|
+
clearSelection() {
|
|
662
|
+
this.rowKeyMap.forEach((row) => {
|
|
663
|
+
const _selectable = row.selectable;
|
|
664
|
+
if (typeof _selectable === 'function') {
|
|
665
|
+
const selectable = _selectable({
|
|
666
|
+
row: row.item,
|
|
667
|
+
rowIndex: row.rowIndex,
|
|
668
|
+
});
|
|
669
|
+
if (selectable) {
|
|
670
|
+
row.check = false;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
if (_selectable) {
|
|
675
|
+
row.check = false;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
});
|
|
679
|
+
const rows = this.getSelectionRows();
|
|
680
|
+
this.ctx.emit('clearSelection');
|
|
681
|
+
this.ctx.emit('selectionChange', rows);
|
|
682
|
+
this.ctx.emit('draw');
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* 获取选中状态,表头用
|
|
686
|
+
* @param rowKey
|
|
687
|
+
*/
|
|
688
|
+
getCheckedState() {
|
|
689
|
+
let total = 0;
|
|
690
|
+
let totalChecked = 0;
|
|
691
|
+
let totalSelectable = 0;
|
|
692
|
+
this.rowKeyMap.forEach((row) => {
|
|
693
|
+
total += 1;
|
|
694
|
+
if (row.check) {
|
|
695
|
+
totalChecked += 1;
|
|
696
|
+
}
|
|
697
|
+
const _selectable = row.selectable;
|
|
698
|
+
if (typeof _selectable === 'function') {
|
|
699
|
+
const selectable = _selectable({
|
|
700
|
+
row: row.item,
|
|
701
|
+
rowIndex: row.rowIndex,
|
|
702
|
+
});
|
|
703
|
+
if (selectable) {
|
|
704
|
+
totalSelectable += 1;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
else {
|
|
708
|
+
if (_selectable) {
|
|
709
|
+
totalSelectable += 1;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
});
|
|
713
|
+
const indeterminate = totalSelectable && totalSelectable > totalChecked && totalChecked > 0;
|
|
714
|
+
const selectable = totalSelectable !== 0;
|
|
715
|
+
const check = totalSelectable && totalSelectable === totalChecked;
|
|
716
|
+
return {
|
|
717
|
+
check,
|
|
718
|
+
indeterminate,
|
|
719
|
+
selectable,
|
|
720
|
+
};
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* 更新列索引
|
|
724
|
+
* @param list 表头末级列表
|
|
725
|
+
*/
|
|
726
|
+
updateColIndexKeyMap(list = []) {
|
|
727
|
+
this.colIndexKeyMap.clear();
|
|
728
|
+
list.forEach((column) => {
|
|
729
|
+
this.colIndexKeyMap.set(column.colIndex, column.key);
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* 获取以改变数据
|
|
734
|
+
*/
|
|
735
|
+
getChangedData() {
|
|
736
|
+
let list = [];
|
|
737
|
+
this.changedDataMap.forEach((value, key) => {
|
|
738
|
+
const originalValue = this.originalDataMap.get(key);
|
|
739
|
+
const rowKey = key.split('_')[0];
|
|
740
|
+
const colKey = key.split('_')[1];
|
|
741
|
+
if (originalValue !== value) {
|
|
742
|
+
list.push({
|
|
743
|
+
rowKey,
|
|
744
|
+
colKey,
|
|
745
|
+
originalValue,
|
|
746
|
+
row: this.rowKeyMap.get(rowKey),
|
|
747
|
+
value,
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
});
|
|
751
|
+
return list;
|
|
752
|
+
}
|
|
753
|
+
getChangedRows() {
|
|
754
|
+
const rowKeyList = new Set();
|
|
755
|
+
this.changedDataMap.forEach((value, key) => {
|
|
756
|
+
const originalValue = this.originalDataMap.get(key);
|
|
757
|
+
const rowKey = key.split('_')[0];
|
|
758
|
+
if (originalValue !== value) {
|
|
759
|
+
rowKeyList.add(rowKey);
|
|
760
|
+
}
|
|
761
|
+
});
|
|
762
|
+
let rows = [];
|
|
763
|
+
rowKeyList.forEach((rowKey) => {
|
|
764
|
+
rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));
|
|
765
|
+
});
|
|
766
|
+
return rows;
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* 获取改变值是否已经改变
|
|
770
|
+
* @param rowKey
|
|
771
|
+
* @param key
|
|
772
|
+
* @returns
|
|
773
|
+
*/
|
|
774
|
+
isHasChangedData(rowKey, key) {
|
|
775
|
+
const changedKey = `${rowKey}_${key}`;
|
|
776
|
+
if (!this.changedDataMap.has(changedKey)) {
|
|
777
|
+
return false;
|
|
778
|
+
}
|
|
779
|
+
const originalValue = this.originalDataMap.get(changedKey);
|
|
780
|
+
const changedValue = this.changedDataMap.get(changedKey);
|
|
781
|
+
return originalValue !== changedValue;
|
|
782
|
+
}
|
|
783
|
+
getPositionForRowIndex(rowIndex) {
|
|
784
|
+
if (rowIndex < this.positions.length) {
|
|
785
|
+
return this.positions[rowIndex];
|
|
786
|
+
}
|
|
787
|
+
return {
|
|
788
|
+
height: 0,
|
|
789
|
+
top: 0,
|
|
790
|
+
bottom: 0,
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
setHeader(key, cellHeader) {
|
|
794
|
+
if (!key) {
|
|
795
|
+
return false;
|
|
796
|
+
}
|
|
797
|
+
this.headerMap.set(key, cellHeader);
|
|
798
|
+
return true;
|
|
799
|
+
}
|
|
800
|
+
getReadonly(rowKey, key) {
|
|
801
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
802
|
+
const colHeader = this.headerMap.get(key);
|
|
803
|
+
const rowReadonly = row?.readonly;
|
|
804
|
+
const colReadonly = colHeader?.readonly;
|
|
805
|
+
const { CELL_READONLY_METHOD } = this.ctx.config;
|
|
806
|
+
// 自定义只读
|
|
807
|
+
if (typeof CELL_READONLY_METHOD === 'function') {
|
|
808
|
+
const cellReadonlyMethod = CELL_READONLY_METHOD;
|
|
809
|
+
const readonly = cellReadonlyMethod({
|
|
810
|
+
row: row.item,
|
|
811
|
+
rowIndex: row.rowIndex,
|
|
812
|
+
colIndex: colHeader.colIndex,
|
|
813
|
+
column: colHeader.column,
|
|
814
|
+
value: this.getItemValue(rowKey, key),
|
|
815
|
+
});
|
|
816
|
+
if (readonly !== undefined) {
|
|
817
|
+
return readonly;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
return colReadonly || rowReadonly;
|
|
821
|
+
}
|
|
822
|
+
clearValidate() {
|
|
823
|
+
this.validationErrorMap.clear();
|
|
824
|
+
}
|
|
825
|
+
getValidator(rowKey, key) {
|
|
826
|
+
return new Promise((resolve) => {
|
|
827
|
+
const row = this.rowKeyMap.get(rowKey);
|
|
828
|
+
const colHeader = this.headerMap.get(key);
|
|
829
|
+
const { CELL_RULES_METHOD } = this.ctx.config;
|
|
830
|
+
const column = colHeader.column;
|
|
831
|
+
let rules = column.rules;
|
|
832
|
+
// 自定义只读
|
|
833
|
+
if (typeof CELL_RULES_METHOD === 'function') {
|
|
834
|
+
const cellRulesMethod = CELL_RULES_METHOD;
|
|
835
|
+
const _rules = cellRulesMethod({
|
|
836
|
+
row: row.item,
|
|
837
|
+
rowIndex: row.rowIndex,
|
|
838
|
+
colIndex: colHeader.colIndex,
|
|
839
|
+
column,
|
|
840
|
+
value: this.getItemValue(rowKey, key),
|
|
841
|
+
});
|
|
842
|
+
if (_rules) {
|
|
843
|
+
rules = _rules;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
if (rules) {
|
|
847
|
+
let descriptor = {};
|
|
848
|
+
let data = {};
|
|
849
|
+
data[key] = this.getItemValue(rowKey, key);
|
|
850
|
+
if (Array.isArray(rules) && rules.length) {
|
|
851
|
+
const _rules = rules.map((item) => {
|
|
852
|
+
return {
|
|
853
|
+
...item,
|
|
854
|
+
row: row.item,
|
|
855
|
+
column,
|
|
856
|
+
rowIndex: row.rowIndex,
|
|
857
|
+
colIndex: colHeader.colIndex,
|
|
858
|
+
};
|
|
859
|
+
});
|
|
860
|
+
descriptor[key] = _rules;
|
|
861
|
+
}
|
|
862
|
+
else {
|
|
863
|
+
descriptor[key] = {
|
|
864
|
+
...rules,
|
|
865
|
+
row: row.item,
|
|
866
|
+
column,
|
|
867
|
+
rowIndex: row.rowIndex,
|
|
868
|
+
colIndex: colHeader.colIndex,
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
const validator = new Schema(descriptor);
|
|
872
|
+
validator
|
|
873
|
+
.validate(data)
|
|
874
|
+
.then(() => {
|
|
875
|
+
this.setValidationError(rowKey, key, []);
|
|
876
|
+
resolve([]);
|
|
877
|
+
})
|
|
878
|
+
.catch(({ errors }) => {
|
|
879
|
+
const _errors = errors.map((error) => ({
|
|
880
|
+
...error,
|
|
881
|
+
column,
|
|
882
|
+
key,
|
|
883
|
+
row: row.item,
|
|
884
|
+
rowKey,
|
|
885
|
+
}));
|
|
886
|
+
this.setValidationError(rowKey, key, _errors);
|
|
887
|
+
resolve(_errors);
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
else {
|
|
891
|
+
resolve([]);
|
|
892
|
+
}
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
getHeightByRowIndexRowSpan(rowIndex, rowSpan) {
|
|
896
|
+
let sumHeight = 0;
|
|
897
|
+
for (let i = 0; i < rowSpan; i++) {
|
|
898
|
+
const position = this.positions[rowIndex + i];
|
|
899
|
+
if (position) {
|
|
900
|
+
sumHeight += position.height;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
return sumHeight;
|
|
904
|
+
}
|
|
905
|
+
setLoading(loading) {
|
|
906
|
+
this.loading = loading;
|
|
907
|
+
this.ctx.emit('loadingChange', loading);
|
|
908
|
+
}
|
|
909
|
+
getLoading() {
|
|
910
|
+
return this.loading;
|
|
911
|
+
}
|
|
912
|
+
setValidationErrorByRowIndex(rowIndex, key, message) {
|
|
913
|
+
const rowKey = this.rowIndexRowKeyMap.get(rowIndex);
|
|
914
|
+
const _key = `${rowKey}_${key}`;
|
|
915
|
+
const errors = [
|
|
916
|
+
{
|
|
917
|
+
message,
|
|
918
|
+
},
|
|
919
|
+
];
|
|
920
|
+
this.validationErrorMap.set(_key, errors);
|
|
921
|
+
}
|
|
922
|
+
setValidationError(rowKey, key, errors) {
|
|
923
|
+
const _key = `${rowKey}_${key}`;
|
|
924
|
+
this.validationErrorMap.set(_key, errors);
|
|
925
|
+
}
|
|
926
|
+
getValidationError(rowKey, key) {
|
|
927
|
+
const _key = `${rowKey}_${key}`;
|
|
928
|
+
return this.validationErrorMap.get(_key) || [];
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
//# sourceMappingURL=Database.js.map
|