@v2coding/ui 0.1.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.
Files changed (49) hide show
  1. package/README.md +6 -0
  2. package/dist/v2coding-ui.esm.js +10840 -0
  3. package/dist/v2coding-ui.min.js +1 -0
  4. package/dist/v2coding-ui.ssr.js +10747 -0
  5. package/package.json +54 -0
  6. package/src/components/dialog/dialog.vue +179 -0
  7. package/src/components/drawer/drawer.vue +523 -0
  8. package/src/components/exports/index.vue +53 -0
  9. package/src/components/exports/remote-exports-dialog.vue +202 -0
  10. package/src/components/field/field.autocomplete.vue +21 -0
  11. package/src/components/field/field.calendar.vue +117 -0
  12. package/src/components/field/field.cascade.vue +233 -0
  13. package/src/components/field/field.checkbox.vue +134 -0
  14. package/src/components/field/field.color.vue +24 -0
  15. package/src/components/field/field.date.vue +145 -0
  16. package/src/components/field/field.icons.vue +123 -0
  17. package/src/components/field/field.number.vue +43 -0
  18. package/src/components/field/field.radio.vue +100 -0
  19. package/src/components/field/field.rate.vue +37 -0
  20. package/src/components/field/field.rich.vue +165 -0
  21. package/src/components/field/field.select.vue +210 -0
  22. package/src/components/field/field.slider.vue +66 -0
  23. package/src/components/field/field.switch.vue +14 -0
  24. package/src/components/field/field.text.vue +66 -0
  25. package/src/components/field/field.timepicker.vue +70 -0
  26. package/src/components/field/field.timeselect.vue +24 -0
  27. package/src/components/field/field.trigger.dialog.vue +50 -0
  28. package/src/components/field/field.trigger.popover.vue +63 -0
  29. package/src/components/field/field.upload.file.vue +241 -0
  30. package/src/components/field/field.upload.image.vue +125 -0
  31. package/src/components/field/field.upload.portrait.vue +304 -0
  32. package/src/components/fill-view/index.vue +43 -0
  33. package/src/components/form/form.dialog.vue +174 -0
  34. package/src/components/form/form.drawer.vue +246 -0
  35. package/src/components/form/form.fieldset.vue +110 -0
  36. package/src/components/form/form.item.vue +213 -0
  37. package/src/components/form/form.vue +293 -0
  38. package/src/components/head-menu/index.vue +188 -0
  39. package/src/components/head-menu/menu-item.vue +84 -0
  40. package/src/components/history/index.vue +360 -0
  41. package/src/components/icon/icon.vue +63 -0
  42. package/src/components/minimize/index.vue +342 -0
  43. package/src/components/page/page.vue +43 -0
  44. package/src/components/provider/provider.vue +15 -0
  45. package/src/components/scroll-view/scroll-view.vue +384 -0
  46. package/src/components/table/column.vue +262 -0
  47. package/src/components/table/table.pagination.vue +71 -0
  48. package/src/components/table/table.select.vue +165 -0
  49. package/src/components/table/table.vue +805 -0
