iov-design 2.15.60 → 2.15.61
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.md +148 -148
- package/lib/alert.js +24 -105
- package/lib/aside.js +24 -34
- package/lib/autocomplete.js +36 -240
- package/lib/avatar.js +21 -20
- package/lib/backtop.js +27 -52
- package/lib/badge.js +30 -58
- package/lib/breadcrumb-item.js +24 -53
- package/lib/breadcrumb.js +24 -37
- package/lib/button-group.js +24 -29
- package/lib/button.js +38 -60
- package/lib/calendar.js +29 -146
- package/lib/card.js +24 -51
- package/lib/carousel-item.js +30 -68
- package/lib/carousel.js +27 -159
- package/lib/cascader-panel.js +41 -64
- package/lib/cascader.js +37 -470
- package/lib/checkbox-button.js +28 -164
- package/lib/checkbox-group.js +24 -37
- package/lib/checkbox.js +35 -189
- package/lib/col.js +1 -0
- package/lib/collapse-item.js +27 -125
- package/lib/collapse.js +24 -37
- package/lib/color-picker.js +104 -424
- package/lib/container.js +24 -34
- package/lib/date-picker.js +126 -1981
- package/lib/descriptions-item.js +1 -0
- package/lib/descriptions.js +1 -0
- package/lib/dialog.js +24 -137
- package/lib/divider.js +29 -64
- package/lib/drawer.js +24 -139
- package/lib/dropdown-item.js +27 -45
- package/lib/dropdown-menu.js +24 -51
- package/lib/dropdown.js +21 -20
- package/lib/empty.js +24 -61
- package/lib/footer.js +24 -34
- package/lib/form-item.js +42 -128
- package/lib/form.js +27 -40
- package/lib/header.js +24 -34
- package/lib/icon.js +24 -29
- package/lib/image.js +36 -220
- package/lib/index.js +1 -1
- package/lib/infinite-scroll.js +1 -0
- package/lib/input-number.js +30 -163
- package/lib/input.js +42 -274
- package/lib/iov-design.common.js +1635 -11132
- package/lib/link.js +31 -56
- package/lib/loading.js +24 -77
- package/lib/locale/format.js +10 -10
- package/lib/main.js +24 -29
- package/lib/menu-item-group.js +24 -40
- package/lib/menu-item.js +27 -83
- package/lib/menu.js +21 -20
- package/lib/message-box.js +24 -321
- package/lib/message.js +30 -82
- package/lib/mixins/migrating.js +20 -20
- package/lib/notification.js +24 -109
- package/lib/option-group.js +24 -50
- package/lib/option.js +27 -76
- package/lib/page-header.js +24 -56
- package/lib/pagination.js +24 -97
- package/lib/popconfirm.js +24 -97
- package/lib/popover.js +24 -89
- package/lib/progress.js +30 -133
- package/lib/radio-button.js +29 -111
- package/lib/radio-group.js +24 -39
- package/lib/radio.js +36 -152
- package/lib/rate.js +24 -94
- package/lib/result.js +72 -187
- package/lib/row.js +1 -0
- package/lib/scrollbar.js +1 -0
- package/lib/select.js +48 -637
- package/lib/skeleton-item.js +36 -68
- package/lib/skeleton.js +28 -70
- package/lib/slider.js +36 -267
- package/lib/spinner.js +24 -51
- package/lib/statistic.js +24 -76
- package/lib/step.js +29 -118
- package/lib/steps.js +27 -40
- package/lib/submenu.js +21 -20
- package/lib/switch.js +24 -130
- package/lib/tab-pane.js +24 -52
- package/lib/table-column.js +1 -0
- package/lib/table.js +93 -633
- package/lib/tabs.js +34 -49
- package/lib/tag.js +21 -20
- package/lib/theme-chalk/button.css +1 -1
- package/lib/theme-chalk/calendar.css +1 -1
- package/lib/theme-chalk/dropdown.css +1 -1
- package/lib/theme-chalk/index.css +1 -1
- package/lib/theme-chalk/link.css +1 -1
- package/lib/theme-chalk/message-box.css +1 -1
- package/lib/theme-chalk/transfer.css +1 -1
- package/lib/time-picker.js +58 -820
- package/lib/time-select.js +42 -303
- package/lib/timeline-item.js +29 -75
- package/lib/timeline.js +21 -20
- package/lib/tooltip.js +1 -0
- package/lib/transfer.js +36 -299
- package/lib/tree.js +54 -243
- package/lib/upload.js +86 -654
- package/lib/utils/clickoutside.js +7 -7
- package/lib/utils/vue-popper.js +7 -7
- package/package.json +154 -154
- package/packages/autocomplete/src/autocomplete-suggestions.vue +76 -76
- package/packages/autocomplete/src/autocomplete.vue +285 -285
- package/packages/button/src/button.vue +90 -90
- package/packages/calendar/src/date-table.vue +200 -200
- package/packages/calendar/src/main.vue +280 -280
- package/packages/carousel/src/item.vue +138 -138
- package/packages/carousel/src/main.vue +315 -315
- package/packages/cascader/src/cascader.vue +776 -776
- package/packages/cascader-panel/src/cascader-menu.vue +138 -138
- package/packages/cascader-panel/src/cascader-node.vue +246 -246
- package/packages/cascader-panel/src/cascader-panel.vue +391 -391
- package/packages/cascader-panel/src/node.js +166 -166
- package/packages/cascader-panel/src/store.js +58 -58
- package/packages/checkbox/src/checkbox-button.vue +199 -199
- package/packages/checkbox/src/checkbox-group.vue +49 -49
- package/packages/checkbox/src/checkbox.vue +225 -225
- package/packages/collapse/src/collapse-item.vue +114 -114
- package/packages/color-picker/src/components/picker-dropdown.vue +121 -121
- package/packages/color-picker/src/main.vue +188 -188
- package/packages/date-picker/src/basic/date-table.vue +441 -441
- package/packages/date-picker/src/basic/month-table.vue +269 -269
- package/packages/date-picker/src/basic/time-spinner.vue +304 -304
- package/packages/date-picker/src/basic/year-table.vue +111 -111
- package/packages/date-picker/src/panel/date-range.vue +680 -680
- package/packages/date-picker/src/panel/date.vue +609 -609
- package/packages/date-picker/src/panel/month-range.vue +289 -289
- package/packages/date-picker/src/panel/time-range.vue +248 -248
- package/packages/date-picker/src/panel/time-select.vue +178 -178
- package/packages/date-picker/src/panel/time.vue +186 -186
- package/packages/date-picker/src/picker.vue +967 -967
- package/packages/descriptions/src/index.js +180 -180
- package/packages/dialog/src/component.vue +262 -262
- package/packages/drawer/src/main.vue +205 -205
- package/packages/dropdown/src/dropdown-item.vue +37 -37
- package/packages/dropdown/src/dropdown-menu.vue +63 -63
- package/packages/dropdown/src/dropdown.vue +293 -293
- package/packages/empty/src/index.vue +70 -70
- package/packages/form/src/form-item.vue +324 -324
- package/packages/form/src/form.vue +182 -182
- package/packages/image/src/image-viewer.vue +330 -330
- package/packages/image/src/main.vue +249 -249
- package/packages/infinite-scroll/src/main.js +150 -150
- package/packages/input/src/input.vue +477 -477
- package/packages/input-number/src/input-number.vue +283 -283
- package/packages/loading/src/directive.js +133 -133
- package/packages/loading/src/index.js +106 -106
- package/packages/menu/src/menu-item.vue +112 -112
- package/packages/menu/src/menu.vue +325 -325
- package/packages/menu/src/submenu.vue +349 -349
- package/packages/message/src/main.js +91 -91
- package/packages/message-box/src/main.js +216 -216
- package/packages/message-box/src/main.vue +333 -333
- package/packages/notification/src/main.js +94 -94
- package/packages/page-header/src/main.vue +30 -30
- package/packages/pagination/src/pagination.js +390 -390
- package/packages/popconfirm/src/main.vue +104 -104
- package/packages/popover/src/main.vue +239 -239
- package/packages/radio/src/radio-button.vue +115 -115
- package/packages/radio/src/radio-group.vue +115 -115
- package/packages/radio/src/radio.vue +148 -148
- package/packages/rate/src/main.vue +348 -348
- package/packages/scrollbar/src/bar.js +92 -92
- package/packages/scrollbar/src/main.js +130 -130
- package/packages/select/src/option-group.vue +60 -60
- package/packages/select/src/option.vue +171 -171
- package/packages/select/src/select-dropdown.vue +74 -74
- package/packages/select/src/select.vue +979 -979
- package/packages/slider/src/button.vue +238 -238
- package/packages/slider/src/main.vue +427 -427
- package/packages/statistic/src/main.vue +204 -204
- package/packages/steps/src/steps.vue +68 -68
- package/packages/switch/src/component.vue +182 -182
- package/packages/table/src/config.js +153 -153
- package/packages/table/src/filter-panel.vue +194 -194
- package/packages/table/src/store/current.js +76 -76
- package/packages/table/src/store/helper.js +41 -41
- package/packages/table/src/store/index.js +147 -147
- package/packages/table/src/store/watcher.js +502 -502
- package/packages/table/src/table-body.js +469 -469
- package/packages/table/src/table-column.js +328 -328
- package/packages/table/src/table-header.js +571 -571
- package/packages/table/src/table-layout.js +249 -249
- package/packages/table/src/table-row.js +101 -101
- package/packages/table/src/table.vue +740 -740
- package/packages/table/src/util.js +273 -273
- package/packages/tabs/src/tab-bar.vue +57 -57
- package/packages/tabs/src/tab-nav.vue +294 -294
- package/packages/tabs/src/tabs.vue +201 -201
- package/packages/theme-chalk/src/button.scss +416 -416
- package/packages/theme-chalk/src/cascader.scss +252 -252
- package/packages/theme-chalk/src/checkbox.scss +419 -419
- package/packages/theme-chalk/src/common/var.scss +795 -795
- package/packages/theme-chalk/src/form.scss +201 -201
- package/packages/theme-chalk/src/input.scss +591 -591
- package/packages/theme-chalk/src/iovfont.scss +803 -803
- package/packages/theme-chalk/src/link.scss +8 -8
- package/packages/theme-chalk/src/message-box.scss +207 -207
- package/packages/theme-chalk/src/mixins/_button.scss +136 -136
- package/packages/theme-chalk/src/mixins/mixins.scss +190 -190
- package/packages/theme-chalk/src/radio-button.scss +115 -115
- package/packages/theme-chalk/src/select.scss +270 -270
- package/packages/theme-chalk/src/tabs.scss +755 -755
- package/packages/theme-chalk/src/upload.scss +568 -568
- package/packages/tooltip/src/main.js +242 -242
- package/packages/transfer/src/main.vue +231 -231
- package/packages/transfer/src/transfer-panel.vue +251 -251
- package/packages/tree/src/model/node.js +484 -484
- package/packages/tree/src/tree-node.vue +279 -279
- package/packages/tree/src/tree.vue +496 -496
- package/packages/upload/src/index.vue +420 -420
- package/packages/upload/src/upload-file.vue +98 -98
- package/packages/upload/src/upload-list.vue +115 -115
- package/packages/upload/src/upload-picture.vue +98 -98
- package/packages/upload/src/upload.vue +231 -231
- package/packages/upload/src/utils.js +31 -31
- package/src/directives/repeat-click.js +26 -26
- package/src/index.js +259 -259
- package/src/locale/format.js +46 -46
- package/src/locale/index.js +48 -48
- package/src/locale/lang/lo-LA.js +126 -126
- package/src/mixins/locale.js +9 -9
- package/src/mixins/migrating.js +54 -54
- package/src/transitions/collapse-transition.js +77 -77
- package/src/utils/clickoutside.js +76 -76
- package/src/utils/date-util.js +282 -282
- package/src/utils/popup/index.js +218 -218
- package/src/utils/popup/popup-manager.js +194 -194
- package/src/utils/util.js +245 -245
- package/src/utils/vdom.js +5 -5
- package/src/utils/vue-popper.js +198 -198
|
@@ -1,273 +1,273 @@
|
|
|
1
|
-
import { getValueByPath } from 'iov-design/src/utils/util';
|
|
2
|
-
|
|
3
|
-
export const getCell = function(event) {
|
|
4
|
-
let cell = event.target;
|
|
5
|
-
|
|
6
|
-
while (cell && cell.tagName.toUpperCase() !== 'HTML') {
|
|
7
|
-
if (cell.tagName.toUpperCase() === 'TD') {
|
|
8
|
-
return cell;
|
|
9
|
-
}
|
|
10
|
-
cell = cell.parentNode;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
return null;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const isObject = function(obj) {
|
|
17
|
-
return obj !== null && typeof obj === 'object';
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export const orderBy = function(array, sortKey, reverse, sortMethod, sortBy) {
|
|
21
|
-
if (!sortKey && !sortMethod && (!sortBy || Array.isArray(sortBy) && !sortBy.length)) {
|
|
22
|
-
return array;
|
|
23
|
-
}
|
|
24
|
-
if (typeof reverse === 'string') {
|
|
25
|
-
reverse = reverse === 'descending' ? -1 : 1;
|
|
26
|
-
} else {
|
|
27
|
-
reverse = (reverse && reverse < 0) ? -1 : 1;
|
|
28
|
-
}
|
|
29
|
-
const getKey = sortMethod ? null : function(value, index) {
|
|
30
|
-
if (sortBy) {
|
|
31
|
-
if (!Array.isArray(sortBy)) {
|
|
32
|
-
sortBy = [sortBy];
|
|
33
|
-
}
|
|
34
|
-
return sortBy.map(function(by) {
|
|
35
|
-
if (typeof by === 'string') {
|
|
36
|
-
return getValueByPath(value, by);
|
|
37
|
-
} else {
|
|
38
|
-
return by(value, index, array);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
if (sortKey !== '$key') {
|
|
43
|
-
if (isObject(value) && '$value' in value) value = value.$value;
|
|
44
|
-
}
|
|
45
|
-
return [isObject(value) ? getValueByPath(value, sortKey) : value];
|
|
46
|
-
};
|
|
47
|
-
const compare = function(a, b) {
|
|
48
|
-
if (sortMethod) {
|
|
49
|
-
return sortMethod(a.value, b.value);
|
|
50
|
-
}
|
|
51
|
-
for (let i = 0, len = a.key.length; i < len; i++) {
|
|
52
|
-
if (a.key[i] < b.key[i]) {
|
|
53
|
-
return -1;
|
|
54
|
-
}
|
|
55
|
-
if (a.key[i] > b.key[i]) {
|
|
56
|
-
return 1;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return 0;
|
|
60
|
-
};
|
|
61
|
-
return array.map(function(value, index) {
|
|
62
|
-
return {
|
|
63
|
-
value: value,
|
|
64
|
-
index: index,
|
|
65
|
-
key: getKey ? getKey(value, index) : null
|
|
66
|
-
};
|
|
67
|
-
}).sort(function(a, b) {
|
|
68
|
-
let order = compare(a, b);
|
|
69
|
-
if (!order) {
|
|
70
|
-
// make stable https://en.wikipedia.org/wiki/Sorting_algorithm#Stability
|
|
71
|
-
order = a.index - b.index;
|
|
72
|
-
}
|
|
73
|
-
return order * reverse;
|
|
74
|
-
}).map(item => item.value);
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export const getColumnById = function(table, columnId) {
|
|
78
|
-
let column = null;
|
|
79
|
-
table.columns.forEach(function(item) {
|
|
80
|
-
if (item.id === columnId) {
|
|
81
|
-
column = item;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
return column;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
export const getColumnByKey = function(table, columnKey) {
|
|
88
|
-
let column = null;
|
|
89
|
-
for (let i = 0; i < table.columns.length; i++) {
|
|
90
|
-
const item = table.columns[i];
|
|
91
|
-
if (item.columnKey === columnKey) {
|
|
92
|
-
column = item;
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return column;
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
export const getColumnByCell = function(table, cell) {
|
|
100
|
-
const matches = (cell.className || '').match(/el-table_[^\s]+/gm);
|
|
101
|
-
if (matches) {
|
|
102
|
-
return getColumnById(table, matches[0]);
|
|
103
|
-
}
|
|
104
|
-
return null;
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
export const getRowIdentity = (row, rowKey) => {
|
|
108
|
-
if (!row) throw new Error('row is required when get row identity');
|
|
109
|
-
if (typeof rowKey === 'string') {
|
|
110
|
-
if (rowKey.indexOf('.') < 0) {
|
|
111
|
-
return row[rowKey];
|
|
112
|
-
}
|
|
113
|
-
let key = rowKey.split('.');
|
|
114
|
-
let current = row;
|
|
115
|
-
for (let i = 0; i < key.length; i++) {
|
|
116
|
-
current = current[key[i]];
|
|
117
|
-
}
|
|
118
|
-
return current;
|
|
119
|
-
} else if (typeof rowKey === 'function') {
|
|
120
|
-
return rowKey.call(null, row);
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
export const getKeysMap = function(array, rowKey) {
|
|
125
|
-
const arrayMap = {};
|
|
126
|
-
(array || []).forEach((row, index) => {
|
|
127
|
-
arrayMap[getRowIdentity(row, rowKey)] = { row, index };
|
|
128
|
-
});
|
|
129
|
-
return arrayMap;
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
function hasOwn(obj, key) {
|
|
133
|
-
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function mergeOptions(defaults, config) {
|
|
137
|
-
const options = {};
|
|
138
|
-
let key;
|
|
139
|
-
for (key in defaults) {
|
|
140
|
-
options[key] = defaults[key];
|
|
141
|
-
}
|
|
142
|
-
for (key in config) {
|
|
143
|
-
if (hasOwn(config, key)) {
|
|
144
|
-
const value = config[key];
|
|
145
|
-
if (typeof value !== 'undefined') {
|
|
146
|
-
options[key] = value;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return options;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export function parseWidth(width) {
|
|
154
|
-
if (width !== undefined) {
|
|
155
|
-
width = parseInt(width, 10);
|
|
156
|
-
if (isNaN(width)) {
|
|
157
|
-
width = null;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return width;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export function parseMinWidth(minWidth) {
|
|
164
|
-
if (typeof minWidth !== 'undefined') {
|
|
165
|
-
minWidth = parseWidth(minWidth);
|
|
166
|
-
if (isNaN(minWidth)) {
|
|
167
|
-
minWidth = 80;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return minWidth;
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
export function parseHeight(height) {
|
|
174
|
-
if (typeof height === 'number') {
|
|
175
|
-
return height;
|
|
176
|
-
}
|
|
177
|
-
if (typeof height === 'string') {
|
|
178
|
-
if (/^\d+(?:px)?$/.test(height)) {
|
|
179
|
-
return parseInt(height, 10);
|
|
180
|
-
} else {
|
|
181
|
-
return height;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return null;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// https://github.com/reduxjs/redux/blob/master/src/compose.js
|
|
188
|
-
export function compose(...funcs) {
|
|
189
|
-
if (funcs.length === 0) {
|
|
190
|
-
return arg => arg;
|
|
191
|
-
}
|
|
192
|
-
if (funcs.length === 1) {
|
|
193
|
-
return funcs[0];
|
|
194
|
-
}
|
|
195
|
-
return funcs.reduce((a, b) => (...args) => a(b(...args)));
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export function toggleRowStatus(statusArr, row, newVal) {
|
|
199
|
-
let changed = false;
|
|
200
|
-
const index = statusArr.indexOf(row);
|
|
201
|
-
const included = index !== -1;
|
|
202
|
-
|
|
203
|
-
const addRow = () => {
|
|
204
|
-
statusArr.push(row);
|
|
205
|
-
changed = true;
|
|
206
|
-
};
|
|
207
|
-
const removeRow = () => {
|
|
208
|
-
statusArr.splice(index, 1);
|
|
209
|
-
changed = true;
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
if (typeof newVal === 'boolean') {
|
|
213
|
-
if (newVal && !included) {
|
|
214
|
-
addRow();
|
|
215
|
-
} else if (!newVal && included) {
|
|
216
|
-
removeRow();
|
|
217
|
-
}
|
|
218
|
-
} else {
|
|
219
|
-
if (included) {
|
|
220
|
-
removeRow();
|
|
221
|
-
} else {
|
|
222
|
-
addRow();
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return changed;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export function walkTreeNode(root, cb, childrenKey = 'children', lazyKey = 'hasChildren') {
|
|
229
|
-
const isNil = (array) => !(Array.isArray(array) && array.length);
|
|
230
|
-
|
|
231
|
-
function _walker(parent, children, level) {
|
|
232
|
-
cb(parent, children, level);
|
|
233
|
-
children.forEach(item => {
|
|
234
|
-
if (item[lazyKey]) {
|
|
235
|
-
cb(item, null, level + 1);
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
const children = item[childrenKey];
|
|
239
|
-
if (!isNil(children)) {
|
|
240
|
-
_walker(item, children, level + 1);
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
root.forEach(item => {
|
|
246
|
-
if (item[lazyKey]) {
|
|
247
|
-
cb(item, null, 0);
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
const children = item[childrenKey];
|
|
251
|
-
if (!isNil(children)) {
|
|
252
|
-
_walker(item, children, 0);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
export const objectEquals = function(objectA, objectB) {
|
|
258
|
-
// 取对象a和b的属性名
|
|
259
|
-
let aProps = Object.getOwnPropertyNames(objectA);
|
|
260
|
-
let bProps = Object.getOwnPropertyNames(objectB);
|
|
261
|
-
// 判断属性名的length是否一致
|
|
262
|
-
if (aProps.length !== bProps.length) {
|
|
263
|
-
return false;
|
|
264
|
-
}
|
|
265
|
-
// 循环取出属性名,再判断属性值是否一致
|
|
266
|
-
for (let i = 0; i < aProps.length; i++) {
|
|
267
|
-
let propName = aProps[i];
|
|
268
|
-
if (objectA[propName] !== objectB[propName]) {
|
|
269
|
-
return false;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
return true;
|
|
273
|
-
};
|
|
1
|
+
import { getValueByPath } from 'iov-design/src/utils/util';
|
|
2
|
+
|
|
3
|
+
export const getCell = function(event) {
|
|
4
|
+
let cell = event.target;
|
|
5
|
+
|
|
6
|
+
while (cell && cell.tagName.toUpperCase() !== 'HTML') {
|
|
7
|
+
if (cell.tagName.toUpperCase() === 'TD') {
|
|
8
|
+
return cell;
|
|
9
|
+
}
|
|
10
|
+
cell = cell.parentNode;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return null;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const isObject = function(obj) {
|
|
17
|
+
return obj !== null && typeof obj === 'object';
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const orderBy = function(array, sortKey, reverse, sortMethod, sortBy) {
|
|
21
|
+
if (!sortKey && !sortMethod && (!sortBy || Array.isArray(sortBy) && !sortBy.length)) {
|
|
22
|
+
return array;
|
|
23
|
+
}
|
|
24
|
+
if (typeof reverse === 'string') {
|
|
25
|
+
reverse = reverse === 'descending' ? -1 : 1;
|
|
26
|
+
} else {
|
|
27
|
+
reverse = (reverse && reverse < 0) ? -1 : 1;
|
|
28
|
+
}
|
|
29
|
+
const getKey = sortMethod ? null : function(value, index) {
|
|
30
|
+
if (sortBy) {
|
|
31
|
+
if (!Array.isArray(sortBy)) {
|
|
32
|
+
sortBy = [sortBy];
|
|
33
|
+
}
|
|
34
|
+
return sortBy.map(function(by) {
|
|
35
|
+
if (typeof by === 'string') {
|
|
36
|
+
return getValueByPath(value, by);
|
|
37
|
+
} else {
|
|
38
|
+
return by(value, index, array);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (sortKey !== '$key') {
|
|
43
|
+
if (isObject(value) && '$value' in value) value = value.$value;
|
|
44
|
+
}
|
|
45
|
+
return [isObject(value) ? getValueByPath(value, sortKey) : value];
|
|
46
|
+
};
|
|
47
|
+
const compare = function(a, b) {
|
|
48
|
+
if (sortMethod) {
|
|
49
|
+
return sortMethod(a.value, b.value);
|
|
50
|
+
}
|
|
51
|
+
for (let i = 0, len = a.key.length; i < len; i++) {
|
|
52
|
+
if (a.key[i] < b.key[i]) {
|
|
53
|
+
return -1;
|
|
54
|
+
}
|
|
55
|
+
if (a.key[i] > b.key[i]) {
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return 0;
|
|
60
|
+
};
|
|
61
|
+
return array.map(function(value, index) {
|
|
62
|
+
return {
|
|
63
|
+
value: value,
|
|
64
|
+
index: index,
|
|
65
|
+
key: getKey ? getKey(value, index) : null
|
|
66
|
+
};
|
|
67
|
+
}).sort(function(a, b) {
|
|
68
|
+
let order = compare(a, b);
|
|
69
|
+
if (!order) {
|
|
70
|
+
// make stable https://en.wikipedia.org/wiki/Sorting_algorithm#Stability
|
|
71
|
+
order = a.index - b.index;
|
|
72
|
+
}
|
|
73
|
+
return order * reverse;
|
|
74
|
+
}).map(item => item.value);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const getColumnById = function(table, columnId) {
|
|
78
|
+
let column = null;
|
|
79
|
+
table.columns.forEach(function(item) {
|
|
80
|
+
if (item.id === columnId) {
|
|
81
|
+
column = item;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return column;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const getColumnByKey = function(table, columnKey) {
|
|
88
|
+
let column = null;
|
|
89
|
+
for (let i = 0; i < table.columns.length; i++) {
|
|
90
|
+
const item = table.columns[i];
|
|
91
|
+
if (item.columnKey === columnKey) {
|
|
92
|
+
column = item;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return column;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const getColumnByCell = function(table, cell) {
|
|
100
|
+
const matches = (cell.className || '').match(/el-table_[^\s]+/gm);
|
|
101
|
+
if (matches) {
|
|
102
|
+
return getColumnById(table, matches[0]);
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const getRowIdentity = (row, rowKey) => {
|
|
108
|
+
if (!row) throw new Error('row is required when get row identity');
|
|
109
|
+
if (typeof rowKey === 'string') {
|
|
110
|
+
if (rowKey.indexOf('.') < 0) {
|
|
111
|
+
return row[rowKey];
|
|
112
|
+
}
|
|
113
|
+
let key = rowKey.split('.');
|
|
114
|
+
let current = row;
|
|
115
|
+
for (let i = 0; i < key.length; i++) {
|
|
116
|
+
current = current[key[i]];
|
|
117
|
+
}
|
|
118
|
+
return current;
|
|
119
|
+
} else if (typeof rowKey === 'function') {
|
|
120
|
+
return rowKey.call(null, row);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export const getKeysMap = function(array, rowKey) {
|
|
125
|
+
const arrayMap = {};
|
|
126
|
+
(array || []).forEach((row, index) => {
|
|
127
|
+
arrayMap[getRowIdentity(row, rowKey)] = { row, index };
|
|
128
|
+
});
|
|
129
|
+
return arrayMap;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
function hasOwn(obj, key) {
|
|
133
|
+
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function mergeOptions(defaults, config) {
|
|
137
|
+
const options = {};
|
|
138
|
+
let key;
|
|
139
|
+
for (key in defaults) {
|
|
140
|
+
options[key] = defaults[key];
|
|
141
|
+
}
|
|
142
|
+
for (key in config) {
|
|
143
|
+
if (hasOwn(config, key)) {
|
|
144
|
+
const value = config[key];
|
|
145
|
+
if (typeof value !== 'undefined') {
|
|
146
|
+
options[key] = value;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return options;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function parseWidth(width) {
|
|
154
|
+
if (width !== undefined) {
|
|
155
|
+
width = parseInt(width, 10);
|
|
156
|
+
if (isNaN(width)) {
|
|
157
|
+
width = null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return width;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function parseMinWidth(minWidth) {
|
|
164
|
+
if (typeof minWidth !== 'undefined') {
|
|
165
|
+
minWidth = parseWidth(minWidth);
|
|
166
|
+
if (isNaN(minWidth)) {
|
|
167
|
+
minWidth = 80;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return minWidth;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export function parseHeight(height) {
|
|
174
|
+
if (typeof height === 'number') {
|
|
175
|
+
return height;
|
|
176
|
+
}
|
|
177
|
+
if (typeof height === 'string') {
|
|
178
|
+
if (/^\d+(?:px)?$/.test(height)) {
|
|
179
|
+
return parseInt(height, 10);
|
|
180
|
+
} else {
|
|
181
|
+
return height;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// https://github.com/reduxjs/redux/blob/master/src/compose.js
|
|
188
|
+
export function compose(...funcs) {
|
|
189
|
+
if (funcs.length === 0) {
|
|
190
|
+
return arg => arg;
|
|
191
|
+
}
|
|
192
|
+
if (funcs.length === 1) {
|
|
193
|
+
return funcs[0];
|
|
194
|
+
}
|
|
195
|
+
return funcs.reduce((a, b) => (...args) => a(b(...args)));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export function toggleRowStatus(statusArr, row, newVal) {
|
|
199
|
+
let changed = false;
|
|
200
|
+
const index = statusArr.indexOf(row);
|
|
201
|
+
const included = index !== -1;
|
|
202
|
+
|
|
203
|
+
const addRow = () => {
|
|
204
|
+
statusArr.push(row);
|
|
205
|
+
changed = true;
|
|
206
|
+
};
|
|
207
|
+
const removeRow = () => {
|
|
208
|
+
statusArr.splice(index, 1);
|
|
209
|
+
changed = true;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
if (typeof newVal === 'boolean') {
|
|
213
|
+
if (newVal && !included) {
|
|
214
|
+
addRow();
|
|
215
|
+
} else if (!newVal && included) {
|
|
216
|
+
removeRow();
|
|
217
|
+
}
|
|
218
|
+
} else {
|
|
219
|
+
if (included) {
|
|
220
|
+
removeRow();
|
|
221
|
+
} else {
|
|
222
|
+
addRow();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return changed;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function walkTreeNode(root, cb, childrenKey = 'children', lazyKey = 'hasChildren') {
|
|
229
|
+
const isNil = (array) => !(Array.isArray(array) && array.length);
|
|
230
|
+
|
|
231
|
+
function _walker(parent, children, level) {
|
|
232
|
+
cb(parent, children, level);
|
|
233
|
+
children.forEach(item => {
|
|
234
|
+
if (item[lazyKey]) {
|
|
235
|
+
cb(item, null, level + 1);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const children = item[childrenKey];
|
|
239
|
+
if (!isNil(children)) {
|
|
240
|
+
_walker(item, children, level + 1);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
root.forEach(item => {
|
|
246
|
+
if (item[lazyKey]) {
|
|
247
|
+
cb(item, null, 0);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const children = item[childrenKey];
|
|
251
|
+
if (!isNil(children)) {
|
|
252
|
+
_walker(item, children, 0);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export const objectEquals = function(objectA, objectB) {
|
|
258
|
+
// 取对象a和b的属性名
|
|
259
|
+
let aProps = Object.getOwnPropertyNames(objectA);
|
|
260
|
+
let bProps = Object.getOwnPropertyNames(objectB);
|
|
261
|
+
// 判断属性名的length是否一致
|
|
262
|
+
if (aProps.length !== bProps.length) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
// 循环取出属性名,再判断属性值是否一致
|
|
266
|
+
for (let i = 0; i < aProps.length; i++) {
|
|
267
|
+
let propName = aProps[i];
|
|
268
|
+
if (objectA[propName] !== objectB[propName]) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return true;
|
|
273
|
+
};
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="el-tabs__active-bar" :class="`is-${ rootTabs.tabPosition }`" :style="barStyle"></div>
|
|
3
|
-
</template>
|
|
4
|
-
<script>
|
|
5
|
-
import { arrayFind } from 'iov-design/src/utils/util';
|
|
6
|
-
export default {
|
|
7
|
-
name: 'TabBar',
|
|
8
|
-
|
|
9
|
-
props: {
|
|
10
|
-
tabs: Array
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
inject: ['rootTabs'],
|
|
14
|
-
|
|
15
|
-
computed: {
|
|
16
|
-
barStyle: {
|
|
17
|
-
get() {
|
|
18
|
-
let style = {};
|
|
19
|
-
let offset = 0;
|
|
20
|
-
let tabSize = 0;
|
|
21
|
-
const sizeName = ['top', 'bottom'].indexOf(this.rootTabs.tabPosition) !== -1 ? 'width' : 'height';
|
|
22
|
-
const sizeDir = sizeName === 'width' ? 'x' : 'y';
|
|
23
|
-
const firstUpperCase = str => {
|
|
24
|
-
return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
|
|
25
|
-
};
|
|
26
|
-
this.tabs.every((tab, index) => {
|
|
27
|
-
let $el = arrayFind(this.$parent.$refs.tabs || [], t => t.id.replace('tab-', '') === tab.paneName);
|
|
28
|
-
if (!$el) { return false; }
|
|
29
|
-
|
|
30
|
-
if (!tab.active) {
|
|
31
|
-
offset += $el[`client${firstUpperCase(sizeName)}`];
|
|
32
|
-
return true;
|
|
33
|
-
} else {
|
|
34
|
-
tabSize = $el[`client${firstUpperCase(sizeName)}`];
|
|
35
|
-
const tabStyles = window.getComputedStyle($el);
|
|
36
|
-
if (sizeName === 'width' && this.tabs.length > 1) {
|
|
37
|
-
tabSize -= parseFloat(tabStyles.paddingLeft) + parseFloat(tabStyles.paddingRight);
|
|
38
|
-
}
|
|
39
|
-
if (sizeName === 'width') {
|
|
40
|
-
offset += parseFloat(tabStyles.paddingLeft);
|
|
41
|
-
}
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
const transform = `translate${firstUpperCase(sizeDir)}(${offset + 4}px)`;
|
|
47
|
-
style[sizeName] = tabSize - 8 + 'px';
|
|
48
|
-
style.transform = transform;
|
|
49
|
-
style.msTransform = transform;
|
|
50
|
-
style.webkitTransform = transform;
|
|
51
|
-
|
|
52
|
-
return style;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<div class="el-tabs__active-bar" :class="`is-${ rootTabs.tabPosition }`" :style="barStyle"></div>
|
|
3
|
+
</template>
|
|
4
|
+
<script>
|
|
5
|
+
import { arrayFind } from 'iov-design/src/utils/util';
|
|
6
|
+
export default {
|
|
7
|
+
name: 'TabBar',
|
|
8
|
+
|
|
9
|
+
props: {
|
|
10
|
+
tabs: Array
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
inject: ['rootTabs'],
|
|
14
|
+
|
|
15
|
+
computed: {
|
|
16
|
+
barStyle: {
|
|
17
|
+
get() {
|
|
18
|
+
let style = {};
|
|
19
|
+
let offset = 0;
|
|
20
|
+
let tabSize = 0;
|
|
21
|
+
const sizeName = ['top', 'bottom'].indexOf(this.rootTabs.tabPosition) !== -1 ? 'width' : 'height';
|
|
22
|
+
const sizeDir = sizeName === 'width' ? 'x' : 'y';
|
|
23
|
+
const firstUpperCase = str => {
|
|
24
|
+
return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
|
|
25
|
+
};
|
|
26
|
+
this.tabs.every((tab, index) => {
|
|
27
|
+
let $el = arrayFind(this.$parent.$refs.tabs || [], t => t.id.replace('tab-', '') === tab.paneName);
|
|
28
|
+
if (!$el) { return false; }
|
|
29
|
+
|
|
30
|
+
if (!tab.active) {
|
|
31
|
+
offset += $el[`client${firstUpperCase(sizeName)}`];
|
|
32
|
+
return true;
|
|
33
|
+
} else {
|
|
34
|
+
tabSize = $el[`client${firstUpperCase(sizeName)}`];
|
|
35
|
+
const tabStyles = window.getComputedStyle($el);
|
|
36
|
+
if (sizeName === 'width' && this.tabs.length > 1) {
|
|
37
|
+
tabSize -= parseFloat(tabStyles.paddingLeft) + parseFloat(tabStyles.paddingRight);
|
|
38
|
+
}
|
|
39
|
+
if (sizeName === 'width') {
|
|
40
|
+
offset += parseFloat(tabStyles.paddingLeft);
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const transform = `translate${firstUpperCase(sizeDir)}(${offset + 4}px)`;
|
|
47
|
+
style[sizeName] = tabSize - 8 + 'px';
|
|
48
|
+
style.transform = transform;
|
|
49
|
+
style.msTransform = transform;
|
|
50
|
+
style.webkitTransform = transform;
|
|
51
|
+
|
|
52
|
+
return style;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
</script>
|