@truenewx/tnxvue3 3.4.2 → 3.4.4
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 +14 -8
- package/src/element-plus/aj-captcha/api/index.js +2 -2
- package/src/element-plus/avatar/Avatar.vue +4 -27
- package/src/element-plus/date-picker/DatePicker.vue +8 -9
- package/src/element-plus/dialog/Dialog.vue +15 -15
- package/src/element-plus/drawer/Drawer.vue +2 -2
- package/src/element-plus/edit-table/EditTable.vue +10 -10
- package/src/element-plus/enum-select/EnumSelect.vue +30 -30
- package/src/element-plus/enum-view/EnumView.vue +1 -3
- package/src/element-plus/fetch-cascader/FetchCascader.vue +4 -4
- package/src/element-plus/fetch-select/FetchSelect.vue +3 -3
- package/src/element-plus/fetch-tags/FetchTags.vue +1 -1
- package/src/element-plus/fss-upload/FssUpload.vue +75 -114
- package/src/element-plus/fss-view/FssView.vue +28 -30
- package/src/element-plus/query-form/QueryForm.vue +3 -3
- package/src/element-plus/query-table/QueryTable.vue +12 -12
- package/src/element-plus/region-cascader/RegionCascader.vue +3 -3
- package/src/element-plus/select/Select.vue +56 -56
- package/src/element-plus/submit-form/SubmitForm.vue +5 -5
- package/src/element-plus/tnxel-validator.ts +347 -0
- package/src/element-plus/tnxel.ts +575 -0
- package/src/element-plus/transfer/Transfer.vue +2 -2
- package/src/element-plus/upload/Upload.vue +68 -70
- package/src/tdesign/desktop/tnxtdd.ts +5 -5
- package/src/tdesign/mobile/tnxtdm.css +0 -0
- package/src/tdesign/mobile/tnxtdm.ts +7 -6
- package/src/tdesign/{foundation/validator.ts → tnxtd-validator.ts} +4 -4
- package/src/tdesign/tnxtd.ts +6 -7
- package/src/tnxvue-router.ts +8 -14
- package/src/tnxvue.ts +53 -26
- package/tsconfig.json +32 -19
- package/src/element-plus/tnxel.js +0 -598
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truenewx/tnxvue3",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.4",
|
|
4
4
|
"description": "互联网技术解决方案:Vue3扩展支持",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -21,27 +21,33 @@
|
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"@element-plus/icons-vue": "~2.3.0",
|
|
23
23
|
"async-validator": "~4.2.0",
|
|
24
|
-
"element-plus": "~2.11.0",
|
|
25
24
|
"bootstrap-vue-next": "~0.40.0",
|
|
25
|
+
"element-plus": "~2.13.0",
|
|
26
26
|
"tdesign-icons-vue-next": "~0.4.0",
|
|
27
|
-
"tdesign-mobile-vue": "~1.
|
|
27
|
+
"tdesign-mobile-vue": "~1.12.0",
|
|
28
28
|
"tdesign-vue-next": "~1.17.0",
|
|
29
29
|
"validator": "~13.15.0",
|
|
30
30
|
"vue": "~3.5.0",
|
|
31
31
|
"vue-router": "~4.6.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@truenewx/tnxcore": "3.4.
|
|
34
|
+
"@truenewx/tnxcore": "3.4.3",
|
|
35
|
+
"bootstrap": "5.3.8",
|
|
36
|
+
"cash-dom": "8.1.5",
|
|
35
37
|
"mitt": "3.0.1"
|
|
36
38
|
},
|
|
37
39
|
"devDependencies": {
|
|
40
|
+
"@eslint/js": "9.39.2",
|
|
41
|
+
"@typescript-eslint/parser": "8.50.0",
|
|
42
|
+
"@typescript-eslint/eslint-plugin": "8.50.0",
|
|
38
43
|
"@vitejs/plugin-vue": "6.0.1",
|
|
39
|
-
"vite": "7.2.2",
|
|
40
44
|
"eslint": "9.39.1",
|
|
41
45
|
"eslint-plugin-vue": "10.5.1",
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
46
|
+
"globals": "16.5.0",
|
|
47
|
+
"tsx": "4.21.0",
|
|
48
|
+
"typescript": "5.6.3",
|
|
49
|
+
"vite": "7.2.2",
|
|
50
|
+
"vue-eslint-parser": "10.2.0"
|
|
45
51
|
},
|
|
46
52
|
"browserslist": [
|
|
47
53
|
"> 1%",
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// 获取验证图片以及token
|
|
2
2
|
export function reqGet(data) {
|
|
3
|
-
return window.tnx.
|
|
3
|
+
return window.tnx.api.post('/captcha/generate', data);
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
// 滑动或者点选验证
|
|
7
7
|
export function reqCheck(data) {
|
|
8
|
-
return window.tnx.
|
|
8
|
+
return window.tnx.api.post('/captcha/check', data);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
|
|
@@ -74,33 +74,10 @@ export default {
|
|
|
74
74
|
methods: {
|
|
75
75
|
load() {
|
|
76
76
|
if (this.url && this.url.startsWith(window.tnx.fss.PROTOCOL)) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
locationUrl: this.url
|
|
82
|
-
}, (meta) => {
|
|
83
|
-
this.src = meta.thumbnailReadUrl;
|
|
84
|
-
this.previewSrcList = [meta.readUrl];
|
|
85
|
-
}, {
|
|
86
|
-
app: fssConfig.appName,
|
|
87
|
-
error(errors) {
|
|
88
|
-
console.error(errors[0].message);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
} else {
|
|
92
|
-
rpc.get(fssConfig.contextUrl + '/read/url', {
|
|
93
|
-
locationUrl: this.url,
|
|
94
|
-
thumbnail: true,
|
|
95
|
-
}, (readUrl) => {
|
|
96
|
-
this.src = readUrl;
|
|
97
|
-
}, {
|
|
98
|
-
app: fssConfig.appName,
|
|
99
|
-
error(errors) {
|
|
100
|
-
console.error(errors[0].message);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
77
|
+
window.tnx.fss.getReadUrl(this.url, true).then(readUrl => {
|
|
78
|
+
this.src = readUrl.thumbnailUrl;
|
|
79
|
+
this.previewSrcList = [readUrl.readUrl];
|
|
80
|
+
});
|
|
104
81
|
} else {
|
|
105
82
|
this.src = this.url;
|
|
106
83
|
}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="tnxel-date-picker d-flex" v-if="permanentable">
|
|
3
3
|
<el-date-picker :type="type" v-model="model.value" :value-format="format" :editable="editable"
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
:placeholder="placeholderText" :clearable="empty" :default-value="defaultDate"
|
|
5
|
+
:disabled-date="disabledDate" :disabled="disabled || model.permanent"
|
|
6
|
+
:class="{'flex-grow-1': !pickerWidth}" :style="{width: pickerWidth}"
|
|
7
|
+
@change="emitModelValue"/>
|
|
8
8
|
<el-checkbox style="margin-left: 1rem; margin-right: 0.75rem;" v-model="model.permanent"
|
|
9
|
-
|
|
9
|
+
@change="onPermanentChange">{{ permanentText }}
|
|
10
10
|
</el-checkbox>
|
|
11
11
|
</div>
|
|
12
12
|
<el-date-picker class="tnxel-date-picker" :type="type" v-model="model.value" :value-format="format"
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
:editable="editable" :placeholder="placeholderText" :clearable="empty" :default-value="defaultDate"
|
|
14
|
+
:disabled-date="disabledDate" :disabled="disabled" :style="{width: pickerWidth}" v-else/>
|
|
15
15
|
</template>
|
|
16
16
|
|
|
17
17
|
<script>
|
|
18
18
|
import $ from 'cash-dom';
|
|
19
|
-
|
|
20
|
-
const util = window.tnx.util;
|
|
19
|
+
import {util} from '../tnxel.ts';
|
|
21
20
|
|
|
22
21
|
export default {
|
|
23
22
|
name: 'TnxelDatePicker',
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<el-dialog class="tnxel-dialog"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
:data-v-id="id"
|
|
4
|
+
v-model="visible"
|
|
5
|
+
destroy-on-close
|
|
6
|
+
append-to-body
|
|
7
|
+
:modal="options.modal"
|
|
8
|
+
:close-on-click-modal="options['close-on-click-modal']"
|
|
9
|
+
:close-on-press-escape="options['close-on-press-escape']"
|
|
10
|
+
:show-close="options['show-close']"
|
|
11
|
+
:center="options.center"
|
|
12
|
+
:before-close="beforeClose"
|
|
13
|
+
@closed="onClosed">
|
|
14
14
|
<template #header>
|
|
15
15
|
<div class="tnxel-dialog-title" :class="mergeClass({'border-bottom': title})" v-html="title"
|
|
16
|
-
|
|
16
|
+
v-if="title || options['show-close']"></div>
|
|
17
17
|
</template>
|
|
18
18
|
<template v-if="$slots.default">
|
|
19
19
|
<slot></slot>
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
<template #footer v-if="buttons && buttons.length">
|
|
24
24
|
<div class="tnxel-dialog-footer" :class="mergeClass()">
|
|
25
25
|
<el-button v-for="(button, index) in buttons" :type="button.type" :key="index"
|
|
26
|
-
|
|
26
|
+
:loading="buttonLoadings[index]" @click="btnClick(index)">{{ button.caption || button.text }}
|
|
27
27
|
</el-button>
|
|
28
28
|
</div>
|
|
29
29
|
</template>
|
|
@@ -111,7 +111,7 @@ export default {
|
|
|
111
111
|
},
|
|
112
112
|
},
|
|
113
113
|
mounted() {
|
|
114
|
-
window.tnx.
|
|
114
|
+
window.tnx.eventBus.once('tnx.error', options => {
|
|
115
115
|
this.buttonLoadings = [];
|
|
116
116
|
});
|
|
117
117
|
this.$nextTick(() => {
|
|
@@ -133,7 +133,7 @@ export default {
|
|
|
133
133
|
});
|
|
134
134
|
},
|
|
135
135
|
beforeUnmount() {
|
|
136
|
-
window.tnx.
|
|
136
|
+
window.tnx.eventBus.off('tnx.error');
|
|
137
137
|
},
|
|
138
138
|
methods: {
|
|
139
139
|
mergeClass(classObject) {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
</div>
|
|
24
24
|
<div class="tnxel-drawer-footer" v-if="buttons && buttons.length">
|
|
25
25
|
<el-button v-for="(button, index) in buttons" :type="button.type" :key="index"
|
|
26
|
-
|
|
26
|
+
@click="btnClick(index)">{{ button.caption || button.text }}
|
|
27
27
|
</el-button>
|
|
28
28
|
</div>
|
|
29
29
|
</div>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
</template>
|
|
32
32
|
|
|
33
33
|
<script>
|
|
34
|
-
|
|
34
|
+
import {util} from '../tnxel.ts';
|
|
35
35
|
|
|
36
36
|
export default {
|
|
37
37
|
name: 'TnxelDrawer',
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="tnxel-edit-table-container" :id="id">
|
|
3
3
|
<el-table ref="table"
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
class="tnxel-edit-table"
|
|
5
|
+
:class="{'padding-none': !padding}"
|
|
6
|
+
:data="tableDataList"
|
|
7
|
+
:row-key="rowKey"
|
|
8
|
+
:row-class-name="tableRowClassName"
|
|
9
|
+
:highlight-current-row="selectable"
|
|
10
|
+
border
|
|
11
|
+
@current-change="onSelectRow"
|
|
12
12
|
>
|
|
13
13
|
<template #empty v-if="!tableDataList">
|
|
14
14
|
<tnxel-icon class="text-placeholder" value="Loading"/>
|
|
@@ -172,7 +172,7 @@ export default {
|
|
|
172
172
|
initRules() {
|
|
173
173
|
if (this.rules) {
|
|
174
174
|
if (typeof this.rules === 'string') {
|
|
175
|
-
window.tnx.
|
|
175
|
+
window.tnx.meta.getMeta(this.rules, this.rulesApp).then(meta => {
|
|
176
176
|
if (this.rulesLoaded) {
|
|
177
177
|
this.rulesLoaded(meta.$rules);
|
|
178
178
|
} else {
|
|
@@ -269,7 +269,7 @@ export default {
|
|
|
269
269
|
let model = {};
|
|
270
270
|
model[fieldName] = element.value;
|
|
271
271
|
let successful = true;
|
|
272
|
-
window.tnx.
|
|
272
|
+
window.tnx.validator.validate(rules, model).catch(errors => {
|
|
273
273
|
if (errors) {
|
|
274
274
|
successful = false;
|
|
275
275
|
let message = '';
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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"
|
|
7
|
+
:theme="theme"
|
|
8
|
+
:params="{
|
|
9
9
|
type: type,
|
|
10
10
|
subtype:subtype,
|
|
11
11
|
grouped: true,
|
|
12
12
|
}"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
13
|
+
v-if="grouped"/>
|
|
14
|
+
<tnxel-select ref="select"
|
|
15
|
+
v-model="model"
|
|
16
|
+
:id="id"
|
|
17
|
+
:selector="selector"
|
|
18
|
+
:items="items"
|
|
19
|
+
value-name="key" text-name="caption" index-name="searchIndex"
|
|
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>
|
|
31
|
+
<template #option="{item}" v-if="$slots.option">
|
|
32
|
+
<slot name="option" :item="item"></slot>
|
|
33
|
+
</template>
|
|
34
|
+
</tnxel-select>
|
|
35
35
|
</template>
|
|
36
36
|
|
|
37
37
|
<script>
|
|
@@ -116,7 +116,7 @@ export default {
|
|
|
116
116
|
this.initModel();
|
|
117
117
|
} else {
|
|
118
118
|
let vm = this;
|
|
119
|
-
window.tnx.
|
|
119
|
+
window.tnx.meta.resolveEnumItems(this.type, this.subtype, {
|
|
120
120
|
app: this.app,
|
|
121
121
|
}).then((items) => {
|
|
122
122
|
vm.items = items;
|
|
@@ -26,9 +26,7 @@ export default {
|
|
|
26
26
|
};
|
|
27
27
|
},
|
|
28
28
|
mounted() {
|
|
29
|
-
window.tnx.
|
|
30
|
-
app: this.app,
|
|
31
|
-
}).then(enumType => {
|
|
29
|
+
window.tnx.meta.resolveEnumType(this.type, this.subtype).then(enumType => {
|
|
32
30
|
this.item = enumType.items.find(item => item.key === this.itemKey);
|
|
33
31
|
});
|
|
34
32
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<el-cascader v-model="model" class="ignore-feedback" :options="items" :props="options"
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
:placeholder="placeholder" :show-all-levels="showAllLevels" :clearable="empty" :disabled="disabled"
|
|
4
|
+
:filterable="filterable" :filter-method="filter" v-if="items"/>
|
|
5
5
|
</template>
|
|
6
6
|
|
|
7
7
|
<script>
|
|
@@ -47,7 +47,7 @@ export default {
|
|
|
47
47
|
change: Function, // 选中值变化后的事件处理函数,由于比element的change事件传递更多参数,所以以prop的形式指定,以尽量节省性能
|
|
48
48
|
transferItems: {
|
|
49
49
|
type: Function,
|
|
50
|
-
default: function(items) {
|
|
50
|
+
default: function (items) {
|
|
51
51
|
return items;
|
|
52
52
|
}
|
|
53
53
|
},
|
|
@@ -121,7 +121,7 @@ export default {
|
|
|
121
121
|
return null;
|
|
122
122
|
},
|
|
123
123
|
load() {
|
|
124
|
-
window.tnx.
|
|
124
|
+
window.tnx.api.get(this.url, this.params).then((result) => {
|
|
125
125
|
this.items = this.transferItems(result);
|
|
126
126
|
this.model = this.getModel();
|
|
127
127
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<el-select v-model="model" :loading="loading" :filterable="filterable" remote :remote-method="load"
|
|
3
|
-
|
|
3
|
+
:placeholder="finalPlaceholder" :disabled="disabled" :title="title" default-first-option>
|
|
4
4
|
<el-option class="text-secondary" :value="null" :label="emptyText" v-if="empty"/>
|
|
5
5
|
<el-option v-for="item in items" :key="item[valueName]" :value="item[valueName]" :label="label(item)"/>
|
|
6
6
|
<el-option label="还有更多结果..." disabled v-if="more"/>
|
|
@@ -15,7 +15,7 @@ export default {
|
|
|
15
15
|
url: String,
|
|
16
16
|
params: { // 构建远程检索请求参数集的函数
|
|
17
17
|
type: Function,
|
|
18
|
-
default: function(keyword) {
|
|
18
|
+
default: function (keyword) {
|
|
19
19
|
return keyword ? {keyword} : undefined;
|
|
20
20
|
}
|
|
21
21
|
},
|
|
@@ -122,7 +122,7 @@ export default {
|
|
|
122
122
|
if (this.url && this.params) { // 当url或参数函数被设置为null时,不进行取数操作,用于初始条件不满足的情况
|
|
123
123
|
this.loading = true;
|
|
124
124
|
let params = this.params(keyword);
|
|
125
|
-
window.tnx.
|
|
125
|
+
window.tnx.api.get(this.url, params).then(result => {
|
|
126
126
|
this.loading = false;
|
|
127
127
|
if (Array.isArray(result)) {
|
|
128
128
|
this.items = result;
|
|
@@ -94,7 +94,7 @@ export default {
|
|
|
94
94
|
if (this.keyword) {
|
|
95
95
|
params[this.keywordName] = this.keyword;
|
|
96
96
|
}
|
|
97
|
-
window.tnx.
|
|
97
|
+
window.tnx.api.get(this.url, params).then(result => {
|
|
98
98
|
if (result instanceof Array) {
|
|
99
99
|
this.items = this.format(result);
|
|
100
100
|
} else if (result.records && result.paged) {
|