@truenewx/tnxvue3 2.6.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 (60) hide show
  1. package/README.md +3 -0
  2. package/package.json +76 -0
  3. package/sample/App.vue +19 -0
  4. package/sample/main.js +11 -0
  5. package/sample/pages/index.vue +79 -0
  6. package/sample/pages/info.vue +28 -0
  7. package/sample/tnx.js +31 -0
  8. package/src/aj-captcha/Verify/VerifyPoints.vue +258 -0
  9. package/src/aj-captcha/Verify/VerifySlide.vue +379 -0
  10. package/src/aj-captcha/Verify.vue +375 -0
  11. package/src/aj-captcha/api/index.js +19 -0
  12. package/src/aj-captcha/utils/ase.js +11 -0
  13. package/src/aj-captcha/utils/util.js +35 -0
  14. package/src/ant-design/tnxad-theme.css +5 -0
  15. package/src/ant-design/tnxad.css +8 -0
  16. package/src/ant-design/tnxad.js +23 -0
  17. package/src/element-plus/alert/Alert.vue +112 -0
  18. package/src/element-plus/avatar/Avatar.vue +124 -0
  19. package/src/element-plus/button/Button.vue +184 -0
  20. package/src/element-plus/check-icon/CheckIcon.vue +61 -0
  21. package/src/element-plus/close-error-button/CloseErrorButton.vue +45 -0
  22. package/src/element-plus/curd/Curd.vue +224 -0
  23. package/src/element-plus/date-picker/DatePicker.vue +206 -0
  24. package/src/element-plus/date-range/DateRange.vue +78 -0
  25. package/src/element-plus/datetime-picker/DateTimePicker.vue +129 -0
  26. package/src/element-plus/detail-form/DetailForm.vue +88 -0
  27. package/src/element-plus/dialog/Dialog.vue +259 -0
  28. package/src/element-plus/dialog/DialogContent.vue +13 -0
  29. package/src/element-plus/drawer/Drawer.vue +175 -0
  30. package/src/element-plus/dropdown-item/DropdownItem.vue +30 -0
  31. package/src/element-plus/enum-select/EnumSelect.vue +125 -0
  32. package/src/element-plus/fetch-cascader/FetchCascader.vue +138 -0
  33. package/src/element-plus/fetch-select/FetchSelect.vue +166 -0
  34. package/src/element-plus/fetch-tags/FetchTags.vue +122 -0
  35. package/src/element-plus/fss-upload/FssUpload.vue +306 -0
  36. package/src/element-plus/fss-view/FssView.vue +163 -0
  37. package/src/element-plus/icon/Icon.vue +221 -0
  38. package/src/element-plus/input-number/InputNumber.vue +150 -0
  39. package/src/element-plus/paged/Paged.vue +76 -0
  40. package/src/element-plus/permission-tree/PermissionTree.vue +184 -0
  41. package/src/element-plus/query-form/QueryForm.vue +138 -0
  42. package/src/element-plus/query-table/QueryTable.vue +402 -0
  43. package/src/element-plus/region-cascader/RegionCascader.vue +108 -0
  44. package/src/element-plus/select/Select.vue +446 -0
  45. package/src/element-plus/slider/Slider.vue +88 -0
  46. package/src/element-plus/steps-nav/StepsNav.vue +57 -0
  47. package/src/element-plus/submit-form/SubmitForm.vue +236 -0
  48. package/src/element-plus/table-column/TableColumn.vue +32 -0
  49. package/src/element-plus/tabs/Tabs.vue +93 -0
  50. package/src/element-plus/tnxel.css +890 -0
  51. package/src/element-plus/tnxel.js +528 -0
  52. package/src/element-plus/transfer/Transfer.vue +117 -0
  53. package/src/element-plus/upload/Upload.vue +856 -0
  54. package/src/percent/Percent.vue +12 -0
  55. package/src/text/Text.vue +33 -0
  56. package/src/tnxvue-cli.js +64 -0
  57. package/src/tnxvue-router.js +161 -0
  58. package/src/tnxvue-validator.js +365 -0
  59. package/src/tnxvue.css +12 -0
  60. package/src/tnxvue.js +343 -0
