@ctzy-web-client/data-model 1.0.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/package.json +33 -0
- package/src/SimpleOrm.js +123 -0
- package/src/abstract/DataColumn.js +164 -0
- package/src/abstract/DataForm.js +342 -0
- package/src/abstract/DataModel.js +327 -0
- package/src/abstract/DataModelAdapter.js +241 -0
- package/src/abstract/DataTable.js +627 -0
- package/src/abstract/FilterColumn.js +60 -0
- package/src/abstract/FilterPanel.js +678 -0
- package/src/abstract/FormColumn.js +63 -0
- package/src/abstract/TableColumn.js +83 -0
- package/src/abstract/where/CombineCondition.js +115 -0
- package/src/abstract/where/Condition.js +3 -0
- package/src/abstract/where/SingleCondition.js +22 -0
- package/src/abstract/where/Where.js +22 -0
- package/src/decorator/constant.js +13 -0
- package/src/decorator/dataForm.js +35 -0
- package/src/decorator/dataTable.js +38 -0
- package/src/decorator/filterColumn.js +29 -0
- package/src/decorator/formColumn.js +60 -0
- package/src/decorator/tableColumn.js +42 -0
- package/src/factory.js +25 -0
- package/src/index.js +26 -0
- package/src/utils/index.js +16 -0
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
import { cloneDeep } from 'lodash';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DATA_TABLE,
|
|
5
|
+
DATA_TABLE_COLUMNS,
|
|
6
|
+
DATA_TABLE_FILTER_COLUMN,
|
|
7
|
+
} from '../decorator/constant';
|
|
8
|
+
import { sortColumn } from '../utils';
|
|
9
|
+
import DataModel from './DataModel';
|
|
10
|
+
import FilterColumn from './FilterColumn';
|
|
11
|
+
import TableColumn from './TableColumn';
|
|
12
|
+
|
|
13
|
+
import { FilterPanel } from './FilterPanel';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @class DataTable
|
|
17
|
+
* @extends DataModel
|
|
18
|
+
*/
|
|
19
|
+
export default class DataTable extends DataModel {
|
|
20
|
+
/**
|
|
21
|
+
* @returns {Array<FilterColumn>} 字段数组
|
|
22
|
+
*/
|
|
23
|
+
get filterColumns() {
|
|
24
|
+
return this.filterPanel.getColumns();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @type {boolean} 锁定中
|
|
29
|
+
*/
|
|
30
|
+
get locking() {
|
|
31
|
+
return this._loadingCount > 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
_userService = null;
|
|
35
|
+
|
|
36
|
+
_loadingCount = 0;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @type {Number} 记录总数
|
|
40
|
+
*/
|
|
41
|
+
totalRecCount = 0;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @type {Number} 字段数组
|
|
45
|
+
*/
|
|
46
|
+
pageNum = 1;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @type {Number} 字段数组
|
|
50
|
+
*/
|
|
51
|
+
pageSize = 20;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @type {Object} 筛选参数
|
|
55
|
+
*/
|
|
56
|
+
get searchParams() {
|
|
57
|
+
return this.filterPanel._filterParams;
|
|
58
|
+
}
|
|
59
|
+
// searchParams = {};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @type {Array<Object>} 选中项
|
|
63
|
+
*/
|
|
64
|
+
selection = [];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @type {Array<Object>} 数据
|
|
68
|
+
*/
|
|
69
|
+
data = [];
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @type {Array<Object>} 默认列排序
|
|
73
|
+
*/
|
|
74
|
+
_defaultColumnSort = [];
|
|
75
|
+
|
|
76
|
+
inited = false;
|
|
77
|
+
|
|
78
|
+
filterPanel = new FilterPanel(this);
|
|
79
|
+
|
|
80
|
+
set whereForFilter(v) {
|
|
81
|
+
this._options.whereForFilter = v;
|
|
82
|
+
if (this.filterPanel) {
|
|
83
|
+
this.filterPanel.whereForFilter = v;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
get whereForFilter() {
|
|
88
|
+
return this._options.whereForFilter;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
set whereParamName(v) {
|
|
92
|
+
this.filterPanel.whereParamName = v;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
get whereParamName() {
|
|
96
|
+
return this.filterPanel.whereParamName;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
set encryptCondition(v) {
|
|
100
|
+
this.filterPanel.encryptCondition = v;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
get encryptCondition() {
|
|
104
|
+
return this.filterPanel.encryptCondition;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @template T
|
|
109
|
+
* @param {Object} option 配置
|
|
110
|
+
* @param {String} option.name 表格名称
|
|
111
|
+
* @param {T} option.model
|
|
112
|
+
* @param {String} option.title 表格标题
|
|
113
|
+
* @param {String} option.primaryKey 主键字段名
|
|
114
|
+
*/
|
|
115
|
+
constructor(option) {
|
|
116
|
+
super(option);
|
|
117
|
+
|
|
118
|
+
this.whereForFilter = this.whereForFilter;
|
|
119
|
+
|
|
120
|
+
this._loadCallbacks = [];
|
|
121
|
+
|
|
122
|
+
this.filterPanel.on('ready', () => {
|
|
123
|
+
for (let callback of this._loadCallbacks) {
|
|
124
|
+
callback();
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 获取总页数
|
|
131
|
+
* @returns {Number} 总页数
|
|
132
|
+
*/
|
|
133
|
+
getTotalPage() {
|
|
134
|
+
const totalPage = Math.ceil(this.totalRecCount / this.pageSize);
|
|
135
|
+
return Number.isNaN(totalPage) ? 0 : totalPage;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* 设置选项
|
|
140
|
+
* @param {Object} options 选项
|
|
141
|
+
*/
|
|
142
|
+
setOptions(options) {
|
|
143
|
+
if (!options.model) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
super.setOptions({ ...options.model[DATA_TABLE], model: options.model });
|
|
148
|
+
|
|
149
|
+
this.whereForFilter = options.model[DATA_TABLE].whereForFilter ?? false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* 设置选中项
|
|
154
|
+
* @param {Array<Object>} selection 选中项
|
|
155
|
+
*/
|
|
156
|
+
setSelection(selection) {
|
|
157
|
+
const oldSelection = this.selection;
|
|
158
|
+
|
|
159
|
+
this.selection = selection;
|
|
160
|
+
|
|
161
|
+
this.emit('select-change', selection, oldSelection);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 获取选中项
|
|
166
|
+
* @returns {Array<Object>} 选中项
|
|
167
|
+
*/
|
|
168
|
+
getSelection() {
|
|
169
|
+
return this.selection;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* 清空选中项
|
|
174
|
+
*/
|
|
175
|
+
clearSelection() {
|
|
176
|
+
this.setSelection([]);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* 设置where参数名
|
|
181
|
+
* @param {String} whereParamName where参数名
|
|
182
|
+
*/
|
|
183
|
+
setWhereParamName(whereParamName) {
|
|
184
|
+
this.whereParamName = whereParamName;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* 初始化
|
|
189
|
+
*/
|
|
190
|
+
init() {
|
|
191
|
+
if (this.inited) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
super.init();
|
|
196
|
+
|
|
197
|
+
const model = this.model;
|
|
198
|
+
if (!model) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (this.extendField) {
|
|
203
|
+
this._loadingCount++;
|
|
204
|
+
return;
|
|
205
|
+
} else {
|
|
206
|
+
let tableColumnConfigs = model.tableColumns || [];
|
|
207
|
+
|
|
208
|
+
const tableColumns = (model[DATA_TABLE_COLUMNS] || []).map(
|
|
209
|
+
(columnConfig) =>
|
|
210
|
+
new TableColumn({
|
|
211
|
+
type: columnConfig.formComponent === 'BwaRichText' ? 'html' : '',
|
|
212
|
+
...columnConfig,
|
|
213
|
+
})
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
tableColumnConfigs = tableColumnConfigs.concat(
|
|
217
|
+
tableColumns
|
|
218
|
+
.filter((column) => !tableColumnConfigs.includes(column.name))
|
|
219
|
+
.map((column) => column.attrName)
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
sortColumn(tableColumns, tableColumnConfigs).forEach((tableColumn) => {
|
|
223
|
+
this.addColumn(tableColumn);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
this._defaultColumnSort = this.getColumns().map((column) => ({
|
|
228
|
+
name: column.attrName,
|
|
229
|
+
visible: column.visible,
|
|
230
|
+
}));
|
|
231
|
+
|
|
232
|
+
this.filterPanel.init(
|
|
233
|
+
[],
|
|
234
|
+
model[DATA_TABLE_FILTER_COLUMN] || [],
|
|
235
|
+
model.filterColumns || []
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
this.inited = true;
|
|
239
|
+
|
|
240
|
+
this.emit('init-completed');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* 设置数据
|
|
245
|
+
* @param {Array<Object>} data 数据列表
|
|
246
|
+
* @param {Boolean} append 是否追加数据
|
|
247
|
+
*/
|
|
248
|
+
setData(data, append = false) {
|
|
249
|
+
if (!append) {
|
|
250
|
+
this.data.length = 0;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
this.data.push(...data);
|
|
254
|
+
|
|
255
|
+
//设置完数据 以为准备就绪
|
|
256
|
+
this.ready = true;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* 加载自定义字段数据并读取label
|
|
261
|
+
*/
|
|
262
|
+
async setDataBeforeMount (data = []) {
|
|
263
|
+
if (this.extendFieldInfos.every(a => a.type !== 0)) {
|
|
264
|
+
return data
|
|
265
|
+
}
|
|
266
|
+
const colMap = {}
|
|
267
|
+
let userListResult = {}
|
|
268
|
+
if (this.extendFieldInfos.some(a => ['BwaUserSelect', 'BwaUserMultiSelect'].includes(a.component))) {
|
|
269
|
+
if (this._userService) {
|
|
270
|
+
userListResult = await this._userService({ name: '' });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
this.extendFieldInfos.forEach( e=>{
|
|
274
|
+
if (e.type === 0) {
|
|
275
|
+
if (['BwaSelect', 'BwaMultiSelect'].includes(e.component)) {
|
|
276
|
+
colMap[e.name] = e.extendInfo?.options
|
|
277
|
+
}
|
|
278
|
+
if (['BwaUserSelect', 'BwaUserMultiSelect'].includes(e.component)) {
|
|
279
|
+
colMap[e.name] = userListResult?.data || []
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
})
|
|
283
|
+
// 单个参数
|
|
284
|
+
const getValueByString = (key, value)=>{
|
|
285
|
+
let arr = colMap[key] || []
|
|
286
|
+
let find = arr.find(item=>item.value == value)
|
|
287
|
+
return find ? find.label : (value || '-')
|
|
288
|
+
}
|
|
289
|
+
// 多个参数
|
|
290
|
+
const getValueByArray = (key, valueList)=>{
|
|
291
|
+
let list = []
|
|
292
|
+
valueList.forEach(v => {
|
|
293
|
+
list.push(getValueByString(key, v))
|
|
294
|
+
})
|
|
295
|
+
return list
|
|
296
|
+
}
|
|
297
|
+
data.forEach(e=>{
|
|
298
|
+
let obj = e.columnJson || e.json || {}
|
|
299
|
+
Object.keys(obj).forEach(key=>{
|
|
300
|
+
// 字符串, 数字
|
|
301
|
+
if (['string', 'number'].includes(typeof obj[key])) obj[key] = getValueByString(key, obj[key])
|
|
302
|
+
// 数组
|
|
303
|
+
if (Array.isArray(obj[key])) obj[key] = getValueByArray(key, obj[key])
|
|
304
|
+
})
|
|
305
|
+
})
|
|
306
|
+
return data
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* 加载数据
|
|
310
|
+
* @returns {Promise} 加载数据的Promise
|
|
311
|
+
*/
|
|
312
|
+
async load(params) {
|
|
313
|
+
if (!this.filterPanel.ready) {
|
|
314
|
+
return new Promise((resolve, reject) => {
|
|
315
|
+
this._loadCallbacks.push(() => {
|
|
316
|
+
this.load(params).then(resolve, reject);
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
//获取正式数据
|
|
322
|
+
this.ready = false;
|
|
323
|
+
// this.locking = true;
|
|
324
|
+
this._loadingCount++;
|
|
325
|
+
|
|
326
|
+
const loadParams = {
|
|
327
|
+
[this.adapter.pagerNumParamName]: this.pageNum,
|
|
328
|
+
[this.adapter.recCountParamName]: this.pageSize,
|
|
329
|
+
...this.defaultParams,
|
|
330
|
+
...this.filterPanel.getAjaxParams(),
|
|
331
|
+
...params,
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
//加载完成
|
|
335
|
+
this.emit('before-load', loadParams);
|
|
336
|
+
|
|
337
|
+
return this.adapter
|
|
338
|
+
.loadDataListHandle(this, loadParams)
|
|
339
|
+
.then((res) => {
|
|
340
|
+
//记录总数
|
|
341
|
+
this.totalRecCount = res[this.adapter.totalRecCountNodeName]
|
|
342
|
+
? res[this.adapter.totalRecCountNodeName] * 1
|
|
343
|
+
: 0;
|
|
344
|
+
|
|
345
|
+
const data = (res[this.adapter.dataNodeName] || []).map(
|
|
346
|
+
this.formatData.bind(this)
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
//设置数据
|
|
350
|
+
this.setDataBeforeMount(data).then(arr => {
|
|
351
|
+
this.setData(arr);
|
|
352
|
+
})
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
this.emit('load-successfully', res);
|
|
356
|
+
|
|
357
|
+
return res;
|
|
358
|
+
})
|
|
359
|
+
.catch((e) => {
|
|
360
|
+
this.emit('load-failed', e);
|
|
361
|
+
return Promise.reject(e);
|
|
362
|
+
})
|
|
363
|
+
.finally(() => {
|
|
364
|
+
this.emit('load-complete');
|
|
365
|
+
// this.locking = false;
|
|
366
|
+
this._loadingCount--;
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* 刷新
|
|
372
|
+
* @returns {Promise} 刷新的Promise
|
|
373
|
+
*/
|
|
374
|
+
refresh() {
|
|
375
|
+
return this.load();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* 翻页
|
|
380
|
+
* @param {Number} pageNum 页码
|
|
381
|
+
* @returns {Promise} 翻页的Promise
|
|
382
|
+
*/
|
|
383
|
+
pageTo(pageNum) {
|
|
384
|
+
this.pageNum = pageNum || 1;
|
|
385
|
+
this.emit('current-page-change', this.pageNum);
|
|
386
|
+
return this.refresh();
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* 设置每页显示数量
|
|
391
|
+
* @param {Number} pageSize 每页显示数量
|
|
392
|
+
* @returns {Promise} 设置每页显示数量的Promise
|
|
393
|
+
*/
|
|
394
|
+
setPageSize(pageSize) {
|
|
395
|
+
this.pageSize = pageSize;
|
|
396
|
+
this.emit('page-size-change', this.pageSize);
|
|
397
|
+
return this.refresh();
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* 删除数据
|
|
402
|
+
* @param {Object} params 参数
|
|
403
|
+
* @returns {Promise} 删除数据的Promise
|
|
404
|
+
*/
|
|
405
|
+
async delete(params) {
|
|
406
|
+
if (this.locking) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
// this.locking = true;
|
|
410
|
+
this._loadingCount++;
|
|
411
|
+
|
|
412
|
+
if (typeof params !== 'object') {
|
|
413
|
+
params = { [this.primaryKey]: params };
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
return this.adapter
|
|
417
|
+
.deleteHandle(this, params)
|
|
418
|
+
.then((res) => {
|
|
419
|
+
this.emit('delete-successfully', res);
|
|
420
|
+
|
|
421
|
+
return res;
|
|
422
|
+
})
|
|
423
|
+
.catch((e) => {
|
|
424
|
+
this.emit('delete-failed', e);
|
|
425
|
+
throw e;
|
|
426
|
+
})
|
|
427
|
+
.finally(() => {
|
|
428
|
+
// this.locking = false;
|
|
429
|
+
this._loadingCount--;
|
|
430
|
+
this.emit('delete-complete');
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
formatExtendFieldInfo(extendFieldInfo) {
|
|
435
|
+
return {
|
|
436
|
+
...super.formatExtendFieldInfo(extendFieldInfo),
|
|
437
|
+
component: '',
|
|
438
|
+
formComponent: extendFieldInfo.component,
|
|
439
|
+
visible: !!extendFieldInfo.enablePageShow,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
mergeTableColumn(formatedExtendFieldInfo, modelFieldInfo) {
|
|
444
|
+
return {
|
|
445
|
+
...super.mergeTableColumn(formatedExtendFieldInfo, modelFieldInfo),
|
|
446
|
+
visible: modelFieldInfo?.visible ?? true,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
setExtendFieldInfos(extendFieldInfos) {
|
|
451
|
+
this.extendFieldInfos = extendFieldInfos;
|
|
452
|
+
|
|
453
|
+
const mergedColumnInfos = this.mergeTableColumns(
|
|
454
|
+
extendFieldInfos,
|
|
455
|
+
this.model[DATA_TABLE_COLUMNS]
|
|
456
|
+
);
|
|
457
|
+
|
|
458
|
+
const tableColumns = mergedColumnInfos.map(
|
|
459
|
+
(columnInfo) =>
|
|
460
|
+
new TableColumn({
|
|
461
|
+
type: columnInfo.formComponent === 'BwaRichText' ? 'html' : '',
|
|
462
|
+
...columnInfo,
|
|
463
|
+
})
|
|
464
|
+
);
|
|
465
|
+
|
|
466
|
+
this.setColumns(tableColumns);
|
|
467
|
+
|
|
468
|
+
this._defaultColumnSort = this.getColumns().map((column) => ({
|
|
469
|
+
name: column.attrName,
|
|
470
|
+
visible: column.visible,
|
|
471
|
+
}));
|
|
472
|
+
|
|
473
|
+
this.filterPanel.init(
|
|
474
|
+
extendFieldInfos,
|
|
475
|
+
this.model[DATA_TABLE_FILTER_COLUMN] || [],
|
|
476
|
+
this.model.filterColumns || []
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
this._loadingCount--;
|
|
480
|
+
|
|
481
|
+
this.inited = true;
|
|
482
|
+
|
|
483
|
+
this.emit('init-completed');
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* 删除完成后刷新列表
|
|
488
|
+
* @param {Object} params 参数
|
|
489
|
+
* @returns {Promise} 删除完成后刷新列表的Promise
|
|
490
|
+
*/
|
|
491
|
+
async refreshAfterDelete(params) {
|
|
492
|
+
const deleteResult = await this.delete(params);
|
|
493
|
+
|
|
494
|
+
this.refresh();
|
|
495
|
+
|
|
496
|
+
return deleteResult;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* 对列进行排序
|
|
501
|
+
* @param {Array} columns 列
|
|
502
|
+
* @returns {Array} 排序后的列
|
|
503
|
+
*/
|
|
504
|
+
sortColumns(columns) {
|
|
505
|
+
return sortColumn(columns, this.model.tableColumns || []);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* 重置列排序
|
|
510
|
+
*/
|
|
511
|
+
resetColumnSort() {
|
|
512
|
+
if (this.isDefaultColumnSort()) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
this._defaultColumnSort.forEach((item) => {
|
|
517
|
+
const column = this.getColumn(item.name);
|
|
518
|
+
|
|
519
|
+
if (column) {
|
|
520
|
+
column.visible = item.visible;
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
const displayColumns = this._defaultColumnSort
|
|
525
|
+
.filter((item) => item.visible)
|
|
526
|
+
.map((item) => {
|
|
527
|
+
return this.getColumn(item.name);
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
this.setDisplayColumns(displayColumns);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* 是否为默认列排序
|
|
535
|
+
* @returns {Boolean} 是否为默认列排序
|
|
536
|
+
*/
|
|
537
|
+
isDefaultColumnSort() {
|
|
538
|
+
const displayColumns = this.getDisplayColumns();
|
|
539
|
+
|
|
540
|
+
const defaultVisibleColumnInfos = this._defaultColumnSort.filter(
|
|
541
|
+
(item) => item.visible
|
|
542
|
+
);
|
|
543
|
+
|
|
544
|
+
if (displayColumns.length !== defaultVisibleColumnInfos.length) {
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
for (let i = 0; i < displayColumns.length; i++) {
|
|
549
|
+
if (
|
|
550
|
+
displayColumns[i].attrName !== defaultVisibleColumnInfos[i].name ||
|
|
551
|
+
displayColumns[i].visible !== defaultVisibleColumnInfos[i].visible
|
|
552
|
+
) {
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* 添加筛选字段
|
|
562
|
+
* @param {FilterColumn} column 筛选字段
|
|
563
|
+
*/
|
|
564
|
+
addFilterColumn(column) {
|
|
565
|
+
this.filterPanel.addColumn(column);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* 移除筛选字段
|
|
570
|
+
* @param {FilterColumn} column 筛选字段
|
|
571
|
+
*/
|
|
572
|
+
removeFilterColumn(column) {
|
|
573
|
+
this.filterPanel.removeColumn(column);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* 设置筛选字段
|
|
578
|
+
* @param {Array} columns
|
|
579
|
+
* @memberof DataTable
|
|
580
|
+
*/
|
|
581
|
+
setFilterColumns(columns) {
|
|
582
|
+
this.filterPanel.setColumns(columns);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* 获取筛选字段
|
|
587
|
+
* @returns {Array} 筛选字段
|
|
588
|
+
*/
|
|
589
|
+
getFilterColumns() {
|
|
590
|
+
return this.filterPanel.getColumns();
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* 获取筛选字段
|
|
595
|
+
* @param {String} columnName 字段名称
|
|
596
|
+
* @returns {FilterColumn} 筛选字段
|
|
597
|
+
*/
|
|
598
|
+
getFilterColumn(columnName) {
|
|
599
|
+
return this.filterPanel.getColumn(columnName);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* 重置搜索参数
|
|
604
|
+
*/
|
|
605
|
+
resetSearchParams() {
|
|
606
|
+
this.filterPanel.resetFilterParams();
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* 克隆
|
|
611
|
+
* @returns {DataTable} 克隆后的DataTable
|
|
612
|
+
*/
|
|
613
|
+
clone() {
|
|
614
|
+
const cloned = super.clone();
|
|
615
|
+
cloned.data = cloneDeep(this.data);
|
|
616
|
+
cloned.filterPanel = cloneDeep(this.filterPanel);
|
|
617
|
+
cloned.selection = this.selection
|
|
618
|
+
.map((select) => {
|
|
619
|
+
return cloned.data.find(
|
|
620
|
+
(item) => item[this.primaryKey] === select[this.primaryKey]
|
|
621
|
+
);
|
|
622
|
+
})
|
|
623
|
+
.filter(Boolean);
|
|
624
|
+
|
|
625
|
+
return cloned;
|
|
626
|
+
}
|
|
627
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import DataColumn from './DataColumn';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 筛选列定义
|
|
5
|
+
*/
|
|
6
|
+
export default class FilterColumn extends DataColumn {
|
|
7
|
+
closable = true;
|
|
8
|
+
|
|
9
|
+
attrMapping = {
|
|
10
|
+
start: { name: '${name}', op: '>=' },
|
|
11
|
+
end: { name: '${name}', op: '<=' },
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
conditionOper = 'AND';
|
|
15
|
+
|
|
16
|
+
formComponent = '';
|
|
17
|
+
|
|
18
|
+
twoFieldsDatePicker = false;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 注入
|
|
22
|
+
* @param {Object} options 配置
|
|
23
|
+
* @param {String} options.name 字段名称,如果字段名用,号分隔的话 2个字段将会接受组件返回的数组的2个值,一次类推
|
|
24
|
+
* @param {String} options.title 字段标题
|
|
25
|
+
* @param {Boolean} options.visible 字段在渲染组件里是否渲染 默认:true
|
|
26
|
+
* @param {Object|Function|String} options.component 字段在组件里面渲染的所用到的组件,可以是组件对象,字符串,或者方法,工厂方法必然返回vnode 默认:无,
|
|
27
|
+
* @param {Object|Function} options.componentProps 字段在组件中渲染所需要的配置参数,如果是函数的话函数的第一个参数会返回当前数据列对象和当前行数据,此时可动态返回所需参数
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
30
|
+
constructor(filterPanel, options) {
|
|
31
|
+
super(options);
|
|
32
|
+
this.closable = options.closable ?? this.closable;
|
|
33
|
+
this.attrMapping =
|
|
34
|
+
options.attrMapping ?? options.whereAttrMapping ?? this.attrMapping;
|
|
35
|
+
this.filterPanel = filterPanel;
|
|
36
|
+
this.conditionOper = options.conditionOper;
|
|
37
|
+
this.formComponent = options.formComponent ?? this.formComponent;
|
|
38
|
+
this.twoFieldsDatePicker = options.twoFieldsDatePicker;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
show() {
|
|
42
|
+
const visible = this.visible;
|
|
43
|
+
|
|
44
|
+
super.show();
|
|
45
|
+
|
|
46
|
+
if (visible !== this.visible) {
|
|
47
|
+
this.filterPanel.appliedColumn(this);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
hide() {
|
|
52
|
+
const visible = this.visible;
|
|
53
|
+
|
|
54
|
+
super.hide();
|
|
55
|
+
|
|
56
|
+
if (visible !== this.visible) {
|
|
57
|
+
this.filterPanel.cancelAppliedColumn(this);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|