@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,206 @@
1
+ <template>
2
+ <div class="tnxel-date-picker d-flex" v-if="permanentable">
3
+ <el-date-picker :type="type" v-model="model.value" :value-format="format" :editable="editable"
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
+ <el-checkbox style="margin-left: 1rem; margin-right: 0.75rem;" v-model="model.permanent"
9
+ @change="onPermanentChange">{{ permanentText }}
10
+ </el-checkbox>
11
+ </div>
12
+ <el-date-picker class="tnxel-date-picker" :type="type" v-model="model.value" :value-format="format"
13
+ :editable="editable" :placeholder="placeholderText" :clearable="empty" :default-value="defaultDate"
14
+ :disabled-date="disabledDate" :disabled="disabled" :style="{width: pickerWidth}" v-else/>
15
+ </template>
16
+
17
+ <script>
18
+ import $ from 'jquery';
19
+
20
+ const util = window.tnx.util;
21
+
22
+ export default {
23
+ name: 'TnxelDatePicker',
24
+ props: {
25
+ permanentable: Boolean,
26
+ modelValue: [Date, Number, String, Object], // 仅permanentable为true时传入Object
27
+ valueFormat: String,
28
+ type: {
29
+ type: String,
30
+ default: 'date',
31
+ },
32
+ placeholder: {
33
+ type: String,
34
+ default: '请选择',
35
+ },
36
+ disabled: Boolean,
37
+ empty: {
38
+ type: Boolean,
39
+ default: false,
40
+ },
41
+ defaultValue: [Date, Number, String],
42
+ earliest: [Date, Number, String],
43
+ latest: [Date, Number, String],
44
+ pickerWidth: String,
45
+ editable: {
46
+ type: Boolean,
47
+ default: true,
48
+ },
49
+ },
50
+ emits: ['update:modelValue'],
51
+ data() {
52
+ let vm = this;
53
+ let model = {
54
+ value: null,
55
+ permanent: false,
56
+ }
57
+ Object.assign(model, this.getModel());
58
+ return {
59
+ permanentText: util.date.PERMANENT_DATE_TEXT,
60
+ model: model,
61
+ disabledDate(date) {
62
+ if (vm.earliest || vm.latest) {
63
+ date = new Date(date);
64
+ if (vm.earliest) {
65
+ let earliest = new Date(vm.earliest);
66
+ if (date.getTime() < earliest.getTime()) {
67
+ return true;
68
+ }
69
+ }
70
+ if (vm.latest) {
71
+ let latest = new Date(vm.latest);
72
+ if (date.getTime() > latest.getTime()) {
73
+ return true;
74
+ }
75
+ }
76
+ }
77
+ return false;
78
+ },
79
+ };
80
+ },
81
+ computed: {
82
+ format() {
83
+ let format;
84
+ if (this.valueFormat) {
85
+ format = this.valueFormat;
86
+ } else {
87
+ format = this.type === 'datetime' ? util.date.patterns.dateTime : util.date.patterns.date;
88
+ }
89
+ return window.tnx.date.toDayJsDateFormat(format);
90
+ },
91
+ defaultDate() {
92
+ if (this.defaultValue) {
93
+ if (this.defaultValue instanceof Date) {
94
+ return this.defaultValue;
95
+ }
96
+ return new Date(this.defaultValue);
97
+ }
98
+ return null;
99
+ },
100
+ defaultDateValue() {
101
+ let date = this.defaultDate;
102
+ return date ? date.formatDate() : null;
103
+ },
104
+ placeholderText() {
105
+ if (this.placeholder) {
106
+ return this.placeholder;
107
+ }
108
+ if (this.model.permanent) {
109
+ return '';
110
+ }
111
+ return this.editable ? '格式:' + this.format : '请选择';
112
+ },
113
+ },
114
+ watch: {
115
+ modelValue() {
116
+ let model = this.getModel();
117
+ Object.assign(this.model, model);
118
+ },
119
+ defaultValue() {
120
+ if (!this.empty && !this.model.value) {
121
+ this.model.value = this.defaultDateValue;
122
+ }
123
+ },
124
+ },
125
+ mounted() {
126
+ let vm = this;
127
+ this.$watch('model', function() {
128
+ vm.emitModelValue();
129
+ }, {
130
+ deep: true
131
+ });
132
+ },
133
+ methods: {
134
+ emitModelValue() {
135
+ if (this.permanentable) {
136
+ this.$emit('update:modelValue', this.model);
137
+ } else {
138
+ this.$emit('update:modelValue', this.model.value);
139
+ }
140
+ if (!this.empty) {
141
+ // 重新进行字段校验,以清除可能的字段校验错误消息
142
+ let formItem = this.$parent;
143
+ while (formItem && !formItem.elForm) {
144
+ formItem = formItem.$parent;
145
+ }
146
+ if (formItem && formItem.elForm && formItem.prop) {
147
+ formItem.elForm.validateField(formItem.prop);
148
+ } else { // 不隶属于表单栏目,则简单地移除错误框效果
149
+ let $element = $(this.$el);
150
+ if ($element.is('.el-input')) {
151
+ $element.removeClass('is-error');
152
+ } else {
153
+ $('.el-input', $element).removeClass('is-error');
154
+ }
155
+ }
156
+ }
157
+ },
158
+ onPermanentChange() {
159
+ // 如果不允许为空,需做特殊处理
160
+ if (!this.empty) {
161
+ if (!this.model.permanent && !this.model.value) { // 取消永久选项时日期值为空,则设置为默认值
162
+ this.model.value = this.defaultDateValue;
163
+ }
164
+ }
165
+ this.emitModelValue();
166
+ },
167
+ getModel() {
168
+ let model = {
169
+ value: null,
170
+ permanent: false,
171
+ };
172
+ if (this.modelValue) {
173
+ if (this.permanentable) {
174
+ if (typeof this.modelValue === 'object') {
175
+ model.value = this.modelValue.value;
176
+ model.permanent = this.modelValue.permanent;
177
+ } else {
178
+ model.value = this.modelValue;
179
+ }
180
+ if (model.permanent) {
181
+ model.value = null;
182
+ } else if (!this.empty && !model.value) {
183
+ model.value = this.defaultDateValue;
184
+ }
185
+ } else {
186
+ if (this.modelValue instanceof Date) {
187
+ model.value = this.modelValue.format(this.format);
188
+ } else if (typeof this.modelValue === 'number') {
189
+ model.value = new Date(this.modelValue).format(this.format);
190
+ } else {
191
+ model.value = this.modelValue;
192
+ }
193
+ }
194
+ }
195
+ return model;
196
+ }
197
+ }
198
+ }
199
+ </script>
200
+
201
+ <style>
202
+ .tnxel-date-picker.el-date-editor.el-input,
203
+ .tnxel-date-picker.el-date-editor.el-input__wrapper {
204
+ width: 150px;
205
+ }
206
+ </style>
@@ -0,0 +1,78 @@
1
+ <template>
2
+ <el-date-picker type="daterange" v-model="model" :editable="false" value-format="yyyy-MM-dd" :clearable="empty"
3
+ :range-separator="separator" :start-placeholder="beginPlaceholder" :end-placeholder="endPlaceholder"
4
+ :disabled="disabled"/>
5
+ </template>
6
+
7
+ <script>
8
+ export default {
9
+ name: 'TnxelDateRange',
10
+ props: {
11
+ modelValue: Object,
12
+ separator: {
13
+ type: String,
14
+ default: '至',
15
+ },
16
+ beginPlaceholder: {
17
+ type: String,
18
+ default: '开始日期',
19
+ },
20
+ endPlaceholder: {
21
+ type: String,
22
+ default: '结束日期',
23
+ },
24
+ disabled: Boolean,
25
+ empty: {
26
+ type: Boolean,
27
+ default: false,
28
+ }
29
+ },
30
+ emits: ['update:modelValue'],
31
+ data() {
32
+ return {
33
+ model: this.getModel(),
34
+ };
35
+ },
36
+ watch: {
37
+ model(model) {
38
+ let value = {};
39
+ if (Array.isArray(model)) {
40
+ if (model.length > 0) {
41
+ value.begin = model[0];
42
+ }
43
+ if (model.length > 1) {
44
+ value.end = model[1];
45
+ }
46
+ }
47
+ this.$emit('update:modelValue', value);
48
+ },
49
+ modelValue() {
50
+ let model = this.getModel();
51
+ if (model) {
52
+ if (this.model === null) {
53
+ this.model = [];
54
+ }
55
+ this.model[0] = model[0];
56
+ this.model[1] = model[1];
57
+ } else {
58
+ this.model = null;
59
+ }
60
+ }
61
+ },
62
+ methods: {
63
+ getModel() {
64
+ let model = null;
65
+ if (this.modelValue) {
66
+ let begin = this.modelValue.begin;
67
+ let end = this.modelValue.end;
68
+ if (begin && end) {
69
+ model = [];
70
+ model.push(begin instanceof Date ? begin.formatDate() : begin);
71
+ model.push(end instanceof Date ? end.formatDate() : end);
72
+ }
73
+ }
74
+ return model;
75
+ }
76
+ }
77
+ }
78
+ </script>
@@ -0,0 +1,129 @@
1
+ <template>
2
+ <el-row class="tnxel-datetime-picker" :gutter="8">
3
+ <el-col :span="dateColSpan">
4
+ <el-date-picker ref="datePicker"
5
+ v-model="model"
6
+ :format="convertedDateFormat"
7
+ :default-value="defaultValue"
8
+ :placeholder="datePlaceholder"
9
+ :size="size"
10
+ :clearable="empty"
11
+ :disabled-date="isDisabledDate"
12
+ :disabled="disabled"/>
13
+ </el-col>
14
+ <el-col :span="timeColSpan">
15
+ <el-time-picker ref="timePicker"
16
+ v-model="model"
17
+ :format="timeFormat"
18
+ :default-value="defaultTimeValue"
19
+ :placeholder="timePlaceholder"
20
+ :size="size"
21
+ :clearable="empty"
22
+ :disabled="disabled || !model"/>
23
+ </el-col>
24
+ </el-row>
25
+ </template>
26
+
27
+ <script>
28
+ export default {
29
+ name: 'TnxelDateTimePicker',
30
+ props: {
31
+ modelValue: [String, Number, Date],
32
+ dateFormat: {
33
+ type: String,
34
+ default: 'yyyy-MM-dd',
35
+ },
36
+ datePlaceholder: {
37
+ type: String,
38
+ default: '选择日期',
39
+ },
40
+ timeFormat: {
41
+ type: String,
42
+ default: 'HH:mm', // 默认精确到分钟
43
+ },
44
+ timePlaceholder: {
45
+ type: String,
46
+ default: '选择时间',
47
+ },
48
+ delimiter: {
49
+ type: String,
50
+ default: ' ', // 默认用空格分隔日期和时间
51
+ },
52
+ size: String,
53
+ empty: {
54
+ type: Boolean,
55
+ default: false,
56
+ },
57
+ defaultValue: [String, Number, Date],
58
+ valueFormat: String,
59
+ disabled: Boolean,
60
+ minDate: [String, Number, Date],
61
+ maxDate: [String, Number, Date],
62
+ },
63
+ emits: ['update:modelValue'],
64
+ data() {
65
+ return {
66
+ model: window.tnx.util.date.toDate(this.modelValue),
67
+ }
68
+ },
69
+ computed: {
70
+ dateColSpan() {
71
+ if (this.timeFormat.length > 5) {
72
+ return 13;
73
+ }
74
+ return 14;
75
+ },
76
+ timeColSpan() {
77
+ if (this.timeFormat.length > 5) {
78
+ return 11;
79
+ }
80
+ return 10;
81
+ },
82
+ convertedDateFormat() {
83
+ return window.tnx.date.toDayJsDateFormat(this.dateFormat);
84
+ },
85
+ defaultTimeValue() {
86
+ if (this.defaultValue) {
87
+ return window.tnx.util.date.toDate(this.defaultValue);
88
+ }
89
+ // 必须创建新的日期对象,以免改动影响原始modelValue
90
+ let time = this.modelValue ? new Date(this.modelValue) : new Date();
91
+ time.applyTime(0, 0, 0, 0);
92
+ return time;
93
+ },
94
+ },
95
+ watch: {
96
+ modelValue() {
97
+ this.model = window.tnx.util.date.toDate(this.modelValue);
98
+ },
99
+ model() {
100
+ this.$emit('update:modelValue', this.model);
101
+ },
102
+ },
103
+ methods: {
104
+ isDisabledDate(date) {
105
+ let minDate = window.tnx.util.date.toDate(this.minDate);
106
+ if (minDate) {
107
+ minDate.applyTime(0, 0, 0, 0);
108
+ if (minDate.getTime() > date.getTime()) {
109
+ return true;
110
+ }
111
+ }
112
+ let maxDate = window.tnx.util.date.toDate(this.maxDate);
113
+ if (maxDate) {
114
+ maxDate.applyTime(0, 0, 0, 0);
115
+ if (maxDate.getTime() < date.getTime()) {
116
+ return true;
117
+ }
118
+ }
119
+ return false;
120
+ },
121
+ },
122
+ }
123
+ </script>
124
+
125
+ <style>
126
+ .tnxel-datetime-picker .el-input {
127
+ width: 100%;
128
+ }
129
+ </style>
@@ -0,0 +1,88 @@
1
+ <template>
2
+ <el-form :label-position="vertical ? 'top' : 'right'" label-width="auto" ref="form" :model="model"
3
+ class="tnxel-detail-form" :class="formClass">
4
+ <slot></slot>
5
+ <el-form-item class="w-100 mb-0" :label="vertical ? undefined : '&nbsp;'" v-if="update || back !== false">
6
+ <el-button :type="theme || 'primary'" @click="toUpdate" v-if="update">{{ updateText }}</el-button>
7
+ <el-button type="default" @click="toBack" v-if="back !== false">{{ backText }}</el-button>
8
+ </el-form-item>
9
+ </el-form>
10
+ </template>
11
+
12
+ <script>
13
+ export default {
14
+ name: 'TnxelDetailForm',
15
+ props: {
16
+ model: {
17
+ type: Object,
18
+ default: () => {
19
+ },
20
+ },
21
+ theme: String,
22
+ update: {
23
+ type: Function,
24
+ },
25
+ updateText: {
26
+ type: String,
27
+ default: '修改',
28
+ },
29
+ back: {
30
+ type: [String, Function, Boolean],
31
+ default: true,
32
+ },
33
+ backText: {
34
+ type: String,
35
+ default: '返回',
36
+ },
37
+ vertical: {
38
+ type: Boolean,
39
+ default: false,
40
+ },
41
+ columns: {
42
+ type: Number,
43
+ default: 1,
44
+ }
45
+ },
46
+ data() {
47
+ return {};
48
+ },
49
+ computed: {
50
+ formClass() {
51
+ let formClass = '';
52
+ if (this.theme) {
53
+ formClass += ' theme-' + this.theme;
54
+ }
55
+ if (this.columns > 1 && this.columns < 5) {
56
+ formClass += ' form-columns-' + this.columns;
57
+ }
58
+ return formClass.trim();
59
+ }
60
+ },
61
+ methods: {
62
+ toUpdate() { // 为了避免传递事件参数,不直接使用update()
63
+ if (this.update) {
64
+ this.update();
65
+ }
66
+ },
67
+ toBack() {
68
+ if (typeof this.back === 'function') {
69
+ this.back();
70
+ } else if (typeof this.back === 'string') {
71
+ this.$router.back(this.back);
72
+ } else if (this.back !== false) {
73
+ this.$router.back();
74
+ }
75
+ }
76
+ }
77
+ }
78
+ </script>
79
+
80
+ <style>
81
+ .tnxel-detail-form .el-form-item {
82
+ margin-bottom: 0.75rem;
83
+ }
84
+
85
+ .tnxel-detail-form .el-form-item__content {
86
+ align-items: normal;
87
+ }
88
+ </style>