@10yun/cv-mobile-ui 0.4.1 → 0.4.2

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 (112) hide show
  1. package/package.json +1 -1
  2. package/ui-cv/cv-badge/{uni-badge.vue → cv-badge.vue} +2 -2
  3. package/ui-cv/cv-calendar/calendar.js +762 -345
  4. package/ui-cv/cv-calendar/cv-calendar-item.vue +198 -0
  5. package/ui-cv/cv-calendar/cv-calendar.vue +508 -0
  6. package/ui-cv/cv-card/cv-card.vue +427 -0
  7. package/ui-cv/cv-col/cv-col.vue +2965 -0
  8. package/ui-cv/cv-collapse/cv-collapse.vue +146 -0
  9. package/ui-cv/cv-collapse-item/cv-collapse-item.vue +395 -0
  10. package/ui-cv/cv-combox/cv-combox.vue +250 -0
  11. package/ui-cv/cv-countdown/cv-countdown.vue +245 -0
  12. package/ui-cv/cv-data-checkbox/cv-data-checkbox.vue +841 -0
  13. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list-item.vue +154 -0
  14. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list.vue +376 -0
  15. package/ui-cv/cv-data-picker/cv-data-picker.vue +486 -0
  16. package/ui-cv/cv-data-pickerview/{uni-data-picker.js → cv-data-picker.js} +0 -0
  17. package/ui-cv/cv-data-pickerview/cv-data-pickerview.vue +304 -0
  18. package/ui-cv/cv-dateformat/cv-dateformat.vue +86 -0
  19. package/ui-cv/cv-datetime-picker/calendar.vue +752 -738
  20. package/ui-cv/cv-datetime-picker/cv-datetime-picker.vue +958 -0
  21. package/ui-cv/cv-datetime-picker/time-picker.vue +900 -892
  22. package/ui-cv/cv-easyinput/cv-easyinput.vue +514 -0
  23. package/ui-cv/cv-fab/cv-fab.vue +465 -0
  24. package/ui-cv/cv-fab/{uni-fab.vue.bak → cv-fab.vue.bak} +2 -2
  25. package/ui-cv/cv-fav/cv-fav.vue +150 -0
  26. package/ui-cv/cv-file-picker/cv-file-picker.vue +619 -0
  27. package/ui-cv/cv-form-item/cv-form-item.vue +1 -1
  28. package/ui-cv/cv-goods-nav/{uni-goods-nav.vue → cv-goods-nav.vue} +1 -1
  29. package/ui-cv/{cv-icons2/cv-icons2.vue → cv-icon2/cv-icon2.vue} +3 -3
  30. package/ui-cv/{cv-icons2 → cv-icon2}/icons.js +0 -0
  31. package/ui-cv/{cv-icons2 → cv-icon2}/uni.ttf +0 -0
  32. package/ui-cv/cv-indexed-list/cv-indexed-list-item.vue +154 -0
  33. package/ui-cv/cv-indexed-list/cv-indexed-list.vue +371 -0
  34. package/ui-cv/cv-input-password/cv-input-password.vue +2 -2
  35. package/ui-cv/{cv-link/uni-link.vue → cv-link2/cv-link2.vue} +1 -1
  36. package/ui-cv/cv-list/cv-list.vue +107 -0
  37. package/ui-cv/cv-list/cv-refresh.vue +65 -0
  38. package/ui-cv/cv-list-ad/cv-list-ad.vue +113 -0
  39. package/ui-cv/cv-list-chat/{uni-list-chat.scss → cv-list-chat.scss} +0 -0
  40. package/ui-cv/cv-list-chat/{uni-list-chat.vue → cv-list-chat.vue} +0 -0
  41. package/ui-cv/cv-list-item/cv-list-item.vue +449 -0
  42. package/ui-cv/cv-nav-bar/cv-nav-bar.vue +256 -0
  43. package/ui-cv/cv-nav-bar/{uni-status-bar.vue → cv-status-bar.vue} +0 -0
  44. package/ui-cv/cv-notice-bar/cv-notice-bar.vue +453 -0
  45. package/ui-cv/cv-number-box/cv-number-box.vue +223 -0
  46. package/ui-cv/cv-pagination/cv-pagination.vue +397 -0
  47. package/ui-cv/cv-popup/cv-popup.vue +429 -0
  48. package/ui-cv/cv-popup-dialog/{uni-popup-dialog.vue → cv-popup-dialog.vue} +0 -0
  49. package/ui-cv/cv-popup-message/cv-popup-message.vue +143 -0
  50. package/ui-cv/cv-popup-share/{uni-popup-share.vue → cv-popup-share.vue} +0 -0
  51. package/ui-cv/cv-row/{uni-row.vue → cv-row.vue} +1 -1
  52. package/ui-cv/cv-search-bar/cv-search-bar.vue +280 -0
  53. package/ui-cv/cv-section/{uni-section.vue → cv-section.vue} +0 -0
  54. package/ui-cv/cv-segmented-control/{uni-segmented-control.vue → cv-segmented-control.vue} +0 -0
  55. package/ui-cv/cv-status-bar/{uni-status-bar.vue → cv-status-bar.vue} +0 -0
  56. package/ui-cv/cv-steps/cv-steps.vue +293 -0
  57. package/ui-cv/cv-swipe-action/{uni-swipe-action.vue → cv-swipe-action.vue} +0 -0
  58. package/ui-cv/cv-swipe-action-item/{uni-swipe-action-item.vue → cv-swipe-action-item.vue} +0 -0
  59. package/ui-cv/cv-swiper-dot/cv-swiper-dot.vue +255 -0
  60. package/ui-cv/cv-table/cv-table.vue +460 -0
  61. package/ui-cv/cv-tag/cv-tag.vue +276 -0
  62. package/ui-cv/cv-tbody/cv-tbody.vue +28 -0
  63. package/ui-cv/cv-td/cv-td.vue +93 -0
  64. package/ui-cv/cv-test/{uni-test.vue → cv-test.vue} +0 -0
  65. package/ui-cv/cv-th/cv-th.vue +270 -0
  66. package/ui-cv/cv-thead/cv-thead.vue +114 -0
  67. package/ui-cv/cv-title/cv-title.vue +168 -0
  68. package/ui-cv/cv-tr/cv-tr.vue +166 -0
  69. package/ui-cv/cv-transition/cv-transition.vue +279 -0
  70. package/ui-cv/cv-calendar/uni-calendar-item.vue +0 -171
  71. package/ui-cv/cv-calendar/uni-calendar.vue +0 -504
  72. package/ui-cv/cv-card/uni-card.vue +0 -420
  73. package/ui-cv/cv-col/uni-col.vue +0 -2968
  74. package/ui-cv/cv-collapse/uni-collapse.vue +0 -146
  75. package/ui-cv/cv-collapse-item/uni-collapse-item.vue +0 -378
  76. package/ui-cv/cv-combox/uni-combox.vue +0 -237
  77. package/ui-cv/cv-countdown/uni-countdown.vue +0 -234
  78. package/ui-cv/cv-data-checkbox/uni-data-checkbox.vue +0 -792
  79. package/ui-cv/cv-data-indexed-list/uni-data-indexed-list-item.vue +0 -142
  80. package/ui-cv/cv-data-indexed-list/uni-data-indexed-list.vue +0 -364
  81. package/ui-cv/cv-data-picker/uni-data-picker.vue +0 -468
  82. package/ui-cv/cv-data-pickerview/uni-data-pickerview.vue +0 -298
  83. package/ui-cv/cv-dateformat/uni-dateformat.vue +0 -88
  84. package/ui-cv/cv-datetime-picker/uni-datetime-picker.vue +0 -874
  85. package/ui-cv/cv-easyinput/uni-easyinput.vue +0 -438
  86. package/ui-cv/cv-fab/uni-fab.vue +0 -443
  87. package/ui-cv/cv-fav/uni-fav.vue +0 -136
  88. package/ui-cv/cv-file-picker/uni-file-picker.vue +0 -614
  89. package/ui-cv/cv-indexed-list/uni-indexed-list-item.vue +0 -142
  90. package/ui-cv/cv-indexed-list/uni-indexed-list.vue +0 -357
  91. package/ui-cv/cv-list/uni-list.vue +0 -107
  92. package/ui-cv/cv-list/uni-refresh.vue +0 -65
  93. package/ui-cv/cv-list-ad/uni-list-ad.vue +0 -106
  94. package/ui-cv/cv-list-item/uni-list-item.vue +0 -428
  95. package/ui-cv/cv-nav-bar/uni-nav-bar.vue +0 -244
  96. package/ui-cv/cv-notice-bar/uni-notice-bar.vue +0 -394
  97. package/ui-cv/cv-number-box/uni-number-box.vue +0 -224
  98. package/ui-cv/cv-pagination/uni-pagination.vue +0 -376
  99. package/ui-cv/cv-popup/uni-popup.vue +0 -412
  100. package/ui-cv/cv-popup-message/uni-popup-message.vue +0 -143
  101. package/ui-cv/cv-search-bar/uni-search-bar.vue +0 -262
  102. package/ui-cv/cv-steps/uni-steps.vue +0 -250
  103. package/ui-cv/cv-swiper-dot/uni-swiper-dot.vue +0 -205
  104. package/ui-cv/cv-table/uni-table.vue +0 -455
  105. package/ui-cv/cv-tag/uni-tag.vue +0 -283
  106. package/ui-cv/cv-tbody/uni-tbody.vue +0 -30
  107. package/ui-cv/cv-td/uni-td.vue +0 -88
  108. package/ui-cv/cv-th/uni-th.vue +0 -259
  109. package/ui-cv/cv-thead/uni-thead.vue +0 -114
  110. package/ui-cv/cv-title/uni-title.vue +0 -171
  111. package/ui-cv/cv-tr/uni-tr.vue +0 -156
  112. package/ui-cv/cv-transition/uni-transition.vue +0 -287
