@truenewx/tnxvue3 3.0.0-alpha.40 → 3.0.0-alpha.42
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/package.json +2 -2
- package/src/element-plus/edit-table/EditTable.vue +9 -2
- package/src/element-plus/enum-select/EnumSelect.vue +25 -9
- package/src/element-plus/input-dropdown/InputDropdown.vue +74 -0
- package/src/element-plus/select/Select.vue +4 -2
- package/src/element-plus/submit-form/SubmitForm.vue +17 -1
- package/src/element-plus/tnxel.css +1 -0
- package/src/element-plus/tnxel.js +4 -1
- package/src/tnxvue.js +2 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truenewx/tnxvue3",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.42",
|
|
4
4
|
"description": "互联网技术解决方案:Vue3扩展支持",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"vue-router": "~4.4.0"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@truenewx/tnxcore": "3.0.0-alpha.
|
|
27
|
+
"@truenewx/tnxcore": "3.0.0-alpha.27",
|
|
28
28
|
"@element-plus/icons-vue": "2.3.1",
|
|
29
29
|
"async-validator": "4.2.5",
|
|
30
30
|
"mitt": "3.0.1"
|
|
@@ -40,7 +40,9 @@
|
|
|
40
40
|
</el-table-column>
|
|
41
41
|
</el-table>
|
|
42
42
|
<div class="tnxel-edit-table-footer" v-if="addable">
|
|
43
|
-
<tnxel-button type="primary" link icon="Plus" @click="toAddRow">
|
|
43
|
+
<tnxel-button type="primary" class="w-fit-content" link icon="Plus" @click="toAddRow">
|
|
44
|
+
{{ addText }}
|
|
45
|
+
</tnxel-button>
|
|
44
46
|
</div>
|
|
45
47
|
<tnxel-icon class="d-none icon-warning" value="WarningFilled"/>
|
|
46
48
|
</div>
|
|
@@ -455,6 +457,10 @@ export default {
|
|
|
455
457
|
</script>
|
|
456
458
|
|
|
457
459
|
<style>
|
|
460
|
+
.tnxel-edit-table-container .el-table .el-table__row {
|
|
461
|
+
height: 33px;
|
|
462
|
+
}
|
|
463
|
+
|
|
458
464
|
.tnxel-edit-table-container .el-table.padding-none .el-table__body-wrapper .el-table__cell,
|
|
459
465
|
.tnxel-edit-table-container .el-table.padding-none .el-table__body-wrapper td .cell,
|
|
460
466
|
.tnxel-edit-table-container .el-table--border.padding-none .el-table__body-wrapper td.el-table__cell:first-child .cell {
|
|
@@ -470,7 +476,7 @@ export default {
|
|
|
470
476
|
.tnxel-edit-table-container .el-table.padding-none .el-table__body-wrapper .el-input-group__append,
|
|
471
477
|
.tnxel-edit-table-container .el-table.padding-none .el-table__body-wrapper .el-input-group__prepend {
|
|
472
478
|
border-radius: 0;
|
|
473
|
-
padding: 0
|
|
479
|
+
padding: 0 10px;
|
|
474
480
|
}
|
|
475
481
|
|
|
476
482
|
.tnxel-edit-table-container .el-table.padding-none .el-table__body-wrapper .el-button {
|
|
@@ -580,6 +586,7 @@ export default {
|
|
|
580
586
|
height: 32px;
|
|
581
587
|
display: flex;
|
|
582
588
|
align-items: center;
|
|
589
|
+
justify-content: center;
|
|
583
590
|
}
|
|
584
591
|
|
|
585
592
|
.tnxel-edit-table-container .tnxel-edit-table-footer .el-button {
|
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<tnxel-fetch-cascader v-model="model"
|
|
3
|
-
|
|
2
|
+
<tnxel-fetch-cascader v-model="model"
|
|
3
|
+
url="/api/meta/enums" value-name="key" text-name="caption" index-name="searchIndex"
|
|
4
|
+
:disabled="disabled"
|
|
5
|
+
:empty="empty"
|
|
6
|
+
:filterable="filterable"
|
|
4
7
|
:theme="theme"
|
|
5
8
|
:params="{
|
|
6
9
|
type: type,
|
|
7
10
|
subtype:subtype,
|
|
8
11
|
grouped: true,
|
|
9
|
-
}"
|
|
10
|
-
|
|
12
|
+
}"
|
|
13
|
+
v-if="grouped"/>
|
|
14
|
+
<tnxel-select ref="select"
|
|
15
|
+
v-model="model"
|
|
16
|
+
:id="id"
|
|
17
|
+
:selector="selector"
|
|
18
|
+
:items="items"
|
|
11
19
|
value-name="key" text-name="caption" index-name="searchIndex"
|
|
12
|
-
:default-value="defaultValue"
|
|
13
|
-
:
|
|
14
|
-
:
|
|
20
|
+
:default-value="defaultValue"
|
|
21
|
+
:empty="empty"
|
|
22
|
+
:empty-value="emptyValue"
|
|
23
|
+
:placeholder="placeholder"
|
|
24
|
+
:disabled="disabled"
|
|
25
|
+
:filterable="filterable"
|
|
26
|
+
:theme="theme"
|
|
27
|
+
:size="size"
|
|
28
|
+
:tag-click="tagClick"
|
|
29
|
+
:change="change"
|
|
30
|
+
v-else>
|
|
15
31
|
<template #option="{item}" v-if="$slots.option">
|
|
16
32
|
<slot name="option" :item="item"></slot>
|
|
17
33
|
</template>
|
|
@@ -43,8 +59,8 @@ export default {
|
|
|
43
59
|
default: false,
|
|
44
60
|
},
|
|
45
61
|
emptyValue: {
|
|
46
|
-
type: [String, Boolean,
|
|
47
|
-
default:
|
|
62
|
+
type: [String, Number, Boolean, Array],
|
|
63
|
+
default: '', // 设为null会告警,暂时先设为空字符,在非字符串类型的情况下是否有问题,有待检验
|
|
48
64
|
},
|
|
49
65
|
placeholder: String,
|
|
50
66
|
disabled: Boolean,
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-input class="tnxel-input-dropdown"
|
|
3
|
+
v-model="model"
|
|
4
|
+
:disabled="disabled"
|
|
5
|
+
>
|
|
6
|
+
<template #append v-if="items?.length">
|
|
7
|
+
<el-dropdown :trigger="trigger" @command="selectItem">
|
|
8
|
+
<span class="el-dropdown-link">
|
|
9
|
+
<Icon value="ArrowDown"/>
|
|
10
|
+
</span>
|
|
11
|
+
<template #dropdown>
|
|
12
|
+
<el-dropdown-menu>
|
|
13
|
+
<template v-for="(item, index) of items" :key="index">
|
|
14
|
+
<el-dropdown-item
|
|
15
|
+
:command="item[valueName]"
|
|
16
|
+
:title="item[titleName]"
|
|
17
|
+
>
|
|
18
|
+
{{ item[textName] }}
|
|
19
|
+
</el-dropdown-item>
|
|
20
|
+
</template>
|
|
21
|
+
</el-dropdown-menu>
|
|
22
|
+
</template>
|
|
23
|
+
</el-dropdown>
|
|
24
|
+
</template>
|
|
25
|
+
</el-input>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<script>
|
|
29
|
+
import Icon from '../icon/Icon.vue';
|
|
30
|
+
|
|
31
|
+
export default {
|
|
32
|
+
name: 'TnxelInputDropdown',
|
|
33
|
+
components: {Icon},
|
|
34
|
+
props: {
|
|
35
|
+
modelValue: String,
|
|
36
|
+
items: Array,
|
|
37
|
+
valueName: {
|
|
38
|
+
type: String,
|
|
39
|
+
default: 'value',
|
|
40
|
+
},
|
|
41
|
+
textName: {
|
|
42
|
+
type: String,
|
|
43
|
+
default: 'text',
|
|
44
|
+
},
|
|
45
|
+
titleName: {
|
|
46
|
+
type: String,
|
|
47
|
+
default: 'title',
|
|
48
|
+
},
|
|
49
|
+
trigger: String,
|
|
50
|
+
disabled: Boolean,
|
|
51
|
+
},
|
|
52
|
+
data() {
|
|
53
|
+
return {
|
|
54
|
+
model: this.modelValue,
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
watch: {
|
|
58
|
+
model() {
|
|
59
|
+
this.$emit('update:modelValue', this.model);
|
|
60
|
+
},
|
|
61
|
+
modelValue() {
|
|
62
|
+
this.model = this.modelValue;
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
methods: {
|
|
66
|
+
selectItem(value) {
|
|
67
|
+
this.model = value;
|
|
68
|
+
},
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<style>
|
|
74
|
+
</style>
|
|
@@ -204,13 +204,13 @@ export default {
|
|
|
204
204
|
placeholder: String,
|
|
205
205
|
disabled: Boolean,
|
|
206
206
|
tagClick: Function, // 点击一个标签选项时调用,如果返回false,则选项不会被选中
|
|
207
|
-
change: Function, //
|
|
207
|
+
change: Function, // 选中值变化后的事件处理函数,比change事件传递更多参数数据
|
|
208
208
|
filterable: Boolean,
|
|
209
209
|
theme: String,
|
|
210
210
|
size: String,
|
|
211
211
|
border: Boolean,
|
|
212
212
|
},
|
|
213
|
-
emits: ['update:modelValue'],
|
|
213
|
+
emits: ['update:modelValue', 'change'],
|
|
214
214
|
data() {
|
|
215
215
|
let model = this.getModel(this.items);
|
|
216
216
|
if (model !== this.modelValue) {
|
|
@@ -286,6 +286,8 @@ export default {
|
|
|
286
286
|
item = this.getItem(value);
|
|
287
287
|
}
|
|
288
288
|
this.change(item, this.id);
|
|
289
|
+
} else {
|
|
290
|
+
this.$emit('change', value);
|
|
289
291
|
}
|
|
290
292
|
},
|
|
291
293
|
getItem(value) {
|
|
@@ -125,7 +125,22 @@ export default {
|
|
|
125
125
|
vm.fieldNames = Object.keys(meta);
|
|
126
126
|
}, this.rulesApp);
|
|
127
127
|
} else {
|
|
128
|
-
this.validationRules =
|
|
128
|
+
this.validationRules = {};
|
|
129
|
+
Object.keys(this.rules).forEach(fieldName => {
|
|
130
|
+
let fieldRules = this.rules[fieldName];
|
|
131
|
+
if (fieldRules && Array.isArray(fieldRules)) {
|
|
132
|
+
this.validationRules[fieldName] = fieldRules.filter((rule, index) => {
|
|
133
|
+
let valid = rule !== undefined && rule !== null;
|
|
134
|
+
if (!valid) {
|
|
135
|
+
console.error(
|
|
136
|
+
'invalid rules[' + index + '] for field "' + fieldName + '": ' + rule);
|
|
137
|
+
}
|
|
138
|
+
return valid;
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
console.error('invalid rules for field "' + fieldName + '": ' + fieldRules);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
129
144
|
}
|
|
130
145
|
} else {
|
|
131
146
|
this.validationRules = {};
|
|
@@ -215,6 +230,7 @@ export default {
|
|
|
215
230
|
/**
|
|
216
231
|
* 执行所有的校验规则,以自定义方式处理错误
|
|
217
232
|
* @param callback 校验后的回调函数,首个参数为错误消息字符串数组,没有错误时为null
|
|
233
|
+
* @param fieldLabels 字段标签,可以是一个函数,也可以是一个对象,用于自定义错误消息中的字段标签
|
|
218
234
|
*/
|
|
219
235
|
validateRules(callback, fieldLabels) {
|
|
220
236
|
let validator = new AsyncValidator(this.validationRules);
|
|
@@ -29,6 +29,7 @@ import FetchTags from './fetch-tags/FetchTags.vue';
|
|
|
29
29
|
import FssUpload from './fss-upload/FssUpload.vue';
|
|
30
30
|
import FssView from './fss-view/FssView.vue';
|
|
31
31
|
import Icon from './icon/Icon.vue';
|
|
32
|
+
import InputDropdown from './input-dropdown/InputDropdown.vue';
|
|
32
33
|
import InputNumber from './input-number/InputNumber.vue';
|
|
33
34
|
import Paged from './paged/Paged.vue';
|
|
34
35
|
import PermissionTree from './permission-tree/PermissionTree.vue';
|
|
@@ -74,6 +75,7 @@ export default build('tnxel', () => {
|
|
|
74
75
|
FssUpload,
|
|
75
76
|
FssView,
|
|
76
77
|
Icon,
|
|
78
|
+
InputDropdown,
|
|
77
79
|
InputNumber,
|
|
78
80
|
Paged,
|
|
79
81
|
PermissionTree,
|
|
@@ -402,13 +404,14 @@ export default build('tnxel', () => {
|
|
|
402
404
|
}
|
|
403
405
|
});
|
|
404
406
|
|
|
407
|
+
tnxel.libs.ElementPlus = ElementPlus;
|
|
408
|
+
|
|
405
409
|
tnxel.install = tnxel.util.function.around(tnxel.install, function (install, vm) {
|
|
406
410
|
install.call(tnxel, vm);
|
|
407
411
|
// 始终安装ElementPlus,以避免对于不同Vue实例未安装的问题
|
|
408
412
|
vm.use(ElementPlus, {
|
|
409
413
|
locale: ElementPlus_zh_CN,
|
|
410
414
|
});
|
|
411
|
-
tnxel.libs = Object.assign({}, tnxel.libs, {ElementPlus});
|
|
412
415
|
});
|
|
413
416
|
|
|
414
417
|
tnxel.router.beforeLeave =
|
package/src/tnxvue.js
CHANGED
|
@@ -107,7 +107,6 @@ export default build('tnxvue', () => {
|
|
|
107
107
|
const component = this.components[key];
|
|
108
108
|
vm.component(component.name, component);
|
|
109
109
|
}
|
|
110
|
-
this.libs.Vue = Vue;
|
|
111
110
|
},
|
|
112
111
|
dialog(content, title, buttons, options, contentProps) {
|
|
113
112
|
// 默认不实现,由UI框架扩展层实现
|
|
@@ -199,6 +198,8 @@ export default build('tnxvue', () => {
|
|
|
199
198
|
},
|
|
200
199
|
});
|
|
201
200
|
|
|
201
|
+
tnxvue.libs.Vue = Vue;
|
|
202
|
+
|
|
202
203
|
Object.assign(tnxvue.util, {
|
|
203
204
|
/**
|
|
204
205
|
* 判断指定对象是否组件实例
|