@@ -0,0 +1,84 @@
1
+ <script type="text/jsx">
2
+ export default {
3
+ name: 'head-menu-submenu',
4
+ inject: ['headMenu'],
5
+ props: {
6
+ item: Object,
7
+ },
8
+ computed: {
9
+ isLeaf() {
10
+ const {children} = this.item;
11
+ return !Array.isArray(children) || children.length <= 0;
12
+ },
13
+ index() {
14
+ const {url, id} = this.item;
15
+ if (this.isRouter) {
16
+ return url || id + '';
17
+ }
18
+ return id + '';
19
+ },
20
+ route() {
21
+ const {url} = this.item;
22
+ return url;
23
+ },
24
+ isRouter() {
25
+ return this.headMenu.router;
26
+ },
27
+ theme() {
28
+ return this.headMenu.theme;
29
+ },
30
+ popperClass() {
31
+ return ['nav-menu-submenu-popup', this.theme].join(' ');
32
+ },
33
+ },
34
+ render() {
35
+ if (this.isLeaf) {
36
+ return (
37
+ <el-menu-item index={this.index} route={this.route}>
38
+ <template slot="title">{this.item.name}</template>
39
+ </el-menu-item>
40
+ );
41
+ }
42
+ return (
43
+ <el-submenu index={this.index} popperClass={this.popperClass} popper-append-to-body={false}>
44
+ <template slot="title">{this.item.name}</template>
45
+ {this.item.children.map(child => <head-menu-submenu key={child.id} item={child}/>)}
46
+ </el-submenu>
47
+ );
48
+ },
49
+ };
50
+ </script>
51
+ <style lang="less">
52
+ .el-menu--collapse .el-menu-item [class^=el-icon-],
53
+ .el-menu--collapse .el-submenu .el-submenu__title [class^=el-icon-] {
54
+ margin: 0;
55
+ vertical-align: middle;
56
+ width: 24px;
57
+ text-align: center
58
+ }
59
+
60
+ .el-menu--collapse .el-menu-item .el-submenu__icon-arrow,
61
+ .el-menu--collapse .el-submenu .el-submenu__title .el-submenu__icon-arrow {
62
+ display: none
63
+ }
64
+
65
+ .el-menu--collapse .el-menu-item span,
66
+ .el-menu--collapse .el-submenu .el-submenu__title span {
67
+ height: 0;
68
+ width: 0;
69
+ overflow: hidden;
70
+ visibility: hidden;
71
+ display: inline-block
72
+ }
73
+
74
+ .nav-menu-submenu-popup {
75
+
76
+ .el-menu-item,
77
+ .el-submenu__title {
78
+ height: 40px;
79
+ line-height: 40px;
80
+ font-size: 12px;
81
+ }
82
+ }
83
+
84
+ </style>
@@ -0,0 +1,360 @@
1
+ <template>
2
+ <div class="history" v-show="visible">
3
+ <scroll-nav ref="menus" class="history-tabs">
4
+ <div
5
+ v-for="item in items"
6
+ :key="item.path"
7
+ :class="['history-menu', current === item.path ? 'is-active' : '']"
8
+ @click="onTabClick(item.path)"
9
+ >
10
+ <span class="ellipsis" :title="item.title">{{ item.title }}</span>
11
+ <i class="el-icon-close" @click.stop="onTabRemove(item.path)"></i>
12
+ </div>
13
+ </scroll-nav>
14
+ <div class="contextmenu" :style="contextmenu">
15
+ <div
16
+ class="modal"
17
+ ref="modal"
18
+ :style="{ display: activeContextMenu ? 'block' : 'none' }"
19
+ @click="hideContextMenu"
20
+ ></div>
21
+ <el-dropdown
22
+ @command="contextmenuClose"
23
+ trigger="click"
24
+ ref="context"
25
+ placement="top-start"
26
+ class="history-dropdown"
27
+ >
28
+ <span></span>
29
+ <el-dropdown-menu
30
+ class="history-contextmenu"
31
+ slot="dropdown"
32
+ :visible-arrow="false"
33
+ >
34
+ <el-dropdown-item command="left">
35
+ <i class="el-icon-arrow-left"></i>
36
+ 关闭左侧
37
+ </el-dropdown-item>
38
+ <el-dropdown-item command="right">
39
+ <i class="el-icon-arrow-right"></i>
40
+ 关闭右侧
41
+ </el-dropdown-item>
42
+ <el-dropdown-item command="other">
43
+ <i class="el-icon-close"></i>
44
+ 关闭其它
45
+ </el-dropdown-item>
46
+ <el-dropdown-item command="all">
47
+ <i class="el-icon-circle-close"></i>
48
+ 全部关闭
49
+ </el-dropdown-item>
50
+ </el-dropdown-menu>
51
+ </el-dropdown>
52
+ </div>
53
+ </div>
54
+ </template>
55
+
56
+ <script>
57
+ export default {
58
+ name: "History",
59
+ props: {
60
+ items: Array,
61
+ current: null,
62
+ visible: {
63
+ type: Boolean,
64
+ default: true,
65
+ },
66
+ },
67
+ data() {
68
+ return {
69
+ activeContextMenu: "",
70
+ contextmenu: {
71
+ width: "0px",
72
+ left: "0px",
73
+ },
74
+ };
75
+ },
76
+ watch: {
77
+ async current() {
78
+ if (!this.$refs.menus) {
79
+ return;
80
+ }
81
+ await this.$nextTick();
82
+ await this.$refs.menus.$nextTick();
83
+ this.$refs.menus.scrollToActiveItem();
84
+ },
85
+ },
86
+ mounted() {
87
+ document.addEventListener("contextmenu", this.onContextMenu);
88
+ },
89
+ beforeDestroy() {
90
+ document.removeEventListener("contextmenu", this.onContextMenu);
91
+ },
92
+ methods: {
93
+ showContextMenu() {
94
+ setTimeout(() => {
95
+ this.$refs.context.broadcast("ElDropdownMenu", "visible", true);
96
+ });
97
+ },
98
+ hideContextMenu() {
99
+ this.$refs.context.broadcast("ElDropdownMenu", "visible", false);
100
+ this.activeContextMenu = "";
101
+ },
102
+ onTabClick(path) {
103
+ this.$router.push({ path });
104
+ },
105
+ onTabRemove(path) {
106
+ this.$emit("remove-history", { type: "current", name: path });
107
+ },
108
+ onContextMenu(event) {
109
+ const container = this.$el.querySelector(".scroll-nav__nav");
110
+ const index = this.getChildContainIndex(container, event.target);
111
+ const rect = this.$el.getBoundingClientRect();
112
+ if (index !== -1) {
113
+ this.activeContextMenu = this.items[index]?.path;
114
+ this.contextmenu.left = `${event.clientX - rect.left}px`;
115
+ this.contextmenu.top = `${event.clientY - rect.top}px`;
116
+ this.showContextMenu();
117
+ event.preventDefault();
118
+ return false;
119
+ }
120
+ const modal = this.$el.querySelector(".modal");
121
+ if (event.target === modal) {
122
+ event.preventDefault();
123
+ return false;
124
+ }
125
+ return true;
126
+ },
127
+ contextmenuClose(command) {
128
+ this.$emit("remove-history", {
129
+ type: command,
130
+ name: this.activeContextMenu,
131
+ });
132
+ this.hideContextMenu();
133
+ },
134
+ getChildContainIndex(container, target) {
135
+ return Array.from(container.childNodes).findIndex((child) => {
136
+ return this.isContains(child, target);
137
+ });
138
+ },
139
+ isContains(container, target) {
140
+ if (container === target) {
141
+ return true;
142
+ }
143
+ const fn = (childNodes, _target) => {
144
+ return Array.from(childNodes).find((item) => {
145
+ const isEq = item === _target;
146
+ if (isEq) {
147
+ return true;
148
+ }
149
+ if (!item.childNodes.length) {
150
+ return false;
151
+ }
152
+ return fn(item.childNodes, _target);
153
+ });
154
+ };
155
+ return fn(container.childNodes, target);
156
+ },
157
+ },
158
+ };
159
+ </script>
160
+
161
+ <style lang="scss">
162
+ @import "../../assets/style/var";
163
+
164
+ .history {
165
+ flex: none;
166
+ height: 40px;
167
+ position: relative;
168
+ margin: 10px 0 0;
169
+
170
+ .history-tabs.scroll-nav__nav-wrap {
171
+ left: 0;
172
+ right: 0;
173
+ top: 0;
174
+ bottom: 0;
175
+ position: absolute;
176
+ align-items: flex-end;
177
+
178
+ .scroll-nav__nav-scroll {
179
+ flex: 1;
180
+ }
181
+
182
+ .scroll-nav__nav-control {
183
+ width: 20px;
184
+ height: 30px;
185
+
186
+ &.is-disabled {
187
+ .menu-nav-control {
188
+ &::before,
189
+ &::after {
190
+ background: var(--color-primary-light-3);
191
+ }
192
+ }
193
+ }
194
+ }
195
+
196
+ .scroll-nav__nav {
197
+ align-items: flex-end;
198
+ }
199
+
200
+ .menu-nav-control {
201
+ height: 30px;
202
+
203
+ &::before,
204
+ &::after {
205
+ width: 3px;
206
+ height: 12px;
207
+ background: var(--color-primary-light-6);
208
+ }
209
+
210
+ &::before {
211
+ bottom: -2px;
212
+ }
213
+
214
+ &::after {
215
+ top: -2px;
216
+ }
217
+ }
218
+ }
219
+
220
+ .contextmenu {
221
+ width: 0;
222
+ height: 0;
223
+ position: absolute;
224
+ top: 0;
225
+ left: 0;
226
+
227
+ .modal {
228
+ position: fixed;
229
+ top: 0;
230
+ left: 0;
231
+ bottom: 0;
232
+ right: 0;
233
+ z-index: 99;
234
+ }
235
+ }
236
+
237
+ .history-menu {
238
+ height: 30px;
239
+ color: #fff;
240
+ font-size: 14px;
241
+ display: flex;
242
+ flex-direction: row;
243
+ align-items: center;
244
+ justify-content: space-between;
245
+ cursor: pointer;
246
+ background: rgba(83,109,139,.6);
247
+ border-radius: 5px 5px 0 0;
248
+ transition: all 0.3s ease-in-out;
249
+ position: relative;
250
+ background: var(--color-primary-light-9);
251
+
252
+ & + .history-menu {
253
+ border-left: 1px solid var(--color-darken-primary-2);
254
+ }
255
+
256
+ &.is-active {
257
+ height: 40px;
258
+ color: #ffffff;
259
+ background: var(--color-darken-primary-2);
260
+ text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.95);
261
+ box-shadow: 7px 5px 5px rgba(0, 0, 0, 0.2);
262
+ z-index: 1;
263
+ }
264
+
265
+ &:hover {
266
+ i {
267
+ opacity: 1;
268
+ }
269
+ }
270
+
271
+ > span {
272
+ flex: 1;
273
+ padding: 0 25px;
274
+ }
275
+
276
+ > i {
277
+ position: absolute;
278
+ top: 2px;
279
+ right: 3px;
280
+ opacity: 0.3;
281
+ width: 14px;
282
+ height: 14px;
283
+ font-size: 12px;
284
+ border-radius: 50%;
285
+ transition: opacity 0.3s ease-in-out;
286
+
287
+ &:hover {
288
+ background-color: var(--color-primary);
289
+ }
290
+ }
291
+ }
292
+
293
+ .el-tabs {
294
+ background: transparent;
295
+
296
+ > .el-tabs__header {
297
+ background: transparent;
298
+ border-bottom: none;
299
+
300
+ .el-tabs__nav {
301
+ border: none;
302
+ }
303
+
304
+ .el-tabs__nav-wrap::after {
305
+ content: unset;
306
+ }
307
+ }
308
+
309
+ > .el-tabs__content {
310
+ padding: 0;
311
+ }
312
+
313
+ .el-tabs__nav-next,
314
+ .el-tabs__nav-prev {
315
+ color: #536d8b;
316
+ width: 20px;
317
+ line-height: 39px;
318
+ text-align: center;
319
+ font-size: 18px;
320
+ }
321
+
322
+ .el-tabs__nav-prev {
323
+ border-right: 1px solid #ddd;
324
+ }
325
+
326
+ .el-tabs__nav-next {
327
+ border-left: 1px solid #ddd;
328
+ }
329
+
330
+ .el-tabs__item {
331
+ margin: 8px;
332
+ border: none;
333
+ height: 34px;
334
+ line-height: 34px;
335
+ background: #2e557e;
336
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16);
337
+ color: #fff;
338
+ display: inline-flex;
339
+ flex-direction: row;
340
+ align-items: center;
341
+ }
342
+ }
343
+
344
+ .history-tab-title {
345
+ width: 6em;
346
+ display: inline-block;
347
+ vertical-align: middle;
348
+ }
349
+ }
350
+
351
+ .history-dropdown {
352
+ position: absolute;
353
+ top: 0;
354
+ left: 0;
355
+ }
356
+
357
+ .history-contextmenu.el-popper {
358
+ margin-top: 0;
359
+ }
360
+ </style>
@@ -0,0 +1,63 @@
1
+ <template>
2
+ <svg :class="['ui-icon', 'ui-icon-' + realName]" aria-hidden="true">
3
+ <use :xlink:href="`#icon-${realName}`"/>
4
+ </svg>
5
+ </template>
6
+
7
+ <script>
8
+ import Iconfont from '../../config/config.iconfont';
9
+
10
+ export default {
11
+ name: 'ui-icon',
12
+ props: {
13
+ name: String,
14
+ },
15
+ data() {
16
+ return {
17
+ icons: [],
18
+ };
19
+ },
20
+ computed: {
21
+ realName({name, icons}) {
22
+ const isIncludes = icons.includes(name);
23
+ if (isIncludes) {
24
+ return name;
25
+ }
26
+ return 'unknown';
27
+ },
28
+ },
29
+ mounted() {
30
+ this.init();
31
+ },
32
+ methods: {
33
+ async init() {
34
+ this.icons = await Iconfont.getIcons();
35
+ },
36
+ },
37
+ };
38
+ </script>
39
+
40
+ <style scoped>
41
+ .ui-icon {
42
+ width: 1em;
43
+ height: 1em;
44
+ vertical-align: -0.15em;
45
+ fill: currentColor;
46
+ overflow: hidden;
47
+ display: inline-block;
48
+ }
49
+
50
+ .ui-icon.ui-icon-loading {
51
+ animation: rotating 2s linear infinite;
52
+ }
53
+
54
+ @keyframes rotating {
55
+ from {
56
+ transform: rotate(0deg)
57
+ }
58
+
59
+ to {
60
+ transform: rotate(1turn)
61
+ }
62
+ }
63
+ </style>