oxy-uni-ui 1.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 (355) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/attributes.json +1 -0
  4. package/components/common/AbortablePromise.ts +28 -0
  5. package/components/common/abstracts/_config.scss +7 -0
  6. package/components/common/abstracts/_function.scss +89 -0
  7. package/components/common/abstracts/_mixin.scss +385 -0
  8. package/components/common/abstracts/variable.scss +974 -0
  9. package/components/common/base64.ts +29 -0
  10. package/components/common/canvasHelper.ts +49 -0
  11. package/components/common/clickoutside.ts +25 -0
  12. package/components/common/event.ts +8 -0
  13. package/components/common/interceptor.ts +43 -0
  14. package/components/common/props.ts +51 -0
  15. package/components/common/util.ts +778 -0
  16. package/components/composables/index.ts +11 -0
  17. package/components/composables/useCell.ts +13 -0
  18. package/components/composables/useChildren.ts +113 -0
  19. package/components/composables/useCountDown.ts +138 -0
  20. package/components/composables/useLockScroll.ts +37 -0
  21. package/components/composables/useParent.ts +41 -0
  22. package/components/composables/usePopover.ts +176 -0
  23. package/components/composables/useQueue.ts +52 -0
  24. package/components/composables/useRaf.ts +37 -0
  25. package/components/composables/useTouch.ts +43 -0
  26. package/components/composables/useTranslate.ts +12 -0
  27. package/components/composables/useUpload.ts +364 -0
  28. package/components/oxy-action-sheet/index.scss +204 -0
  29. package/components/oxy-action-sheet/oxy-action-sheet.vue +155 -0
  30. package/components/oxy-action-sheet/types.ts +118 -0
  31. package/components/oxy-backtop/index.scss +25 -0
  32. package/components/oxy-backtop/oxy-backtop.vue +45 -0
  33. package/components/oxy-backtop/types.ts +37 -0
  34. package/components/oxy-badge/index.scss +63 -0
  35. package/components/oxy-badge/oxy-badge.vue +61 -0
  36. package/components/oxy-badge/types.ts +41 -0
  37. package/components/oxy-button/index.scss +336 -0
  38. package/components/oxy-button/oxy-button.vue +195 -0
  39. package/components/oxy-button/types.ts +133 -0
  40. package/components/oxy-calendar/index.scss +158 -0
  41. package/components/oxy-calendar/oxy-calendar.vue +451 -0
  42. package/components/oxy-calendar/types.ts +217 -0
  43. package/components/oxy-calendar-view/index.scss +0 -0
  44. package/components/oxy-calendar-view/month/index.scss +162 -0
  45. package/components/oxy-calendar-view/month/month.vue +389 -0
  46. package/components/oxy-calendar-view/month/types.ts +20 -0
  47. package/components/oxy-calendar-view/monthPanel/index.scss +89 -0
  48. package/components/oxy-calendar-view/monthPanel/month-panel.vue +374 -0
  49. package/components/oxy-calendar-view/monthPanel/types.ts +48 -0
  50. package/components/oxy-calendar-view/oxy-calendar-view.vue +111 -0
  51. package/components/oxy-calendar-view/types.ts +109 -0
  52. package/components/oxy-calendar-view/utils.ts +429 -0
  53. package/components/oxy-calendar-view/year/index.scss +153 -0
  54. package/components/oxy-calendar-view/year/types.ts +20 -0
  55. package/components/oxy-calendar-view/year/year.vue +202 -0
  56. package/components/oxy-calendar-view/yearPanel/index.scss +24 -0
  57. package/components/oxy-calendar-view/yearPanel/types.ts +38 -0
  58. package/components/oxy-calendar-view/yearPanel/year-panel.vue +135 -0
  59. package/components/oxy-card/index.scss +71 -0
  60. package/components/oxy-card/oxy-card.vue +37 -0
  61. package/components/oxy-card/types.ts +30 -0
  62. package/components/oxy-cell/index.scss +206 -0
  63. package/components/oxy-cell/oxy-cell.vue +140 -0
  64. package/components/oxy-cell/types.ts +111 -0
  65. package/components/oxy-cell-group/index.scss +56 -0
  66. package/components/oxy-cell-group/oxy-cell-group.vue +45 -0
  67. package/components/oxy-cell-group/types.ts +32 -0
  68. package/components/oxy-checkbox/index.scss +285 -0
  69. package/components/oxy-checkbox/oxy-checkbox.vue +177 -0
  70. package/components/oxy-checkbox/types.ts +68 -0
  71. package/components/oxy-checkbox-group/index.scss +20 -0
  72. package/components/oxy-checkbox-group/oxy-checkbox-group.vue +100 -0
  73. package/components/oxy-checkbox-group/types.ts +59 -0
  74. package/components/oxy-circle/index.scss +18 -0
  75. package/components/oxy-circle/oxy-circle.vue +296 -0
  76. package/components/oxy-circle/types.ts +54 -0
  77. package/components/oxy-col/index.scss +19 -0
  78. package/components/oxy-col/oxy-col.vue +49 -0
  79. package/components/oxy-col/types.ts +15 -0
  80. package/components/oxy-col-picker/index.scss +168 -0
  81. package/components/oxy-col-picker/oxy-col-picker.vue +498 -0
  82. package/components/oxy-col-picker/types.ts +166 -0
  83. package/components/oxy-collapse/index.scss +55 -0
  84. package/components/oxy-collapse/oxy-collapse.vue +151 -0
  85. package/components/oxy-collapse/types.ts +58 -0
  86. package/components/oxy-collapse-item/index.scss +90 -0
  87. package/components/oxy-collapse-item/oxy-collapse-item.vue +171 -0
  88. package/components/oxy-collapse-item/types.ts +48 -0
  89. package/components/oxy-config-provider/oxy-config-provider.vue +73 -0
  90. package/components/oxy-config-provider/types.ts +1052 -0
  91. package/components/oxy-count-down/index.scss +15 -0
  92. package/components/oxy-count-down/oxy-count-down.vue +60 -0
  93. package/components/oxy-count-down/types.ts +41 -0
  94. package/components/oxy-count-down/utils.ts +52 -0
  95. package/components/oxy-count-to/index.scss +7 -0
  96. package/components/oxy-count-to/oxy-count-to.vue +125 -0
  97. package/components/oxy-count-to/types.ts +117 -0
  98. package/components/oxy-curtain/index.scss +85 -0
  99. package/components/oxy-curtain/oxy-curtain.vue +172 -0
  100. package/components/oxy-curtain/types.ts +73 -0
  101. package/components/oxy-datetime-picker/index.scss +164 -0
  102. package/components/oxy-datetime-picker/oxy-datetime-picker.vue +801 -0
  103. package/components/oxy-datetime-picker/types.ts +231 -0
  104. package/components/oxy-datetime-picker-view/oxy-datetime-picker-view.vue +499 -0
  105. package/components/oxy-datetime-picker-view/types.ts +120 -0
  106. package/components/oxy-datetime-picker-view/util.ts +30 -0
  107. package/components/oxy-design-uni/oxy-design-uni.vue +5 -0
  108. package/components/oxy-divider/index.scss +100 -0
  109. package/components/oxy-divider/oxy-divider.vue +52 -0
  110. package/components/oxy-divider/types.ts +35 -0
  111. package/components/oxy-drop-menu/index.scss +86 -0
  112. package/components/oxy-drop-menu/oxy-drop-menu.vue +166 -0
  113. package/components/oxy-drop-menu/types.ts +38 -0
  114. package/components/oxy-drop-menu-item/index.scss +66 -0
  115. package/components/oxy-drop-menu-item/oxy-drop-menu-item.vue +221 -0
  116. package/components/oxy-drop-menu-item/types.ts +94 -0
  117. package/components/oxy-fab/index.scss +116 -0
  118. package/components/oxy-fab/oxy-fab.vue +276 -0
  119. package/components/oxy-fab/types.ts +66 -0
  120. package/components/oxy-floating-panel/index.scss +64 -0
  121. package/components/oxy-floating-panel/oxy-floating-panel.vue +140 -0
  122. package/components/oxy-floating-panel/type.ts +32 -0
  123. package/components/oxy-form/oxy-form.vue +207 -0
  124. package/components/oxy-form/types.ts +76 -0
  125. package/components/oxy-form-item/index.scss +18 -0
  126. package/components/oxy-form-item/oxy-form-item.vue +56 -0
  127. package/components/oxy-form-item/types.ts +16 -0
  128. package/components/oxy-gap/index.scss +9 -0
  129. package/components/oxy-gap/oxy-gap.vue +36 -0
  130. package/components/oxy-gap/types.ts +17 -0
  131. package/components/oxy-grid/index.scss +9 -0
  132. package/components/oxy-grid/oxy-grid.vue +106 -0
  133. package/components/oxy-grid/types.ts +50 -0
  134. package/components/oxy-grid-item/index.scss +148 -0
  135. package/components/oxy-grid-item/oxy-grid-item.vue +176 -0
  136. package/components/oxy-grid-item/types.ts +77 -0
  137. package/components/oxy-icon/index.scss +1230 -0
  138. package/components/oxy-icon/oxy-icon.vue +53 -0
  139. package/components/oxy-icon/oxy-icons.ttf +0 -0
  140. package/components/oxy-icon/types.ts +21 -0
  141. package/components/oxy-img/index.scss +19 -0
  142. package/components/oxy-img/oxy-img.vue +81 -0
  143. package/components/oxy-img/types.ts +61 -0
  144. package/components/oxy-img-cropper/index.scss +231 -0
  145. package/components/oxy-img-cropper/oxy-img-cropper.vue +664 -0
  146. package/components/oxy-img-cropper/types.ts +76 -0
  147. package/components/oxy-index-anchor/index.scss +35 -0
  148. package/components/oxy-index-anchor/oxy-index-anchor.vue +55 -0
  149. package/components/oxy-index-anchor/type.ts +9 -0
  150. package/components/oxy-index-bar/index.scss +39 -0
  151. package/components/oxy-index-bar/oxy-index-bar.vue +156 -0
  152. package/components/oxy-index-bar/type.ts +23 -0
  153. package/components/oxy-input/index.scss +323 -0
  154. package/components/oxy-input/oxy-input.vue +300 -0
  155. package/components/oxy-input/placeholder.scss +21 -0
  156. package/components/oxy-input/types.ts +189 -0
  157. package/components/oxy-input-number/index.scss +132 -0
  158. package/components/oxy-input-number/oxy-input-number.vue +464 -0
  159. package/components/oxy-input-number/types.ts +101 -0
  160. package/components/oxy-keyboard/constants.ts +81 -0
  161. package/components/oxy-keyboard/index.scss +102 -0
  162. package/components/oxy-keyboard/key/index.scss +79 -0
  163. package/components/oxy-keyboard/key/index.vue +76 -0
  164. package/components/oxy-keyboard/key/types.ts +11 -0
  165. package/components/oxy-keyboard/oxy-keyboard.vue +206 -0
  166. package/components/oxy-keyboard/types.ts +92 -0
  167. package/components/oxy-loading/index.scss +37 -0
  168. package/components/oxy-loading/oxy-loading.vue +90 -0
  169. package/components/oxy-loading/types.ts +22 -0
  170. package/components/oxy-loadmore/index.scss +39 -0
  171. package/components/oxy-loadmore/oxy-loadmore.vue +59 -0
  172. package/components/oxy-loadmore/types.ts +30 -0
  173. package/components/oxy-message-box/index.scss +108 -0
  174. package/components/oxy-message-box/index.ts +87 -0
  175. package/components/oxy-message-box/oxy-message-box.vue +291 -0
  176. package/components/oxy-message-box/types.ts +132 -0
  177. package/components/oxy-navbar/index.scss +93 -0
  178. package/components/oxy-navbar/oxy-navbar.vue +111 -0
  179. package/components/oxy-navbar/types.ts +52 -0
  180. package/components/oxy-navbar-capsule/index.scss +66 -0
  181. package/components/oxy-navbar-capsule/oxy-navbar-capsule.vue +35 -0
  182. package/components/oxy-navbar-capsule/types.ts +8 -0
  183. package/components/oxy-notice-bar/index.scss +68 -0
  184. package/components/oxy-notice-bar/oxy-notice-bar.vue +266 -0
  185. package/components/oxy-notice-bar/types.ts +67 -0
  186. package/components/oxy-notify/index.scss +34 -0
  187. package/components/oxy-notify/index.ts +61 -0
  188. package/components/oxy-notify/oxy-notify.vue +85 -0
  189. package/components/oxy-notify/types.ts +66 -0
  190. package/components/oxy-number-keyboard/index.scss +78 -0
  191. package/components/oxy-number-keyboard/key/index.scss +81 -0
  192. package/components/oxy-number-keyboard/key/index.vue +78 -0
  193. package/components/oxy-number-keyboard/key/types.ts +11 -0
  194. package/components/oxy-number-keyboard/oxy-number-keyboard.vue +151 -0
  195. package/components/oxy-number-keyboard/types.ts +83 -0
  196. package/components/oxy-overlay/index.scss +17 -0
  197. package/components/oxy-overlay/oxy-overlay.vue +47 -0
  198. package/components/oxy-overlay/types.ts +25 -0
  199. package/components/oxy-pagination/index.scss +57 -0
  200. package/components/oxy-pagination/oxy-pagination.vue +110 -0
  201. package/components/oxy-pagination/types.ts +41 -0
  202. package/components/oxy-password-input/index.scss +124 -0
  203. package/components/oxy-password-input/oxy-password-input.vue +49 -0
  204. package/components/oxy-password-input/types.ts +33 -0
  205. package/components/oxy-picker/index.scss +110 -0
  206. package/components/oxy-picker/oxy-picker.vue +412 -0
  207. package/components/oxy-picker/types.ts +189 -0
  208. package/components/oxy-picker-view/index.scss +92 -0
  209. package/components/oxy-picker-view/oxy-picker-view.vue +369 -0
  210. package/components/oxy-picker-view/types.ts +152 -0
  211. package/components/oxy-popover/index.scss +116 -0
  212. package/components/oxy-popover/oxy-popover.vue +180 -0
  213. package/components/oxy-popover/types.ts +69 -0
  214. package/components/oxy-popup/index.scss +84 -0
  215. package/components/oxy-popup/oxy-popup.vue +169 -0
  216. package/components/oxy-popup/types.ts +95 -0
  217. package/components/oxy-progress/index.scss +68 -0
  218. package/components/oxy-progress/oxy-progress.vue +197 -0
  219. package/components/oxy-progress/types.ts +35 -0
  220. package/components/oxy-radio/index.scss +301 -0
  221. package/components/oxy-radio/oxy-radio.vue +118 -0
  222. package/components/oxy-radio/types.ts +42 -0
  223. package/components/oxy-radio-group/index.scss +23 -0
  224. package/components/oxy-radio-group/oxy-radio-group.vue +51 -0
  225. package/components/oxy-radio-group/types.ts +39 -0
  226. package/components/oxy-rate/index.scss +25 -0
  227. package/components/oxy-rate/oxy-rate.vue +178 -0
  228. package/components/oxy-rate/types.ts +103 -0
  229. package/components/oxy-resize/index.scss +27 -0
  230. package/components/oxy-resize/oxy-resize.vue +144 -0
  231. package/components/oxy-resize/types.ts +6 -0
  232. package/components/oxy-root-portal/oxy-root-portal.vue +50 -0
  233. package/components/oxy-row/index.scss +10 -0
  234. package/components/oxy-row/oxy-row.vue +42 -0
  235. package/components/oxy-row/types.ts +16 -0
  236. package/components/oxy-search/index.scss +148 -0
  237. package/components/oxy-search/oxy-search.vue +187 -0
  238. package/components/oxy-search/types.ts +93 -0
  239. package/components/oxy-segmented/index.scss +101 -0
  240. package/components/oxy-segmented/oxy-segmented.vue +143 -0
  241. package/components/oxy-segmented/types.ts +71 -0
  242. package/components/oxy-select-picker/index.scss +102 -0
  243. package/components/oxy-select-picker/oxy-select-picker.vue +432 -0
  244. package/components/oxy-select-picker/types.ts +123 -0
  245. package/components/oxy-sidebar/index.scss +25 -0
  246. package/components/oxy-sidebar/oxy-sidebar.vue +63 -0
  247. package/components/oxy-sidebar/types.ts +38 -0
  248. package/components/oxy-sidebar-item/index.scss +97 -0
  249. package/components/oxy-sidebar-item/oxy-sidebar-item.vue +116 -0
  250. package/components/oxy-sidebar-item/types.ts +31 -0
  251. package/components/oxy-signature/index.scss +31 -0
  252. package/components/oxy-signature/oxy-signature.vue +630 -0
  253. package/components/oxy-signature/types.ts +108 -0
  254. package/components/oxy-skeleton/index.scss +96 -0
  255. package/components/oxy-skeleton/index.ts +1 -0
  256. package/components/oxy-skeleton/oxy-skeleton.vue +110 -0
  257. package/components/oxy-skeleton/types.ts +69 -0
  258. package/components/oxy-slider/index.scss +98 -0
  259. package/components/oxy-slider/oxy-slider.vue +356 -0
  260. package/components/oxy-slider/types.ts +138 -0
  261. package/components/oxy-sort-button/index.scss +89 -0
  262. package/components/oxy-sort-button/oxy-sort-button.vue +69 -0
  263. package/components/oxy-sort-button/types.ts +43 -0
  264. package/components/oxy-status-tip/images/collect.png +0 -0
  265. package/components/oxy-status-tip/images/content.png +0 -0
  266. package/components/oxy-status-tip/images/network.png +0 -0
  267. package/components/oxy-status-tip/images/search.png +0 -0
  268. package/components/oxy-status-tip/index.scss +37 -0
  269. package/components/oxy-status-tip/oxy-status-tip.vue +71 -0
  270. package/components/oxy-status-tip/types.ts +50 -0
  271. package/components/oxy-step/index.scss +235 -0
  272. package/components/oxy-step/oxy-step.vue +150 -0
  273. package/components/oxy-step/types.ts +33 -0
  274. package/components/oxy-steps/index.scss +10 -0
  275. package/components/oxy-steps/oxy-steps.vue +28 -0
  276. package/components/oxy-steps/types.ts +50 -0
  277. package/components/oxy-sticky/index.scss +9 -0
  278. package/components/oxy-sticky/oxy-sticky.vue +190 -0
  279. package/components/oxy-sticky/types.ts +13 -0
  280. package/components/oxy-sticky-box/index.scss +6 -0
  281. package/components/oxy-sticky-box/oxy-sticky-box.vue +155 -0
  282. package/components/oxy-sticky-box/types.ts +11 -0
  283. package/components/oxy-swipe-action/index.scss +22 -0
  284. package/components/oxy-swipe-action/oxy-swipe-action.vue +294 -0
  285. package/components/oxy-swipe-action/types.ts +40 -0
  286. package/components/oxy-swiper/index.scss +53 -0
  287. package/components/oxy-swiper/oxy-swiper.vue +318 -0
  288. package/components/oxy-swiper/types.ts +264 -0
  289. package/components/oxy-swiper-nav/index.scss +159 -0
  290. package/components/oxy-swiper-nav/oxy-swiper-nav.vue +37 -0
  291. package/components/oxy-swiper-nav/types.ts +42 -0
  292. package/components/oxy-switch/index.scss +58 -0
  293. package/components/oxy-switch/oxy-switch.vue +83 -0
  294. package/components/oxy-switch/types.ts +58 -0
  295. package/components/oxy-tab/index.scss +16 -0
  296. package/components/oxy-tab/oxy-tab.vue +88 -0
  297. package/components/oxy-tab/types.ts +30 -0
  298. package/components/oxy-tabbar/index.scss +62 -0
  299. package/components/oxy-tabbar/oxy-tabbar.vue +91 -0
  300. package/components/oxy-tabbar/types.ts +73 -0
  301. package/components/oxy-tabbar-item/index.scss +55 -0
  302. package/components/oxy-tabbar-item/oxy-tabbar-item.vue +99 -0
  303. package/components/oxy-tabbar-item/types.ts +51 -0
  304. package/components/oxy-table/index.scss +163 -0
  305. package/components/oxy-table/oxy-table.vue +283 -0
  306. package/components/oxy-table/types.ts +58 -0
  307. package/components/oxy-table-col/index.scss +46 -0
  308. package/components/oxy-table-col/oxy-table-col.vue +149 -0
  309. package/components/oxy-table-col/types.ts +54 -0
  310. package/components/oxy-tabs/index.scss +299 -0
  311. package/components/oxy-tabs/oxy-tabs.vue +443 -0
  312. package/components/oxy-tabs/types.ts +107 -0
  313. package/components/oxy-tag/index.scss +115 -0
  314. package/components/oxy-tag/oxy-tag.vue +148 -0
  315. package/components/oxy-tag/types.ts +81 -0
  316. package/components/oxy-text/index.scss +37 -0
  317. package/components/oxy-text/oxy-text.vue +139 -0
  318. package/components/oxy-text/types.ts +98 -0
  319. package/components/oxy-textarea/index.scss +340 -0
  320. package/components/oxy-textarea/oxy-textarea.vue +296 -0
  321. package/components/oxy-textarea/placeholder.scss +20 -0
  322. package/components/oxy-textarea/types.ts +288 -0
  323. package/components/oxy-toast/index.scss +75 -0
  324. package/components/oxy-toast/index.ts +92 -0
  325. package/components/oxy-toast/oxy-toast.vue +198 -0
  326. package/components/oxy-toast/types.ts +181 -0
  327. package/components/oxy-tooltip/index.scss +66 -0
  328. package/components/oxy-tooltip/oxy-tooltip.vue +141 -0
  329. package/components/oxy-tooltip/types.ts +107 -0
  330. package/components/oxy-transition/index.scss +95 -0
  331. package/components/oxy-transition/oxy-transition.vue +232 -0
  332. package/components/oxy-transition/types.ts +98 -0
  333. package/components/oxy-upload/index.scss +175 -0
  334. package/components/oxy-upload/oxy-upload.vue +673 -0
  335. package/components/oxy-upload/types.ts +391 -0
  336. package/components/oxy-video-preview/index.scss +34 -0
  337. package/components/oxy-video-preview/oxy-video-preview.vue +72 -0
  338. package/components/oxy-video-preview/types.ts +23 -0
  339. package/components/oxy-watermark/index.scss +18 -0
  340. package/components/oxy-watermark/oxy-watermark.vue +486 -0
  341. package/components/oxy-watermark/types.ts +76 -0
  342. package/dayjs/constant.js +26 -0
  343. package/dayjs/index.d.ts +430 -0
  344. package/dayjs/index.js +542 -0
  345. package/dayjs/locale/en.js +13 -0
  346. package/dayjs/utils.js +59 -0
  347. package/global.d.ts +101 -0
  348. package/index.ts +12 -0
  349. package/locale/index.ts +32 -0
  350. package/locale/lang/ar-SA.ts +133 -0
  351. package/locale/lang/en-US.ts +133 -0
  352. package/locale/lang/zh-CN.ts +137 -0
  353. package/package.json +1 -0
  354. package/tags.json +1 -0
  355. package/web-types.json +1 -0