@@ -0,0 +1,236 @@
1
+ <template>
2
+ <el-form ref="form" :id="id" :label-width="labelWidth" :label-position="vertical ? 'top' : 'right'"
3
+ :model="model" :rules="validationRules" :validate-on-rule-change="false"
4
+ :inline="inline" :inline-message="!vertical" :disabled="disabled"
5
+ :class="theme ? ('theme-' + theme) : null" :size="size" :status-icon="statusIcon">
6
+ <slot></slot>
7
+ <el-form-item class="w-100 mb-0" :label="vertical ? undefined : '&nbsp;'"
8
+ v-if="submit !== undefined && submit !== null">
9
+ <el-button :type="theme || 'primary'" :size="size" @click="toSubmit" v-if="submit !== false">
10
+ {{ _submitText }}
11
+ </el-button>
12
+ <el-button :size="size" @click="toCancel" v-if="cancel !== false">{{ cancelText }}</el-button>
13
+ </el-form-item>
14
+ </el-form>
15
+ </template>
16
+
17
+ <script>
18
+ import $ from 'jquery';
19
+ import AsyncValidator from 'async-validator';
20
+
21
+ export default {
22
+ name: 'TnxelSubmitForm',
23
+ props: {
24
+ /**
25
+ * 所属滚动容器的选择器
26
+ */
27
+ container: {
28
+ type: String,
29
+ default: 'main',
30
+ },
31
+ model: {
32
+ type: Object,
33
+ required: true,
34
+ },
35
+ rules: [String, Object], // 加载字段校验规则的URL地址,或规则集对象
36
+ rulesApp: String, // 加载字段校验规则的应用名称
37
+ rulesLoaded: Function, // 规则集加载后的附加处理函数,仅在rules为字符串类型的URL地址时有效
38
+ submit: {
39
+ type: [Function, Boolean],
40
+ default: null,
41
+ },
42
+ submitText: String,
43
+ theme: String,
44
+ cancel: {
45
+ type: [String, Function, Boolean],
46
+ default: true
47
+ },
48
+ cancelText: {
49
+ type: String,
50
+ default: '取消'
51
+ },
52
+ vertical: {
53
+ type: Boolean,
54
+ default: false
55
+ },
56
+ inline: {
57
+ type: Boolean,
58
+ default: false
59
+ },
60
+ errorFocus: {
61
+ type: Boolean,
62
+ default: false,
63
+ },
64
+ labelWidth: {
65
+ type: [String, Number],
66
+ default: 'auto',
67
+ },
68
+ size: String,
69
+ statusIcon: {
70
+ type: Boolean,
71
+ default: false,
72
+ },
73
+ },
74
+ emits: ['rules-loaded', 'meta'],
75
+ data() {
76
+ return {
77
+ id: window.tnx.util.string.random(32),
78
+ validationRules: {},
79
+ disabled: false,
80
+ topOffset: 0,
81
+ fieldNames: [],
82
+ };
83
+ },
84
+ computed: {
85
+ _submitText() {
86
+ if (this.submitText) {
87
+ return this.submitText;
88
+ }
89
+ return this.cancel === false ? '保存' : '提交';
90
+ }
91
+ },
92
+ watch: {
93
+ rules() {
94
+ this.initRules();
95
+ },
96
+ },
97
+ mounted() {
98
+ this.initRules();
99
+
100
+ let vm = this;
101
+ this.$nextTick(function() {
102
+ let container = $(vm.container);
103
+ if (container.length) {
104
+ vm.topOffset = $('#' + vm.id).offset().top - container.offset().top - 16;
105
+ }
106
+ });
107
+ },
108
+ methods: {
109
+ initRules() {
110
+ if (typeof this.rules === 'string') {
111
+ const vm = this;
112
+ window.tnx.app.rpc.getMeta(this.rules, meta => {
113
+ if (vm.rulesLoaded) {
114
+ vm.rulesLoaded(meta.$rules);
115
+ } else {
116
+ vm.$emit('rules-loaded', meta.$rules);
117
+ }
118
+ vm.validationRules = meta.$rules;
119
+ delete meta.$rules;
120
+ this.$emit('meta', meta);
121
+ vm.fieldNames = Object.keys(meta);
122
+ }, this.rulesApp);
123
+ } else if (this.rules) {
124
+ this.validationRules = this.rules;
125
+ }
126
+ },
127
+ disable(disabled) {
128
+ this.disabled = disabled !== false;
129
+ },
130
+ focusError(errors) {
131
+ let $form = $('#' + this.id);
132
+ let fieldNames = Object.keys(errors);
133
+ let fieldName = fieldNames[0];
134
+ if (fieldName) {
135
+ let $item = $('.el-form-item label[for=' + fieldName + ']', $form).parents('.el-form-item');
136
+ if ($item.length) {
137
+ let $input = $('input:first', $item);
138
+ if ($input.length) {
139
+ $input.focus();
140
+ return;
141
+ }
142
+ }
143
+ // 没有找到错误字段输入框,则滚动到错误栏目处
144
+ this.$refs.form.scrollToField(fieldName);
145
+ }
146
+ },
147
+ validate(callback, errorFocus) {
148
+ let _this = this;
149
+ this.$refs.form.validate().then(function() {
150
+ if (typeof callback === 'function') {
151
+ callback(true);
152
+ }
153
+ }).catch(function(errors) {
154
+ if (_this.errorFocus && errorFocus !== false) {
155
+ _this.$nextTick(function() {
156
+ _this.focusError.call(_this, errors);
157
+ });
158
+ }
159
+ if (typeof callback === 'function') {
160
+ callback(false);
161
+ }
162
+ });
163
+ },
164
+ validateField(props, callback, errorFocus) {
165
+ let _this = this;
166
+ this.$refs.form.validateField(props, function(errorMessage) {
167
+ if (errorMessage && _this.errorFocus && errorFocus !== false) {
168
+ _this.$nextTick(function() {
169
+ _this.focusError.call(_this);
170
+ });
171
+ }
172
+ if (typeof callback === 'function') {
173
+ callback(errorMessage);
174
+ }
175
+ });
176
+ },
177
+ clearValidate(props) {
178
+ this.$refs.form.clearValidate(props);
179
+ },
180
+ toSubmit(callback, disabled) {
181
+ const vm = this;
182
+ this.validate(function(success) {
183
+ if (success) {
184
+ if (typeof callback !== 'function') {
185
+ callback = vm.submit;
186
+ }
187
+ if (typeof callback === 'function') {
188
+ if (disabled !== false) {
189
+ vm.disable();
190
+ }
191
+ callback(vm);
192
+ }
193
+ }
194
+ });
195
+ },
196
+ toCancel() {
197
+ if (typeof this.cancel === 'function') {
198
+ this.cancel();
199
+ } else if (typeof this.cancel === 'string') {
200
+ this.$router.back(this.cancel);
201
+ } else if (this.cancel !== false) {
202
+ this.$router.back();
203
+ }
204
+ },
205
+ getFieldNames() {
206
+ return this.fieldNames;
207
+ },
208
+ /**
209
+ * 执行所有的校验规则,以自定义方式处理错误
210
+ * @param callback 校验后的回调函数,首个参数为错误消息字符串数组,没有错误时为null
211
+ */
212
+ validateRules(callback, fieldLabels) {
213
+ let validator = new AsyncValidator(this.validationRules);
214
+ validator.validate(this.model, function(errors) {
215
+ let messages = [];
216
+ if (errors) {
217
+ for (let error of errors) {
218
+ let fieldLabel = undefined;
219
+ if (typeof fieldLabels === 'function') {
220
+ fieldLabel = fieldLabels(error.field);
221
+ } else if (typeof fieldLabels === 'object') {
222
+ fieldLabel = fieldLabels[error.field];
223
+ }
224
+ fieldLabel = fieldLabel || error.field;
225
+ messages.push(fieldLabel + error.message);
226
+ }
227
+ }
228
+ if (messages.length === 0) {
229
+ messages = null;
230
+ }
231
+ callback(messages);
232
+ });
233
+ }
234
+ }
235
+ }
236
+ </script>
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <el-table-column
3
+ :label="label"
4
+ :prop="prop"
5
+ :header-align="headerAlign || align"
6
+ :align="align"
7
+ :width="width">
8
+ <template #header v-if="required">
9
+ <span class="text-danger" v-if="required">* </span>{{ label }}
10
+ </template>
11
+ <template #default="scope">
12
+ <slot :$index="scope.$index" :row="scope.row" :column="scope.column"></slot>
13
+ </template>
14
+ </el-table-column>
15
+ </template>
16
+
17
+ <script>
18
+ export default {
19
+ name: 'TnxelTableColumn',
20
+ props: {
21
+ label: String,
22
+ prop: String,
23
+ headerAlign: String,
24
+ align: {
25
+ type: String,
26
+ default: 'center',
27
+ },
28
+ width: [String, Number],
29
+ required: Boolean,
30
+ },
31
+ }
32
+ </script>
@@ -0,0 +1,93 @@
1
+ <template>
2
+ <el-tabs class="tnxel-tabs" :id="id" :type="type" v-model="model" @tab-click="clickTab">
3
+ <slot v-if="$slots.default"></slot>
4
+ <template v-else>
5
+ <el-tab-pane :name="pane.name" v-for="pane of panes" :key="pane.name">
6
+ <template #label>
7
+ <span class="tnxel-tabs-pane-label">{{ pane.label }}</span>
8
+ </template>
9
+ </el-tab-pane>
10
+ </template>
11
+ </el-tabs>
12
+ </template>
13
+
14
+ <script>
15
+ export default {
16
+ name: 'TnxelTabs',
17
+ props: {
18
+ type: String,
19
+ modelValue: String,
20
+ items: Object,
21
+ id: {
22
+ type: String,
23
+ default: 'tnxel-tabs',
24
+ },
25
+ },
26
+ emits: ['update:modelValue', 'tab-click'],
27
+ data() {
28
+ return {
29
+ model: this.modelValue,
30
+ }
31
+ },
32
+ computed: {
33
+ panes() {
34
+ let panes = [];
35
+ if (this.items) {
36
+ let keys = Object.keys(this.items);
37
+ for (let key of keys) {
38
+ let label = this.items[key];
39
+ if (typeof label === 'string') {
40
+ panes.push({
41
+ name: key,
42
+ label: label,
43
+ });
44
+ }
45
+ }
46
+ }
47
+ return panes;
48
+ }
49
+ },
50
+ watch: {
51
+ model(model) {
52
+ let cache = this.getCache();
53
+ if (cache) {
54
+ cache[this.id] = model;
55
+ }
56
+ this.$emit('update:modelValue', model);
57
+ },
58
+ modelValue(value) {
59
+ this.model = value;
60
+ }
61
+ },
62
+ mounted() {
63
+ let cache = this.getCache();
64
+ if (cache) {
65
+ let vm = this;
66
+ setTimeout(function() {
67
+ if (vm.$route.meta.isHistory()) {
68
+ let model = cache[vm.id];
69
+ if (model) {
70
+ vm.model = model;
71
+ }
72
+ }
73
+ });
74
+ }
75
+ },
76
+ methods: {
77
+ getCache() {
78
+ if (this.$route && this.$route.meta) {
79
+ let cache = this.$route.meta.cache.tabs;
80
+ if (!cache) {
81
+ cache = {};
82
+ this.$route.meta.cache.tabs = cache;
83
+ }
84
+ return cache;
85
+ }
86
+ return undefined;
87
+ },
88
+ clickTab(tab, event) {
89
+ this.$emit('tab-click', tab, event);
90
+ }
91
+ }
92
+ }
93
+ </script>