@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
@@ -1,614 +0,0 @@
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>