@@ -0,0 +1,619 @@
1
+ <template>
2
+ <view class="uni-file-picker">
3
+ <view v-if="title" class="uni-file-picker__header">
4
+ <text class="file-title">{{ title }}</text>
5
+ <text class="file-count">{{ filesList.length }}/{{ limitLength }}</text>
6
+ </view>
7
+ <upload-image
8
+ v-if="fileMediatype === 'image' && showType === 'grid'"
9
+ :readonly="readonly"
10
+ :image-styles="imageStyles"
11
+ :files-list="filesList"
12
+ :limit="limitLength"
13
+ :disablePreview="disablePreview"
14
+ :delIcon="delIcon"
15
+ @uploadFiles="uploadFiles"
16
+ @choose="choose"
17
+ @delFile="delFile"
18
+ >
19
+ <slot>
20
+ <view class="is-add">
21
+ <view class="icon-add"></view>
22
+ <view class="icon-add rotate"></view>
23
+ </view>
24
+ </slot>
25
+ </upload-image>
26
+ <upload-file
27
+ v-if="fileMediatype !== 'image' || showType !== 'grid'"
28
+ :readonly="readonly"
29
+ :list-styles="listStyles"
30
+ :files-list="filesList"
31
+ :showType="showType"
32
+ :delIcon="delIcon"
33
+ @uploadFiles="uploadFiles"
34
+ @choose="choose"
35
+ @delFile="delFile"
36
+ >
37
+ <slot><button type="primary" size="mini">选择文件</button></slot>
38
+ </upload-file>
39
+ </view>
40
+ </template>
41
+
42
+ <script>
43
+ import { chooseAndUploadFile, uploadCloudFiles } from './choose-and-upload-file.js';
44
+ import { get_file_ext, get_extname, get_files_and_is_max, get_file_info, get_file_data } from './utils.js';
45
+ import uploadImage from './upload-image.vue';
46
+ import uploadFile from './upload-file.vue';
47
+ let fileInput = null;
48
+ /**
49
+ * FilePicker 文件选择上传
50
+ * @description 文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
51
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=4079
52
+ * @property {Object|Array} value 组件数据,通常用来回显 ,类型由return-type属性决定
53
+ * @property {Boolean} disabled = [true|false] 组件禁用
54
+ * @value true 禁用
55
+ * @value false 取消禁用
56
+ * @property {Boolean} readonly = [true|false] 组件只读,不可选择,不显示进度,不显示删除按钮
57
+ * @value true 只读
58
+ * @value false 取消只读
59
+ * @property {String} return-type = [array|object] 限制 value 格式,当为 object 时 ,组件只能单选,且会覆盖
60
+ * @value array 规定 value 属性的类型为数组
61
+ * @value object 规定 value 属性的类型为对象
62
+ * @property {Boolean} disable-preview = [true|false] 禁用图片预览,仅 mode:grid 时生效
63
+ * @value true 禁用图片预览
64
+ * @value false 取消禁用图片预览
65
+ * @property {Boolean} del-icon = [true|false] 是否显示删除按钮
66
+ * @value true 显示删除按钮
67
+ * @value false 不显示删除按钮
68
+ * @property {Boolean} auto-upload = [true|false] 是否自动上传,值为true则只触发@select,可自行上传
69
+ * @value true 自动上传
70
+ * @value false 取消自动上传
71
+ * @property {Number|String} limit 最大选择个数 ,h5 会自动忽略多选的部分
72
+ * @property {String} title 组件标题,右侧显示上传计数
73
+ * @property {String} mode = [list|grid] 选择文件后的文件列表样式
74
+ * @value list 列表显示
75
+ * @value grid 宫格显示
76
+ * @property {String} file-mediatype = [image|video|all] 选择文件类型
77
+ * @value image 只选择图片
78
+ * @value video 只选择视频
79
+ * @value all 选择所有文件
80
+ * @property {Array} file-extname 选择文件后缀,根据 file-mediatype 属性而不同
81
+ * @property {Object} list-style mode:list 时的样式
82
+ * @property {Object} image-styles 选择文件后缀,根据 file-mediatype 属性而不同
83
+ * @event {Function} select 选择文件后触发
84
+ * @event {Function} progress 文件上传时触发
85
+ * @event {Function} success 上传成功触发
86
+ * @event {Function} fail 上传失败触发
87
+ * @event {Function} delete 文件从列表移除时触发
88
+ */
89
+ export default {
90
+ name: 'cvFilePicker',
91
+ components: {
92
+ uploadImage,
93
+ uploadFile
94
+ },
95
+ emits: ['select', 'success', 'fail', 'progress', 'delete', 'update:modelValue', 'input'],
96
+ props: {
97
+ // #ifdef VUE3
98
+ modelValue: {
99
+ type: [Array, Object],
100
+ default() {
101
+ return [];
102
+ }
103
+ },
104
+ // #endif
105
+
106
+ // #ifndef VUE3
107
+ value: {
108
+ type: [Array, Object],
109
+ default() {
110
+ return [];
111
+ }
112
+ },
113
+ // #endif
114
+
115
+ disabled: {
116
+ type: Boolean,
117
+ default: false
118
+ },
119
+ disablePreview: {
120
+ type: Boolean,
121
+ default: false
122
+ },
123
+ delIcon: {
124
+ type: Boolean,
125
+ default: true
126
+ },
127
+ // 自动上传
128
+ autoUpload: {
129
+ type: Boolean,
130
+ default: true
131
+ },
132
+ // 最大选择个数 ,h5只能限制单选或是多选
133
+ limit: {
134
+ type: [Number, String],
135
+ default: 9
136
+ },
137
+ // 列表样式 grid | list | list-card
138
+ mode: {
139
+ type: String,
140
+ default: 'grid'
141
+ },
142
+ // 选择文件类型 image/video/all
143
+ fileMediatype: {
144
+ type: String,
145
+ default: 'image'
146
+ },
147
+ // 文件类型筛选
148
+ fileExtname: {
149
+ type: [Array, String],
150
+ default() {
151
+ return [];
152
+ }
153
+ },
154
+ title: {
155
+ type: String,
156
+ default: ''
157
+ },
158
+ listStyles: {
159
+ type: Object,
160
+ default() {
161
+ return {
162
+ // 是否显示边框
163
+ border: true,
164
+ // 是否显示分隔线
165
+ dividline: true,
166
+ // 线条样式
167
+ borderStyle: {}
168
+ };
169
+ }
170
+ },
171
+ imageStyles: {
172
+ type: Object,
173
+ default() {
174
+ return {
175
+ width: 'auto',
176
+ height: 'auto'
177
+ };
178
+ }
179
+ },
180
+ readonly: {
181
+ type: Boolean,
182
+ default: false
183
+ },
184
+ returnType: {
185
+ type: String,
186
+ default: 'array'
187
+ },
188
+ sizeType: {
189
+ type: Array,
190
+ default() {
191
+ return ['original', 'compressed'];
192
+ }
193
+ }
194
+ },
195
+ data() {
196
+ return {
197
+ files: [],
198
+ localValue: []
199
+ };
200
+ },
201
+ watch: {
202
+ // #ifndef VUE3
203
+ value: {
204
+ handler(newVal, oldVal) {
205
+ this.setValue(newVal, oldVal);
206
+ },
207
+ immediate: true
208
+ },
209
+ // #endif
210
+ // #ifdef VUE3
211
+ modelValue: {
212
+ handler(newVal, oldVal) {
213
+ this.setValue(newVal, oldVal);
214
+ },
215
+ immediate: true
216
+ }
217
+ // #endif
218
+ },
219
+ computed: {
220
+ filesList() {
221
+ let files = [];
222
+ this.files.forEach((v) => {
223
+ files.push(v);
224
+ });
225
+ return files;
226
+ },
227
+ showType() {
228
+ if (this.fileMediatype === 'image') {
229
+ return this.mode;
230
+ }
231
+ return 'list';
232
+ },
233
+ limitLength() {
234
+ if (this.returnType === 'object') {
235
+ return 1;
236
+ }
237
+ if (!this.limit) {
238
+ return 1;
239
+ }
240
+ if (this.limit >= 9) {
241
+ return 9;
242
+ }
243
+ return this.limit;
244
+ }
245
+ },
246
+ created() {
247
+ // TODO 兼容不开通服务空间的情况
248
+ if (!(uniCloud.config && uniCloud.config.provider)) {
249
+ this.noSpace = true;
250
+ uniCloud.chooseAndUploadFile = chooseAndUploadFile;
251
+ }
252
+ this.tempData = {};
253
+ this.form = this.getForm('uniForms');
254
+ this.formItem = this.getForm('uniFormsItem');
255
+ if (this.form && this.formItem) {
256
+ if (this.formItem.name) {
257
+ this.rename = this.formItem.name;
258
+ this.form.inputChildrens.push(this);
259
+ }
260
+ }
261
+ },
262
+ methods: {
263
+ setValue(newVal, oldVal) {
264
+ const newData = (v) => {
265
+ const files = this.files.find((i) => i.url === v.url);
266
+ const reg = /cloud:\/\/([\w.]+\/?)\S*/;
267
+ v.path = v.url;
268
+ if (reg.test(v.url)) {
269
+ this.getTempFileURL(v, v.url);
270
+ }
271
+ return v;
272
+ };
273
+ // let data = null
274
+ if (this.returnType === 'object') {
275
+ newData(newData);
276
+ } else {
277
+ newVal.forEach((v) => {
278
+ newData(v);
279
+ });
280
+ }
281
+ this.localValue = newVal;
282
+ this.formItem && this.formItem.setValue(this.localValue);
283
+ this.files = [].concat(newVal || []);
284
+ },
285
+
286
+ /**
287
+ * 继续上传
288
+ */
289
+ upload() {
290
+ let files = [];
291
+ this.files.forEach((v, index) => {
292
+ if (v.status === 'ready' || v.status === 'error') {
293
+ files.push(Object.assign({}, v));
294
+ }
295
+ });
296
+
297
+ this.uploadFiles(files);
298
+ },
299
+ /**
300
+ * 选择文件
301
+ */
302
+ choose() {
303
+ if (this.disabled) return;
304
+ if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType === 'array') {
305
+ uni.showToast({
306
+ title: `您最多选择 ${this.limitLength} 个文件`,
307
+ icon: 'none'
308
+ });
309
+ return;
310
+ }
311
+ this.chooseFiles();
312
+ },
313
+
314
+ /**
315
+ * 选择文件并上传
316
+ */
317
+ chooseFiles() {
318
+ const _extname = get_extname(this.fileExtname);
319
+ // 获取后缀
320
+ uniCloud
321
+ .chooseAndUploadFile({
322
+ type: this.fileMediatype,
323
+ compressed: false,
324
+ sizeType: this.sizeType,
325
+ // TODO 如果为空,video 有问题
326
+ extension: _extname.length > 0 ? _extname : undefined,
327
+ count: this.limitLength - this.files.length, //默认9
328
+ onChooseFile: this.chooseFileCallback,
329
+ onUploadProgress: (progressEvent) => {
330
+ this.setProgress(progressEvent, progressEvent.index);
331
+ }
332
+ })
333
+ .then((result) => {
334
+ this.setSuccessAndError(result.tempFiles);
335
+ })
336
+ .catch((err) => {
337
+ console.log('选择失败', err);
338
+ });
339
+ },
340
+
341
+ /**
342
+ * 选择文件回调
343
+ * @param {Object} res
344
+ */
345
+ async chooseFileCallback(res) {
346
+ const _extname = get_extname(this.fileExtname);
347
+ const is_one = (Number(this.limitLength) === 1 && this.disablePreview && !this.disabled) || this.returnType === 'object';
348
+ // 如果这有一个文件 ,需要清空本地缓存数据
349
+ if (is_one) {
350
+ this.files = [];
351
+ }
352
+
353
+ let { filePaths, files } = get_files_and_is_max(res, _extname);
354
+ if (!(_extname && _extname.length > 0)) {
355
+ filePaths = res.tempFilePaths;
356
+ files = res.tempFiles;
357
+ }
358
+
359
+ let currentData = [];
360
+ for (let i = 0; i < files.length; i++) {
361
+ if (this.limitLength - this.files.length <= 0) break;
362
+ files[i].uuid = Date.now();
363
+ let filedata = await get_file_data(files[i], this.fileMediatype);
364
+ filedata.progress = 100;
365
+ filedata.status = 'ready';
366
+ this.files.push(filedata);
367
+ currentData.push({
368
+ ...filedata,
369
+ file: files[i]
370
+ });
371
+ }
372
+ this.$emit('select', {
373
+ tempFiles: currentData,
374
+ tempFilePaths: filePaths
375
+ });
376
+ res.tempFiles = files;
377
+ // 停止自动上传
378
+ if (!this.autoUpload || this.noSpace) {
379
+ res.tempFiles = [];
380
+ }
381
+ },
382
+
383
+ /**
384
+ * 批传
385
+ * @param {Object} e
386
+ */
387
+ uploadFiles(files) {
388
+ files = [].concat(files);
389
+ uploadCloudFiles
390
+ .call(this, files, 5, (res) => {
391
+ this.setProgress(res, res.index, true);
392
+ })
393
+ .then((result) => {
394
+ this.setSuccessAndError(result);
395
+ })
396
+ .catch((err) => {
397
+ console.log('err', err);
398
+ });
399
+ },
400
+
401
+ /**
402
+ * 成功或失败
403
+ */
404
+ async setSuccessAndError(res, fn) {
405
+ let successData = [];
406
+ let errorData = [];
407
+ let tempFilePath = [];
408
+ let errorTempFilePath = [];
409
+ for (let i = 0; i < res.length; i++) {
410
+ // const index = item.index
411
+ const item = res[i];
412
+ const index = item.uuid ? this.files.findIndex((p) => p.uuid === item.uuid) : item.index;
413
+ if (index === -1 || !this.files) break;
414
+ if (item.errMsg === 'request:fail') {
415
+ this.files[index].url = item.path;
416
+ this.files[index].status = 'error';
417
+ this.files[index].errMsg = item.errMsg;
418
+ // this.files[index].progress = -1
419
+ errorData.push(this.files[index]);
420
+ errorTempFilePath.push(this.files[index].url);
421
+ } else {
422
+ this.files[index].errMsg = '';
423
+ this.files[index].url = item.url;
424
+ this.files[index].status = 'success';
425
+ this.files[index].progress += 1;
426
+ successData.push(this.files[index]);
427
+ tempFilePath.push(this.files[index].url);
428
+ }
429
+ }
430
+
431
+ if (successData.length > 0) {
432
+ this.setEmit();
433
+ // 状态改变返回
434
+ this.$emit('success', {
435
+ tempFiles: this.backObject(successData),
436
+ tempFilePaths: tempFilePath
437
+ });
438
+ }
439
+
440
+ if (errorData.length > 0) {
441
+ this.$emit('fail', {
442
+ tempFiles: this.backObject(errorData),
443
+ tempFilePaths: errorTempFilePath
444
+ });
445
+ }
446
+ },
447
+
448
+ /**
449
+ * 获取进度
450
+ * @param {Object} progressEvent
451
+ * @param {Object} index
452
+ * @param {Object} type
453
+ */
454
+ setProgress(progressEvent, index, type) {
455
+ const fileLenth = this.files.length;
456
+ const percentNum = (index / fileLenth) * 100;
457
+ const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
458
+ let idx = index;
459
+ if (!type) {
460
+ idx = this.files.findIndex((p) => p.uuid === progressEvent.tempFile.uuid);
461
+ }
462
+ if (idx === -1 || !this.files[idx]) return;
463
+ // fix by mehaotian 100 就会消失,-1 是为了让进度条消失
464
+ this.files[idx].progress = percentCompleted - 1;
465
+ // 上传中
466
+ this.$emit('progress', {
467
+ index: idx,
468
+ progress: parseInt(percentCompleted),
469
+ tempFile: this.files[idx]
470
+ });
471
+ },
472
+
473
+ /**
474
+ * 删除文件
475
+ * @param {Object} index
476
+ */
477
+ delFile(index) {
478
+ this.$emit('delete', {
479
+ tempFile: this.files[index],
480
+ tempFilePath: this.files[index].url
481
+ });
482
+ this.files.splice(index, 1);
483
+ this.$nextTick(() => {
484
+ this.setEmit();
485
+ });
486
+ },
487
+
488
+ /**
489
+ * 获取文件名和后缀
490
+ * @param {Object} name
491
+ */
492
+ getFileExt(name) {
493
+ const last_len = name.lastIndexOf('.');
494
+ const len = name.length;
495
+ return {
496
+ name: name.substring(0, last_len),
497
+ ext: name.substring(last_len + 1, len)
498
+ };
499
+ },
500
+
501
+ /**
502
+ * 处理返回事件
503
+ */
504
+ setEmit() {
505
+ let data = [];
506
+ if (this.returnType === 'object') {
507
+ data = this.backObject(this.files)[0];
508
+ this.localValue = {};
509
+ Object.assign(this.localValue, data);
510
+ } else {
511
+ data = this.backObject(this.files);
512
+ if (!this.localValue) {
513
+ this.localValue = [];
514
+ }
515
+ this.localValue = [...data];
516
+ }
517
+ // #ifdef VUE3
518
+ this.$emit('update:modelValue', this.localValue);
519
+ // #endif
520
+ // #ifndef VUE3
521
+ this.$emit('input', this.localValue);
522
+ // #endif
523
+ },
524
+
525
+ /**
526
+ * 处理返回参数
527
+ * @param {Object} files
528
+ */
529
+ backObject(files) {
530
+ let newFilesData = [];
531
+ files.forEach((v) => {
532
+ newFilesData.push({
533
+ extname: v.extname,
534
+ fileType: v.fileType,
535
+ image: v.image,
536
+ name: v.name,
537
+ path: v.path,
538
+ size: v.size,
539
+ url: v.url
540
+ });
541
+ });
542
+ return newFilesData;
543
+ },
544
+ async getTempFileURL(file, fileList) {
545
+ fileList = {
546
+ fileList: [].concat(fileList)
547
+ };
548
+ const urls = await uniCloud.getTempFileURL(fileList);
549
+ file.url = urls.fileList[0].tempFileURL || '';
550
+ file.path = file.url;
551
+ const index = this.files.findIndex((v) => v.path === file.path);
552
+ if (index !== -1) {
553
+ this.$set(this.files, index, file);
554
+ }
555
+ },
556
+ /**
557
+ * 获取父元素实例
558
+ */
559
+ getForm(name = 'uniForms') {
560
+ let parent = this.$parent;
561
+ let parentName = parent.$options.name;
562
+ while (parentName !== name) {
563
+ parent = parent.$parent;
564
+ if (!parent) return false;
565
+ parentName = parent.$options.name;
566
+ }
567
+ return parent;
568
+ }
569
+ }
570
+ };
571
+ </script>
572
+
573
+ <style scoped>
574
+ .uni-file-picker {
575
+ /* #ifndef APP-NVUE */
576
+ box-sizing: border-box;
577
+ overflow: hidden;
578
+ /* #endif */
579
+ }
580
+
581
+ .uni-file-picker__header {
582
+ padding-top: 5px;
583
+ padding-bottom: 10px;
584
+ /* #ifndef APP-NVUE */
585
+ display: flex;
586
+ /* #endif */
587
+ justify-content: space-between;
588
+ }
589
+
590
+ .file-title {
591
+ font-size: 14px;
592
+ color: #333;
593
+ }
594
+
595
+ .file-count {
596
+ font-size: 14px;
597
+ color: #999;
598
+ }
599
+
600
+ .is-add {
601
+ /* #ifndef APP-NVUE */
602
+ display: flex;
603
+ /* #endif */
604
+ align-items: center;
605
+ justify-content: center;
606
+ }
607
+
608
+ .icon-add {
609
+ width: 50px;
610
+ height: 5px;
611
+ background-color: #f1f1f1;
612
+ border-radius: 2px;
613
+ }
614
+
615
+ .rotate {
616
+ position: absolute;
617
+ transform: rotate(90deg);
618
+ }
619
+ </style>
@@ -7,7 +7,7 @@
7
7
  <view class="cv-form-item__inner" :class="['is-direction-' + labelPos]">
