iov-design 2.15.30 → 2.15.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/calendar.js +2 -2
- package/lib/cascader-panel.js +8 -8
- package/lib/cascader.js +2 -2
- package/lib/color-picker.js +4 -4
- package/lib/date-picker.js +6 -6
- package/lib/image.js +8 -8
- package/lib/index.js +1 -1
- package/lib/iov-design.common.js +333 -12
- package/lib/loading.js +8 -8
- package/lib/message-box.js +10 -10
- package/lib/message.js +8 -8
- package/lib/notification.js +8 -8
- package/lib/pagination.js +2 -2
- package/lib/popover.js +8 -8
- package/lib/select.js +8 -8
- package/lib/table-column.js +76 -6
- package/lib/table.js +273 -22
- package/lib/theme-chalk/date-picker.css +1 -1
- package/lib/theme-chalk/index.css +1 -1
- package/lib/theme-chalk/table.css +1 -1
- package/lib/theme-chalk/time-picker.css +1 -1
- package/lib/theme-chalk/time-select.css +1 -1
- package/lib/time-picker.js +11 -11
- package/lib/time-select.js +8 -8
- package/lib/tooltip.js +2 -2
- package/lib/transfer.js +8 -8
- package/lib/upload.js +8 -8
- package/package.json +1 -1
- package/packages/table/src/config.js +32 -4
- package/packages/table/src/store/watcher.js +65 -5
- package/packages/table/src/table-header.js +149 -0
- package/packages/table/src/table.vue +6 -0
- package/packages/theme-chalk/src/date-picker/picker.scss +1 -1
- package/packages/theme-chalk/src/table.scss +34 -8
- package/src/index.js +1 -1
|
@@ -58,6 +58,15 @@ export default Vue.extend({
|
|
|
58
58
|
selectOnIndeterminate: false,
|
|
59
59
|
selectable: null,
|
|
60
60
|
|
|
61
|
+
// 跨页全选标记
|
|
62
|
+
isCrossPageSelection: false,
|
|
63
|
+
// 全选下拉出现/隐藏事件
|
|
64
|
+
showSelectionDropdown: false,
|
|
65
|
+
// 1-全选当前页 2-取消全选当前页 3-全选所有页 4-取消全选所有页
|
|
66
|
+
selectionType: 0,
|
|
67
|
+
// 已取消勾选的数据
|
|
68
|
+
unSelectedRow: [],
|
|
69
|
+
|
|
61
70
|
// 过滤
|
|
62
71
|
filters: {}, // 不可响应的
|
|
63
72
|
filteredData: null,
|
|
@@ -126,9 +135,17 @@ export default Vue.extend({
|
|
|
126
135
|
const states = this.states;
|
|
127
136
|
states.isAllSelected = false;
|
|
128
137
|
const oldSelection = states.selection;
|
|
138
|
+
|
|
139
|
+
// 表格中有选中的数据项是disabled状态时,清空时保留该数据
|
|
140
|
+
const isDisabledSelection = states.data.filter((row, index) => {
|
|
141
|
+
// 判断selectable是不可选中状态, 且当前数据项已被选中
|
|
142
|
+
if (states.selectable && !states.selectable.call(null, row, index) && oldSelection.some(item => item[states.rowKey] === row[states.rowKey])) {
|
|
143
|
+
return row;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
129
146
|
if (oldSelection.length) {
|
|
130
|
-
states.selection =
|
|
131
|
-
this.table.$emit('selection-change',
|
|
147
|
+
states.selection = isDisabledSelection;
|
|
148
|
+
this.table.$emit('selection-change', states.selection, false);
|
|
132
149
|
}
|
|
133
150
|
},
|
|
134
151
|
|
|
@@ -151,7 +168,7 @@ export default Vue.extend({
|
|
|
151
168
|
if (deleted.length) {
|
|
152
169
|
const newSelection = selection.filter(item => deleted.indexOf(item) === -1);
|
|
153
170
|
states.selection = newSelection;
|
|
154
|
-
this.table.$emit('selection-change', newSelection.slice());
|
|
171
|
+
this.table.$emit('selection-change', newSelection.slice(), false);
|
|
155
172
|
}
|
|
156
173
|
},
|
|
157
174
|
|
|
@@ -161,12 +178,48 @@ export default Vue.extend({
|
|
|
161
178
|
const newSelection = (this.states.selection || []).slice();
|
|
162
179
|
// 调用 API 修改选中值,不触发 select 事件
|
|
163
180
|
if (emitChange) {
|
|
181
|
+
this.getUnSelectedRow(newSelection);
|
|
164
182
|
this.table.$emit('select', newSelection, row);
|
|
165
183
|
}
|
|
166
|
-
this.
|
|
184
|
+
if (this.states.isCrossPageSelection) {
|
|
185
|
+
this.table.$emit('selection-change', this.states.unSelectedRow, true);
|
|
186
|
+
} else {
|
|
187
|
+
this.table.$emit('selection-change', newSelection, false);
|
|
188
|
+
}
|
|
167
189
|
}
|
|
168
190
|
},
|
|
169
191
|
|
|
192
|
+
/**
|
|
193
|
+
* 获取取消勾选数据项
|
|
194
|
+
* @param {arr} selection 当前已选择所有数据项
|
|
195
|
+
*/
|
|
196
|
+
getUnSelectedRow(selection) {
|
|
197
|
+
if (!this.states.isCrossPageSelection) return;
|
|
198
|
+
|
|
199
|
+
const { rowKey } = this.table;
|
|
200
|
+
|
|
201
|
+
// 从全部勾选数据中过滤出当前页勾选的数据
|
|
202
|
+
const selected = this.table.data.filter(item => selection.some(row => row[rowKey] === item[rowKey]));
|
|
203
|
+
// 通过当前页数据与当前页已勾选的数据, 过滤出当前页未勾选的数据
|
|
204
|
+
const unselected = this.table.data.filter((item) => !selected.some((row) => row[rowKey] === item[rowKey]));
|
|
205
|
+
|
|
206
|
+
// 取消勾选数据中是否存在当页面已勾选的数据项, 如有则删除
|
|
207
|
+
const index = [];
|
|
208
|
+
this.states.unSelectedRow.forEach((item, i) => {
|
|
209
|
+
if (selected.some(s => s[rowKey] === item[rowKey])) {
|
|
210
|
+
index.push(i);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
this.states.unSelectedRow = this.states.unSelectedRow.filter((item, i) => !index.includes(i));
|
|
214
|
+
|
|
215
|
+
// 取消勾选数据中如果不存在当前页未勾选的数据, 则将当前未勾选的数据添push到取消勾选数据中
|
|
216
|
+
unselected.forEach(item => {
|
|
217
|
+
if (!this.states.unSelectedRow.some(s => s[rowKey] === item[rowKey])) {
|
|
218
|
+
this.states.unSelectedRow.push(item);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
},
|
|
222
|
+
|
|
170
223
|
_toggleAllSelection() {
|
|
171
224
|
const states = this.states;
|
|
172
225
|
const { data = [], selection } = states;
|
|
@@ -190,8 +243,15 @@ export default Vue.extend({
|
|
|
190
243
|
}
|
|
191
244
|
});
|
|
192
245
|
|
|
246
|
+
const newSelection = (this.states.selection || []).slice();
|
|
247
|
+
|
|
193
248
|
if (selectionChanged) {
|
|
194
|
-
|
|
249
|
+
if (states.isCrossPageSelection) {
|
|
250
|
+
this.getUnSelectedRow(newSelection);
|
|
251
|
+
this.table.$emit('selection-change', states.unSelectedRow || [], true);
|
|
252
|
+
} else {
|
|
253
|
+
this.table.$emit('selection-change', selection ? selection.slice() : [], false);
|
|
254
|
+
}
|
|
195
255
|
}
|
|
196
256
|
this.table.$emit('select-all', selection);
|
|
197
257
|
},
|
|
@@ -4,6 +4,7 @@ import ElCheckbox from 'iov-design/packages/checkbox';
|
|
|
4
4
|
import FilterPanel from './filter-panel.vue';
|
|
5
5
|
import LayoutObserver from './layout-observer';
|
|
6
6
|
import { mapStates } from './store/helper';
|
|
7
|
+
import { toggleRowStatus } from './util';
|
|
7
8
|
|
|
8
9
|
const getAllColumns = (columns) => {
|
|
9
10
|
const result = [];
|
|
@@ -187,6 +188,52 @@ export default {
|
|
|
187
188
|
})
|
|
188
189
|
},
|
|
189
190
|
|
|
191
|
+
watch: {
|
|
192
|
+
'store.states.data': {
|
|
193
|
+
handler() {
|
|
194
|
+
const { states } = this.store;
|
|
195
|
+
const { data = [], selection } = states;
|
|
196
|
+
const { rowKey } = this.table;
|
|
197
|
+
// 全选所有页
|
|
198
|
+
if (this.store.states.isCrossPageSelection) {
|
|
199
|
+
|
|
200
|
+
states.isAllSelected = true;
|
|
201
|
+
|
|
202
|
+
data.forEach((row, index) => {
|
|
203
|
+
if (states.selectable) {
|
|
204
|
+
if (states.selectable.call(null, row, index)) {
|
|
205
|
+
// 如果已勾选数据中不包含当前页数据(如跳转至新的一页), 则勾选
|
|
206
|
+
if (!selection.some(o => o[rowKey] === row[rowKey])) {
|
|
207
|
+
toggleRowStatus(selection, row, true);
|
|
208
|
+
}
|
|
209
|
+
if (states.unSelectedRow.some(o => o[rowKey] === row[rowKey])) {
|
|
210
|
+
// 如果取消勾选数据中包含当前页数据项, 则取消勾选
|
|
211
|
+
toggleRowStatus(selection, row, false);
|
|
212
|
+
states.isAllSelected = false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
// 如果已勾选数据中不包含当前页数据(如跳转至新的一页), 则勾选
|
|
217
|
+
if (!selection.some(o => o[rowKey] === row[rowKey])) {
|
|
218
|
+
toggleRowStatus(selection, row, true);
|
|
219
|
+
}
|
|
220
|
+
// 如果取消勾选数据中包含当前页数据项, 则取消勾选
|
|
221
|
+
if (states.unSelectedRow.some(o => o[rowKey] === row[rowKey])) {
|
|
222
|
+
toggleRowStatus(selection, row, false);
|
|
223
|
+
states.isAllSelected = false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// console.log(states, 'states===========================');
|
|
228
|
+
} else {
|
|
229
|
+
// states.isAllSelected = false;
|
|
230
|
+
states.selection = [];
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
deep: true
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
|
|
190
237
|
created() {
|
|
191
238
|
this.filterPanels = {};
|
|
192
239
|
},
|
|
@@ -295,6 +342,108 @@ export default {
|
|
|
295
342
|
this.store.commit('toggleAllSelection');
|
|
296
343
|
},
|
|
297
344
|
|
|
345
|
+
/**
|
|
346
|
+
* 下拉框出现/隐藏事件
|
|
347
|
+
* @param {bol} visible 出现/隐藏
|
|
348
|
+
*/
|
|
349
|
+
onVisibleChange(v) {
|
|
350
|
+
this.store.states.showSelectionDropdown = v;
|
|
351
|
+
},
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* 选择数据事件
|
|
355
|
+
* @param {num} command 选择事件类型 1-全选当前页 2-清空当前页 3-全选所有页 4-清空所有页
|
|
356
|
+
*/
|
|
357
|
+
onCommand(command) {
|
|
358
|
+
this.store.states.selectionType = command;
|
|
359
|
+
const { states } = this.store;
|
|
360
|
+
const { data = [], selection } = states;
|
|
361
|
+
// console.log(this, 'this===========================');
|
|
362
|
+
|
|
363
|
+
switch (command) {
|
|
364
|
+
// 全选当前页
|
|
365
|
+
case 1:
|
|
366
|
+
states.isAllSelected = true;
|
|
367
|
+
data.forEach((row, index) => {
|
|
368
|
+
if (states.selectable) {
|
|
369
|
+
if (states.selectable.call(null, row, index)) {
|
|
370
|
+
toggleRowStatus(selection, row, true);
|
|
371
|
+
}
|
|
372
|
+
} else {
|
|
373
|
+
toggleRowStatus(selection, row, true);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
// console.log(states, 'states1===========================');
|
|
377
|
+
// 先点击跨页全选,再点击清空当前页/取消几条勾选数据, 最后点击全选当前页
|
|
378
|
+
if (states.isCrossPageSelection) {
|
|
379
|
+
// 重新计算未选中数据
|
|
380
|
+
this.store.getUnSelectedRow(states.selection);
|
|
381
|
+
// 触发el-table的'selection-change'事件
|
|
382
|
+
this.table.$listeners['selection-change'](states.unSelectedRow, true);
|
|
383
|
+
} else {
|
|
384
|
+
this.table.$listeners['selection-change'](this.table.selection, false);
|
|
385
|
+
}
|
|
386
|
+
break;
|
|
387
|
+
// 清空当前页
|
|
388
|
+
case 2:
|
|
389
|
+
// 先点击跨页选择,再点击清空当前页
|
|
390
|
+
if (states.isCrossPageSelection) {
|
|
391
|
+
// 标记当前页未选中, 如果有选中的数据,清空选中数据
|
|
392
|
+
states.isAllSelected = false;
|
|
393
|
+
const oldSelection = states.selection;
|
|
394
|
+
// 表格中有选中的数据项是disabled状态时,清空时保留该数据
|
|
395
|
+
const isDisabledSelection = states.data.filter((row, index) => {
|
|
396
|
+
// 判断selectable是不可选中状态, 且当前数据项已被选中
|
|
397
|
+
if (states.selectable && !states.selectable.call(null, row, index) && oldSelection.some(item => item[states.rowKey] === row[states.rowKey])) {
|
|
398
|
+
return row;
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
if (oldSelection.length) {
|
|
402
|
+
states.selection = isDisabledSelection;
|
|
403
|
+
}
|
|
404
|
+
// 重新计算未选中数据
|
|
405
|
+
this.store.getUnSelectedRow(states.selection);
|
|
406
|
+
// 触发el-table的'selection-change'事件
|
|
407
|
+
this.table.$listeners['selection-change'](states.unSelectedRow, true);
|
|
408
|
+
} else {
|
|
409
|
+
states.unSelectedRow = [];
|
|
410
|
+
this.table.clearSelection();
|
|
411
|
+
}
|
|
412
|
+
// console.log(states, 'states2===========================');
|
|
413
|
+
break;
|
|
414
|
+
// 全选所有页
|
|
415
|
+
case 3:
|
|
416
|
+
states.isCrossPageSelection = true;
|
|
417
|
+
states.unSelectedRow = [];
|
|
418
|
+
states.isAllSelected = true;
|
|
419
|
+
data.forEach((row, index) => {
|
|
420
|
+
if (states.selectable) {
|
|
421
|
+
if (states.selectable.call(null, row, index)) {
|
|
422
|
+
toggleRowStatus(selection, row, true);
|
|
423
|
+
}
|
|
424
|
+
} else {
|
|
425
|
+
toggleRowStatus(selection, row, true);
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
// console.log(states, 'states3===========================');
|
|
429
|
+
// 重新计算未选中数据
|
|
430
|
+
this.store.getUnSelectedRow(states.selection);
|
|
431
|
+
// 触发el-table的'selection-change'事件
|
|
432
|
+
this.table.$listeners['selection-change'](states.unSelectedRow, true);
|
|
433
|
+
break;
|
|
434
|
+
// 清空所有页
|
|
435
|
+
case 4:
|
|
436
|
+
states.isCrossPageSelection = false;
|
|
437
|
+
states.unSelectedRow = [];
|
|
438
|
+
// console.log(states, 'states4===========================');
|
|
439
|
+
this.table.clearSelection();
|
|
440
|
+
break;
|
|
441
|
+
default:
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
},
|
|
446
|
+
|
|
298
447
|
handleFilterClick(event, column) {
|
|
299
448
|
event.stopPropagation();
|
|
300
449
|
const target = event.target;
|
|
@@ -325,6 +325,11 @@
|
|
|
325
325
|
default: true
|
|
326
326
|
},
|
|
327
327
|
|
|
328
|
+
crossPageSelection: {
|
|
329
|
+
type: Boolean,
|
|
330
|
+
default: false
|
|
331
|
+
},
|
|
332
|
+
|
|
328
333
|
indent: {
|
|
329
334
|
type: Number,
|
|
330
335
|
default: 16
|
|
@@ -676,6 +681,7 @@
|
|
|
676
681
|
});
|
|
677
682
|
|
|
678
683
|
this.$ready = true;
|
|
684
|
+
|
|
679
685
|
},
|
|
680
686
|
|
|
681
687
|
destroyed() {
|
|
@@ -36,6 +36,20 @@
|
|
|
36
36
|
pointer-events: none;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
|
|
40
|
+
// 跨页选择
|
|
41
|
+
@include e(cross-page-selection) {
|
|
42
|
+
.iov-icon-arrow-down {
|
|
43
|
+
color: $--color-fill-6;
|
|
44
|
+
cursor: pointer;
|
|
45
|
+
transition: all ease .2s;
|
|
46
|
+
&.show-selection-dropdown {
|
|
47
|
+
transform: rotate(180deg);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
39
53
|
// 展开行
|
|
40
54
|
@include e(expand-column) {
|
|
41
55
|
.cell {
|
|
@@ -285,18 +299,18 @@
|
|
|
285
299
|
.has-gutter {
|
|
286
300
|
.el-table__cell {
|
|
287
301
|
border-bottom: 0 none;
|
|
288
|
-
&:nth-last-child(2) {
|
|
289
|
-
|
|
290
|
-
}
|
|
302
|
+
// &:nth-last-child(2) {
|
|
303
|
+
// border-right: 0 none;
|
|
304
|
+
// }
|
|
291
305
|
}
|
|
292
306
|
}
|
|
293
307
|
|
|
294
308
|
.el-table__row {
|
|
295
|
-
.el-table__cell {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
309
|
+
// .el-table__cell {
|
|
310
|
+
// &:last-child {
|
|
311
|
+
// border-right: 0 none;
|
|
312
|
+
// }
|
|
313
|
+
// }
|
|
300
314
|
&:last-child {
|
|
301
315
|
.el-table__cell {
|
|
302
316
|
border-bottom: 0 none;
|
|
@@ -384,6 +398,18 @@
|
|
|
384
398
|
.el-table__fixed-footer-wrapper {
|
|
385
399
|
left: auto;
|
|
386
400
|
right: 0;
|
|
401
|
+
.el-table__row {
|
|
402
|
+
.el-table__cell {
|
|
403
|
+
&:last-child {
|
|
404
|
+
border-right: 0 none;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
&:last-child {
|
|
408
|
+
.el-table__cell {
|
|
409
|
+
border-bottom: 0 none;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
387
413
|
}
|
|
388
414
|
}
|
|
389
415
|
|