@v2coding/ui 0.1.5 → 0.1.9

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 (50) hide show
  1. package/dist/v2coding-ui.esm.js +557 -842
  2. package/dist/v2coding-ui.min.js +1 -1
  3. package/dist/v2coding-ui.ssr.js +578 -836
  4. package/package.json +2 -3
  5. package/src/components/dialog/dialog.vue +0 -179
  6. package/src/components/drawer/drawer.vue +0 -523
  7. package/src/components/exports/index.vue +0 -53
  8. package/src/components/exports/remote-exports-dialog.vue +0 -202
  9. package/src/components/field/field.autocomplete.vue +0 -21
  10. package/src/components/field/field.calendar.vue +0 -117
  11. package/src/components/field/field.cascade.vue +0 -233
  12. package/src/components/field/field.checkbox.vue +0 -134
  13. package/src/components/field/field.color.vue +0 -24
  14. package/src/components/field/field.date.vue +0 -145
  15. package/src/components/field/field.fence.vue +0 -856
  16. package/src/components/field/field.icons.vue +0 -123
  17. package/src/components/field/field.lnglat.vue +0 -236
  18. package/src/components/field/field.number.vue +0 -43
  19. package/src/components/field/field.radio.vue +0 -100
  20. package/src/components/field/field.rate.vue +0 -37
  21. package/src/components/field/field.rich.vue +0 -155
  22. package/src/components/field/field.select.vue +0 -210
  23. package/src/components/field/field.slider.vue +0 -66
  24. package/src/components/field/field.switch.vue +0 -14
  25. package/src/components/field/field.text.vue +0 -66
  26. package/src/components/field/field.timepicker.vue +0 -70
  27. package/src/components/field/field.timeselect.vue +0 -24
  28. package/src/components/field/field.trigger.dialog.vue +0 -50
  29. package/src/components/field/field.trigger.popover.vue +0 -63
  30. package/src/components/field/field.upload.file.vue +0 -241
  31. package/src/components/field/field.upload.image.vue +0 -125
  32. package/src/components/fill-view/fill-view.vue +0 -43
  33. package/src/components/form/form.dialog.vue +0 -174
  34. package/src/components/form/form.drawer.vue +0 -246
  35. package/src/components/form/form.fieldset.vue +0 -110
  36. package/src/components/form/form.item.vue +0 -210
  37. package/src/components/form/form.vue +0 -302
  38. package/src/components/head-menu/head-menu.vue +0 -188
  39. package/src/components/head-menu/menu-item.vue +0 -80
  40. package/src/components/history/history.vue +0 -361
  41. package/src/components/icon/icon.vue +0 -63
  42. package/src/components/minimize/minimize.vue +0 -342
  43. package/src/components/page/page.vue +0 -43
  44. package/src/components/page/search-page.vue +0 -202
  45. package/src/components/provider/provider.vue +0 -15
  46. package/src/components/scroll-view/scroll-view.vue +0 -384
  47. package/src/components/table/column.vue +0 -262
  48. package/src/components/table/table.pagination.vue +0 -71
  49. package/src/components/table/table.select.vue +0 -165
  50. package/src/components/table/table.vue +0 -807
