@tplc/wot 0.0.1

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 (328) hide show
  1. package/components/common/AbortablePromise.ts +36 -0
  2. package/components/common/abstracts/_config.scss +7 -0
  3. package/components/common/abstracts/_function.scss +76 -0
  4. package/components/common/abstracts/_mixin.scss +339 -0
  5. package/components/common/abstracts/variable.scss +1346 -0
  6. package/components/common/base64.ts +30 -0
  7. package/components/common/canvasHelper.ts +49 -0
  8. package/components/common/clickoutside.ts +34 -0
  9. package/components/common/dayjs.ts +157 -0
  10. package/components/common/event.ts +8 -0
  11. package/components/common/props.ts +51 -0
  12. package/components/common/util.ts +751 -0
  13. package/components/composables/useCell.ts +13 -0
  14. package/components/composables/useChildren.ts +122 -0
  15. package/components/composables/useCountDown.ts +138 -0
  16. package/components/composables/useLockScroll.ts +39 -0
  17. package/components/composables/useParent.ts +41 -0
  18. package/components/composables/usePopover.ts +193 -0
  19. package/components/composables/useQueue.ts +52 -0
  20. package/components/composables/useRaf.ts +37 -0
  21. package/components/composables/useTouch.ts +44 -0
  22. package/components/composables/useTranslate.ts +22 -0
  23. package/components/wd-action-sheet/index.scss +204 -0
  24. package/components/wd-action-sheet/types.ts +128 -0
  25. package/components/wd-action-sheet/wd-action-sheet.vue +174 -0
  26. package/components/wd-backtop/index.scss +25 -0
  27. package/components/wd-backtop/types.ts +37 -0
  28. package/components/wd-backtop/wd-backtop.vue +48 -0
  29. package/components/wd-badge/index.scss +59 -0
  30. package/components/wd-badge/types.ts +53 -0
  31. package/components/wd-badge/wd-badge.vue +69 -0
  32. package/components/wd-button/index.scss +340 -0
  33. package/components/wd-button/types.ts +112 -0
  34. package/components/wd-button/wd-button.vue +176 -0
  35. package/components/wd-calendar/index.scss +244 -0
  36. package/components/wd-calendar/types.ts +235 -0
  37. package/components/wd-calendar/wd-calendar.vue +456 -0
  38. package/components/wd-calendar-view/index.scss +9 -0
  39. package/components/wd-calendar-view/month/index.scss +151 -0
  40. package/components/wd-calendar-view/month/month.vue +391 -0
  41. package/components/wd-calendar-view/month/types.ts +19 -0
  42. package/components/wd-calendar-view/monthPanel/index.scss +89 -0
  43. package/components/wd-calendar-view/monthPanel/month-panel.vue +388 -0
  44. package/components/wd-calendar-view/monthPanel/types.ts +48 -0
  45. package/components/wd-calendar-view/types.ts +134 -0
  46. package/components/wd-calendar-view/utils.ts +451 -0
  47. package/components/wd-calendar-view/wd-calendar-view.vue +111 -0
  48. package/components/wd-calendar-view/year/index.scss +148 -0
  49. package/components/wd-calendar-view/year/types.ts +19 -0
  50. package/components/wd-calendar-view/year/year.vue +220 -0
  51. package/components/wd-calendar-view/yearPanel/index.scss +24 -0
  52. package/components/wd-calendar-view/yearPanel/types.ts +38 -0
  53. package/components/wd-calendar-view/yearPanel/year-panel.vue +140 -0
  54. package/components/wd-card/index.scss +70 -0
  55. package/components/wd-card/types.ts +30 -0
  56. package/components/wd-card/wd-card.vue +40 -0
  57. package/components/wd-cell/index.scss +189 -0
  58. package/components/wd-cell/types.ts +96 -0
  59. package/components/wd-cell/wd-cell.vue +135 -0
  60. package/components/wd-cell-group/index.scss +55 -0
  61. package/components/wd-cell-group/types.ts +41 -0
  62. package/components/wd-cell-group/wd-cell-group.vue +45 -0
  63. package/components/wd-checkbox/index.scss +285 -0
  64. package/components/wd-checkbox/types.ts +68 -0
  65. package/components/wd-checkbox/wd-checkbox.vue +185 -0
  66. package/components/wd-checkbox-group/index.scss +20 -0
  67. package/components/wd-checkbox-group/types.ts +59 -0
  68. package/components/wd-checkbox-group/wd-checkbox-group.vue +103 -0
  69. package/components/wd-circle/index.scss +18 -0
  70. package/components/wd-circle/types.ts +54 -0
  71. package/components/wd-circle/wd-circle.vue +318 -0
  72. package/components/wd-col/index.scss +19 -0
  73. package/components/wd-col/types.ts +15 -0
  74. package/components/wd-col/wd-col.vue +91 -0
  75. package/components/wd-col-picker/index.scss +241 -0
  76. package/components/wd-col-picker/types.ts +170 -0
  77. package/components/wd-col-picker/wd-col-picker.vue +550 -0
  78. package/components/wd-collapse/index.scss +55 -0
  79. package/components/wd-collapse/types.ts +63 -0
  80. package/components/wd-collapse/wd-collapse.vue +160 -0
  81. package/components/wd-collapse-item/index.scss +79 -0
  82. package/components/wd-collapse-item/types.ts +36 -0
  83. package/components/wd-collapse-item/wd-collapse-item.vue +182 -0
  84. package/components/wd-config-provider/types.ts +1023 -0
  85. package/components/wd-config-provider/wd-config-provider.vue +82 -0
  86. package/components/wd-count-down/index.scss +14 -0
  87. package/components/wd-count-down/types.ts +41 -0
  88. package/components/wd-count-down/utils.ts +52 -0
  89. package/components/wd-count-down/wd-count-down.vue +60 -0
  90. package/components/wd-count-to/index.scss +6 -0
  91. package/components/wd-count-to/types.ts +110 -0
  92. package/components/wd-count-to/wd-count-to.vue +134 -0
  93. package/components/wd-curtain/index.scss +80 -0
  94. package/components/wd-curtain/types.ts +45 -0
  95. package/components/wd-curtain/wd-curtain.vue +174 -0
  96. package/components/wd-datetime-picker/index.scss +243 -0
  97. package/components/wd-datetime-picker/types.ts +225 -0
  98. package/components/wd-datetime-picker/wd-datetime-picker.vue +827 -0
  99. package/components/wd-datetime-picker-view/index.scss +0 -0
  100. package/components/wd-datetime-picker-view/types.ts +137 -0
  101. package/components/wd-datetime-picker-view/wd-datetime-picker-view.vue +514 -0
  102. package/components/wd-divider/index.scss +32 -0
  103. package/components/wd-divider/types.ts +12 -0
  104. package/components/wd-divider/wd-divider.vue +29 -0
  105. package/components/wd-drop-menu/index.scss +89 -0
  106. package/components/wd-drop-menu/types.ts +38 -0
  107. package/components/wd-drop-menu/wd-drop-menu.vue +128 -0
  108. package/components/wd-drop-menu-item/index.scss +66 -0
  109. package/components/wd-drop-menu-item/types.ts +78 -0
  110. package/components/wd-drop-menu-item/wd-drop-menu-item.vue +230 -0
  111. package/components/wd-fab/index.scss +115 -0
  112. package/components/wd-fab/types.ts +61 -0
  113. package/components/wd-fab/wd-fab.vue +257 -0
  114. package/components/wd-form/index.scss +10 -0
  115. package/components/wd-form/types.ts +93 -0
  116. package/components/wd-form/wd-form.vue +185 -0
  117. package/components/wd-form-item/index.scss +17 -0
  118. package/components/wd-form-item/types.ts +22 -0
  119. package/components/wd-form-item/wd-form-item.vue +65 -0
  120. package/components/wd-gap/index.scss +9 -0
  121. package/components/wd-gap/types.ts +23 -0
  122. package/components/wd-gap/wd-gap.vue +39 -0
  123. package/components/wd-grid/index.scss +9 -0
  124. package/components/wd-grid/types.ts +54 -0
  125. package/components/wd-grid/wd-grid.vue +107 -0
  126. package/components/wd-grid-item/index.scss +137 -0
  127. package/components/wd-grid-item/types.ts +74 -0
  128. package/components/wd-grid-item/wd-grid-item.vue +181 -0
  129. package/components/wd-icon/index.scss +1222 -0
  130. package/components/wd-icon/types.ts +21 -0
  131. package/components/wd-icon/wd-icon.vue +53 -0
  132. package/components/wd-icon/wd-icons.ttf +0 -0
  133. package/components/wd-img/index.scss +19 -0
  134. package/components/wd-img/types.ts +53 -0
  135. package/components/wd-img/wd-img.vue +76 -0
  136. package/components/wd-img-cropper/index.scss +227 -0
  137. package/components/wd-img-cropper/types.ts +87 -0
  138. package/components/wd-img-cropper/wd-img-cropper.vue +659 -0
  139. package/components/wd-index-anchor/index.scss +34 -0
  140. package/components/wd-index-anchor/type.ts +9 -0
  141. package/components/wd-index-anchor/wd-index-anchor.vue +57 -0
  142. package/components/wd-index-bar/index.scss +39 -0
  143. package/components/wd-index-bar/type.ts +28 -0
  144. package/components/wd-index-bar/wd-index-bar.vue +158 -0
  145. package/components/wd-input/index.scss +326 -0
  146. package/components/wd-input/types.ts +182 -0
  147. package/components/wd-input/wd-input.vue +327 -0
  148. package/components/wd-input-number/index.scss +132 -0
  149. package/components/wd-input-number/types.ts +78 -0
  150. package/components/wd-input-number/wd-input-number.vue +221 -0
  151. package/components/wd-loading/index.scss +34 -0
  152. package/components/wd-loading/types.ts +31 -0
  153. package/components/wd-loading/wd-loading.vue +90 -0
  154. package/components/wd-loadmore/index.scss +39 -0
  155. package/components/wd-loadmore/types.ts +24 -0
  156. package/components/wd-loadmore/wd-loadmore.vue +53 -0
  157. package/components/wd-message-box/index.scss +121 -0
  158. package/components/wd-message-box/index.ts +95 -0
  159. package/components/wd-message-box/types.ts +116 -0
  160. package/components/wd-message-box/wd-message-box.vue +326 -0
  161. package/components/wd-navbar/index.scss +103 -0
  162. package/components/wd-navbar/types.ts +52 -0
  163. package/components/wd-navbar/wd-navbar.vue +142 -0
  164. package/components/wd-navbar-capsule/index.scss +65 -0
  165. package/components/wd-navbar-capsule/types.ts +0 -0
  166. package/components/wd-navbar-capsule/wd-navbar-capsule.vue +31 -0
  167. package/components/wd-notice-bar/index.scss +86 -0
  168. package/components/wd-notice-bar/types.ts +56 -0
  169. package/components/wd-notice-bar/wd-notice-bar.vue +223 -0
  170. package/components/wd-notify/index.scss +34 -0
  171. package/components/wd-notify/index.ts +59 -0
  172. package/components/wd-notify/types.ts +62 -0
  173. package/components/wd-notify/wd-notify.vue +83 -0
  174. package/components/wd-number-keyboard/index.scss +78 -0
  175. package/components/wd-number-keyboard/key/index.scss +79 -0
  176. package/components/wd-number-keyboard/key/index.vue +76 -0
  177. package/components/wd-number-keyboard/key/types.ts +11 -0
  178. package/components/wd-number-keyboard/types.ts +79 -0
  179. package/components/wd-number-keyboard/wd-number-keyboard.vue +173 -0
  180. package/components/wd-overlay/index.scss +17 -0
  181. package/components/wd-overlay/types.ts +25 -0
  182. package/components/wd-overlay/wd-overlay.vue +46 -0
  183. package/components/wd-pagination/index.scss +57 -0
  184. package/components/wd-pagination/types.ts +41 -0
  185. package/components/wd-pagination/wd-pagination.vue +121 -0
  186. package/components/wd-password-input/index.scss +123 -0
  187. package/components/wd-password-input/types.ts +48 -0
  188. package/components/wd-password-input/wd-password-input.vue +58 -0
  189. package/components/wd-picker/index.scss +216 -0
  190. package/components/wd-picker/types.ts +186 -0
  191. package/components/wd-picker/wd-picker.vue +409 -0
  192. package/components/wd-picker-view/index.scss +91 -0
  193. package/components/wd-picker-view/types.ts +162 -0
  194. package/components/wd-picker-view/wd-picker-view.vue +361 -0
  195. package/components/wd-popover/index.scss +123 -0
  196. package/components/wd-popover/types.ts +69 -0
  197. package/components/wd-popover/wd-popover.vue +216 -0
  198. package/components/wd-popup/index.scss +112 -0
  199. package/components/wd-popup/types.ts +68 -0
  200. package/components/wd-popup/wd-popup.vue +227 -0
  201. package/components/wd-progress/index.scss +62 -0
  202. package/components/wd-progress/types.ts +40 -0
  203. package/components/wd-progress/wd-progress.vue +201 -0
  204. package/components/wd-radio/index.scss +300 -0
  205. package/components/wd-radio/types.ts +42 -0
  206. package/components/wd-radio/wd-radio.vue +136 -0
  207. package/components/wd-radio-group/index.scss +23 -0
  208. package/components/wd-radio-group/types.ts +36 -0
  209. package/components/wd-radio-group/wd-radio-group.vue +54 -0
  210. package/components/wd-rate/index.scss +24 -0
  211. package/components/wd-rate/types.ts +91 -0
  212. package/components/wd-rate/wd-rate.vue +131 -0
  213. package/components/wd-resize/index.scss +26 -0
  214. package/components/wd-resize/types.ts +6 -0
  215. package/components/wd-resize/wd-resize.vue +155 -0
  216. package/components/wd-row/index.scss +10 -0
  217. package/components/wd-row/types.ts +16 -0
  218. package/components/wd-row/wd-row.vue +63 -0
  219. package/components/wd-search/index.scss +148 -0
  220. package/components/wd-search/types.ts +83 -0
  221. package/components/wd-search/wd-search.vue +237 -0
  222. package/components/wd-segmented/index.scss +97 -0
  223. package/components/wd-segmented/types.ts +68 -0
  224. package/components/wd-segmented/wd-segmented.vue +143 -0
  225. package/components/wd-select-picker/index.scss +177 -0
  226. package/components/wd-select-picker/types.ts +116 -0
  227. package/components/wd-select-picker/wd-select-picker.vue +486 -0
  228. package/components/wd-sidebar/index.scss +25 -0
  229. package/components/wd-sidebar/types.ts +28 -0
  230. package/components/wd-sidebar/wd-sidebar.vue +41 -0
  231. package/components/wd-sidebar-item/index.scss +93 -0
  232. package/components/wd-sidebar-item/types.ts +31 -0
  233. package/components/wd-sidebar-item/wd-sidebar-item.vue +114 -0
  234. package/components/wd-skeleton/index.scss +101 -0
  235. package/components/wd-skeleton/index.ts +1 -0
  236. package/components/wd-skeleton/types.ts +69 -0
  237. package/components/wd-skeleton/wd-skeleton.vue +135 -0
  238. package/components/wd-slider/index.scss +91 -0
  239. package/components/wd-slider/types.ts +104 -0
  240. package/components/wd-slider/wd-slider.vue +377 -0
  241. package/components/wd-sort-button/index.scss +86 -0
  242. package/components/wd-sort-button/types.ts +43 -0
  243. package/components/wd-sort-button/wd-sort-button.vue +76 -0
  244. package/components/wd-status-tip/index.scss +37 -0
  245. package/components/wd-status-tip/types.ts +59 -0
  246. package/components/wd-status-tip/wd-status-tip.vue +94 -0
  247. package/components/wd-step/index.scss +236 -0
  248. package/components/wd-step/types.ts +33 -0
  249. package/components/wd-step/wd-step.vue +151 -0
  250. package/components/wd-steps/index.scss +10 -0
  251. package/components/wd-steps/types.ts +59 -0
  252. package/components/wd-steps/wd-steps.vue +37 -0
  253. package/components/wd-sticky/index.scss +9 -0
  254. package/components/wd-sticky/types.ts +13 -0
  255. package/components/wd-sticky/wd-sticky.vue +190 -0
  256. package/components/wd-sticky-box/index.scss +6 -0
  257. package/components/wd-sticky-box/types.ts +20 -0
  258. package/components/wd-sticky-box/wd-sticky-box.vue +154 -0
  259. package/components/wd-swipe-action/index.scss +22 -0
  260. package/components/wd-swipe-action/types.ts +43 -0
  261. package/components/wd-swipe-action/wd-swipe-action.vue +307 -0
  262. package/components/wd-swiper/index.scss +23 -0
  263. package/components/wd-swiper/types.ts +189 -0
  264. package/components/wd-swiper/wd-swiper.vue +202 -0
  265. package/components/wd-swiper-nav/index.scss +153 -0
  266. package/components/wd-swiper-nav/types.ts +42 -0
  267. package/components/wd-swiper-nav/wd-swiper-nav.vue +37 -0
  268. package/components/wd-switch/index.scss +58 -0
  269. package/components/wd-switch/types.ts +56 -0
  270. package/components/wd-switch/wd-switch.vue +83 -0
  271. package/components/wd-tab/index.scss +8 -0
  272. package/components/wd-tab/types.ts +20 -0
  273. package/components/wd-tab/wd-tab.vue +100 -0
  274. package/components/wd-tabbar/index.scss +57 -0
  275. package/components/wd-tabbar/types.ts +88 -0
  276. package/components/wd-tabbar/wd-tabbar.vue +104 -0
  277. package/components/wd-tabbar-item/index.scss +52 -0
  278. package/components/wd-tabbar-item/types.ts +51 -0
  279. package/components/wd-tabbar-item/wd-tabbar-item.vue +101 -0
  280. package/components/wd-table/index.scss +132 -0
  281. package/components/wd-table/types.ts +69 -0
  282. package/components/wd-table/wd-table.vue +255 -0
  283. package/components/wd-table-col/index.scss +44 -0
  284. package/components/wd-table-col/types.ts +54 -0
  285. package/components/wd-table-col/wd-table-col.vue +149 -0
  286. package/components/wd-tabs/index.scss +280 -0
  287. package/components/wd-tabs/types.ts +71 -0
  288. package/components/wd-tabs/wd-tabs.vue +528 -0
  289. package/components/wd-tag/index.scss +115 -0
  290. package/components/wd-tag/types.ts +81 -0
  291. package/components/wd-tag/wd-tag.vue +154 -0
  292. package/components/wd-text/index.scss +34 -0
  293. package/components/wd-text/types.ts +98 -0
  294. package/components/wd-text/wd-text.vue +138 -0
  295. package/components/wd-textarea/index.scss +343 -0
  296. package/components/wd-textarea/types.ts +298 -0
  297. package/components/wd-textarea/wd-textarea.vue +303 -0
  298. package/components/wd-toast/index.scss +66 -0
  299. package/components/wd-toast/index.ts +109 -0
  300. package/components/wd-toast/types.ts +76 -0
  301. package/components/wd-toast/wd-toast.vue +212 -0
  302. package/components/wd-tooltip/index.scss +61 -0
  303. package/components/wd-tooltip/types.ts +102 -0
  304. package/components/wd-tooltip/wd-tooltip.vue +167 -0
  305. package/components/wd-transition/index.scss +91 -0
  306. package/components/wd-transition/types.ts +89 -0
  307. package/components/wd-transition/wd-transition.vue +221 -0
  308. package/components/wd-upload/index.scss +173 -0
  309. package/components/wd-upload/types.ts +378 -0
  310. package/components/wd-upload/utils.ts +152 -0
  311. package/components/wd-upload/wd-upload.vue +737 -0
  312. package/components/wd-video-preview/index.scss +34 -0
  313. package/components/wd-video-preview/types.ts +32 -0
  314. package/components/wd-video-preview/wd-video-preview.vue +76 -0
  315. package/components/wd-watermark/index.scss +18 -0
  316. package/components/wd-watermark/types.ts +82 -0
  317. package/components/wd-watermark/wd-watermark.vue +592 -0
  318. package/components/wot-design-uni/wot-design-uni.vue +14 -0
  319. package/global.d.ts +108 -0
  320. package/index.ts +30 -0
  321. package/locale/index.ts +41 -0
  322. package/locale/lang/en-US.ts +128 -0
  323. package/locale/lang/th-TH.ts +127 -0
  324. package/locale/lang/vi-VN.ts +89 -0
  325. package/locale/lang/zh-CN.ts +127 -0
  326. package/locale/lang/zh-HK.ts +84 -0
  327. package/locale/lang/zh-TW.ts +84 -0
  328. package/package.json +20 -0
