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