@@ -1,302 +0,0 @@
1
- <template>
2
- <el-form v-bind="$attrs" ref="form" :model="model" :label-width="labelWidth" v-on="listeners" @submit.native.prevent="onSubmit">
3
- <component v-for="(field, i) in fields" v-bind="field" v-on="field.listeners" :key="i" :is="field.componentName || 'ui-form-item'"></component>
4
- <slot></slot>
5
- </el-form>
6
- </template>
7
-
8
- <script>
9
- import throttle from 'lodash.throttle';
10
- import Objects from '../../util/objects';
11
- import FormItem from './form.item';
12
- import TableSelectItem from '../table/table.select.item';
13
-
14
- export default {
15
- name: 'ui-form',
16
- inheritAttrs: false,
17
- provide() {
18
- return {
19
- uiForm: this,
20
- };
21
- },
22
- props: {
23
- disabled: Boolean,
24
- labelWidth: {
25
- type: String,
26
- default: '105px',
27
- },
28
- fields: Array,
29
- url: String,
30
- method: {
31
- type: String,
32
- validator: (val) => ['get', 'post', 'put'].includes(val),
33
- default: 'post',
34
- },
35
- /**
36
- * 是否显示 label 后面的冒号
37
- */
38
- colon: {
39
- type: Boolean,
40
- default: undefined,
41
- },
42
- beforeSubmit: {
43
- type: Function,
44
- default: () => void 0,
45
- },
46
- submitting: {
47
- type: Boolean,
48
- default: false,
49
- },
50
- /**
51
- * listeners:
52
- * ready 所有表单项都准备好后触发
53
- * submit 触发提交事件
54
- * after-submit 配置 url 后触发submit事件时触发提交数据完成事件
55
- * validate 任一表单项被校验后触发
56
- **/
57
- },
58
- data() {
59
- this.fieldStatus = []; // [{name,status,componentInstance}, ...]
60
- return {
61
- fieldList: [],// [[name, value], ...]
62
- };
63
- },
64
- computed: {
65
- model() {
66
- return Object.fromEntries(this.fieldList);
67
- },
68
- listeners() {
69
- // eslint-disable-next-line
70
- const {submit, ready, ...listeners} = this.$listeners;
71
- return listeners;
72
- },
73
- },
74
- beforeCreate() {
75
- this.isMounted = false;
76
- },
77
- mounted() {
78
- this.isMounted = true;
79
- this.$el.addEventListener('reset', this.onReset);
80
- this.checkFieldsReady();
81
- },
82
- beforeDestroy() {
83
- this.$el.removeEventListener('reset', this.onReset);
84
- },
85
- methods: {
86
- /**
87
- * @public
88
- */
89
- validate(...args) {
90
- return this.$refs.form.validate(...args);
91
- },
92
- /**
93
- * @public
94
- */
95
- validateField(...args) {
96
- return this.$refs.form.validateField(...args);
97
- },
98
- /**
99
- * @public
100
- */
101
- clearValidate(...args) {
102
- return this.$refs.form.clearValidate(...args);
103
- },
104
- /**
105
- * @public
106
- */
107
- resetValues(values) {
108
- if (!Objects.isObject(values)) {
109
- values = {};
110
- }
111
- const formItems = this.getFormItems();
112
- formItems.forEach(item => {
113
- if (Object.prototype.hasOwnProperty.call(values, item.name)) {
114
- item.resetField(values[item.name]);
115
- } else {
116
- item.resetField();
117
- }
118
- });
119
- },
120
- /**
121
- * @public
122
- */
123
- setValues(values) {
124
- if (!values || !Objects.isObject(values)) {
125
- return;
126
- }
127
- const formItems = this.getFormItems();
128
- Object.entries(values).forEach(([fieldName, fieldValue]) => {
129
- const fieldItem = formItems.find(item => item.name === fieldName);
130
- if (!fieldItem) {
131
- return;
132
- }
133
- fieldItem.fieldValue = fieldValue;
134
- });
135
- },
136
- /**
137
- * @public
138
- */
139
- getValues() {
140
- const formItems = this.getFormItems();
141
- return formItems.reduce((values, item) => {
142
- if (item.ignore === true) {
143
- return values;
144
- }
145
- return {...values, [item.name]: item.fieldValue};
146
- }, {});
147
- },
148
- getFormItems() {
149
- const listSearchItem = (items) => {
150
- return items.reduce((results, item) => {
151
- // TableSelectItem mixins FormItem
152
- if ([FormItem.name, TableSelectItem.name].includes(item.$options.name)) {
153
- results.push(item);
154
- } else {
155
- results.push(...listSearchItem(item.$children || []));
156
- }
157
- return results;
158
- }, []);
159
- };
160
- return listSearchItem(this.$children);
161
- },
162
- /**
163
- * @private
164
- */
165
- addField(name, defaultValue = '', instance) {
166
- if (!Object.hasOwnProperty.call(this.model, name)) {
167
- this.onFieldChange(name, defaultValue, instance);
168
- }
169
- },
170
-
171
- /**
172
- * (函数节流. 600ms内只执行一次, 防止 form 表单多次提交)
173
- * @private
174
- */
175
- onSubmit: throttle(
176
- function() {
177
- let formData = this.getValues();
178
- const allow = this.beforeSubmit(formData);
179
- if (typeof allow === 'boolean' && allow === false) {
180
- return;
181
- }
182
- if (typeof allow === 'object') {
183
- formData = allow;
184
- }
185
- this.validate((valid) => {
186
- if (!valid) {
187
- return;
188
- }
189
- this.$emit('submit', formData);
190
- this.doAction(formData);
191
- });
192
- },
193
- 600,
194
- {trailing: false},
195
- ),
196
- doAction(data) {
197
- if (!this.url) {
198
- return;
199
- }
200
- let def;
201
- this.$emit('update:submitting', true);
202
- if (this.method === 'get') {
203
- def = this.getWithMessage(this.url, {params: data});
204
- } else {
205
- def = this.postWithMessage(this.url, data);
206
- }
207
- def.then((...args) => {
208
- this.$emit('update:submitting', false);
209
- this.$emit('after-submit', ...args);
210
- }).catch((...args) => {
211
- this.$emit('update:submitting', false);
212
- return Promise.reject(...args);
213
- });
214
- },
215
- /**
216
- * @private
217
- */
218
- onReset(e) {
219
- e.preventDefault();
220
- this.resetValues();
221
- this.$emit('reset');
222
- },
223
- /**
224
- * @private
225
- */
226
- trigger(event, ...args) {
227
- if (typeof event !== 'string') {
228
- return;
229
- }
230
- const e = event.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
231
- if (!this[`onField${e}`]) {
232
- return;
233
- }
234
- this[`onField${e}`](...args);
235
- },
236
- /**
237
- * @private
238
- */
239
- onFieldPending(component) {
240
- if (!component.name) {
241
- return;
242
- }
243
- this.fieldStatus.push({name: component.name, status: false, instance: component});
244
- },
245
- /**
246
- * @private
247
- */
248
- onFieldDestroy(component) {
249
- if (component.name) {
250
- const index = this.fieldStatus.findIndex(item => item.name === component.name);
251
- index !== -1 && this.fieldStatus.splice(index, 1);
252
-
253
- const i = this.fieldList.findIndex(item => item[0] === component.name);
254
- this.fieldList.splice(i, 1);
255
- }
256
- const formItems = this.getFormItems();
257
- if (formItems.length === this.fieldStatus.length) {
258
- this.checkFieldsReady();
259
- }
260
- },
261
- /**
262
- * @private
263
- */
264
- onFieldDone(component) {
265
- if (!component.name) {
266
- return;
267
- }
268
- const index = this.fieldStatus.findIndex(item => item.name === component.name);
269
- index !== -1 && this.fieldStatus.splice(index, 1, {name: component.name, status: true, instance: component});
270
- const formItems = this.getFormItems();
271
- if (formItems.length === this.fieldStatus.length) {
272
- this.checkFieldsReady();
273
- }
274
- },
275
- onFieldChange(fieldName, fieldValue, instance) {
276
- const index = this.fieldList.findIndex(item => item[0] === fieldName);
277
- const current = Object.freeze([fieldName, fieldValue, instance]);
278
- if (index === -1) {
279
- this.fieldList.push(current);
280
- } else {
281
- this.fieldList.splice(index, 1, current);
282
- }
283
- },
284
- checkFieldsReady() {
285
- if (!this.isMounted) {
286
- return;
287
- }
288
- const isPending = this.fieldStatus.some(item => !item.status);
289
- if (!isPending && !this.isReady) {
290
- this.isReady = true;
291
- this.$emit('ready');
292
- }
293
- },
294
- },
295
- };
296
- </script>
297
-
298
- <style scoped>
299
- .el-form--inline ::v-deep .el-form-item {
300
- display: inline-flex;
301
- }
302
- </style>
@@ -1,188 +0,0 @@
1
- <template>
2
- <el-menu
3
- class="head-menu"
4
- v-bind="$attrs"
5
- v-on="$listeners"
6
- :mode="mode"
7
- :router="router"
8
- :default-active="active"
9
- >
10
- <menu-item v-for="item in displayMenus" :item="item" :key="item.id"/>
11
- </el-menu>
12
- </template>
13
-
14
- <script>
15
- import {mapState} from 'vuex';
16
- import MenuItem from './menu-item';
17
-
18
- export default {
19
- name: 'ui-head-menu',
20
- components: {MenuItem},
21
- provide() {
22
- return {
23
- headMenu: this,
24
- };
25
- },
26
- props: {
27
- router: {
28
- type: Boolean,
29
- default: true,
30
- },
31
- defaultActive: String,
32
- mode: {
33
- default: 'horizontal',
34
- },
35
- },
36
- data() {
37
- return {
38
- packUpWidth: 0,
39
- };
40
- },
41
- computed: {
42
- ...mapState(['menus']),
43
- headMenu() {
44
- // eslint-disable-next-line
45
- return this.menus.filter(menu => [1, 2].includes(menu.type)).map(({children, ...menu}) => menu);
46
- },
47
- active() {
48
- if (!this.router) {
49
- return this.defaultActive;
50
- }
51
- const currentPath = this.$route.path;
52
- const isHeadRoute = this.headMenu.some(menu => menu.url === currentPath);
53
- if (isHeadRoute) {
54
- return currentPath;
55
- }
56
- const currentHeadMenu = this.getCurrentHeadMenu(currentPath, this.menus);
57
- return currentHeadMenu && (currentHeadMenu.path || currentHeadMenu.url);
58
- },
59
- menuWidth() {
60
- return this.headMenu.reduce((total, item) => {
61
- return total + (item.name || '').split('').length * 16 + 25 * 2; // 16:字体大小值; 25:左右padding/margin值
62
- }, 60); // 100:菜单左边的margin值
63
- },
64
- packUpIndex() {
65
- if (this.packUpWidth <= 0) {
66
- return -1;
67
- }
68
- let index = -1;
69
- let width = this.packUpWidth + 130; // 50:更多下拉菜单所占宽度
70
- for(let i = this.headMenu.length - 1; i >= 0; i--) {
71
- const item = this.headMenu[i];
72
- const currentWidth = (item.name || '').split('').length * 16 + 25 * 2;
73
- if (currentWidth >= width) {
74
- index = i - 1;
75
- break;
76
- }
77
- width = width - currentWidth;
78
- }
79
- return Math.max(0, index);
80
- },
81
- displayMenus() {
82
- if (this.packUpIndex === -1) {
83
- return this.headMenu;
84
- }
85
- const menus = this.headMenu.slice(0, this.packUpIndex);
86
- const moreMenus = this.headMenu.slice(this.packUpIndex);
87
- menus.push({
88
- id: 'more',
89
- name: '更多菜单',
90
- children: moreMenus,
91
- });
92
- return menus;
93
- },
94
- },
95
- mounted() {
96
- window.addEventListener('resize', this.onResize);
97
- this.onResize();
98
-
99
- const logo = document.querySelector('.page-header > .logo');
100
- logo && logo.addEventListener('load', () => this.onResize());
101
- },
102
- beforeDestroy() {
103
- window.removeEventListener('resize', this.onResize);
104
- },
105
- methods: {
106
- onResize() {
107
- clearTimeout(this.timer);
108
- this.timer = setTimeout(() => {
109
- const headerWidth = document.documentElement.clientWidth;
110
- const logoEl = document.querySelector('.page-header > .logo');
111
- const titleEl = document.querySelector('.page-header > .title');
112
- const messageEl = document.querySelector('.page-header > .screen');
113
- const usernameEl = document.querySelector('.page-header > .username');
114
- const logoWidth = (logoEl && logoEl.offsetWidth || 0) + 20; // 20 margin
115
- const titleWidth = titleEl && titleEl.offsetWidth || 0;
116
- const messageElWidth = messageEl && messageEl.offsetWidth || 0;
117
- const usernameWidth = usernameEl && usernameEl.offsetWidth || 0;
118
- const allowedMenuWidth = headerWidth - 60 - logoWidth - titleWidth - messageElWidth - usernameWidth;
119
- this.packUpWidth = Math.max(0, this.menuWidth - allowedMenuWidth);
120
- }, 50);
121
- },
122
- getCurrentHeadMenu(path, menus) {
123
- if (!Array.isArray(menus) || menus.length <= 0) {
124
- return undefined;
125
- }
126
- return menus.find(menu => {
127
- const isMatched = (menu.children || []).some(childMenu => (childMenu.path || childMenu.url) === path);
128
- if (isMatched) {
129
- return true;
130
- }
131
- return this.getCurrentHeadMenu(path, menu.children);
132
- });
133
- },
134
- },
135
- };
136
- </script>
137
-
138
- <style lang="scss">
139
-
140
- .head-menu.el-menu {
141
- background-color: transparent;
142
- border-bottom: none;
143
-
144
- > .el-menu-item,
145
- > .el-submenu .el-submenu__title {
146
- font-size: 16px;
147
- font-weight: 400;
148
- color: inherit;
149
- height: var(--header-height);
150
- line-height: var(--header-height);
151
- padding: 0 25px;
152
- border: none;
153
- box-sizing: border-box;
154
- transition: all 0.2s ease-in-out;
155
-
156
- span {
157
- vertical-align: unset;
158
- }
159
-
160
- i {
161
- width: 20px;
162
- font-size: 14px;
163
- }
164
- }
165
-
166
- > .el-menu-item:not(.is-disabled):not(.is-active):hover,
167
- > .el-menu-item:not(.is-disabled):not(.is-active):focus,
168
- > .el-submenu:not(.is-disabled):not(.is-active):hover .el-submenu__title,
169
- > .el-submenu:not(.is-disabled):not(.is-active):focus .el-submenu__title {
170
- color: inherit;
171
- background-color: rgba(0, 146, 63, 0.3);
172
- }
173
-
174
- > .el-menu-item.is-active,
175
- > .el-submenu.is-active .el-submenu__title {
176
- color: inherit;
177
- background-color: rgba(0, 146, 63, 0.6);
178
- }
179
-
180
- .el-submenu__title i {
181
- color: inherit;
182
- }
183
-
184
- .el-menu--popup {
185
-
186
- }
187
- }
188
- </style>
@@ -1,80 +0,0 @@
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(createElement) {
35
- if (this.isLeaf) {
36
- return createElement('el-menu-item', {props: {index: this.index, route: this.route}}, [
37
- createElement('template', {slot: 'title'}, [this.item.name]),
38
- ]);
39
- }
40
- return createElement('el-submenu', {props: {index: this.index, popperClass: this.popperClass, popperAppendToBody: false}}, [
41
- createElement('template', {slot: 'title'}, [this.item.name]),
42
- ...this.item.children.map(child => createElement('head-menu-submenu', {key: child.id, props: {item: child}})),
43
- ]);
44
- },
45
- };
46
- </script>
47
- <style lang="less">
48
- .el-menu--collapse .el-menu-item [class^=el-icon-],
49
- .el-menu--collapse .el-submenu .el-submenu__title [class^=el-icon-] {
50
- margin: 0;
51
- vertical-align: middle;
52
- width: 24px;
53
- text-align: center
54
- }
55
-
56
- .el-menu--collapse .el-menu-item .el-submenu__icon-arrow,
57
- .el-menu--collapse .el-submenu .el-submenu__title .el-submenu__icon-arrow {
58
- display: none
59
- }
60
-
61
- .el-menu--collapse .el-menu-item span,
62
- .el-menu--collapse .el-submenu .el-submenu__title span {
63
- height: 0;
64
- width: 0;
65
- overflow: hidden;
66
- visibility: hidden;
67
- display: inline-block
68
- }
69
-
70
- .nav-menu-submenu-popup {
71
-
72
- .el-menu-item,
73
- .el-submenu__title {
74
- height: 40px;
75
- line-height: 40px;
76
- font-size: 12px;
77
- }
78
- }
79
-
80
- </style>