@@ -0,0 +1,378 @@
1
+ import type { ComponentPublicInstance, ExtractPropTypes, PropType } from 'vue'
2
+ import {
3
+ baseProps,
4
+ makeArrayProp,
5
+ makeBooleanProp,
6
+ makeNumberProp,
7
+ makeStringProp,
8
+ } from '../common/props'
9
+ import type { LoadingType } from '../wd-loading/types'
10
+ import type { ImageMode } from '../wd-img/types'
11
+
12
+ export interface ChooseFileOption {
13
+ // 是否支持多选文件
14
+ multiple: boolean
15
+ // 所选的图片的尺寸
16
+ sizeType?: UploadSizeType[]
17
+ // 选择文件的来源
18
+ sourceType: UploadSourceType[]
19
+ // 最大允许上传个数
20
+ maxCount: number
21
+ // 接受文件类型
22
+ accept: UploadFileType
23
+ /**
24
+ * 是否压缩视频,当 accept 为 video 时生效。
25
+ */
26
+ compressed: boolean
27
+ /**
28
+ * 拍摄视频最长拍摄时间,当 accept 为 video | media 时生效,单位秒。
29
+ */
30
+ maxDuration: number
31
+ /**
32
+ * 使用前置或者后置相机,当 accept 为 video | media 时生效,可选值为:back|front。
33
+ */
34
+ camera: UploadCameraType
35
+ }
36
+
37
+ export type UploadFileItem = {
38
+ [key: string]: any
39
+ // 当前上传文件在列表中的唯一标识
40
+ uid: number
41
+ // 缩略图地址
42
+ thumb?: string
43
+ // 当前文件名称,仅h5支持
44
+ name?: string
45
+ // 上传状态。若自定义了status-key,应取对应字段
46
+ status?: UploadStatusType
47
+ // 文件大小
48
+ size?: number
49
+ // 上传图片/视频的本地地址
50
+ url: string
51
+ // 上传进度
52
+ percent?: number
53
+ // 后端返回的内容,可能是对象,也可能是字符串
54
+ response?: string | Record<string, any>
55
+ }
56
+
57
+ export interface ChooseFile {
58
+ path: string // 上传临时地址
59
+ size?: number // 上传大小
60
+ name?: string // 当前文件名称,仅h5支持
61
+ type: 'image' | 'video' | 'file' // 上传类型
62
+ duration?: number // 上传时间
63
+ thumb?: string // 缩略图地址
64
+ }
65
+
66
+ export type UploadSourceType = 'album' | 'camera'
67
+ export type UploadSizeType = 'original' | 'compressed'
68
+ export type UploadFileType = 'image' | 'video' | 'media' | 'all' | 'file'
69
+ export type UploadCameraType = 'front' | 'back'
70
+ export type UploadStatusType = 'pending' | 'loading' | 'success' | 'fail'
71
+
72
+ export type UploadBeforePreviewOption = {
73
+ index: number
74
+ imgList: string[]
75
+ resolve: (isPass: boolean) => void
76
+ }
77
+ export type UploadBeforePreview = (option: UploadBeforePreviewOption) => void
78
+
79
+ export type UploadOnPreviewFailOption = {
80
+ index: number
81
+ imgList: string[]
82
+ }
83
+ export type UploadOnPreviewFail = (option: UploadOnPreviewFailOption) => void
84
+
85
+ export type UploadBeforeRemoveOption = {
86
+ file: UploadFileItem
87
+ index: number
88
+ fileList: UploadFileItem[]
89
+ resolve: (isPass: boolean) => void
90
+ }
91
+ export type UploadBeforeRemove = (option: UploadBeforeRemoveOption) => void
92
+
93
+ export type UploadBeforeChooseOption = {
94
+ fileList: UploadFileItem[]
95
+ resolve: (isPass: boolean) => void
96
+ }
97
+ export type UploadBeforeChoose = (option: UploadBeforeChooseOption) => void
98
+
99
+ export type UploadBeforeUploadOption = {
100
+ files: Record<string, any>[]
101
+ fileList: UploadFileItem[]
102
+ resolve: (isPass: boolean) => void
103
+ }
104
+ export type UploadBeforeUpload = (options: UploadBeforeUploadOption) => void
105
+
106
+ export type UploadFormData = Record<string, any>
107
+
108
+ export type UploadBuildFormDataOption = {
109
+ file: UploadFileItem
110
+ formData: UploadFormData
111
+ resolve: (formData: Record<string, any>) => void
112
+ }
113
+ export type UploadBuildFormData = (options: UploadBuildFormDataOption) => void
114
+
115
+ export type UploadFile = Partial<UploadFileItem> & { url: string }
116
+
117
+ export type UploadMethod = (
118
+ uploadFile: UploadFileItem,
119
+ formData: UploadFormData,
120
+ options: {
121
+ action: string
122
+ header: Record<string, any>
123
+ name: string
124
+ fileName: string
125
+ fileType: 'image' | 'video' | 'audio'
126
+ statusCode: number
127
+ onSuccess: (
128
+ res: UniApp.UploadFileSuccessCallbackResult,
129
+ file: UploadFileItem,
130
+ formData: UploadFormData,
131
+ ) => void
132
+ onError: (
133
+ res: UniApp.GeneralCallbackResult,
134
+ file: UploadFileItem,
135
+ formData: UploadFormData,
136
+ ) => void
137
+ onProgress: (res: UniApp.OnProgressUpdateResult, file: UploadFileItem) => void
138
+ },
139
+ ) => void
140
+
141
+ export const uploadProps = {
142
+ ...baseProps,
143
+ /**
144
+ * 上传的文件列表,例如:[{name:'food.jpg',url:'https://xxx.cdn.com/xxx.jpg'}]
145
+ * 类型:array
146
+ * 默认值:[]
147
+ */
148
+ fileList: makeArrayProp<UploadFile>(),
149
+ /**
150
+ * 必选参数,上传的地址
151
+ * 类型:string
152
+ * 默认值:''
153
+ */
154
+ action: makeStringProp(''),
155
+ /**
156
+ * 设置上传的请求头部
157
+ * 类型:object
158
+ * 默认值:{}
159
+ */
160
+ header: { type: Object as PropType<Record<string, any>>, default: () => {} },
161
+ /**
162
+ * 是否支持多选文件
163
+ * 类型:boolean
164
+ * 默认值:false
165
+ */
166
+ multiple: makeBooleanProp(false),
167
+ /**
168
+ * 是否禁用
169
+ * 类型:boolean
170
+ * 默认值:false
171
+ */
172
+ disabled: makeBooleanProp(false),
173
+ /**
174
+ * 最大允许上传个数
175
+ * 类型:number
176
+ * 默认值:无
177
+ */
178
+ limit: Number,
179
+ /**
180
+ * 限制上传个数的情况下,是否展示当前上传的个数
181
+ * 类型:boolean
182
+ * 默认值:true
183
+ */
184
+ showLimitNum: makeBooleanProp(true),
185
+ /**
186
+ * 文件大小限制,单位为byte
187
+ * 类型:number
188
+ * 默认值:Number.MAX_VALUE
189
+ */
190
+ maxSize: makeNumberProp(Number.MAX_VALUE),
191
+ /**
192
+ * 选择图片的来源,chooseImage接口详细参数,查看官方手册
193
+ * 类型:array
194
+ * 默认值:['album','camera']
195
+ */
196
+ sourceType: {
197
+ type: Array as PropType<UploadSourceType[]>,
198
+ default: () => ['album', 'camera'],
199
+ },
200
+ /**
201
+ * 所选的图片的尺寸,chooseImage接口详细参数,查看官方手册
202
+ * 类型:array
203
+ * 默认值:['original','compressed']
204
+ */
205
+ sizeType: {
206
+ type: Array as PropType<UploadSizeType[]>,
207
+ // #ifndef MP-DINGTALK
208
+ default: () => ['original', 'compressed'],
209
+ // #endif
210
+ },
211
+ /**
212
+ * 文件对应的key,开发者在服务端可以通过这个key获取文件的二进制内容,uploadFile接口详细参数,查看官方手册
213
+ * 类型:string
214
+ * 默认值:'file'
215
+ */
216
+ name: makeStringProp('file'),
217
+ /**
218
+ * HTTP请求中其他额外的formdata,uploadFile接口详细参数,查看官方手册
219
+ * 类型:object
220
+ * 默认值:{}
221
+ */
222
+ formData: { type: Object as PropType<UploadFormData>, default: () => {} },
223
+ /**
224
+ * 预览失败执行操作
225
+ * 类型:function({index,imgList})
226
+ * 默认值:-
227
+ */
228
+ onPreviewFail: Function as PropType<UploadOnPreviewFail>,
229
+ /**
230
+ * 上传文件之前的钩子,参数为上传的文件和文件列表,若返回false或者返回Promise且被reject,则停止上传。
231
+ * 类型:function({files,fileList,resolve})
232
+ * 默认值:-
233
+ */
234
+ beforeUpload: Function as PropType<UploadBeforeUpload>,
235
+ /**
236
+ * 选择图片之前的钩子,参数为文件列表,若返回false或者返回Promise且被reject,则停止上传。
237
+ * 类型:function({fileList,resolve})
238
+ * 默认值:-
239
+ */
240
+ beforeChoose: Function as PropType<UploadBeforeChoose>,
241
+ /**
242
+ * 删除文件之前的钩子,参数为要删除的文件和文件列表,若返回false或者返回Promise且被reject,则停止上传。
243
+ * 类型:function({file,fileList,resolve})
244
+ * 默认值:-
245
+ */
246
+ beforeRemove: Function as PropType<UploadBeforeRemove>,
247
+ /**
248
+ * 图片预览前的钩子,参数为预览的图片下标和图片列表,若返回false或者返回Promise且被reject,则停止上传。
249
+ * 类型:function({index,imgList,resolve})
250
+ * 默认值:-
251
+ */
252
+ beforePreview: Function as PropType<UploadBeforePreview>,
253
+ /**
254
+ * 构建上传formData的钩子,参数为上传的文件、待处理的formData,返回值为处理后的formData,若返回false或者返回Promise且被reject,则停止上传。
255
+ * 类型:function({file,formData,resolve})
256
+ * 默认值:-
257
+ * 最低版本:0.1.61
258
+ */
259
+ buildFormData: Function as PropType<UploadBuildFormData>,
260
+ /**
261
+ * 加载中图标类型
262
+ * 类型:string
263
+ * 默认值:'ring'
264
+ */
265
+ loadingType: makeStringProp<LoadingType>('ring'),
266
+ /**
267
+ * 加载中图标颜色
268
+ * 类型:string
269
+ * 默认值:'#ffffff'
270
+ */
271
+ loadingColor: makeStringProp('#ffffff'),
272
+ /**
273
+ * 文件类型,可选值:'image' | 'video' | 'media' | 'all' | 'file'
274
+ * 默认值:image
275
+ * 描述:'media'表示同时支持'image'和'video','file'表示支持除'image'和'video'外的所有文件类型,'all'标识支持全部类型文件
276
+ * 'media'和'file'仅微信支持,'all'仅微信和H5支持
277
+ */
278
+ accept: makeStringProp<UploadFileType>('image'),
279
+ /**
280
+ * file 数据结构中,status 对应的 key
281
+ * 类型:string
282
+ * 默认值:'status'
283
+ */
284
+ statusKey: makeStringProp('status'),
285
+ /**
286
+ * 加载中图标尺寸
287
+ * 类型:string
288
+ * 默认值:'24px'
289
+ */
290
+ loadingSize: makeStringProp('24px'),
291
+ /**
292
+ * 是否压缩视频,当 accept 为 video 时生效。
293
+ * 类型:boolean
294
+ * 默认值:true
295
+ */
296
+ compressed: makeBooleanProp(true),
297
+ /**
298
+ * 拍摄视频最长拍摄时间,当 accept 为 video | media 时生效,单位秒。
299
+ * 类型:number
300
+ * 默认值:60
301
+ */
302
+ maxDuration: makeNumberProp(60),
303
+ /**
304
+ * 使用前置或者后置相机,当 accept 为 video | media 时生效,可选值为:back|front。
305
+ * 类型:UploadCameraType
306
+ * 默认值:'back'
307
+ */
308
+ camera: makeStringProp<UploadCameraType>('back'),
309
+ /**
310
+ * 预览图片的mode属性
311
+ */
312
+ imageMode: makeStringProp<ImageMode>('aspectFit'),
313
+ /**
314
+ * 接口响应的成功状态(statusCode)值
315
+ */
316
+ successStatus: makeNumberProp(200),
317
+ /**
318
+ * 自定义上传按钮样式
319
+ * 类型:string
320
+ */
321
+ customEvokeClass: makeStringProp(''),
322
+ /**
323
+ * 自定义预览图片列表样式
324
+ * 类型:string
325
+ */
326
+ customPreviewClass: makeStringProp(''),
327
+ /**
328
+ * 是否选择文件后自动上传
329
+ * 类型:boolean
330
+ */
331
+ autoUpload: makeBooleanProp(true),
332
+ /**
333
+ * 自定义上传文件的请求方法
334
+ * 类型:UploadMethod
335
+ * 默认值:-
336
+ */
337
+ uploadMethod: Function as PropType<UploadMethod>,
338
+ }
339
+
340
+ export type UploadProps = ExtractPropTypes<typeof uploadProps>
341
+
342
+ export type UploadExpose = {
343
+ /**
344
+ * 手动触发上传
345
+ */
346
+ submit: () => void
347
+ }
348
+
349
+ export type UploadErrorEvent = {
350
+ error: any
351
+ file: UploadFileItem
352
+ formData: UploadFormData
353
+ }
354
+
355
+ export type UploadChangeEvent = {
356
+ fileList: UploadFileItem[]
357
+ }
358
+
359
+ export type UploadSuccessEvent = {
360
+ file: UploadFileItem
361
+ fileList: UploadFileItem[]
362
+ formData: UploadFormData
363
+ }
364
+
365
+ export type UploadProgressEvent = {
366
+ response: UniApp.OnProgressUpdateResult
367
+ file: UploadFileItem
368
+ }
369
+
370
+ export type UploadOversizeEvent = {
371
+ file: ChooseFile
372
+ }
373
+
374
+ export type UploadRemoveEvent = {
375
+ file: UploadFileItem
376
+ }
377
+
378
+ export type UploadInstance = ComponentPublicInstance<UploadProps, UploadExpose>
@@ -0,0 +1,152 @@
1
+ /*
2
+ * @Author: weisheng
3
+ * @Date: 2024-03-18 22:36:44
4
+ * @LastEditTime: 2024-07-07 18:59:40
5
+ * @LastEditors: weisheng
6
+ * @Description:
7
+ * @FilePath: /wot-design-uni/src/uni_modules/wot-design-uni/components/wd-upload/utils.ts
8
+ * 记得注释
9
+ */
10
+ import { isArray, isDef } from '../common/util'
11
+ import type { ChooseFile, ChooseFileOption } from './types'
12
+
13
+ function formatImage(res: UniApp.ChooseImageSuccessCallbackResult): ChooseFile[] {
14
+ // #ifdef MP-DINGTALK
15
+ // 钉钉文件在files中
16
+ res.tempFiles = isDef((res as any).files) ? (res as any).files : res.tempFiles
17
+ // #endif
18
+ if (isArray(res.tempFiles)) {
19
+ const result: ChooseFile[] = []
20
+ res.tempFiles.forEach(async (item: any) => {
21
+ result.push({
22
+ path: item.path || '',
23
+ name: item.name || '',
24
+ size: item.size,
25
+ type: 'image',
26
+ thumb: item.path || '',
27
+ })
28
+ })
29
+ return result
30
+ } else {
31
+ return [
32
+ {
33
+ path: (res.tempFiles as any).path || '',
34
+ name: (res.tempFiles as any).name || '',
35
+ size: (res.tempFiles as any).size,
36
+ type: 'image',
37
+ thumb: (res.tempFiles as any).path || '',
38
+ },
39
+ ]
40
+ }
41
+ }
42
+
43
+ function formatVideo(res: UniApp.ChooseVideoSuccess): ChooseFile[] {
44
+ return [
45
+ {
46
+ path: res.tempFilePath || (res as any).filePath || '',
47
+ name: res.name || '',
48
+ size: res.size,
49
+ type: 'video',
50
+ thumb: (res as any).thumbTempFilePath || '',
51
+ duration: res.duration,
52
+ },
53
+ ]
54
+ }
55
+
56
+ function formatMedia(res: UniApp.ChooseMediaSuccessCallbackResult): ChooseFile[] {
57
+ return res.tempFiles.map((item) => ({
58
+ type: item.fileType,
59
+ path: item.tempFilePath,
60
+ thumb: item.fileType === 'video' ? item.thumbTempFilePath : item.tempFilePath,
61
+ size: item.size,
62
+ duration: item.duration,
63
+ }))
64
+ }
65
+ export function chooseFile({
66
+ multiple,
67
+ sizeType,
68
+ sourceType,
69
+ maxCount,
70
+ accept,
71
+ compressed,
72
+ maxDuration,
73
+ camera,
74
+ }: ChooseFileOption): Promise<ChooseFile[]> {
75
+ return new Promise((resolve, reject) => {
76
+ switch (accept) {
77
+ case 'image':
78
+ uni.chooseImage({
79
+ count: multiple ? Math.min(maxCount, 9) : 1, // 最多可以选择的数量,如果不支持多选则数量为1
80
+ sizeType,
81
+ sourceType,
82
+ success: (res) => resolve(formatImage(res)),
83
+ fail: (error) => {
84
+ reject(error)
85
+ },
86
+ })
87
+ break
88
+ case 'video':
89
+ uni.chooseVideo({
90
+ sourceType,
91
+ compressed,
92
+ maxDuration,
93
+ camera,
94
+ success: (res) => {
95
+ resolve(formatVideo(res))
96
+ },
97
+ fail: reject,
98
+ })
99
+
100
+ break
101
+ // #ifdef MP-WEIXIN
102
+ case 'media':
103
+ uni.chooseMedia({
104
+ count: multiple ? Math.min(maxCount, 9) : 1,
105
+ sourceType,
106
+ sizeType,
107
+ camera,
108
+ maxDuration,
109
+ success: (res) => resolve(formatMedia(res)),
110
+ fail: reject,
111
+ })
112
+ break
113
+ case 'file':
114
+ uni.chooseMessageFile({
115
+ count: multiple ? Math.min(maxCount, 100) : 1,
116
+ type: accept,
117
+ success: (res) => resolve(res.tempFiles),
118
+ fail: reject,
119
+ })
120
+ break
121
+ // #endif
122
+ case 'all':
123
+ // #ifdef MP-WEIXIN
124
+ uni.chooseMessageFile({
125
+ count: multiple ? Math.min(maxCount, 100) : 1,
126
+ type: accept,
127
+ success: (res) => resolve(res.tempFiles),
128
+ fail: reject,
129
+ })
130
+ // #endif
131
+ // #ifdef H5
132
+ uni.chooseFile({
133
+ count: multiple ? Math.min(maxCount, 100) : 1,
134
+ type: accept,
135
+ success: (res) => resolve(res.tempFiles as ChooseFile[]),
136
+ fail: reject,
137
+ })
138
+ // #endif
139
+ break
140
+ default:
141
+ // 默认选择图片
142
+ uni.chooseImage({
143
+ count: multiple ? Math.min(maxCount, 9) : 1, // 最多可以选择的数量,如果不支持多选则数量为1
144
+ sizeType,
145
+ sourceType,
146
+ success: (res) => resolve(formatImage(res)),
147
+ fail: reject,
148
+ })
149
+ break
150
+ }
151
+ })
152
+ }