@@ -0,0 +1,412 @@
1
+ <template>
2
+ <view
3
+ :class="`oxy-picker ${disabled ? 'is-disabled' : ''} ${size ? 'is-' + size : ''} ${alignRight ? 'is-align-right' : ''} ${
4
+ error ? 'is-error' : ''
5
+ } ${customClass}`"
6
+ :style="customStyle"
7
+ >
8
+ <oxy-cell
9
+ v-if="!$slots.default"
10
+ :title="label"
11
+ :value="showValue ? showValue : placeholder || translate('placeholder')"
12
+ :required="required"
13
+ :size="size"
14
+ :title-width="labelWidth"
15
+ :prop="prop"
16
+ :rules="rules"
17
+ :clickable="!disabled && !readonly"
18
+ :value-align="alignRight ? 'right' : 'left'"
19
+ :custom-class="cellClass"
20
+ :custom-style="customStyle"
21
+ :custom-title-class="customLabelClass"
22
+ :custom-value-class="customValueClass"
23
+ :ellipsis="ellipsis"
24
+ :use-title-slot="!!$slots.label"
25
+ :marker-side="markerSide"
26
+ @click="showPopup"
27
+ >
28
+ <template v-if="$slots.label" #title>
29
+ <slot name="label"></slot>
30
+ </template>
31
+ <template #right-icon>
32
+ <oxy-icon v-if="showArrow" custom-class="oxy-picker__arrow" name="arrow-right" />
33
+ <view v-else-if="showClear" @click.stop="handleClear">
34
+ <oxy-icon custom-class="oxy-picker__clear" name="error-fill" />
35
+ </view>
36
+ </template>
37
+ </oxy-cell>
38
+ <view v-else @click="showPopup">
39
+ <slot></slot>
40
+ </view>
41
+ <oxy-popup
42
+ v-model="popupShow"
43
+ position="bottom"
44
+ :hide-when-close="false"
45
+ :close-on-click-modal="closeOnClickModal"
46
+ :z-index="zIndex"
47
+ :safe-area-inset-bottom="safeAreaInsetBottom"
48
+ :root-portal="rootPortal"
49
+ @close="onCancel"
50
+ custom-class="oxy-picker__popup"
51
+ >
52
+ <view class="oxy-picker__wraper">
53
+ <view class="oxy-picker__toolbar" @touchmove="noop">
54
+ <view class="oxy-picker__action oxy-picker__action--cancel" @click="onCancel">
55
+ {{ cancelButtonText || translate('cancel') }}
56
+ </view>
57
+ <view v-if="title" class="oxy-picker__title">{{ title }}</view>
58
+ <view :class="`oxy-picker__action ${isLoading ? 'is-loading' : ''}`" @click="onConfirm">
59
+ {{ confirmButtonText || translate('done') }}
60
+ </view>
61
+ </view>
62
+ <oxy-picker-view
63
+ ref="pickerViewOxy"
64
+ :custom-class="customViewClass"
65
+ v-model="pickerValue"
66
+ :columns="displayColumns"
67
+ :loading="isLoading"
68
+ :loading-color="loadingColor"
69
+ :columns-height="columnsHeight"
70
+ :value-key="valueKey"
71
+ :label-key="labelKey"
72
+ :immediate-change="immediateChange"
73
+ @change="pickerViewChange"
74
+ @pickstart="onPickStart"
75
+ @pickend="onPickEnd"
76
+ :column-change="columnChange"
77
+ />
78
+ </view>
79
+ </oxy-popup>
80
+ </view>
81
+ </template>
82
+
83
+ <script lang="ts">
84
+ export default {
85
+ name: 'oxy-picker',
86
+ options: {
87
+ virtualHost: true,
88
+ addGlobalClass: true,
89
+ styleIsolation: 'shared'
90
+ }
91
+ }
92
+ </script>
93
+
94
+ <script lang="ts" setup>
95
+ import OxyIcon from '../oxy-icon/oxy-icon.vue'
96
+ import OxyPopup from '../oxy-popup/oxy-popup.vue'
97
+ import OxyPickerView from '../oxy-picker-view/oxy-picker-view.vue'
98
+ import OxyCell from '../oxy-cell/oxy-cell.vue'
99
+ import { getCurrentInstance, onBeforeMount, ref, watch, computed, onMounted, nextTick } from 'vue'
100
+ import { deepClone, defaultDisplayFormat, getType, isArray, isDef, isFunction } from '../common/util'
101
+ import { type ColumnItem, formatArray, type PickerViewInstance } from '../oxy-picker-view/types'
102
+ import { FORM_KEY, type FormItemRule } from '../oxy-form/types'
103
+ import { useParent } from '../composables/useParent'
104
+ import { useTranslate } from '../composables/useTranslate'
105
+ import { pickerProps, type PickerExpose } from './types'
106
+ const { translate } = useTranslate('picker')
107
+
108
+ const props = defineProps(pickerProps)
109
+ const emit = defineEmits(['confirm', 'open', 'cancel', 'clear', 'update:modelValue'])
110
+
111
+ const pickerViewOxy = ref<PickerViewInstance | null>(null)
112
+
113
+ const innerLoading = ref<boolean>(false) // 内部控制是否loading
114
+
115
+ // 弹出层是否显示
116
+ const popupShow = ref<boolean>(false)
117
+ // 选定后展示的选中项
118
+ const showValue = ref<string>('')
119
+ const pickerValue = ref<string | number | boolean | string[] | number[] | boolean[]>('')
120
+ const displayColumns = ref<Array<string | number | ColumnItem | Array<string | number | ColumnItem>>>([]) // 传入 pickerView 的columns
121
+ const resetColumns = ref<Array<string | number | ColumnItem | Array<string | number | ColumnItem>>>([]) // 保存之前的 columns,当取消时,将数据源回滚,避免多级联动数据源不正确的情况
122
+ const isPicking = ref<boolean>(false) // 判断pickview是否还在滑动中
123
+ const hasConfirmed = ref<boolean>(false) // 判断用户是否点击了确认按钮
124
+
125
+ const isLoading = computed(() => {
126
+ return props.loading || innerLoading.value
127
+ })
128
+
129
+ watch(
130
+ () => props.displayFormat,
131
+ (fn) => {
132
+ if (fn && !isFunction(fn)) {
133
+ console.error('The type of displayFormat must be Function')
134
+ }
135
+ if (pickerViewOxy.value && pickerViewOxy.value.getSelectedIndex().length !== 0) {
136
+ handleShowValueUpdate(props.modelValue)
137
+ }
138
+ },
139
+ {
140
+ immediate: true,
141
+ deep: true
142
+ }
143
+ )
144
+
145
+ watch(
146
+ () => props.modelValue,
147
+ (newValue) => {
148
+ pickerValue.value = newValue
149
+ // 获取初始选中项,并展示初始选中文案
150
+ handleShowValueUpdate(newValue)
151
+ },
152
+ {
153
+ deep: true,
154
+ immediate: true
155
+ }
156
+ )
157
+
158
+ watch(
159
+ () => props.columns,
160
+ (newValue) => {
161
+ displayColumns.value = deepClone(newValue)
162
+ resetColumns.value = deepClone(newValue)
163
+ if (newValue.length === 0) {
164
+ // 当 columns 变为空时,清空 pickerValue 和 showValue
165
+ pickerValue.value = isArray(props.modelValue) ? [] : ''
166
+ showValue.value = ''
167
+ } else {
168
+ // 非空时正常更新显示值
169
+ handleShowValueUpdate(props.modelValue)
170
+ }
171
+ },
172
+ {
173
+ deep: true,
174
+ immediate: true
175
+ }
176
+ )
177
+
178
+ watch(
179
+ () => props.columnChange,
180
+ (newValue) => {
181
+ if (newValue && !isFunction(newValue)) {
182
+ console.error('The type of columnChange must be Function')
183
+ }
184
+ },
185
+ {
186
+ deep: true,
187
+ immediate: true
188
+ }
189
+ )
190
+
191
+ // 是否展示清除按钮
192
+ const showClear = computed(() => {
193
+ return props.clearable && !props.disabled && !props.readonly && showValue.value.length > 0
194
+ })
195
+
196
+ // 是否展示箭头
197
+ const showArrow = computed(() => {
198
+ return !props.disabled && !props.readonly && !showClear.value
199
+ })
200
+
201
+ const cellClass = computed(() => {
202
+ const classes = ['oxy-picker__cell']
203
+ if (props.disabled) classes.push('is-disabled')
204
+ if (props.readonly) classes.push('is-readonly')
205
+ if (props.error) classes.push('is-error')
206
+ if (!showValue.value) classes.push('oxy-picker__cell--placeholder')
207
+ return classes.join(' ')
208
+ })
209
+
210
+ const { proxy } = getCurrentInstance() as any
211
+
212
+ onMounted(() => {
213
+ handleShowValueUpdate(props.modelValue)
214
+ })
215
+
216
+ onBeforeMount(() => {
217
+ displayColumns.value = deepClone(props.columns)
218
+ resetColumns.value = deepClone(props.columns)
219
+ })
220
+
221
+ /**
222
+ * 值变更时更新显示内容
223
+ * @param value
224
+ */
225
+ function handleShowValueUpdate(value: string | number | Array<string | number>) {
226
+ // 获取初始选中项,并展示初始选中文案
227
+ if ((isArray(value) && value.length > 0) || (isDef(value) && !isArray(value) && value !== '')) {
228
+ if (pickerViewOxy.value) {
229
+ nextTick(() => {
230
+ setShowValue(pickerViewOxy.value!.getSelects())
231
+ })
232
+ } else {
233
+ setShowValue(getSelects(value)!)
234
+ }
235
+ } else {
236
+ showValue.value = ''
237
+ }
238
+ }
239
+
240
+ /**
241
+ * @description 根据传入的value,picker组件获取当前cell展示值。
242
+ * @param {String|Number|Array<String|Number|Array<any>>}value
243
+ */
244
+ function getSelects(value: string | number | Array<string | number | Array<any>>) {
245
+ const formatColumns = formatArray(props.columns, props.valueKey, props.labelKey)
246
+ if (props.columns.length === 0) return
247
+
248
+ // 使其默认选中首项
249
+ if (value === '' || !isDef(value) || (isArray(value) && value.length === 0)) {
250
+ return
251
+ }
252
+ const valueType = getType(value)
253
+ const type = ['string', 'number', 'boolean', 'array']
254
+ if (type.indexOf(valueType) === -1) return []
255
+ /**
256
+ * 1.单key转为Array<key>
257
+ * 2.根据formatColumns的长度截取Array<String>,保证下面的遍历不溢出
258
+ * 3.根据每列的key值找到选项中value为此key的下标并记录
259
+ */
260
+ value = isArray(value) ? value : [value]
261
+ value = value.slice(0, formatColumns.length)
262
+
263
+ if (value.length === 0) {
264
+ value = formatColumns.map(() => 0)
265
+ }
266
+ let selected: number[] = []
267
+ value.forEach((target, col) => {
268
+ let row = formatColumns[col].findIndex((row) => {
269
+ return row[props.valueKey].toString() === target.toString()
270
+ })
271
+ row = row === -1 ? 0 : row
272
+ selected.push(row)
273
+ })
274
+
275
+ const selects = selected.map((row, col) => formatColumns[col][row])
276
+ // 单列选择器,则返回单项
277
+ if (selects.length === 1) {
278
+ return selects[0]
279
+ }
280
+ return selects
281
+ }
282
+
283
+ // 对外暴露方法,打开弹框
284
+ function open() {
285
+ showPopup()
286
+ }
287
+ // 对外暴露方法,关闭弹框
288
+ function close() {
289
+ onCancel()
290
+ }
291
+ /**
292
+ * 展示popup
293
+ */
294
+ function showPopup() {
295
+ if (props.disabled || props.readonly) return
296
+
297
+ emit('open')
298
+ popupShow.value = true
299
+ pickerValue.value = props.modelValue
300
+ displayColumns.value = resetColumns.value
301
+ }
302
+
303
+ /**
304
+ * 点击取消按钮触发。关闭popup,触发cancel事件。
305
+ */
306
+ function onCancel() {
307
+ popupShow.value = false
308
+ emit('cancel')
309
+ let timmer = setTimeout(() => {
310
+ clearTimeout(timmer)
311
+ isDef(pickerViewOxy.value) && pickerViewOxy.value.resetColumns(resetColumns.value)
312
+ }, 300)
313
+ }
314
+ /**
315
+ * 点击确定按钮触发。展示选中值,触发cancel事件。
316
+ */
317
+ function onConfirm() {
318
+ if (isLoading.value) return
319
+
320
+ // 如果当前还在滑动且未停止下来,则锁住先不确认,等滑完再自动确认,避免pickview值未更新
321
+ if (isPicking.value) {
322
+ hasConfirmed.value = true
323
+ return
324
+ }
325
+
326
+ const { beforeConfirm } = props
327
+ if (beforeConfirm && isFunction(beforeConfirm)) {
328
+ beforeConfirm(
329
+ pickerValue.value,
330
+ (isPass: boolean) => {
331
+ isPass && handleConfirm()
332
+ },
333
+ proxy.$.exposed
334
+ )
335
+ } else {
336
+ handleConfirm()
337
+ }
338
+ }
339
+ function handleConfirm() {
340
+ if (isLoading.value || props.disabled) {
341
+ popupShow.value = false
342
+ return
343
+ }
344
+
345
+ const selects = pickerViewOxy.value!.getSelects()
346
+ const values = pickerViewOxy.value!.getValues()
347
+ // 获取当前的数据源,并设置给 resetColumns,用于取消时可以回退数据源
348
+ const columns = pickerViewOxy.value!.getColumnsData()
349
+ popupShow.value = false
350
+ resetColumns.value = deepClone(columns)
351
+ emit('update:modelValue', values)
352
+
353
+ setShowValue(selects)
354
+ emit('confirm', {
355
+ value: values,
356
+ selectedItems: selects
357
+ })
358
+ }
359
+ /**
360
+ * 初始change事件
361
+ * @param event
362
+ */
363
+ function pickerViewChange({ value }: any) {
364
+ pickerValue.value = value
365
+ }
366
+ /**
367
+ * 设置展示值
368
+ * @param items
369
+ */
370
+ function setShowValue(items: ColumnItem | ColumnItem[]) {
371
+ // 避免值为空时调用自定义展示函数
372
+ if ((isArray(items) && !items.length) || !items) return
373
+
374
+ const { valueKey, labelKey } = props
375
+ showValue.value = (props.displayFormat || defaultDisplayFormat)(items, { valueKey, labelKey })
376
+ }
377
+ function noop() {}
378
+ function onPickStart() {
379
+ isPicking.value = true
380
+ }
381
+ function onPickEnd() {
382
+ isPicking.value = false
383
+
384
+ if (hasConfirmed.value) {
385
+ hasConfirmed.value = false
386
+ onConfirm()
387
+ }
388
+ }
389
+
390
+ /**
391
+ * 外部设置是否loading
392
+ * @param loading 是否loading
393
+ */
394
+ function setLoading(loading: boolean) {
395
+ innerLoading.value = loading
396
+ }
397
+
398
+ function handleClear() {
399
+ const clearValue = isArray(pickerValue.value) ? [] : ''
400
+ emit('update:modelValue', clearValue)
401
+ emit('clear')
402
+ }
403
+
404
+ defineExpose<PickerExpose>({
405
+ close,
406
+ open,
407
+ setLoading
408
+ })
409
+ </script>
410
+ <style lang="scss" scoped>
411
+ @import './index.scss';
412
+ </style>
@@ -0,0 +1,189 @@
1
+ import type { ComponentPublicInstance, ExtractPropTypes, PropType } from 'vue'
2
+ import { baseProps, makeArrayProp, makeBooleanProp, makeNumberProp, makeStringProp } from '../common/props'
3
+ import type { ColumnItem, PickerViewColumnChange } from '../oxy-picker-view/types'
4
+ import type { FormItemRule } from '../oxy-form/types'
5
+
6
+ export const pickerProps = {
7
+ ...baseProps,
8
+ /**
9
+ * label 外部自定义样式
10
+ */
11
+ customLabelClass: makeStringProp(''),
12
+ /**
13
+ * value 外部自定义样式
14
+ */
15
+ customValueClass: makeStringProp(''),
16
+ /**
17
+ * pickerView 外部自定义样式
18
+ */
19
+ customViewClass: makeStringProp(''),
20
+ /**
21
+ * 选择器左侧文案
22
+ */
23
+ label: String,
24
+ /**
25
+ * 选择器占位符
26
+ */
27
+ placeholder: String,
28
+ /**
29
+ * 是否禁用
30
+ */
31
+ disabled: makeBooleanProp(false),
32
+ /**
33
+ * 是否只读
34
+ */
35
+ readonly: makeBooleanProp(false),
36
+ /**
37
+ * 加载中
38
+ */
39
+ loading: makeBooleanProp(false),
40
+ /**
41
+ * 加载中颜色
42
+ */
43
+ loadingColor: makeStringProp('#4D80F0'),
44
+ /* popup */
45
+ /**
46
+ * 弹出层标题
47
+ */
48
+ title: String,
49
+ /**
50
+ * 取消按钮文案
51
+ */
52
+ cancelButtonText: String,
53
+ /**
54
+ * 确认按钮文案
55
+ */
56
+ confirmButtonText: String,
57
+ /**
58
+ * 是否必填
59
+ */
60
+ required: makeBooleanProp(false),
61
+ /**
62
+ * 尺寸
63
+ */
64
+ size: String,
65
+ /**
66
+ * 设置左侧标题宽度
67
+ */
68
+ labelWidth: makeStringProp('33%'),
69
+ /**
70
+ * 使用默认插槽
71
+ * @deprecated 可以直接使用默认插槽,无需配置此选项
72
+ */
73
+ useDefaultSlot: makeBooleanProp(false),
74
+ /**
75
+ * 使用标签插槽
76
+ * @deprecated 可以直接使用标签插槽,无需配置此选项
77
+ */
78
+ useLabelSlot: makeBooleanProp(false),
79
+ /**
80
+ * 错误状态
81
+ */
82
+ error: makeBooleanProp(false),
83
+ /**
84
+ * 右对齐
85
+ */
86
+ alignRight: makeBooleanProp(false),
87
+ /**
88
+ * 确定前校验函数,接收 (value, resolve, picker) 参数,通过 resolve 继续执行 picker,resolve 接收1个boolean参数
89
+ */
90
+ beforeConfirm: Function as PropType<PickerBeforeConfirm>,
91
+ /**
92
+ * 点击蒙层关闭
93
+ */
94
+ closeOnClickModal: makeBooleanProp(true),
95
+ /**
96
+ * 底部安全区域内
97
+ */
98
+ safeAreaInsetBottom: makeBooleanProp(true),
99
+ /**
100
+ * 文本溢出显示省略号
101
+ */
102
+ ellipsis: makeBooleanProp(false),
103
+ /**
104
+ * 选项总高度
105
+ */
106
+ columnsHeight: makeNumberProp(217),
107
+ /**
108
+ * 选项值对应的键名
109
+ */
110
+ valueKey: makeStringProp('value'),
111
+ /**
112
+ * 选项文本对应的键名
113
+ */
114
+ labelKey: makeStringProp('label'),
115
+ /**
116
+ * 选中项,如果为多列选择器,则其类型应为数组
117
+ */
118
+ modelValue: {
119
+ type: [String, Number, Array] as PropType<string | number | Array<string> | Array<number>>,
120
+ default: ''
121
+ },
122
+ /**
123
+ * 选择器数据,可以为字符串数组,也可以为对象数组,如果为二维数组,则为多列选择器
124
+ */
125
+ columns: {
126
+ type: Array as PropType<Array<string | number | ColumnItem | Array<string | number | ColumnItem>>>,
127
+ default: () => []
128
+ },
129
+ /**
130
+ * 接收 pickerView 实例、选中项、当前修改列的下标、resolve 作为入参,根据选中项和列下标进行判断,通过 pickerView 实例暴露出来的 setColumnData 方法修改其他列的数据源。
131
+ */
132
+ columnChange: Function as PropType<PickerViewColumnChange>,
133
+ /**
134
+ * 自定义展示文案的格式化函数,返回一个字符串
135
+ */
136
+ displayFormat: Function as PropType<PickerDisplayFormat>,
137
+ /**
138
+ * 自定义层级
139
+ */
140
+ zIndex: makeNumberProp(15),
141
+ /**
142
+ * 表单域 model 字段名,在使用表单校验功能的情况下,该属性是必填的
143
+ */
144
+ prop: String,
145
+ /**
146
+ * 表单验证规则,结合oxy-form组件使用
147
+ */
148
+ rules: makeArrayProp<FormItemRule>(),
149
+ /**
150
+ * 是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件,1.2.25版本起提供,仅微信小程序和支付宝小程序支持。
151
+ */
152
+ immediateChange: makeBooleanProp(false),
153
+ /**
154
+ * 是否从页面中脱离出来,用于解决各种 fixed 失效问题 (H5: teleport, APP: renderjs, 小程序: root-portal)
155
+ */
156
+ rootPortal: makeBooleanProp(false),
157
+ /**
158
+ * 显示清空按钮
159
+ */
160
+ clearable: makeBooleanProp(false),
161
+ /**
162
+ * 必填标记位置,可选值:before、after
163
+ */
164
+ markerSide: makeStringProp<'before' | 'after'>('before')
165
+ }
166
+
167
+ export type PickerProps = ExtractPropTypes<typeof pickerProps>
168
+
169
+ export type PickerDisplayFormat = (item: ColumnItem | ColumnItem[], vl: { valueKey: string; labelKey: string }) => string
170
+
171
+ export type PickerBeforeConfirm = (
172
+ value: string | number | boolean | string[] | number[] | boolean[],
173
+ resolve: (isPass: boolean) => void,
174
+ picker: any
175
+ ) => void
176
+
177
+ export type PickerExpose = {
178
+ // 打开picker弹框
179
+ open: () => void
180
+ // 关闭picker弹框
181
+ close: () => void
182
+ /**
183
+ * 设置加载状态
184
+ * @param loading 加载状态
185
+ */
186
+ setLoading: (loading: boolean) => void
187
+ }
188
+
189
+ export type PickerInstance = ComponentPublicInstance<PickerExpose, PickerProps>
@@ -0,0 +1,92 @@
1
+ @import "./../common/abstracts/_mixin.scss";
2
+ @import "./../common/abstracts/variable.scss";
3
+
4
+ .oxy-theme-dark {
5
+ @include b(picker-view) {
6
+ @include e(columns) {
7
+ background: $-dark-background2;
8
+ }
9
+
10
+ :deep(.oxy-picker-view__roller) {
11
+ background: $-dark-background4;
12
+ }
13
+ }
14
+
15
+ @include b(picker-view-column) {
16
+ color: $-dark-color;
17
+
18
+ @include e(item) {
19
+ @include m(disabled) {
20
+ color: $-dark-color-gray;
21
+ }
22
+ }
23
+ }
24
+ }
25
+
26
+
27
+ @include b(picker-view) {
28
+ position: relative;
29
+ padding: 10px 0;
30
+
31
+ @include e(columns) {
32
+ position: relative;
33
+ display: flex;
34
+ background: $-picker-bg;
35
+ overflow: hidden;
36
+ align-items: center;
37
+ }
38
+
39
+ @include edeep(mask) {
40
+ position: absolute;
41
+ top: 0;
42
+ left: 0;
43
+ width: 100%;
44
+ height: 100%;
45
+ background: $-picker-mask;
46
+ background-position: top, bottom;
47
+ background-repeat: no-repeat;
48
+ z-index: 2;
49
+ pointer-events: none;
50
+ filter: blur(4px);
51
+ }
52
+
53
+ @include e(loading) {
54
+ position: absolute;
55
+ display: flex;
56
+ top: 0;
57
+ right: 0;
58
+ bottom: 0;
59
+ left: 0;
60
+ align-items: center;
61
+ justify-content: center;
62
+ z-index: 3;
63
+ background: $-picker-loading-bg;
64
+ }
65
+
66
+ @include edeep(roller) {
67
+ background: rgba(245, 245, 245, 1);
68
+ z-index: 0;
69
+
70
+ &::before,
71
+ &::after {
72
+ display: none;
73
+ }
74
+ }
75
+ }
76
+
77
+ @include b(picker-view-column) {
78
+ flex: 1;
79
+ font-size: $-picker-column-fs;
80
+ color: $-picker-column-color;
81
+ text-align: center;
82
+ transition-timing-function: cubic-bezier(0.28, 0.8, 0.63, 1);
83
+
84
+ @include e(item) {
85
+ padding: $-picker-column-padding;
86
+ @include lineEllipsis;
87
+
88
+ @include m(disabled) {
89
+ color: $-picker-column-disabled-color;
90
+ }
91
+ }
92
+ }