umy-ui-table 1.2.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/LICENSE +21 -0
- package/README.md +111 -0
- package/lib/button.js +1 -0
- package/lib/icon.js +1 -0
- package/lib/index.js +1 -0
- package/lib/locale/format.js +56 -0
- package/lib/locale/index.js +72 -0
- package/lib/locale/lang/en.js +123 -0
- package/lib/locale/lang/zh-CN.js +119 -0
- package/lib/mixins/locale.js +17 -0
- package/lib/theme-chalk/base.css +0 -0
- package/lib/theme-chalk/button.css +1 -0
- package/lib/theme-chalk/fonts/element-icons.ttf +0 -0
- package/lib/theme-chalk/fonts/element-icons.woff +0 -0
- package/lib/theme-chalk/fonts/iconfont.1785562768224.ttf +0 -0
- package/lib/theme-chalk/fonts/iconfont.1785562768224.woff +0 -0
- package/lib/theme-chalk/fonts/iconfont.1785562768224.woff2 +0 -0
- package/lib/theme-chalk/icon.css +1 -0
- package/lib/theme-chalk/index.css +1 -0
- package/lib/theme-chalk/u-table-column.css +0 -0
- package/lib/theme-chalk/u-table.css +1 -0
- package/lib/theme-chalk/ux-grid.css +1 -0
- package/lib/theme-chalk/ux-table-column.css +0 -0
- package/lib/u-table-column.js +1 -0
- package/lib/u-table.js +1 -0
- package/lib/umd/locale/en.js +139 -0
- package/lib/umd/locale/zh-CN.js +135 -0
- package/lib/umy-ui.common.js +1 -0
- package/lib/utils/svg.js +33 -0
- package/lib/utils/types.js +35 -0
- package/lib/utils/util.js +268 -0
- package/lib/ux-grid.js +1 -0
- package/lib/ux-table-column.js +1 -0
- package/package.json +117 -0
- package/packages/button/index.js +7 -0
- package/packages/button/src/button-group.vue +10 -0
- package/packages/button/src/button.vue +166 -0
- package/packages/checkbox/index.js +8 -0
- package/packages/checkbox/src/checkbox-button.vue +199 -0
- package/packages/checkbox/src/checkbox-group.vue +48 -0
- package/packages/checkbox/src/checkbox.vue +222 -0
- package/packages/checkbox-button/index.js +8 -0
- package/packages/checkbox-group/index.js +8 -0
- package/packages/icon/index.js +7 -0
- package/packages/icon/src/icon.vue +40 -0
- package/packages/input/index.js +2 -0
- package/packages/input/src/calcTextareaHeight.js +104 -0
- package/packages/input/src/input.vue +424 -0
- package/packages/option/index.js +2 -0
- package/packages/pagination/index.js +2 -0
- package/packages/pagination/src/pager.vue +163 -0
- package/packages/pagination/src/pagination.js +386 -0
- package/packages/scrollbar/index.js +8 -0
- package/packages/scrollbar/src/bar.js +92 -0
- package/packages/scrollbar/src/main.js +130 -0
- package/packages/scrollbar/src/util.js +34 -0
- package/packages/select/index.js +2 -0
- package/packages/select/src/navigation-mixin.js +54 -0
- package/packages/select/src/option-group.vue +60 -0
- package/packages/select/src/option.vue +163 -0
- package/packages/select/src/select-dropdown.vue +74 -0
- package/packages/select/src/select.vue +889 -0
- package/packages/table/index.js +8 -0
- package/packages/table/src/config.js +123 -0
- package/packages/table/src/dropdown.js +28 -0
- package/packages/table/src/filter-panel.vue +194 -0
- package/packages/table/src/layout-observer.js +68 -0
- package/packages/table/src/store/current.js +71 -0
- package/packages/table/src/store/expand.js +65 -0
- package/packages/table/src/store/helper.js +37 -0
- package/packages/table/src/store/index.js +145 -0
- package/packages/table/src/store/tree.js +208 -0
- package/packages/table/src/store/watcher.js +448 -0
- package/packages/table/src/table-body.js +493 -0
- package/packages/table/src/table-column.js +381 -0
- package/packages/table/src/table-footer.js +174 -0
- package/packages/table/src/table-header.js +537 -0
- package/packages/table/src/table-layout.js +231 -0
- package/packages/table/src/table.vue +741 -0
- package/packages/table/src/util.js +256 -0
- package/packages/tag/index.js +8 -0
- package/packages/tag/src/tag.vue +58 -0
- package/packages/tools/directives/mousewheel.js +18 -0
- package/packages/tools/directives/repeat-click.js +24 -0
- package/packages/tools/locale/format.js +46 -0
- package/packages/tools/locale/index.js +48 -0
- package/packages/tools/locale/lang/en.js +120 -0
- package/packages/tools/locale/lang/zh-CN.js +116 -0
- package/packages/tools/mixins/emitter.js +33 -0
- package/packages/tools/mixins/focus.js +9 -0
- package/packages/tools/mixins/locale.js +9 -0
- package/packages/tools/mixins/migrating.js +54 -0
- package/packages/tools/transitions/collapse-transition.js +77 -0
- package/packages/tools/utils/after-leave.js +27 -0
- package/packages/tools/utils/aria-dialog.js +90 -0
- package/packages/tools/utils/aria-utils.js +122 -0
- package/packages/tools/utils/clickoutside.js +76 -0
- package/packages/tools/utils/date-util.js +292 -0
- package/packages/tools/utils/date.js +368 -0
- package/packages/tools/utils/dom.js +227 -0
- package/packages/tools/utils/menu/aria-menubar.js +14 -0
- package/packages/tools/utils/menu/aria-menuitem.js +49 -0
- package/packages/tools/utils/menu/aria-submenu.js +59 -0
- package/packages/tools/utils/merge.js +15 -0
- package/packages/tools/utils/popper.js +1276 -0
- package/packages/tools/utils/popup/index.js +218 -0
- package/packages/tools/utils/popup/popup-manager.js +194 -0
- package/packages/tools/utils/resize-event.js +35 -0
- package/packages/tools/utils/scroll-into-view.js +27 -0
- package/packages/tools/utils/scrollbar-width.js +29 -0
- package/packages/tools/utils/shared.js +7 -0
- package/packages/tools/utils/svg.js +1 -0
- package/packages/tools/utils/types.js +28 -0
- package/packages/tools/utils/util.js +241 -0
- package/packages/tools/utils/vdom.js +5 -0
- package/packages/tools/utils/vue-popper.js +198 -0
- package/packages/tooltip/index.js +8 -0
- package/packages/tooltip/src/main.js +241 -0
- package/packages/u-table/index.js +4 -0
- package/packages/u-table/revise-el-table-mixins/index.js +10 -0
- package/packages/u-table/revise-el-table-mixins/table-extend.js +60 -0
- package/packages/u-table/revise-el-table-mixins/table.mixins.js +261 -0
- package/packages/u-table/revise-el-table-mixins/virtual-table-body-render.js +132 -0
- package/packages/u-table/src/u-table.vue +248 -0
- package/packages/u-table/u-table-mixins/index.js +483 -0
- package/packages/u-table/u-table-tree-mixins/methods.js +120 -0
- package/packages/u-table/u-table-tree-mixins/u-table-tree-mixins.js +161 -0
- package/packages/u-table-column/index.js +8 -0
- package/packages/utils/common.js +27 -0
- package/packages/ux-grid/index.js +6 -0
- package/packages/ux-grid/mixins/index.js +707 -0
- package/packages/ux-grid/src/interceptor.js +6 -0
- package/packages/ux-grid/src/ux-grid.vue +301 -0
- package/packages/ux-table-column/index.js +10 -0
- package/tools/locale/format.js +46 -0
- package/tools/locale/index.js +54 -0
- package/tools/locale/lang/en.js +120 -0
- package/tools/locale/lang/zh-CN.js +116 -0
- package/tools/mixins/locale.js +9 -0
- package/tools/utils/svg.js +1 -0
- package/tools/utils/types.js +28 -0
- package/tools/utils/util.js +241 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { getValueByPath } from '../../tools/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
|
+
|
|
208
|
+
const removeRow = () => {
|
|
209
|
+
statusArr.splice(index, 1);
|
|
210
|
+
changed = true;
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
if (typeof newVal === 'boolean') {
|
|
214
|
+
if (newVal && !included) {
|
|
215
|
+
addRow();
|
|
216
|
+
} else if (!newVal && included) {
|
|
217
|
+
removeRow();
|
|
218
|
+
}
|
|
219
|
+
} else {
|
|
220
|
+
if (included) {
|
|
221
|
+
removeRow();
|
|
222
|
+
} else {
|
|
223
|
+
addRow();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return changed;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function walkTreeNode(root, cb, childrenKey = 'children', lazyKey = 'hasChildren') {
|
|
230
|
+
const isNil = (array) => !(Array.isArray(array) && array.length);
|
|
231
|
+
|
|
232
|
+
function _walker(parent, children, level) {
|
|
233
|
+
cb(parent, children, level);
|
|
234
|
+
children.forEach(item => {
|
|
235
|
+
if (item[lazyKey]) {
|
|
236
|
+
cb(item, null, level + 1);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const children = item[childrenKey];
|
|
240
|
+
if (!isNil(children)) {
|
|
241
|
+
_walker(item, children, level + 1);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
root.forEach(item => {
|
|
247
|
+
if (item[lazyKey]) {
|
|
248
|
+
cb(item, null, 0);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const children = item[childrenKey];
|
|
252
|
+
if (!isNil(children)) {
|
|
253
|
+
_walker(item, children, 0);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export default {
|
|
3
|
+
name: 'ElTag',
|
|
4
|
+
props: {
|
|
5
|
+
text: String,
|
|
6
|
+
closable: Boolean,
|
|
7
|
+
type: String,
|
|
8
|
+
hit: Boolean,
|
|
9
|
+
disableTransitions: Boolean,
|
|
10
|
+
color: String,
|
|
11
|
+
size: String,
|
|
12
|
+
effect: {
|
|
13
|
+
type: String,
|
|
14
|
+
default: 'light',
|
|
15
|
+
validator(val) {
|
|
16
|
+
return ['dark', 'light', 'plain'].indexOf(val) !== -1;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
methods: {
|
|
21
|
+
handleClose(event) {
|
|
22
|
+
event.stopPropagation();
|
|
23
|
+
this.$emit('close', event);
|
|
24
|
+
},
|
|
25
|
+
handleClick(event) {
|
|
26
|
+
this.$emit('click', event);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
computed: {
|
|
30
|
+
tagSize() {
|
|
31
|
+
return this.size || (this.$ELEMENT || {}).size;
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
render(h) {
|
|
35
|
+
const { type, tagSize, hit, effect } = this;
|
|
36
|
+
const classes = [
|
|
37
|
+
'el-tag',
|
|
38
|
+
type ? `el-tag--${type}` : '',
|
|
39
|
+
tagSize ? `el-tag--${tagSize}` : '',
|
|
40
|
+
effect ? `el-tag--${effect}` : '',
|
|
41
|
+
hit && 'is-hit'
|
|
42
|
+
];
|
|
43
|
+
const tagEl = (
|
|
44
|
+
<span
|
|
45
|
+
class={ classes }
|
|
46
|
+
style={{ backgroundColor: this.color }}
|
|
47
|
+
on-click={ this.handleClick }>
|
|
48
|
+
{ this.$slots.default }
|
|
49
|
+
{
|
|
50
|
+
this.closable && <i class="el-tag__close el-icon-close" on-click={ this.handleClose }></i>
|
|
51
|
+
}
|
|
52
|
+
</span>
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
return this.disableTransitions ? tagEl : <transition name="el-zoom-in-center">{ tagEl }</transition>;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
</script>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import normalizeWheel from 'normalize-wheel';
|
|
2
|
+
|
|
3
|
+
const isFirefox = typeof navigator !== 'undefined' && navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
|
|
4
|
+
|
|
5
|
+
const mousewheel = function(element, callback) {
|
|
6
|
+
if (element && element.addEventListener) {
|
|
7
|
+
element.addEventListener(isFirefox ? 'DOMMouseScroll' : 'mousewheel', function(event) {
|
|
8
|
+
const normalized = normalizeWheel(event);
|
|
9
|
+
callback && callback.apply(this, [event, normalized]);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default {
|
|
15
|
+
bind(el, binding) {
|
|
16
|
+
mousewheel(el, binding.value);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { once, on } from '../utils/dom';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
bind(el, binding, vnode) {
|
|
5
|
+
let interval = null;
|
|
6
|
+
let startTime;
|
|
7
|
+
const handler = () => vnode.context[binding.expression].apply();
|
|
8
|
+
const clear = () => {
|
|
9
|
+
if (Date.now() - startTime < 100) {
|
|
10
|
+
handler();
|
|
11
|
+
}
|
|
12
|
+
clearInterval(interval);
|
|
13
|
+
interval = null;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
on(el, 'mousedown', (e) => {
|
|
17
|
+
if (e.button !== 0) return;
|
|
18
|
+
startTime = Date.now();
|
|
19
|
+
once(document, 'mouseup', clear);
|
|
20
|
+
clearInterval(interval);
|
|
21
|
+
interval = setInterval(handler, 100);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { hasOwn } from '../utils/util';
|
|
2
|
+
|
|
3
|
+
const RE_NARGS = /(%|)\{([0-9a-zA-Z_]+)\}/g;
|
|
4
|
+
/**
|
|
5
|
+
* String format template
|
|
6
|
+
* - Inspired:
|
|
7
|
+
* https://github.com/Matt-Esch/string-template/index.js
|
|
8
|
+
*/
|
|
9
|
+
export default function(Vue) {
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* template
|
|
13
|
+
*
|
|
14
|
+
* @param {String} string
|
|
15
|
+
* @param {Array} ...args
|
|
16
|
+
* @return {String}
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
function template(string, ...args) {
|
|
20
|
+
if (args.length === 1 && typeof args[0] === 'object') {
|
|
21
|
+
args = args[0];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (!args || !args.hasOwnProperty) {
|
|
25
|
+
args = {};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return string.replace(RE_NARGS, (match, prefix, i, index) => {
|
|
29
|
+
let result;
|
|
30
|
+
|
|
31
|
+
if (string[index - 1] === '{' &&
|
|
32
|
+
string[index + match.length] === '}') {
|
|
33
|
+
return i;
|
|
34
|
+
} else {
|
|
35
|
+
result = hasOwn(args, i) ? args[i] : null;
|
|
36
|
+
if (result === null || result === undefined) {
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return template;
|
|
46
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import defaultLang from './lang/zh-CN';
|
|
2
|
+
import Vue from 'vue';
|
|
3
|
+
import deepmerge from 'deepmerge';
|
|
4
|
+
import Format from './format';
|
|
5
|
+
|
|
6
|
+
const format = Format(Vue);
|
|
7
|
+
let lang = defaultLang;
|
|
8
|
+
let merged = false;
|
|
9
|
+
let i18nHandler = function() {
|
|
10
|
+
const vuei18n = Object.getPrototypeOf(this || Vue).$t;
|
|
11
|
+
if (typeof vuei18n === 'function' && !!Vue.locale) {
|
|
12
|
+
if (!merged) {
|
|
13
|
+
merged = true;
|
|
14
|
+
Vue.locale(
|
|
15
|
+
Vue.config.lang,
|
|
16
|
+
deepmerge(lang, Vue.locale(Vue.config.lang) || {}, { clone: true })
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
return vuei18n.apply(this, arguments);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const t = function(path, options) {
|
|
24
|
+
let value = i18nHandler.apply(this, arguments);
|
|
25
|
+
if (value !== null && value !== undefined) return value;
|
|
26
|
+
const array = path.split('.');
|
|
27
|
+
let current = lang;
|
|
28
|
+
for (let i = 0, j = array.length; i < j; i++) {
|
|
29
|
+
const property = array[i];
|
|
30
|
+
value = current[property];
|
|
31
|
+
if (i === j - 1) {
|
|
32
|
+
return format(value, options)
|
|
33
|
+
}
|
|
34
|
+
if (!value) return '';
|
|
35
|
+
current = value;
|
|
36
|
+
}
|
|
37
|
+
return '';
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const use = function(l) {
|
|
41
|
+
lang = l || lang;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const i18n = function(fn) {
|
|
45
|
+
i18nHandler = fn || i18nHandler;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export default { use, t, i18n };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
el: {
|
|
3
|
+
colorpicker: {
|
|
4
|
+
confirm: 'OK',
|
|
5
|
+
clear: 'Clear'
|
|
6
|
+
},
|
|
7
|
+
datepicker: {
|
|
8
|
+
now: 'Now',
|
|
9
|
+
today: 'Today',
|
|
10
|
+
cancel: 'Cancel',
|
|
11
|
+
clear: 'Clear',
|
|
12
|
+
confirm: 'OK',
|
|
13
|
+
selectDate: 'Select date',
|
|
14
|
+
selectTime: 'Select time',
|
|
15
|
+
startDate: 'Start Date',
|
|
16
|
+
startTime: 'Start Time',
|
|
17
|
+
endDate: 'End Date',
|
|
18
|
+
endTime: 'End Time',
|
|
19
|
+
prevYear: 'Previous Year',
|
|
20
|
+
nextYear: 'Next Year',
|
|
21
|
+
prevMonth: 'Previous Month',
|
|
22
|
+
nextMonth: 'Next Month',
|
|
23
|
+
year: '',
|
|
24
|
+
month1: 'January',
|
|
25
|
+
month2: 'February',
|
|
26
|
+
month3: 'March',
|
|
27
|
+
month4: 'April',
|
|
28
|
+
month5: 'May',
|
|
29
|
+
month6: 'June',
|
|
30
|
+
month7: 'July',
|
|
31
|
+
month8: 'August',
|
|
32
|
+
month9: 'September',
|
|
33
|
+
month10: 'October',
|
|
34
|
+
month11: 'November',
|
|
35
|
+
month12: 'December',
|
|
36
|
+
week: 'week',
|
|
37
|
+
weeks: {
|
|
38
|
+
sun: 'Sun',
|
|
39
|
+
mon: 'Mon',
|
|
40
|
+
tue: 'Tue',
|
|
41
|
+
wed: 'Wed',
|
|
42
|
+
thu: 'Thu',
|
|
43
|
+
fri: 'Fri',
|
|
44
|
+
sat: 'Sat'
|
|
45
|
+
},
|
|
46
|
+
months: {
|
|
47
|
+
jan: 'Jan',
|
|
48
|
+
feb: 'Feb',
|
|
49
|
+
mar: 'Mar',
|
|
50
|
+
apr: 'Apr',
|
|
51
|
+
may: 'May',
|
|
52
|
+
jun: 'Jun',
|
|
53
|
+
jul: 'Jul',
|
|
54
|
+
aug: 'Aug',
|
|
55
|
+
sep: 'Sep',
|
|
56
|
+
oct: 'Oct',
|
|
57
|
+
nov: 'Nov',
|
|
58
|
+
dec: 'Dec'
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
select: {
|
|
62
|
+
loading: 'Loading',
|
|
63
|
+
noMatch: 'No matching data',
|
|
64
|
+
noData: 'No data',
|
|
65
|
+
placeholder: 'Select'
|
|
66
|
+
},
|
|
67
|
+
cascader: {
|
|
68
|
+
noMatch: 'No matching data',
|
|
69
|
+
loading: 'Loading',
|
|
70
|
+
placeholder: 'Select',
|
|
71
|
+
noData: 'No data'
|
|
72
|
+
},
|
|
73
|
+
pagination: {
|
|
74
|
+
goto: 'Go to',
|
|
75
|
+
pagesize: '/page',
|
|
76
|
+
total: 'Total {total}',
|
|
77
|
+
pageClassifier: ''
|
|
78
|
+
},
|
|
79
|
+
messagebox: {
|
|
80
|
+
title: 'Message',
|
|
81
|
+
confirm: 'OK',
|
|
82
|
+
cancel: 'Cancel',
|
|
83
|
+
error: 'Illegal input'
|
|
84
|
+
},
|
|
85
|
+
upload: {
|
|
86
|
+
deleteTip: 'press delete to remove',
|
|
87
|
+
delete: 'Delete',
|
|
88
|
+
preview: 'Preview',
|
|
89
|
+
continue: 'Continue'
|
|
90
|
+
},
|
|
91
|
+
table: {
|
|
92
|
+
emptyText: 'No Data',
|
|
93
|
+
confirmFilter: 'Confirm',
|
|
94
|
+
resetFilter: 'Reset',
|
|
95
|
+
clearFilter: 'All',
|
|
96
|
+
sumText: 'Sum'
|
|
97
|
+
},
|
|
98
|
+
tree: {
|
|
99
|
+
emptyText: 'No Data'
|
|
100
|
+
},
|
|
101
|
+
transfer: {
|
|
102
|
+
noMatch: 'No matching data',
|
|
103
|
+
noData: 'No data',
|
|
104
|
+
titles: ['List 1', 'List 2'], // to be translated
|
|
105
|
+
filterPlaceholder: 'Enter keyword', // to be translated
|
|
106
|
+
noCheckedFormat: '{total} items', // to be translated
|
|
107
|
+
hasCheckedFormat: '{checked}/{total} checked' // to be translated
|
|
108
|
+
},
|
|
109
|
+
image: {
|
|
110
|
+
error: 'FAILED'
|
|
111
|
+
},
|
|
112
|
+
pageHeader: {
|
|
113
|
+
title: 'Back' // to be translated
|
|
114
|
+
},
|
|
115
|
+
popconfirm: {
|
|
116
|
+
confirmButtonText: 'Yes',
|
|
117
|
+
cancelButtonText: 'No'
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
el: {
|
|
3
|
+
colorpicker: {
|
|
4
|
+
confirm: '确定',
|
|
5
|
+
clear: '清空'
|
|
6
|
+
},
|
|
7
|
+
datepicker: {
|
|
8
|
+
now: '此刻',
|
|
9
|
+
today: '今天',
|
|
10
|
+
cancel: '取消',
|
|
11
|
+
clear: '清空',
|
|
12
|
+
confirm: '确定',
|
|
13
|
+
selectDate: '选择日期',
|
|
14
|
+
selectTime: '选择时间',
|
|
15
|
+
startDate: '开始日期',
|
|
16
|
+
startTime: '开始时间',
|
|
17
|
+
endDate: '结束日期',
|
|
18
|
+
endTime: '结束时间',
|
|
19
|
+
prevYear: '前一年',
|
|
20
|
+
nextYear: '后一年',
|
|
21
|
+
prevMonth: '上个月',
|
|
22
|
+
nextMonth: '下个月',
|
|
23
|
+
year: '年',
|
|
24
|
+
month1: '1 月',
|
|
25
|
+
month2: '2 月',
|
|
26
|
+
month3: '3 月',
|
|
27
|
+
month4: '4 月',
|
|
28
|
+
month5: '5 月',
|
|
29
|
+
month6: '6 月',
|
|
30
|
+
month7: '7 月',
|
|
31
|
+
month8: '8 月',
|
|
32
|
+
month9: '9 月',
|
|
33
|
+
month10: '10 月',
|
|
34
|
+
month11: '11 月',
|
|
35
|
+
month12: '12 月',
|
|
36
|
+
// week: '周次',
|
|
37
|
+
weeks: {
|
|
38
|
+
sun: '日',
|
|
39
|
+
mon: '一',
|
|
40
|
+
tue: '二',
|
|
41
|
+
wed: '三',
|
|
42
|
+
thu: '四',
|
|
43
|
+
fri: '五',
|
|
44
|
+
sat: '六'
|
|
45
|
+
},
|
|
46
|
+
months: {
|
|
47
|
+
jan: '一月',
|
|
48
|
+
feb: '二月',
|
|
49
|
+
mar: '三月',
|
|
50
|
+
apr: '四月',
|
|
51
|
+
may: '五月',
|
|
52
|
+
jun: '六月',
|
|
53
|
+
jul: '七月',
|
|
54
|
+
aug: '八月',
|
|
55
|
+
sep: '九月',
|
|
56
|
+
oct: '十月',
|
|
57
|
+
nov: '十一月',
|
|
58
|
+
dec: '十二月'
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
select: {
|
|
62
|
+
loading: '加载中',
|
|
63
|
+
noMatch: '无匹配数据',
|
|
64
|
+
noData: '无数据',
|
|
65
|
+
placeholder: '请选择'
|
|
66
|
+
},
|
|
67
|
+
cascader: {
|
|
68
|
+
noMatch: '无匹配数据',
|
|
69
|
+
loading: '加载中',
|
|
70
|
+
placeholder: '请选择',
|
|
71
|
+
noData: '暂无数据'
|
|
72
|
+
},
|
|
73
|
+
pagination: {
|
|
74
|
+
goto: '前往',
|
|
75
|
+
pagesize: '条/页',
|
|
76
|
+
total: '共 {total} 条',
|
|
77
|
+
pageClassifier: '页'
|
|
78
|
+
},
|
|
79
|
+
messagebox: {
|
|
80
|
+
title: '提示',
|
|
81
|
+
confirm: '确定',
|
|
82
|
+
cancel: '取消',
|
|
83
|
+
error: '输入的数据不合法!'
|
|
84
|
+
},
|
|
85
|
+
upload: {
|
|
86
|
+
deleteTip: '按 delete 键可删除',
|
|
87
|
+
delete: '删除',
|
|
88
|
+
preview: '查看图片',
|
|
89
|
+
continue: '继续上传'
|
|
90
|
+
},
|
|
91
|
+
table: {
|
|
92
|
+
emptyText: '暂无数据',
|
|
93
|
+
confirmFilter: '筛选',
|
|
94
|
+
resetFilter: '重置',
|
|
95
|
+
clearFilter: '全部',
|
|
96
|
+
sumText: '合计'
|
|
97
|
+
},
|
|
98
|
+
tree: {
|
|
99
|
+
emptyText: '暂无数据'
|
|
100
|
+
},
|
|
101
|
+
transfer: {
|
|
102
|
+
noMatch: '无匹配数据',
|
|
103
|
+
noData: '无数据',
|
|
104
|
+
titles: ['列表 1', '列表 2'],
|
|
105
|
+
filterPlaceholder: '请输入搜索内容',
|
|
106
|
+
noCheckedFormat: '共 {total} 项',
|
|
107
|
+
hasCheckedFormat: '已选 {checked}/{total} 项'
|
|
108
|
+
},
|
|
109
|
+
image: {
|
|
110
|
+
error: '加载失败'
|
|
111
|
+
},
|
|
112
|
+
pageHeader: {
|
|
113
|
+
title: '返回'
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
};
|