@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,550 @@
1
+ <template>
2
+ <view
3
+ :class="`wd-col-picker ${cell.border.value ? 'is-border' : ''} ${customClass}`"
4
+ :style="customStyle"
5
+ >
6
+ <view class="wd-col-picker__field" @click="showPicker">
7
+ <slot v-if="useDefaultSlot"></slot>
8
+ <view
9
+ v-else
10
+ :class="`wd-col-picker__cell ${disabled && 'is-disabled'} ${readonly && 'is-readonly'} ${alignRight && 'is-align-right'} ${
11
+ error && 'is-error'
12
+ } ${size && 'is-' + size}`"
13
+ >
14
+ <view
15
+ v-if="label || useLabelSlot"
16
+ :class="`wd-col-picker__label ${isRequired && 'is-required'} ${customLabelClass}`"
17
+ :style="labelWidth ? 'min-width:' + labelWidth + ';max-width:' + labelWidth + ';' : ''"
18
+ >
19
+ <block v-if="label">{{ label }}</block>
20
+ <slot v-else name="label"></slot>
21
+ </view>
22
+ <view class="wd-col-picker__body">
23
+ <view class="wd-col-picker__value-wraper">
24
+ <view
25
+ :class="`wd-col-picker__value ${ellipsis && 'is-ellipsis'} ${customValueClass} ${showValue ? '' : 'wd-col-picker__value--placeholder'}`"
26
+ >
27
+ {{ showValue || placeholder || translate('placeholder') }}
28
+ </view>
29
+ <wd-icon
30
+ v-if="!disabled && !readonly"
31
+ custom-class="wd-col-picker__arrow"
32
+ name="arrow-right"
33
+ />
34
+ </view>
35
+ <view v-if="errorMessage" class="wd-col-picker__error-message">{{ errorMessage }}</view>
36
+ </view>
37
+ </view>
38
+ </view>
39
+ <wd-action-sheet
40
+ v-model="pickerShow"
41
+ :duration="250"
42
+ :title="title || translate('title')"
43
+ :close-on-click-modal="closeOnClickModal"
44
+ :z-index="zIndex"
45
+ :safe-area-inset-bottom="safeAreaInsetBottom"
46
+ @open="handlePickerOpend"
47
+ @close="handlePickerClose"
48
+ >
49
+ <view class="wd-col-picker__selected">
50
+ <scroll-view :scroll-x="true" scroll-with-animation :scroll-left="scrollLeft">
51
+ <view class="wd-col-picker__selected-container">
52
+ <view
53
+ v-for="(_, colIndex) in selectList"
54
+ :key="colIndex"
55
+ :class="`wd-col-picker__selected-item ${colIndex === currentCol && 'is-selected'}`"
56
+ @click="handleColClick(colIndex)"
57
+ >
58
+ {{ selectShowList[colIndex] || translate('select') }}
59
+ </view>
60
+ <view class="wd-col-picker__selected-line" :style="state.lineStyle"></view>
61
+ </view>
62
+ </scroll-view>
63
+ </view>
64
+ <view class="wd-col-picker__list-container">
65
+ <view
66
+ v-for="(col, colIndex) in selectList"
67
+ :key="colIndex"
68
+ class="wd-col-picker__list"
69
+ :style="colIndex === currentCol ? 'display: block;' : 'display: none;'"
70
+ >
71
+ <view
72
+ v-for="(item, index) in col"
73
+ :key="index"
74
+ :class="`wd-col-picker__list-item ${pickerColSelected[colIndex] && item[valueKey] === pickerColSelected[colIndex] && 'is-selected'} ${
75
+ item.disabled && 'is-disabled'
76
+ }`"
77
+ @click="chooseItem(colIndex, index)"
78
+ >
79
+ <view>
80
+ <view class="wd-col-picker__list-item-label">{{ item[labelKey] }}</view>
81
+ <view v-if="item[tipKey]" class="wd-col-picker__list-item-tip">
82
+ {{ item[tipKey] }}
83
+ </view>
84
+ </view>
85
+ <wd-icon custom-class="wd-col-picker__checked" name="check"></wd-icon>
86
+ </view>
87
+ <view v-if="loading" class="wd-col-picker__loading">
88
+ <wd-loading :color="loadingColor" />
89
+ </view>
90
+ </view>
91
+ </view>
92
+ </wd-action-sheet>
93
+ </view>
94
+ </template>
95
+ <script lang="ts">
96
+ export default {
97
+ name: 'wd-col-picker',
98
+ options: {
99
+ addGlobalClass: true,
100
+ virtualHost: true,
101
+ styleIsolation: 'shared',
102
+ },
103
+ }
104
+ </script>
105
+
106
+ <script lang="ts" setup>
107
+ import {
108
+ computed,
109
+ getCurrentInstance,
110
+ onMounted,
111
+ ref,
112
+ watch,
113
+ type CSSProperties,
114
+ reactive,
115
+ nextTick,
116
+ } from 'vue'
117
+ import {
118
+ addUnit,
119
+ debounce,
120
+ getRect,
121
+ isArray,
122
+ isBoolean,
123
+ isDef,
124
+ isFunction,
125
+ objToStyle,
126
+ } from '../common/util'
127
+ import { useCell } from '../composables/useCell'
128
+ import { FORM_KEY, type FormItemRule } from '../wd-form/types'
129
+ import { useParent } from '../composables/useParent'
130
+ import { useTranslate } from '../composables/useTranslate'
131
+ import { colPickerProps, type ColPickerExpose } from './types'
132
+
133
+ const { translate } = useTranslate('col-picker')
134
+
135
+ const $container = '.wd-col-picker__selected-container'
136
+ const $item = '.wd-col-picker__selected-item'
137
+
138
+ const props = defineProps(colPickerProps)
139
+ const emit = defineEmits(['close', 'update:modelValue', 'confirm'])
140
+
141
+ const pickerShow = ref<boolean>(false)
142
+ const currentCol = ref<number>(0)
143
+ const selectList = ref<Record<string, any>[][]>([])
144
+ const pickerColSelected = ref<(string | number)[]>([])
145
+ const selectShowList = ref<Record<string, any>[]>([])
146
+ const loading = ref<boolean>(false)
147
+ const isChange = ref<boolean>(false)
148
+ const lastSelectList = ref<Record<string, any>[][]>([])
149
+ const lastPickerColSelected = ref<(string | number)[]>([])
150
+ const scrollLeft = ref<number>(0)
151
+ const inited = ref<boolean>(false)
152
+ const isCompleting = ref<boolean>(false)
153
+
154
+ const state = reactive({
155
+ lineStyle: 'display:none;', // 激活项边框线样式
156
+ })
157
+
158
+ const { proxy } = getCurrentInstance() as any
159
+
160
+ const cell = useCell()
161
+
162
+ const updateLineAndScroll = debounce(function (animation = true) {
163
+ setLineStyle(animation)
164
+ lineScrollIntoView()
165
+ }, 50)
166
+
167
+ const showValue = computed(() => {
168
+ const selectedItems = (props.modelValue || []).map((item, colIndex) => {
169
+ return getSelectedItem(item, colIndex, selectList.value)
170
+ })
171
+
172
+ if (props.displayFormat) {
173
+ return props.displayFormat(selectedItems)
174
+ } else {
175
+ return selectedItems
176
+ .map((item) => {
177
+ return item[props.labelKey]
178
+ })
179
+ .join('')
180
+ }
181
+ })
182
+
183
+ watch(
184
+ () => props.modelValue,
185
+ (newValue) => {
186
+ if (newValue === pickerColSelected.value) return
187
+ pickerColSelected.value = newValue
188
+ newValue.map((item, colIndex) => {
189
+ return getSelectedItem(item, colIndex, selectList.value)[props.labelKey]
190
+ })
191
+ handleAutoComplete()
192
+ },
193
+ {
194
+ deep: true,
195
+ immediate: true,
196
+ },
197
+ )
198
+
199
+ watch(
200
+ () => props.columns,
201
+ (newValue, oldValue) => {
202
+ if (newValue.length && !isArray(newValue[0])) {
203
+ console.error(
204
+ '[wot design] error(wd-col-picker): the columns props of wd-col-picker should be a two-dimensional array',
205
+ )
206
+ return
207
+ }
208
+ if (newValue.length === 0 && !oldValue) return
209
+
210
+ const newSelectedList = newValue.slice(0)
211
+
212
+ selectList.value = newSelectedList
213
+
214
+ selectShowList.value = pickerColSelected.value.map((item, colIndex) => {
215
+ return getSelectedItem(item, colIndex, newSelectedList)[props.labelKey]
216
+ })
217
+ lastSelectList.value = newSelectedList
218
+
219
+ if (newSelectedList.length > 0) {
220
+ currentCol.value = newSelectedList.length - 1
221
+ }
222
+ },
223
+ {
224
+ deep: true,
225
+ immediate: true,
226
+ },
227
+ )
228
+
229
+ watch(
230
+ () => props.columnChange,
231
+ (fn) => {
232
+ if (fn && !isFunction(fn)) {
233
+ console.error('The type of columnChange must be Function')
234
+ }
235
+ },
236
+ {
237
+ deep: true,
238
+ immediate: true,
239
+ },
240
+ )
241
+
242
+ watch(
243
+ () => props.displayFormat,
244
+ (fn) => {
245
+ if (fn && !isFunction(fn)) {
246
+ console.error('The type of displayFormat must be Function')
247
+ }
248
+ },
249
+ {
250
+ deep: true,
251
+ immediate: true,
252
+ },
253
+ )
254
+
255
+ watch(
256
+ () => props.beforeConfirm,
257
+ (fn) => {
258
+ if (fn && !isFunction(fn)) {
259
+ console.error('The type of beforeConfirm must be Function')
260
+ }
261
+ },
262
+ {
263
+ deep: true,
264
+ immediate: true,
265
+ },
266
+ )
267
+
268
+ const { parent: form } = useParent(FORM_KEY)
269
+
270
+ // 表单校验错误信息
271
+ const errorMessage = computed(() => {
272
+ if (form && props.prop && form.errorMessages && form.errorMessages[props.prop]) {
273
+ return form.errorMessages[props.prop]
274
+ } else {
275
+ return ''
276
+ }
277
+ })
278
+
279
+ // 是否展示必填
280
+ const isRequired = computed(() => {
281
+ let formRequired = false
282
+ if (form && form.props.rules) {
283
+ const rules = form.props.rules
284
+ for (const key in rules) {
285
+ if (
286
+ Object.prototype.hasOwnProperty.call(rules, key) &&
287
+ key === props.prop &&
288
+ Array.isArray(rules[key])
289
+ ) {
290
+ formRequired = rules[key].some((rule: FormItemRule) => rule.required)
291
+ }
292
+ }
293
+ }
294
+ return props.required || props.rules.some((rule) => rule.required) || formRequired
295
+ })
296
+
297
+ onMounted(() => {
298
+ inited.value = true
299
+ })
300
+
301
+ // 打开弹框
302
+ function open() {
303
+ showPicker()
304
+ }
305
+ // 关闭弹框
306
+ function close() {
307
+ handlePickerClose()
308
+ }
309
+ function handlePickerOpend() {
310
+ updateLineAndScroll(false)
311
+ }
312
+
313
+ function handlePickerClose() {
314
+ pickerShow.value = false
315
+ // 如果目前用户正在选择,需要在popup关闭时将数据重置回上次数据,popup 关闭时间 250
316
+ if (isChange.value) {
317
+ setTimeout(() => {
318
+ selectList.value = lastSelectList.value.slice(0)
319
+ pickerColSelected.value = lastPickerColSelected.value.slice(0)
320
+ selectShowList.value = lastPickerColSelected.value.map((item, colIndex) => {
321
+ return getSelectedItem(item, colIndex, lastSelectList.value)[props.labelKey]
322
+ })
323
+ currentCol.value = lastSelectList.value.length - 1
324
+ isChange.value = false
325
+ }, 250)
326
+ }
327
+ emit('close')
328
+ }
329
+ function showPicker() {
330
+ const { disabled, readonly } = props
331
+
332
+ if (disabled || readonly) return
333
+ pickerShow.value = true
334
+ lastPickerColSelected.value = pickerColSelected.value.slice(0)
335
+ lastSelectList.value = selectList.value.slice(0)
336
+ }
337
+
338
+ function getSelectedItem(
339
+ value: string | number,
340
+ colIndex: number,
341
+ selectList: Record<string, any>[][],
342
+ ) {
343
+ const { valueKey, labelKey } = props
344
+ if (selectList[colIndex]) {
345
+ const selecteds = selectList[colIndex].filter((item) => {
346
+ return item[valueKey] === value
347
+ })
348
+
349
+ if (selecteds.length > 0) {
350
+ return selecteds[0]
351
+ }
352
+ }
353
+
354
+ return {
355
+ [valueKey]: value,
356
+ [labelKey]: '',
357
+ }
358
+ }
359
+
360
+ function chooseItem(colIndex: number, index: number) {
361
+ const item = selectList.value[colIndex][index]
362
+ if (item.disabled) return
363
+
364
+ const newPickerColSelected = pickerColSelected.value.slice(0, colIndex)
365
+ newPickerColSelected.push(item[props.valueKey])
366
+ isChange.value = true
367
+ pickerColSelected.value = newPickerColSelected
368
+ selectList.value = selectList.value.slice(0, colIndex + 1)
369
+ selectShowList.value = newPickerColSelected.map((item, colIndex) => {
370
+ return getSelectedItem(item, colIndex, selectList.value)[props.labelKey]
371
+ })
372
+
373
+ if (selectShowList.value[colIndex] && colIndex === currentCol.value) {
374
+ updateLineAndScroll(true)
375
+ }
376
+
377
+ handleColChange(colIndex, item, index)
378
+ }
379
+
380
+ function handleColChange(
381
+ colIndex: number,
382
+ item: Record<string, any>,
383
+ index: number,
384
+ callback?: () => void,
385
+ ) {
386
+ loading.value = true
387
+ const { columnChange, beforeConfirm } = props
388
+ columnChange &&
389
+ columnChange({
390
+ selectedItem: item,
391
+ index: colIndex,
392
+ rowIndex: index,
393
+ resolve: (nextColumn: Record<string, any>[]) => {
394
+ if (!isArray(nextColumn)) {
395
+ console.error(
396
+ '[wot design] error(wd-col-picker): the data of each column of wd-col-picker should be an array',
397
+ )
398
+ return
399
+ }
400
+
401
+ const newSelectList = selectList.value.slice(0)
402
+ newSelectList[colIndex + 1] = nextColumn
403
+
404
+ selectList.value = newSelectList
405
+ loading.value = false
406
+ currentCol.value = colIndex + 1
407
+
408
+ updateLineAndScroll(true)
409
+ if (typeof callback === 'function') {
410
+ isCompleting.value = false
411
+ selectShowList.value = pickerColSelected.value.map((item, colIndex) => {
412
+ return getSelectedItem(item, colIndex, selectList.value)[props.labelKey]
413
+ })
414
+ callback()
415
+ }
416
+ },
417
+ finish: (isOk?: boolean) => {
418
+ // 每设置展示数据回显
419
+ if (typeof callback === 'function') {
420
+ loading.value = false
421
+ isCompleting.value = false
422
+ return
423
+ }
424
+ if (isBoolean(isOk) && !isOk) {
425
+ loading.value = false
426
+ return
427
+ }
428
+
429
+ if (beforeConfirm) {
430
+ beforeConfirm(
431
+ pickerColSelected.value,
432
+ pickerColSelected.value.map((item, colIndex) => {
433
+ return getSelectedItem(item, colIndex, selectList.value)
434
+ }),
435
+ (isPass: boolean) => {
436
+ if (isPass) {
437
+ onConfirm()
438
+ } else {
439
+ loading.value = false
440
+ }
441
+ },
442
+ )
443
+ } else {
444
+ onConfirm()
445
+ }
446
+ },
447
+ })
448
+ }
449
+ function onConfirm() {
450
+ isChange.value = false
451
+ loading.value = false
452
+ pickerShow.value = false
453
+
454
+ emit('update:modelValue', pickerColSelected.value)
455
+ emit('confirm', {
456
+ value: pickerColSelected.value,
457
+ selectedItems: pickerColSelected.value.map((item, colIndex) => {
458
+ return getSelectedItem(item, colIndex, selectList.value)
459
+ }),
460
+ })
461
+ }
462
+ function handleColClick(index: number) {
463
+ isChange.value = true
464
+ currentCol.value = index
465
+ updateLineAndScroll(true)
466
+ }
467
+ /**
468
+ * @description 更新navBar underline的偏移量
469
+ * @param {Boolean} animation 是否伴随动画
470
+ */
471
+ function setLineStyle(animation: boolean = true) {
472
+ if (!inited.value) return
473
+ const { lineWidth, lineHeight } = props
474
+ getRect($item, true, proxy).then((rects) => {
475
+ const lineStyle: CSSProperties = {}
476
+ if (isDef(lineWidth)) {
477
+ lineStyle.width = addUnit(lineWidth)
478
+ }
479
+ if (isDef(lineHeight)) {
480
+ lineStyle.height = addUnit(lineHeight)
481
+ lineStyle.borderRadius = `calc(${addUnit(lineHeight)} / 2)`
482
+ }
483
+ const rect = rects[currentCol.value]
484
+ const left =
485
+ rects.slice(0, currentCol.value).reduce((prev, curr) => prev + Number(curr.width), 0) +
486
+ Number(rect.width) / 2
487
+ lineStyle.transform = `translateX(${left}px) translateX(-50%)`
488
+
489
+ if (animation) {
490
+ lineStyle.transition = 'width 300ms ease, transform 300ms ease'
491
+ }
492
+
493
+ state.lineStyle = objToStyle(lineStyle)
494
+ })
495
+ }
496
+ /**
497
+ * @description scroll-view滑动到active的tab_nav
498
+ */
499
+ function lineScrollIntoView() {
500
+ if (!inited.value) return
501
+ Promise.all([getRect($item, true, proxy), getRect($container, false, proxy)]).then(
502
+ ([navItemsRects, navRect]) => {
503
+ if (!isArray(navItemsRects) || navItemsRects.length === 0) return
504
+ // 选中元素
505
+ const selectItem = navItemsRects[currentCol.value]
506
+ // 选中元素之前的节点的宽度总和
507
+ const offsetLeft = navItemsRects
508
+ .slice(0, currentCol.value)
509
+ .reduce((prev, curr) => prev + Number(curr.width), 0)
510
+ // scroll-view滑动到selectItem的偏移量
511
+ scrollLeft.value = offsetLeft - ((navRect as any).width - Number(selectItem.width)) / 2
512
+ },
513
+ )
514
+ }
515
+
516
+ // 递归列数据补齐
517
+ function diffColumns(colIndex: number) {
518
+ // colIndex 为 -1 时,item 为空对象,>=0 时则具有 value 属性
519
+ const item = colIndex === -1 ? {} : { [props.valueKey]: props.modelValue[colIndex] }
520
+ handleColChange(colIndex, item, -1, () => {
521
+ // 如果 columns 长度还小于 value 长度,colIndex + 1,继续递归补齐
522
+ if (selectList.value.length < props.modelValue.length) {
523
+ diffColumns(colIndex + 1)
524
+ }
525
+ })
526
+ }
527
+ function handleAutoComplete() {
528
+ if (props.autoComplete) {
529
+ // 如果 columns 数组长度为空,或者长度小于 value 的长度,自动触发 columnChange 来补齐数据
530
+ if (selectList.value.length < props.modelValue.length || selectList.value.length === 0) {
531
+ // isCompleting 是否在自动补全,锁操作
532
+ if (!isCompleting.value) {
533
+ // 如果 columns 长度为空,则传入的 colIndex 为 -1
534
+ const colIndex = selectList.value.length === 0 ? -1 : selectList.value.length - 1
535
+ diffColumns(colIndex)
536
+ }
537
+ isCompleting.value = true
538
+ }
539
+ }
540
+ }
541
+
542
+ defineExpose<ColPickerExpose>({
543
+ close,
544
+ open,
545
+ })
546
+ </script>
547
+
548
+ <style lang="scss" scoped>
549
+ @import './index.scss';
550
+ </style>
@@ -0,0 +1,55 @@
1
+ @import '../common/abstracts/variable';
2
+ @import '../common/abstracts/mixin';
3
+
4
+ .wot-theme-dark {
5
+ @include b(collapse) {
6
+ background: $-dark-background2;
7
+
8
+ @include e(content) {
9
+ color: $-dark-color3;
10
+ }
11
+ }
12
+ }
13
+
14
+ @include b(collapse) {
15
+ background: $-color-white;
16
+
17
+ @include when(viewmore) {
18
+ padding: $-collapse-side-padding;
19
+ }
20
+ @include e(content) {
21
+ font-size: $-collapse-body-fs;
22
+ color: $-collapse-body-color;
23
+
24
+ @include when(retract) {
25
+ display: -webkit-box;
26
+ -webkit-box-orient: vertical;
27
+ overflow: hidden;
28
+ font-size: $-collapse-retract-fs;
29
+ }
30
+ }
31
+ @include e(more) {
32
+ display: inline-block;
33
+ margin-top: 8px;
34
+ font-size: $-collapse-retract-fs;
35
+ color: $-collapse-more-color;
36
+ user-select: none;
37
+ }
38
+ @include e(more-txt) {
39
+ display: inline-block;
40
+ margin-right: 4px;
41
+ vertical-align: middle;
42
+ }
43
+ @include e(arrow) {
44
+ display: inline-block;
45
+ height: $-collapse-arrow-size;
46
+ font-size: $-collapse-arrow-size;
47
+ line-height: $-collapse-arrow-size;
48
+ vertical-align: middle;
49
+ transition: transform 0.1s;
50
+
51
+ @include when(retract) {
52
+ transform: rotate(-180deg);
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,63 @@
1
+ import {
2
+ type ComponentPublicInstance,
3
+ type ExtractPropTypes,
4
+ type InjectionKey,
5
+ type PropType,
6
+ } from 'vue'
7
+ import { baseProps, makeBooleanProp, makeNumberProp, makeStringProp } from '../common/props'
8
+
9
+ export type CollapseToggleAllOptions =
10
+ | boolean
11
+ | {
12
+ expanded?: boolean
13
+ skipDisabled?: boolean
14
+ }
15
+
16
+ export type CollapseProvide = {
17
+ props: Partial<CollapseProps>
18
+ toggle: (name: string, expanded: boolean) => void
19
+ }
20
+
21
+ export const COLLAPSE_KEY: InjectionKey<CollapseProvide> = Symbol('wd-collapse')
22
+
23
+ export const collapseProps = {
24
+ ...baseProps,
25
+ /**
26
+ * 查看更多模式下的插槽外部自定义样式
27
+ */
28
+ customMoreSlotClass: makeStringProp(''),
29
+ /**
30
+ * 绑定值
31
+ */
32
+ modelValue: {
33
+ type: [String, Array, Boolean] as PropType<string | Array<string> | boolean>,
34
+ },
35
+ /**
36
+ * 手风琴模式
37
+ */
38
+ accordion: makeBooleanProp(false),
39
+ /**
40
+ * 查看更多的折叠面板
41
+ */
42
+ viewmore: makeBooleanProp(false),
43
+ /**
44
+ * 查看更多的自定义插槽使用标志
45
+ */
46
+ useMoreSlot: makeBooleanProp(false),
47
+ /**
48
+ * 查看更多的折叠面板,收起时的显示行数
49
+ */
50
+ lineNum: makeNumberProp(2),
51
+ }
52
+
53
+ export type CollapseProps = ExtractPropTypes<typeof collapseProps>
54
+
55
+ export type CollapseExpose = {
56
+ /**
57
+ * 切换所有面板展开状态,传 true 为全部展开,false 为全部收起,不传参为全部切换
58
+ * @param options 面板状态
59
+ */
60
+ toggleAll: (options?: boolean | CollapseToggleAllOptions) => void
61
+ }
62
+
63
+ export type CollapseInstance = ComponentPublicInstance<CollapseProps, CollapseExpose>