@10yun/cv-mobile-ui 0.3.26 → 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 (235) hide show
  1. package/build/parse-pages.js +2 -2
  2. package/package.json +1 -1
  3. package/ui-cv/README.md +3 -0
  4. package/ui-cv/cv-badge/cv-badge.vue +249 -0
  5. package/ui-cv/cv-banner/cv-banner.vue +1 -1
  6. package/ui-cv/cv-banner-card/cv-banner-card.vue +1 -1
  7. package/ui-cv/cv-block/cv-block.vue +1 -1
  8. package/ui-cv/cv-box/cv-box.vue +1 -1
  9. package/ui-cv/cv-calendar/calendar.js +963 -0
  10. package/ui-cv/cv-calendar/cv-calendar-item.vue +198 -0
  11. package/ui-cv/cv-calendar/cv-calendar.vue +508 -0
  12. package/{ui-uni/uni-calendar → ui-cv/cv-calendar}/util.js +0 -0
  13. package/ui-cv/cv-card/cv-card.vue +427 -0
  14. package/ui-cv/cv-cell/cv-cell.vue +1 -1
  15. package/ui-cv/cv-checkbox-group/cv-checkbox-group.vue +227 -0
  16. package/ui-cv/cv-checkbox-opt-base/cv-checkbox-opt-base.vue +57 -0
  17. package/ui-cv/cv-checkbox-opt-tag/cv-checkbox-opt-tag.vue +107 -0
  18. package/ui-cv/cv-code-sms/cv-code-sms.vue +23 -42
  19. package/ui-cv/cv-col/cv-col.vue +2965 -0
  20. package/ui-cv/cv-collapse/cv-collapse.vue +146 -0
  21. package/ui-cv/cv-collapse-item/cv-collapse-item.vue +395 -0
  22. package/ui-cv/cv-combox/cv-combox.vue +250 -0
  23. package/ui-cv/cv-countdown/cv-countdown.vue +245 -0
  24. package/ui-cv/cv-data-checkbox/cv-data-checkbox.vue +841 -0
  25. package/{ui-uni/uni-data-indexed-list → ui-cv/cv-data-indexed-list}/clientdb.js +0 -0
  26. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list-item.vue +154 -0
  27. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list.vue +376 -0
  28. package/ui-cv/cv-data-picker/cv-data-picker.vue +486 -0
  29. package/{ui-uni/uni-data-picker → ui-cv/cv-data-picker}/keypress.js +0 -0
  30. package/{ui-uni/uni-data-pickerview/uni-data-picker.js → ui-cv/cv-data-pickerview/cv-data-picker.js} +0 -0
  31. package/ui-cv/cv-data-pickerview/cv-data-pickerview.vue +304 -0
  32. package/ui-cv/cv-dateformat/cv-dateformat.vue +86 -0
  33. package/{ui-uni/uni-dateformat → ui-cv/cv-dateformat}/date-format.js +0 -0
  34. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/calendar-item.vue +0 -0
  35. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/calendar.js +0 -0
  36. package/ui-cv/cv-datetime-picker/calendar.vue +761 -0
  37. package/ui-cv/cv-datetime-picker/cv-datetime-picker.vue +958 -0
  38. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/keypress.js +0 -0
  39. package/ui-cv/cv-datetime-picker/time-picker.vue +907 -0
  40. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/util.js +0 -0
  41. package/ui-cv/cv-dialog-bottom/cv-dialog-bottom.vue +1 -1
  42. package/ui-cv/cv-dialog-full/cv-dialog-full.vue +1 -1
  43. package/ui-cv/cv-dialog-loading/cv-dialog-loading.vue +3 -3
  44. package/ui-cv/cv-drawer/cv-drawer.vue +185 -0
  45. package/{ui-uni/uni-drawer → ui-cv/cv-drawer}/keypress.js +14 -14
  46. package/{ui-uni/uni-easyinput → ui-cv/cv-easyinput}/common.js +0 -0
  47. package/ui-cv/cv-easyinput/cv-easyinput.vue +514 -0
  48. package/ui-cv/cv-editor-parse/readme.md +2 -3
  49. package/ui-cv/{cv-editor → cv-editor-quill}/compressImage.vue +0 -0
  50. package/ui-cv/{cv-editor/cv-editor.vue → cv-editor-quill/cv-editor-quill.vue} +3 -23
  51. package/ui-cv/{cv-editor → cv-editor-quill}/editor-icon.css +0 -0
  52. package/ui-cv/{cv-editor → cv-editor-quill}/editor-icon.ttf +0 -0
  53. package/ui-cv/{cv-editor → cv-editor-quill}/index.js +0 -0
  54. package/ui-cv/cv-fab/cv-fab.vue +465 -0
  55. package/{ui-uni/uni-fab/uni-fab.vue.bak → ui-cv/cv-fab/cv-fab.vue.bak} +2 -2
  56. package/ui-cv/cv-fav/cv-fav.vue +150 -0
  57. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/choose-and-upload-file.js +0 -0
  58. package/ui-cv/cv-file-picker/cv-file-picker.vue +619 -0
  59. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/upload-file.vue +0 -0
  60. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/upload-image.vue +0 -0
  61. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/utils.js +0 -0
  62. package/ui-cv/cv-form-base/cv-form-base.vue +470 -0
  63. package/ui-cv/cv-form-base/validate.js +477 -0
  64. package/ui-cv/cv-form-group/cv-form-group.vue +123 -80
  65. package/ui-cv/cv-form-group/cv-form-group2.vue +80 -0
  66. package/ui-cv/cv-form-item/cv-form-item.vue +482 -174
  67. package/ui-cv/cv-form-item/cv-form-item2.vue +215 -0
  68. package/ui-cv/cv-form-merge/cv-form-merge.vue +1 -1
  69. package/ui-cv/cv-geo-local/cv-geo-local.vue +14 -26
  70. package/{ui-uni/uni-goods-nav/uni-goods-nav.vue → ui-cv/cv-goods-nav/cv-goods-nav.vue} +1 -1
  71. package/ui-cv/cv-grid-group/cv-grid-group.vue +148 -0
  72. package/ui-cv/cv-grid-item/cv-grid-item.vue +132 -0
  73. package/ui-cv/cv-icon2/cv-icon2.vue +78 -0
  74. package/ui-cv/cv-icon2/icons.js +132 -0
  75. package/{ui-uni/uni-icons → ui-cv/cv-icon2}/uni.ttf +0 -0
  76. package/ui-cv/cv-icons/cv-icons.vue +1 -1
  77. package/ui-cv/cv-indexed-list/cv-indexed-list-item.vue +154 -0
  78. package/ui-cv/cv-indexed-list/cv-indexed-list.vue +371 -0
  79. package/ui-cv/cv-info/cv-info.vue +5 -20
  80. package/ui-cv/cv-input-btn/cv-input-btn.vue +25 -43
  81. package/ui-cv/cv-input-digit/cv-input-digit.vue +61 -28
  82. package/ui-cv/cv-input-idcard/cv-input-idcard.vue +47 -29
  83. package/ui-cv/cv-input-number/cv-input-number.vue +60 -28
  84. package/ui-cv/cv-input-password/cv-input-password.vue +80 -30
  85. package/ui-cv/cv-input-text/cv-input-text.vue +55 -37
  86. package/ui-cv/cv-link2/cv-link2.vue +130 -0
  87. package/ui-cv/cv-list/cv-list.vue +107 -0
  88. package/ui-cv/cv-list/cv-refresh.vue +65 -0
  89. package/{ui-uni/uni-list → ui-cv/cv-list}/uni-refresh.wxs +0 -0
  90. package/ui-cv/cv-list-ad/cv-list-ad.vue +113 -0
  91. package/{ui-uni/uni-list-chat/uni-list-chat.scss → ui-cv/cv-list-chat/cv-list-chat.scss} +0 -0
  92. package/{ui-uni/uni-list-chat/uni-list-chat.vue → ui-cv/cv-list-chat/cv-list-chat.vue} +0 -0
  93. package/ui-cv/cv-list-item/cv-list-item.vue +449 -0
  94. package/ui-cv/cv-load-more/config.json +9 -9
  95. package/ui-cv/cv-load-more/cv-load-more.vue +34 -5
  96. package/ui-cv/cv-message/cv-message.vue +1 -1
  97. package/ui-cv/cv-nav-bar/cv-nav-bar.vue +256 -0
  98. package/{ui-uni/uni-nav-bar/uni-status-bar.vue → ui-cv/cv-nav-bar/cv-status-bar.vue} +0 -0
  99. package/ui-cv/cv-nav-col/cv-nav-col.vue +1 -1
  100. package/ui-cv/cv-nav-row/cv-nav-row.vue +1 -1
  101. package/ui-cv/cv-notice-bar/cv-notice-bar.vue +453 -0
  102. package/ui-cv/cv-number-box/cv-number-box.vue +223 -0
  103. package/ui-cv/cv-pagination/cv-pagination.vue +397 -0
  104. package/ui-cv/cv-picker-date/cv-picker-date.vue +17 -27
  105. package/ui-cv/cv-picker-datetime/cv-picker-datetime.vue +31 -41
  106. package/ui-cv/cv-picker-datetime5/cv-picker-datetime5.vue +19 -29
  107. package/ui-cv/cv-picker-region/cv-picker-region.vue +23 -33
  108. package/ui-cv/cv-picker-time/cv-picker-time.vue +16 -26
  109. package/ui-cv/cv-picker1/cv-picker1.vue +16 -28
  110. package/ui-cv/cv-picker2/cv-picker2.vue +22 -32
  111. package/ui-cv/cv-picker3/cv-picker3.vue +34 -44
  112. package/ui-cv/cv-popup/cv-popup.vue +429 -0
  113. package/{ui-uni/uni-popup → ui-cv/cv-popup}/keypress.js +0 -0
  114. package/{ui-uni/uni-popup → ui-cv/cv-popup}/popup.js +0 -0
  115. package/{ui-uni/uni-popup-dialog/uni-popup-dialog.vue → ui-cv/cv-popup-dialog/cv-popup-dialog.vue} +0 -0
  116. package/{ui-uni/uni-popup-dialog → ui-cv/cv-popup-dialog}/keypress.js +0 -0
  117. package/ui-cv/cv-popup-message/cv-popup-message.vue +143 -0
  118. package/{ui-uni/uni-popup-share/uni-popup-share.vue → ui-cv/cv-popup-share/cv-popup-share.vue} +0 -0
  119. package/ui-cv/cv-radio-group/cv-radio-group.vue +185 -0
  120. package/ui-cv/cv-radio-opt-base/cv-radio-opt-base.vue +57 -0
  121. package/ui-cv/cv-radio-opt-tag/cv-radio-opt-tag.vue +107 -0
  122. package/ui-cv/cv-rate/cv-rate.vue +13 -17
  123. package/ui-cv/cv-rate/uni-rate.vue +358 -0
  124. package/ui-cv/cv-row/cv-row.vue +157 -0
  125. package/ui-cv/cv-search/cv-search.vue +4 -4
  126. package/ui-cv/cv-search-bar/cv-search-bar.vue +280 -0
  127. package/{ui-uni/uni-section/uni-section.vue → ui-cv/cv-section/cv-section.vue} +0 -0
  128. package/{ui-uni/uni-segmented-control/uni-segmented-control.vue → ui-cv/cv-segmented-control/cv-segmented-control.vue} +0 -0
  129. package/ui-cv/cv-skeleton/cv-skeleton2.vue +5 -5
  130. package/ui-cv/cv-specs/cv-specs.vue +1 -1
  131. package/{ui-uni/uni-status-bar/uni-status-bar.vue → ui-cv/cv-status-bar/cv-status-bar.vue} +0 -0
  132. package/ui-cv/cv-steps/cv-steps.vue +293 -0
  133. package/{ui-uni/uni-swipe-action/uni-swipe-action.vue → ui-cv/cv-swipe-action/cv-swipe-action.vue} +0 -0
  134. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/bindingx.js +0 -0
  135. package/{ui-uni/uni-swipe-action-item/uni-swipe-action-item.vue → ui-cv/cv-swipe-action-item/cv-swipe-action-item.vue} +0 -0
  136. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/index.wxs +0 -0
  137. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/isPC.js +0 -0
  138. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/mpalipay.js +0 -0
  139. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/mpother.js +0 -0
  140. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/mpwxs.js +0 -0
  141. package/ui-cv/cv-swiper-dot/cv-swiper-dot.vue +255 -0
  142. package/ui-cv/cv-switch/cv-switch.vue +5 -9
  143. package/ui-cv/cv-table/cv-table.vue +460 -0
  144. package/ui-cv/cv-tag/cv-tag.vue +276 -0
  145. package/ui-cv/cv-tbody/cv-tbody.vue +28 -0
  146. package/ui-cv/cv-td/cv-td.vue +93 -0
  147. package/{ui-uni/uni-test/uni-test.vue → ui-cv/cv-test/cv-test.vue} +0 -0
  148. package/ui-cv/cv-textarea/cv-textarea.vue +56 -41
  149. package/ui-cv/cv-th/cv-th.vue +270 -0
  150. package/{ui-uni/uni-th → ui-cv/cv-th}/filter-dropdown.vue +0 -0
  151. package/ui-cv/cv-thead/cv-thead.vue +114 -0
  152. package/ui-cv/cv-title/cv-title.vue +168 -0
  153. package/ui-cv/cv-tr/cv-tr.vue +166 -0
  154. package/{ui-uni/uni-tr → ui-cv/cv-tr}/table-checkbox.vue +0 -0
  155. package/{ui-uni/uni-transition → ui-cv/cv-transition}/createAnimation.js +0 -0
  156. package/ui-cv/cv-transition/cv-transition.vue +279 -0
  157. package/ui-cv/cv-upload-avatar/cv-upload-avatar.vue +24 -22
  158. package/ui-cv/cv-upload-img/cv-upload-img.vue +1 -1
  159. package/ui-cv/mixins/mixins-input.js +20 -29
  160. package/ui-cv/mixins/mixins-picker.js +1 -13
  161. package/ui-uni/amap-wx/js/util.js +158 -166
  162. package/ui-uni/product.vue +52 -52
  163. package/ui-uni/u-charts/u-charts.js +1092 -743
  164. package/ui-cv/cv-checkbox/cv-checkbox.vue +0 -140
  165. package/ui-cv/cv-checkbox-tag/cv-checkbox-tag.vue +0 -164
  166. package/ui-cv/cv-nav-group/cv-nav-group.vue +0 -33
  167. package/ui-cv/cv-radio/cv-radio.vue +0 -111
  168. package/ui-cv/cv-radio-sex/cv-radio-sex.vue +0 -80
  169. package/ui-cv/cv-radio-tag/cv-radio-tag.vue +0 -133
  170. package/ui-cv/mixins/mixins-checkbox.js +0 -71
  171. package/ui-cv/mixins/mixins-common.js +0 -53
  172. package/ui-cv/mixins/mixins-radio.js +0 -84
  173. package/ui-uni/page-foot/page-foot.vue +0 -38
  174. package/ui-uni/page-head/page-head.vue +0 -16
  175. package/ui-uni/u-link/u-link.vue +0 -59
  176. package/ui-uni/uni-badge/uni-badge.vue +0 -250
  177. package/ui-uni/uni-calendar/calendar.js +0 -546
  178. package/ui-uni/uni-calendar/uni-calendar-item.vue +0 -171
  179. package/ui-uni/uni-calendar/uni-calendar.vue +0 -504
  180. package/ui-uni/uni-card/uni-card.vue +0 -420
  181. package/ui-uni/uni-col/uni-col.vue +0 -2968
  182. package/ui-uni/uni-collapse/uni-collapse.vue +0 -146
  183. package/ui-uni/uni-collapse-item/uni-collapse-item.vue +0 -378
  184. package/ui-uni/uni-combox/uni-combox.vue +0 -237
  185. package/ui-uni/uni-countdown/uni-countdown.vue +0 -234
  186. package/ui-uni/uni-data-checkbox/uni-data-checkbox.vue +0 -792
  187. package/ui-uni/uni-data-indexed-list/uni-data-indexed-list-item.vue +0 -142
  188. package/ui-uni/uni-data-indexed-list/uni-data-indexed-list.vue +0 -364
  189. package/ui-uni/uni-data-picker/uni-data-picker.vue +0 -468
  190. package/ui-uni/uni-data-pickerview/uni-data-pickerview.vue +0 -298
  191. package/ui-uni/uni-dateformat/uni-dateformat.vue +0 -88
  192. package/ui-uni/uni-datetime-picker/calendar.vue +0 -747
  193. package/ui-uni/uni-datetime-picker/time-picker.vue +0 -899
  194. package/ui-uni/uni-datetime-picker/uni-datetime-picker.vue +0 -874
  195. package/ui-uni/uni-drawer/uni-drawer.vue +0 -178
  196. package/ui-uni/uni-easyinput/uni-easyinput.vue +0 -438
  197. package/ui-uni/uni-fab/uni-fab.vue +0 -443
  198. package/ui-uni/uni-fav/uni-fav.vue +0 -136
  199. package/ui-uni/uni-file-picker/uni-file-picker.vue +0 -614
  200. package/ui-uni/uni-forms/uni-forms.vue +0 -467
  201. package/ui-uni/uni-forms/validate.js +0 -486
  202. package/ui-uni/uni-forms-item/uni-forms-item.vue +0 -500
  203. package/ui-uni/uni-grid/uni-grid.vue +0 -141
  204. package/ui-uni/uni-grid-item/uni-grid-item.vue +0 -123
  205. package/ui-uni/uni-group/uni-group.vue +0 -123
  206. package/ui-uni/uni-icons/icons.js +0 -132
  207. package/ui-uni/uni-icons/uni-icons.vue +0 -72
  208. package/ui-uni/uni-indexed-list/uni-indexed-list-item.vue +0 -142
  209. package/ui-uni/uni-indexed-list/uni-indexed-list.vue +0 -357
  210. package/ui-uni/uni-link/uni-link.vue +0 -117
  211. package/ui-uni/uni-list/uni-list.vue +0 -107
  212. package/ui-uni/uni-list/uni-refresh.vue +0 -65
  213. package/ui-uni/uni-list-ad/uni-list-ad.vue +0 -106
  214. package/ui-uni/uni-list-item/uni-list-item.vue +0 -428
  215. package/ui-uni/uni-load-more/uni-load-more.vue +0 -366
  216. package/ui-uni/uni-nav-bar/uni-nav-bar.vue +0 -244
  217. package/ui-uni/uni-notice-bar/uni-notice-bar.vue +0 -394
  218. package/ui-uni/uni-number-box/uni-number-box.vue +0 -224
  219. package/ui-uni/uni-pagination/uni-pagination.vue +0 -376
  220. package/ui-uni/uni-popup/uni-popup.vue +0 -412
  221. package/ui-uni/uni-popup-message/uni-popup-message.vue +0 -143
  222. package/ui-uni/uni-rate/uni-rate.vue +0 -357
  223. package/ui-uni/uni-row/uni-row.vue +0 -155
  224. package/ui-uni/uni-search-bar/uni-search-bar.vue +0 -262
  225. package/ui-uni/uni-steps/uni-steps.vue +0 -250
  226. package/ui-uni/uni-swiper-dot/uni-swiper-dot.vue +0 -205
  227. package/ui-uni/uni-table/uni-table.vue +0 -455
  228. package/ui-uni/uni-tag/uni-tag.vue +0 -283
  229. package/ui-uni/uni-tbody/uni-tbody.vue +0 -30
  230. package/ui-uni/uni-td/uni-td.vue +0 -88
  231. package/ui-uni/uni-th/uni-th.vue +0 -259
  232. package/ui-uni/uni-thead/uni-thead.vue +0 -114
  233. package/ui-uni/uni-title/uni-title.vue +0 -171
  234. package/ui-uni/uni-tr/uni-tr.vue +0 -156
  235. package/ui-uni/uni-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>