8
8
  <view class="cv-form-item__label" :style="{ width: labelWid, justifyContent: justifyContent }">
9
9
  <slot name="left">
10
- <uni-icons v-if="leftIcon" class="label-icon" size="16" :type="leftIcon" :color="iconColor" />
10
+ <cv-icon2 v-if="leftIcon" class="label-icon" size="16" :type="leftIcon" :color="iconColor" />
11
11
  <text v-if="required" class="is-required">*</text>
12
12
  <text class="label-text">{{ label }}</text>
13
13
  <view v-if="label" class="label-seat"></view>
@@ -6,7 +6,7 @@
6
6
  <view class="flex uni-tab__cart-sub-left">
7
7
  <view v-for="(item,index) in options" :key="index" class="flex uni-tab__cart-button-left uni-tab__shop-cart" @click="onClick(index,item)">
8
8
  <view class="uni-tab__icon">
9
- <uni-icons :type="item.icon" size="20" color="#646566"></uni-icons>
9
+ <cv-icon2 :type="item.icon" size="20" color="#646566"></cv-icon2>
10
10
  <!-- <image class="image" :src="item.icon" mode="widthFix" /> -->
11
11
  </view>
12
12
  <text class="uni-tab__text">{{ item.text }}</text>
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <text
3
3
  :style="{ color: color, 'font-size': size + 'px' }"
4
- class="uni-icons"
4
+ class="cv-icon2"
5
5
  :class="[customIcons, customIcons ? type : '']"
6
6
  @click="_onClick"
7
7
  >
@@ -29,7 +29,7 @@ domModule.addRule('fontFace', {
29
29
  * @event {Function} click 点击 Icon 触发事件
30
30
  */
31
31
  export default {
32
- name: 'cvIcons2',
32
+ name: 'cvIcon2',
33
33
  emits: ['click'],
34
34
  props: {
35
35
  type: {
@@ -70,7 +70,7 @@ export default {
70
70
  }
71
71
 
72
72
  /* #endif */
73
- .uni-icons {
73
+ .cv-icon2 {
74
74
  font-family: uniicons;
75
75
  text-decoration: none;
76
76
  text-align: center;
File without changes
File without changes