@wot-ui/ui 1.0.0 → 2.0.0-alpha.4

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 (386) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/attributes.json +1 -0
  4. package/changelog.md +63 -0
  5. package/common/AbortablePromise.ts +28 -0
  6. package/common/canvasHelper.ts +49 -0
  7. package/common/clickoutside.ts +25 -0
  8. package/common/event.ts +8 -0
  9. package/common/formatDate.ts +68 -0
  10. package/common/interceptor.ts +43 -0
  11. package/common/props.ts +53 -0
  12. package/common/util.ts +836 -0
  13. package/components/wd-action-sheet/index.scss +232 -0
  14. package/components/wd-action-sheet/types.ts +155 -0
  15. package/components/wd-action-sheet/wd-action-sheet.vue +176 -0
  16. package/components/wd-avatar/index.scss +150 -0
  17. package/components/wd-avatar/types.ts +98 -0
  18. package/components/wd-avatar/wd-avatar.vue +184 -0
  19. package/components/wd-avatar-group/index.scss +11 -0
  20. package/components/wd-avatar-group/types.ts +61 -0
  21. package/components/wd-avatar-group/wd-avatar-group.vue +115 -0
  22. package/components/wd-backtop/index.scss +67 -0
  23. package/components/wd-backtop/types.ts +66 -0
  24. package/components/wd-backtop/wd-backtop.vue +57 -0
  25. package/components/wd-badge/index.scss +116 -0
  26. package/components/wd-badge/types.ts +94 -0
  27. package/components/wd-badge/wd-badge.vue +78 -0
  28. package/components/wd-button/index.scss +436 -0
  29. package/components/wd-button/types.ts +204 -0
  30. package/components/wd-button/wd-button.vue +210 -0
  31. package/components/wd-calendar/index.scss +97 -0
  32. package/components/wd-calendar/types.ts +221 -0
  33. package/components/wd-calendar/wd-calendar.vue +339 -0
  34. package/components/wd-calendar-view/index.scss +41 -0
  35. package/components/wd-calendar-view/month/index.scss +144 -0
  36. package/components/wd-calendar-view/month/month.vue +389 -0
  37. package/components/wd-calendar-view/month/types.ts +70 -0
  38. package/components/wd-calendar-view/monthPanel/index.scss +84 -0
  39. package/components/wd-calendar-view/monthPanel/month-panel.vue +541 -0
  40. package/components/wd-calendar-view/monthPanel/types.ts +151 -0
  41. package/components/wd-calendar-view/types.ts +166 -0
  42. package/components/wd-calendar-view/utils.ts +318 -0
  43. package/components/wd-calendar-view/wd-calendar-view.vue +117 -0
  44. package/components/wd-calendar-view/year/index.scss +148 -0
  45. package/components/wd-calendar-view/year/types.ts +74 -0
  46. package/components/wd-calendar-view/year/year.vue +206 -0
  47. package/components/wd-calendar-view/yearPanel/index.scss +42 -0
  48. package/components/wd-calendar-view/yearPanel/types.ts +96 -0
  49. package/components/wd-calendar-view/yearPanel/year-panel.vue +249 -0
  50. package/components/wd-card/index.scss +104 -0
  51. package/components/wd-card/types.ts +47 -0
  52. package/components/wd-card/wd-card.vue +38 -0
  53. package/components/wd-cascader/index.scss +154 -0
  54. package/components/wd-cascader/types.ts +191 -0
  55. package/components/wd-cascader/wd-cascader.vue +589 -0
  56. package/components/wd-cell/index.scss +244 -0
  57. package/components/wd-cell/types.ts +205 -0
  58. package/components/wd-cell/wd-cell.vue +172 -0
  59. package/components/wd-cell-group/index.scss +53 -0
  60. package/components/wd-cell-group/types.ts +97 -0
  61. package/components/wd-cell-group/wd-cell-group.vue +48 -0
  62. package/components/wd-checkbox/index.scss +166 -0
  63. package/components/wd-checkbox/types.ts +118 -0
  64. package/components/wd-checkbox/wd-checkbox.vue +216 -0
  65. package/components/wd-checkbox-group/index.scss +5 -0
  66. package/components/wd-checkbox-group/types.ts +93 -0
  67. package/components/wd-checkbox-group/wd-checkbox-group.vue +148 -0
  68. package/components/wd-circle/index.scss +28 -0
  69. package/components/wd-circle/types.ts +54 -0
  70. package/components/wd-circle/wd-circle.vue +306 -0
  71. package/components/wd-col/index.scss +5 -0
  72. package/components/wd-col/types.ts +16 -0
  73. package/components/wd-col/wd-col.vue +83 -0
  74. package/components/wd-collapse/index.scss +71 -0
  75. package/components/wd-collapse/types.ts +68 -0
  76. package/components/wd-collapse/wd-collapse.vue +165 -0
  77. package/components/wd-collapse-item/index.scss +86 -0
  78. package/components/wd-collapse-item/types.ts +62 -0
  79. package/components/wd-collapse-item/wd-collapse-item.vue +184 -0
  80. package/components/wd-config-provider/index.scss +10 -0
  81. package/components/wd-config-provider/types.ts +2061 -0
  82. package/components/wd-config-provider/wd-config-provider.vue +61 -0
  83. package/components/wd-count-down/index.scss +16 -0
  84. package/components/wd-count-down/types.ts +58 -0
  85. package/components/wd-count-down/utils.ts +52 -0
  86. package/components/wd-count-down/wd-count-down.vue +62 -0
  87. package/components/wd-count-to/index.scss +25 -0
  88. package/components/wd-count-to/types.ts +121 -0
  89. package/components/wd-count-to/wd-count-to.vue +126 -0
  90. package/components/wd-curtain/index.scss +96 -0
  91. package/components/wd-curtain/types.ts +82 -0
  92. package/components/wd-curtain/wd-curtain.vue +172 -0
  93. package/components/wd-datetime-picker/index.scss +133 -0
  94. package/components/wd-datetime-picker/types.ts +198 -0
  95. package/components/wd-datetime-picker/wd-datetime-picker.vue +526 -0
  96. package/components/wd-datetime-picker-view/types.ts +171 -0
  97. package/components/wd-datetime-picker-view/util.ts +30 -0
  98. package/components/wd-datetime-picker-view/wd-datetime-picker-view.vue +402 -0
  99. package/components/wd-dialog/index.scss +281 -0
  100. package/components/wd-dialog/index.ts +168 -0
  101. package/components/wd-dialog/types.ts +452 -0
  102. package/components/wd-dialog/wd-dialog.vue +586 -0
  103. package/components/wd-divider/index.scss +122 -0
  104. package/components/wd-divider/types.ts +50 -0
  105. package/components/wd-divider/wd-divider.vue +54 -0
  106. package/components/wd-drop-menu/index.scss +90 -0
  107. package/components/wd-drop-menu/types.ts +38 -0
  108. package/components/wd-drop-menu/wd-drop-menu.vue +168 -0
  109. package/components/wd-drop-menu-item/index.scss +96 -0
  110. package/components/wd-drop-menu-item/types.ts +93 -0
  111. package/components/wd-drop-menu-item/wd-drop-menu-item.vue +205 -0
  112. package/components/wd-empty/index.scss +46 -0
  113. package/components/wd-empty/types.ts +37 -0
  114. package/components/wd-empty/wd-empty.vue +47 -0
  115. package/components/wd-fab/index.scss +124 -0
  116. package/components/wd-fab/types.ts +119 -0
  117. package/components/wd-fab/wd-fab.vue +322 -0
  118. package/components/wd-floating-panel/index.scss +73 -0
  119. package/components/wd-floating-panel/type.ts +32 -0
  120. package/components/wd-floating-panel/wd-floating-panel.vue +142 -0
  121. package/components/wd-form/adapters/zod.ts +56 -0
  122. package/components/wd-form/index.ts +2 -0
  123. package/components/wd-form/types.ts +133 -0
  124. package/components/wd-form/wd-form.vue +121 -0
  125. package/components/wd-form-item/index.scss +26 -0
  126. package/components/wd-form-item/types.ts +134 -0
  127. package/components/wd-form-item/wd-form-item.vue +182 -0
  128. package/components/wd-gap/index.scss +9 -0
  129. package/components/wd-gap/types.ts +26 -0
  130. package/components/wd-gap/wd-gap.vue +38 -0
  131. package/components/wd-grid/index.scss +11 -0
  132. package/components/wd-grid/types.ts +97 -0
  133. package/components/wd-grid/wd-grid.vue +48 -0
  134. package/components/wd-grid-item/index.scss +187 -0
  135. package/components/wd-grid-item/types.ts +98 -0
  136. package/components/wd-grid-item/wd-grid-item.vue +295 -0
  137. package/components/wd-icon/index.scss +46 -0
  138. package/components/wd-icon/types.ts +44 -0
  139. package/components/wd-icon/wd-icon.vue +66 -0
  140. package/components/wd-image-preview/index.scss +94 -0
  141. package/components/wd-image-preview/index.ts +95 -0
  142. package/components/wd-image-preview/types.ts +165 -0
  143. package/components/wd-image-preview/wd-image-preview.vue +233 -0
  144. package/components/wd-img/index.scss +82 -0
  145. package/components/wd-img/types.ts +96 -0
  146. package/components/wd-img/wd-img.vue +91 -0
  147. package/components/wd-img-cropper/index.scss +259 -0
  148. package/components/wd-img-cropper/types.ts +101 -0
  149. package/components/wd-img-cropper/wd-img-cropper.vue +653 -0
  150. package/components/wd-index-anchor/index.scss +34 -0
  151. package/components/wd-index-anchor/type.ts +9 -0
  152. package/components/wd-index-anchor/wd-index-anchor.vue +55 -0
  153. package/components/wd-index-bar/index.scss +68 -0
  154. package/components/wd-index-bar/type.ts +23 -0
  155. package/components/wd-index-bar/wd-index-bar.vue +157 -0
  156. package/components/wd-input/index.scss +129 -0
  157. package/components/wd-input/types.ts +165 -0
  158. package/components/wd-input/wd-input.vue +237 -0
  159. package/components/wd-input-number/index.scss +233 -0
  160. package/components/wd-input-number/types.ts +131 -0
  161. package/components/wd-input-number/wd-input-number.vue +473 -0
  162. package/components/wd-keyboard/constants.ts +81 -0
  163. package/components/wd-keyboard/index.scss +104 -0
  164. package/components/wd-keyboard/key/index.scss +103 -0
  165. package/components/wd-keyboard/key/index.vue +84 -0
  166. package/components/wd-keyboard/key/types.ts +44 -0
  167. package/components/wd-keyboard/types.ts +138 -0
  168. package/components/wd-keyboard/wd-keyboard.vue +236 -0
  169. package/components/wd-loading/index.scss +205 -0
  170. package/components/wd-loading/types.ts +61 -0
  171. package/components/wd-loading/wd-loading.vue +70 -0
  172. package/components/wd-loadmore/index.scss +62 -0
  173. package/components/wd-loadmore/types.ts +42 -0
  174. package/components/wd-loadmore/wd-loadmore.vue +68 -0
  175. package/components/wd-navbar/index.scss +96 -0
  176. package/components/wd-navbar/types.ts +74 -0
  177. package/components/wd-navbar/wd-navbar.vue +136 -0
  178. package/components/wd-navbar-capsule/index.scss +70 -0
  179. package/components/wd-navbar-capsule/types.ts +11 -0
  180. package/components/wd-navbar-capsule/wd-navbar-capsule.vue +48 -0
  181. package/components/wd-notice-bar/index.scss +94 -0
  182. package/components/wd-notice-bar/types.ts +97 -0
  183. package/components/wd-notice-bar/wd-notice-bar.vue +270 -0
  184. package/components/wd-notify/index.scss +114 -0
  185. package/components/wd-notify/index.ts +63 -0
  186. package/components/wd-notify/types.ts +130 -0
  187. package/components/wd-notify/wd-notify.vue +162 -0
  188. package/components/wd-overlay/index.scss +14 -0
  189. package/components/wd-overlay/types.ts +42 -0
  190. package/components/wd-overlay/wd-overlay.vue +55 -0
  191. package/components/wd-pagination/index.scss +71 -0
  192. package/components/wd-pagination/types.ts +69 -0
  193. package/components/wd-pagination/wd-pagination.vue +118 -0
  194. package/components/wd-password-input/index.scss +134 -0
  195. package/components/wd-password-input/types.ts +42 -0
  196. package/components/wd-password-input/wd-password-input.vue +51 -0
  197. package/components/wd-picker/index.scss +72 -0
  198. package/components/wd-picker/types.ts +141 -0
  199. package/components/wd-picker/wd-picker.vue +220 -0
  200. package/components/wd-picker-view/index.scss +93 -0
  201. package/components/wd-picker-view/types.ts +145 -0
  202. package/components/wd-picker-view/useSelection.ts +385 -0
  203. package/components/wd-picker-view/wd-picker-view.vue +227 -0
  204. package/components/wd-popover/index.scss +117 -0
  205. package/components/wd-popover/types.ts +106 -0
  206. package/components/wd-popover/wd-popover.vue +212 -0
  207. package/components/wd-popup/index.scss +89 -0
  208. package/components/wd-popup/types.ts +110 -0
  209. package/components/wd-popup/wd-popup.vue +174 -0
  210. package/components/wd-progress/index.scss +155 -0
  211. package/components/wd-progress/types.ts +94 -0
  212. package/components/wd-progress/wd-progress.vue +249 -0
  213. package/components/wd-radio/index.scss +189 -0
  214. package/components/wd-radio/types.ts +64 -0
  215. package/components/wd-radio/wd-radio.vue +164 -0
  216. package/components/wd-radio-group/index.scss +5 -0
  217. package/components/wd-radio-group/types.ts +70 -0
  218. package/components/wd-radio-group/wd-radio-group.vue +53 -0
  219. package/components/wd-rate/index.scss +57 -0
  220. package/components/wd-rate/types.ts +86 -0
  221. package/components/wd-rate/wd-rate.vue +168 -0
  222. package/components/wd-resize/index.scss +31 -0
  223. package/components/wd-resize/types.ts +14 -0
  224. package/components/wd-resize/wd-resize.vue +157 -0
  225. package/components/wd-root-portal/wd-root-portal.vue +77 -0
  226. package/components/wd-row/index.scss +6 -0
  227. package/components/wd-row/types.ts +36 -0
  228. package/components/wd-row/wd-row.vue +88 -0
  229. package/components/wd-search/index.scss +171 -0
  230. package/components/wd-search/types.ts +107 -0
  231. package/components/wd-search/wd-search.vue +198 -0
  232. package/components/wd-segmented/index.scss +155 -0
  233. package/components/wd-segmented/types.ts +81 -0
  234. package/components/wd-segmented/wd-segmented.vue +169 -0
  235. package/components/wd-select-picker/index.scss +72 -0
  236. package/components/wd-select-picker/types.ts +72 -0
  237. package/components/wd-select-picker/wd-select-picker.vue +371 -0
  238. package/components/wd-sidebar/index.scss +25 -0
  239. package/components/wd-sidebar/types.ts +34 -0
  240. package/components/wd-sidebar/wd-sidebar.vue +57 -0
  241. package/components/wd-sidebar-item/index.scss +91 -0
  242. package/components/wd-sidebar-item/types.ts +28 -0
  243. package/components/wd-sidebar-item/wd-sidebar-item.vue +118 -0
  244. package/components/wd-signature/index.scss +42 -0
  245. package/components/wd-signature/types.ts +295 -0
  246. package/components/wd-signature/wd-signature.vue +664 -0
  247. package/components/wd-skeleton/index.scss +112 -0
  248. package/components/wd-skeleton/types.ts +124 -0
  249. package/components/wd-skeleton/wd-skeleton.vue +110 -0
  250. package/components/wd-slide-verify/index.scss +112 -0
  251. package/components/wd-slide-verify/types.ts +98 -0
  252. package/components/wd-slide-verify/wd-slide-verify.vue +222 -0
  253. package/components/wd-slider/index.scss +485 -0
  254. package/components/wd-slider/types.ts +166 -0
  255. package/components/wd-slider/wd-slider.vue +529 -0
  256. package/components/wd-sort-button/index.scss +126 -0
  257. package/components/wd-sort-button/types.ts +68 -0
  258. package/components/wd-sort-button/wd-sort-button.vue +67 -0
  259. package/components/wd-step/index.scss +366 -0
  260. package/components/wd-step/types.ts +43 -0
  261. package/components/wd-step/wd-step.vue +181 -0
  262. package/components/wd-steps/index.scss +7 -0
  263. package/components/wd-steps/types.ts +50 -0
  264. package/components/wd-steps/wd-steps.vue +39 -0
  265. package/components/wd-sticky/index.scss +9 -0
  266. package/components/wd-sticky/types.ts +13 -0
  267. package/components/wd-sticky/wd-sticky.vue +192 -0
  268. package/components/wd-sticky-box/index.scss +6 -0
  269. package/components/wd-sticky-box/types.ts +20 -0
  270. package/components/wd-sticky-box/wd-sticky-box.vue +157 -0
  271. package/components/wd-swipe-action/index.scss +22 -0
  272. package/components/wd-swipe-action/types.ts +87 -0
  273. package/components/wd-swipe-action/wd-swipe-action.vue +320 -0
  274. package/components/wd-swiper/index.scss +69 -0
  275. package/components/wd-swiper/types.ts +275 -0
  276. package/components/wd-swiper/wd-swiper.vue +332 -0
  277. package/components/wd-swiper-nav/index.scss +179 -0
  278. package/components/wd-swiper-nav/types.ts +42 -0
  279. package/components/wd-swiper-nav/wd-swiper-nav.vue +42 -0
  280. package/components/wd-switch/index.scss +177 -0
  281. package/components/wd-switch/types.ts +93 -0
  282. package/components/wd-switch/wd-switch.vue +107 -0
  283. package/components/wd-tab/index.scss +16 -0
  284. package/components/wd-tab/types.ts +45 -0
  285. package/components/wd-tab/wd-tab.vue +99 -0
  286. package/components/wd-tabbar/index.scss +71 -0
  287. package/components/wd-tabbar/types.ts +79 -0
  288. package/components/wd-tabbar/wd-tabbar.vue +109 -0
  289. package/components/wd-tabbar-item/index.scss +50 -0
  290. package/components/wd-tabbar-item/types.ts +45 -0
  291. package/components/wd-tabbar-item/wd-tabbar-item.vue +101 -0
  292. package/components/wd-table/index.scss +128 -0
  293. package/components/wd-table/types.ts +160 -0
  294. package/components/wd-table/wd-table.vue +331 -0
  295. package/components/wd-table-column/index.scss +15 -0
  296. package/components/wd-table-column/types.ts +81 -0
  297. package/components/wd-table-column/wd-table-column.vue +198 -0
  298. package/components/wd-tabs/index.scss +332 -0
  299. package/components/wd-tabs/types.ts +155 -0
  300. package/components/wd-tabs/wd-tabs.vue +508 -0
  301. package/components/wd-tag/index.scss +325 -0
  302. package/components/wd-tag/types.ts +90 -0
  303. package/components/wd-tag/wd-tag.vue +158 -0
  304. package/components/wd-text/index.scss +52 -0
  305. package/components/wd-text/types.ts +107 -0
  306. package/components/wd-text/wd-text.vue +141 -0
  307. package/components/wd-textarea/index.scss +112 -0
  308. package/components/wd-textarea/types.ts +151 -0
  309. package/components/wd-textarea/wd-textarea.vue +212 -0
  310. package/components/wd-toast/index.scss +92 -0
  311. package/components/wd-toast/index.ts +97 -0
  312. package/components/wd-toast/types.ts +190 -0
  313. package/components/wd-toast/wd-toast.vue +158 -0
  314. package/components/wd-tooltip/index.scss +77 -0
  315. package/components/wd-tooltip/types.ts +105 -0
  316. package/components/wd-tooltip/wd-tooltip.vue +169 -0
  317. package/components/wd-tour/index.scss +106 -0
  318. package/components/wd-tour/types.ts +268 -0
  319. package/components/wd-tour/wd-tour.vue +518 -0
  320. package/components/wd-transition/index.scss +67 -0
  321. package/components/wd-transition/types.ts +106 -0
  322. package/components/wd-transition/wd-transition.vue +238 -0
  323. package/components/wd-upload/index.scss +204 -0
  324. package/components/wd-upload/types.ts +390 -0
  325. package/components/wd-upload/wd-upload.vue +565 -0
  326. package/components/wd-video-preview/index.scss +54 -0
  327. package/components/wd-video-preview/index.ts +64 -0
  328. package/components/wd-video-preview/types.ts +66 -0
  329. package/components/wd-video-preview/wd-video-preview.vue +141 -0
  330. package/components/wd-watermark/index.scss +21 -0
  331. package/components/wd-watermark/types.ts +130 -0
  332. package/components/wd-watermark/wd-watermark.vue +718 -0
  333. package/components/wot-ui/wot-ui.vue +5 -0
  334. package/composables/index.ts +16 -0
  335. package/composables/useCell.ts +34 -0
  336. package/composables/useChildren.ts +120 -0
  337. package/composables/useConfigProvider.ts +45 -0
  338. package/composables/useCountDown.ts +138 -0
  339. package/composables/useDeviceInfo.ts +136 -0
  340. package/composables/useLockScroll.ts +37 -0
  341. package/composables/useParent.ts +51 -0
  342. package/composables/usePopover.ts +212 -0
  343. package/composables/useQueue.ts +52 -0
  344. package/composables/useRaf.ts +37 -0
  345. package/composables/useTouch.ts +43 -0
  346. package/composables/useTranslate.ts +12 -0
  347. package/composables/useUpload.ts +366 -0
  348. package/global.d.ts +106 -0
  349. package/index.ts +6 -0
  350. package/locale/index.ts +32 -0
  351. package/locale/lang/ar-SA.ts +150 -0
  352. package/locale/lang/de-DE.ts +150 -0
  353. package/locale/lang/en-US.ts +150 -0
  354. package/locale/lang/es-ES.ts +150 -0
  355. package/locale/lang/fr-FR.ts +150 -0
  356. package/locale/lang/ja-JP.ts +150 -0
  357. package/locale/lang/ko-KR.ts +150 -0
  358. package/locale/lang/pt-PT.ts +150 -0
  359. package/locale/lang/ru-RU.ts +150 -0
  360. package/locale/lang/th-TH.ts +150 -0
  361. package/locale/lang/tr-TR.ts +155 -0
  362. package/locale/lang/ug-CN.ts +154 -0
  363. package/locale/lang/vi-VN.ts +89 -0
  364. package/locale/lang/zh-CN.ts +154 -0
  365. package/locale/lang/zh-HK.ts +78 -0
  366. package/locale/lang/zh-TW.ts +78 -0
  367. package/package.json +1 -11
  368. package/styles/iconfont/iconfont.scss +1243 -0
  369. package/styles/mixin/_config.scss +7 -0
  370. package/styles/mixin/_function.scss +44 -0
  371. package/styles/mixin/_mixin.scss +473 -0
  372. package/styles/theme/base/color.scss +210 -0
  373. package/styles/theme/base/font.scss +13 -0
  374. package/styles/theme/base/index.scss +8 -0
  375. package/styles/theme/base/insets.scss +32 -0
  376. package/styles/theme/base/number.scss +36 -0
  377. package/styles/theme/base/opacity.scss +9 -0
  378. package/styles/theme/base/radius.scss +13 -0
  379. package/styles/theme/base/stroke.scss +9 -0
  380. package/styles/theme/base/typography.scss +44 -0
  381. package/styles/theme/dark.scss +101 -0
  382. package/styles/theme/index.scss +16 -0
  383. package/styles/theme/light.scss +101 -0
  384. package/styles/variable.scss +472 -0
  385. package/tags.json +1 -0
  386. package/web-types.json +1 -0
@@ -0,0 +1,526 @@
1
+ <template>
2
+ <view :class="`wd-datetime-picker ${customClass}`" :style="customStyle">
3
+ <wd-popup
4
+ v-model="popupShow"
5
+ position="bottom"
6
+ :hide-when-close="false"
7
+ :close-on-click-modal="closeOnClickModal"
8
+ :safe-area-inset-bottom="safeAreaInsetBottom"
9
+ :z-index="zIndex"
10
+ :root-portal="rootPortal"
11
+ @close="onCancel"
12
+ custom-class="wd-datetime-picker__popup"
13
+ >
14
+ <view class="wd-datetime-picker__wraper">
15
+ <!--title-->
16
+ <view class="wd-datetime-picker__title" @touchmove="noop">
17
+ <!--取消按钮-->
18
+ <view class="wd-datetime-picker__action" @click="onCancel">
19
+ {{ cancelButtonText || translate('cancel') }}
20
+ </view>
21
+ <!--标题-->
22
+ <view v-if="title" class="wd-datetime-picker__title-text">{{ title }}</view>
23
+ <!--确定按钮-->
24
+ <view class="wd-datetime-picker__action" @click="onConfirm">
25
+ {{ confirmButtonText || translate('confirm') }}
26
+ </view>
27
+ </view>
28
+ <view v-if="region" class="wd-datetime-picker__range">
29
+ <view :class="`wd-datetime-picker__range-item ${showStart ? 'is-active' : ''}`" @click="onTabChange('start')">
30
+ {{ showTabLabel[0] || translate('start') }}
31
+ </view>
32
+ <view class="wd-datetime-picker__range-separator"></view>
33
+ <view :class="`wd-datetime-picker__range-item ${!showStart ? 'is-active' : ''}`" @click="onTabChange('end')">
34
+ {{ showTabLabel[1] || translate('end') }}
35
+ </view>
36
+ </view>
37
+ <view :class="showStart ? 'wd-datetime-picker__show' : 'wd-datetime-picker__hidden'">
38
+ <wd-datetime-picker-view
39
+ :custom-class="customViewClass"
40
+ :type="type"
41
+ v-model="innerValue"
42
+ :item-height="itemHeight"
43
+ :visible-item-count="visibleItemCount"
44
+ :value-key="valueKey"
45
+ :label-key="labelKey"
46
+ :formatter="formatter"
47
+ :filter="filter"
48
+ :column-formatter="isArray(modelValue) ? startColumnFormatter : undefined"
49
+ :max-hour="maxHour"
50
+ :min-hour="minHour"
51
+ :max-date="maxDate"
52
+ :min-date="minDate"
53
+ :max-minute="maxMinute"
54
+ :min-minute="minMinute"
55
+ :use-second="useSecond"
56
+ :min-second="minSecond"
57
+ :max-second="maxSecond"
58
+ :immediate-change="immediateChange"
59
+ @change="onChangeStart"
60
+ @pickstart="onPickStart"
61
+ @pickend="onPickEnd"
62
+ />
63
+ </view>
64
+ <view :class="showStart ? 'wd-datetime-picker__hidden' : 'wd-datetime-picker__show'">
65
+ <wd-datetime-picker-view
66
+ :custom-class="customViewClass"
67
+ :type="type"
68
+ v-model="endInnerValue"
69
+ :item-height="itemHeight"
70
+ :visible-item-count="visibleItemCount"
71
+ :value-key="valueKey"
72
+ :label-key="labelKey"
73
+ :formatter="formatter"
74
+ :filter="filter"
75
+ :column-formatter="isArray(modelValue) ? endColumnFormatter : undefined"
76
+ :max-hour="maxHour"
77
+ :min-hour="minHour"
78
+ :max-date="maxDate"
79
+ :min-date="minDate"
80
+ :max-minute="maxMinute"
81
+ :min-minute="minMinute"
82
+ :use-second="useSecond"
83
+ :min-second="minSecond"
84
+ :max-second="maxSecond"
85
+ :immediate-change="immediateChange"
86
+ @change="onChangeEnd"
87
+ @pickstart="onPickStart"
88
+ @pickend="onPickEnd"
89
+ />
90
+ </view>
91
+ </view>
92
+ </wd-popup>
93
+ </view>
94
+ </template>
95
+
96
+ <script lang="ts">
97
+ export default {
98
+ name: 'wd-datetime-picker',
99
+ options: {
100
+ // #ifndef MP-TOUTIAO
101
+ virtualHost: true,
102
+ // #endif
103
+ addGlobalClass: true,
104
+ styleIsolation: 'shared'
105
+ }
106
+ }
107
+ </script>
108
+
109
+ <script lang="ts" setup>
110
+ import wdPopup from '../wd-popup/wd-popup.vue'
111
+ import wdDatetimePickerView from '../wd-datetime-picker-view/wd-datetime-picker-view.vue'
112
+ import { getCurrentInstance, nextTick, onMounted, ref, watch, computed } from 'vue'
113
+ import { deepClone, isArray, isDef, isEqual, padZero } from '../../common/util'
114
+ import { callInterceptor } from '../../common/interceptor'
115
+ import { type DatetimePickerViewColumnType, type DatetimePickerViewOption, type DatetimePickerViewColumn } from '../wd-datetime-picker-view/types'
116
+ import { useTranslate } from '../../composables/useTranslate'
117
+ import { datetimePickerProps, type DatetimePickerExpose } from './types'
118
+ import { formatDate } from '../../common/formatDate'
119
+ import { getPickerValue } from '../wd-datetime-picker-view/util'
120
+
121
+ const props = defineProps(datetimePickerProps)
122
+ const emit = defineEmits(['change', 'open', 'toggle', 'cancel', 'confirm', 'update:modelValue', 'update:visible'])
123
+
124
+ const { translate } = useTranslate('datetime-picker')
125
+
126
+ const popupShow = ref<boolean>(false)
127
+ const showStart = ref<boolean>(true)
128
+ const region = ref<boolean>(false)
129
+ const innerValue = ref<string | number>('')
130
+ const endInnerValue = ref<string | number>('')
131
+
132
+ const showTabLabel = computed(() => {
133
+ if (region.value) {
134
+ const items = (innerValue.value && getPickerSelectedItems('before')) || []
135
+ const endItems = (endInnerValue.value && getPickerSelectedItems('after')) || []
136
+ return [defaultDisplayFormat(items as Record<string, any>[], true), defaultDisplayFormat(endItems as Record<string, any>[], true)]
137
+ }
138
+ return []
139
+ })
140
+
141
+ const isPicking = ref<boolean>(false) // 判断pickview是否还在滑动中
142
+ const hasConfirmed = ref<boolean>(false) // 判断用户是否点击了确认按钮
143
+
144
+ const { proxy } = getCurrentInstance() as any
145
+
146
+ watch(
147
+ () => props.modelValue,
148
+ (val, oldVal) => {
149
+ if (isEqual(val, oldVal)) return
150
+
151
+ resetInnerValue()
152
+ },
153
+ {
154
+ deep: true,
155
+ immediate: true
156
+ }
157
+ )
158
+
159
+ watch(
160
+ () => props.visible,
161
+ (val) => {
162
+ if (val) {
163
+ showPopup()
164
+ } else {
165
+ popupShow.value = false
166
+ }
167
+ }
168
+ )
169
+
170
+ watch(popupShow, (val) => {
171
+ emit('update:visible', val)
172
+ })
173
+
174
+ function resetInnerValue() {
175
+ const { modelValue } = props
176
+ if (isArray(modelValue)) {
177
+ region.value = true
178
+ innerValue.value = deepClone(getDefaultInnerValue(true))
179
+ endInnerValue.value = deepClone(getDefaultInnerValue(true, true))
180
+ } else {
181
+ // 每次value更新时都需要刷新整个列表
182
+ innerValue.value = deepClone(getDefaultInnerValue())
183
+ }
184
+ }
185
+
186
+ /**
187
+ * @description 处理时间边界值判断
188
+ * @param {boolean} isStart 是否是开始时间
189
+ * @param {DatetimePickerViewColumnType} columnType 当前列类型
190
+ * @param {number} value 当前值
191
+ * @param {number[]} currentArray 当前完整选择的数组
192
+ * @param {number[]} boundary 边界值数组
193
+ * @returns {boolean} 是否超出边界
194
+ */
195
+ function isOutOfBoundary(
196
+ isStart: boolean,
197
+ columnType: DatetimePickerViewColumnType,
198
+ value: number,
199
+ currentArray: number[],
200
+ boundary: number[]
201
+ ): boolean {
202
+ const { type, useSecond } = props
203
+
204
+ // 定义各类型的列顺序
205
+ const typeColumns: Record<string, DatetimePickerViewColumnType[]> = {
206
+ datetime: useSecond ? ['year', 'month', 'date', 'hour', 'minute', 'second'] : ['year', 'month', 'date', 'hour', 'minute'],
207
+ 'year-month': ['year', 'month'],
208
+ year: ['year'],
209
+ date: ['year', 'month', 'date'],
210
+ time: useSecond ? ['hour', 'minute', 'second'] : ['hour', 'minute']
211
+ }
212
+
213
+ const columns = typeColumns[type]
214
+ const columnIndex = columns.indexOf(columnType)
215
+
216
+ // 如果当前列不在类型定义中,直接返回 false
217
+ if (columnIndex === -1) return false
218
+
219
+ // 检查当前列之前的所有列是否都在边界上
220
+ // 例如:检查 'date' 时,必须 'year' 和 'month' 都等于边界值
221
+ const isPreColumnsBoundary = columns.slice(0, columnIndex).every((col, index) => {
222
+ return currentArray[index] === boundary[index]
223
+ })
224
+
225
+ if (isPreColumnsBoundary) {
226
+ const boundaryValue = boundary[columnIndex]
227
+ return isStart ? value > boundaryValue : value < boundaryValue
228
+ }
229
+
230
+ return false
231
+ }
232
+
233
+ /**
234
+ * @description 开始时间列格式化
235
+ * @param {DatetimePickerViewOption[][]} columns 列选项
236
+ * @returns {DatetimePickerViewOption[][]} 格式化后的列选项
237
+ */
238
+ function startColumnFormatter(columns: DatetimePickerViewOption[][]) {
239
+ return customColumnFormatter(columns, 'start')
240
+ }
241
+
242
+ /**
243
+ * @description 结束时间列格式化
244
+ * @param {DatetimePickerViewOption[][]} columns 列选项
245
+ * @returns {DatetimePickerViewOption[][]} 格式化后的列选项
246
+ */
247
+ function endColumnFormatter(columns: DatetimePickerViewOption[][]) {
248
+ return customColumnFormatter(columns, 'end')
249
+ }
250
+
251
+ /**
252
+ * @description 自定义列项筛选规则
253
+ * @param {DatetimePickerViewOption[][]} columns 列选项
254
+ * @param {'start' | 'end'} pickerType 选择器类型
255
+ * @returns {DatetimePickerViewOption[][]} 格式化后的列选项
256
+ */
257
+ const customColumnFormatter = (columns: DatetimePickerViewOption[][], pickerType: 'start' | 'end') => {
258
+ const { type } = props
259
+ const startSymbol = pickerType === 'start'
260
+
261
+ const start = innerValue.value
262
+ const end = endInnerValue.value
263
+
264
+ const currentValue = startSymbol ? getPickerValue(start, type, props.useSecond) : getPickerValue(end, type, props.useSecond)
265
+ const boundary = startSymbol ? getPickerValue(end, type, props.useSecond) : getPickerValue(start, type, props.useSecond)
266
+
267
+ // 定义各类型的列顺序
268
+ const typeColumns: Record<string, DatetimePickerViewColumnType[]> = {
269
+ datetime: props.useSecond ? ['year', 'month', 'date', 'hour', 'minute', 'second'] : ['year', 'month', 'date', 'hour', 'minute'],
270
+ 'year-month': ['year', 'month'],
271
+ year: ['year'],
272
+ date: ['year', 'month', 'date'],
273
+ time: props.useSecond ? ['hour', 'minute', 'second'] : ['hour', 'minute']
274
+ }
275
+ const currentColumnTypes = typeColumns[type]
276
+
277
+ return columns.map((column, index) => {
278
+ const columnType = currentColumnTypes[index]
279
+ return column.map((option) => {
280
+ const disabled = isOutOfBoundary(startSymbol, columnType, option.value, currentValue, boundary)
281
+ return {
282
+ ...option,
283
+ disabled
284
+ }
285
+ })
286
+ })
287
+ }
288
+
289
+ onMounted(() => {
290
+ if (props.visible) {
291
+ showPopup()
292
+ }
293
+ })
294
+
295
+ /**
296
+ * @description 根据传入的picker,picker组件获取当前cell展示值。
297
+ * @param {'before' | 'after'} picker picker类型
298
+ * @returns {Record<string, any>[]} 选中项
299
+ */
300
+ function getPickerSelectedItems(picker: 'before' | 'after') {
301
+ let value = picker === 'before' ? innerValue.value : endInnerValue.value
302
+ let selected: number[] = []
303
+ if (value) {
304
+ selected = getPickerValue(value, props.type, props.useSecond)
305
+ }
306
+
307
+ const typeColumns: Record<string, DatetimePickerViewColumnType[]> = {
308
+ datetime: props.useSecond ? ['year', 'month', 'date', 'hour', 'minute', 'second'] : ['year', 'month', 'date', 'hour', 'minute'],
309
+ 'year-month': ['year', 'month'],
310
+ year: ['year'],
311
+ date: ['year', 'month', 'date'],
312
+ time: props.useSecond ? ['hour', 'minute', 'second'] : ['hour', 'minute']
313
+ }
314
+ const currentColumnTypes = typeColumns[props.type]
315
+
316
+ let selects = selected.map((value, index) => {
317
+ const type = currentColumnTypes[index]
318
+ return {
319
+ [props.labelKey]: props.formatter ? props.formatter(type, padZero(value)) : padZero(value),
320
+ [props.valueKey]: value
321
+ }
322
+ })
323
+ return selects
324
+ }
325
+
326
+ function noop() {}
327
+
328
+ /**
329
+ * @description 获取默认内部值
330
+ * @param {boolean} [isRegion] 是否是区域选择
331
+ * @param {boolean} [isEnd] 是否是结束时间
332
+ * @returns {string | number} 默认值
333
+ */
334
+ function getDefaultInnerValue(isRegion?: boolean, isEnd?: boolean): string | number {
335
+ const { modelValue: value, maxDate, minDate, type } = props
336
+ if (isRegion) {
337
+ const index = isEnd ? 1 : 0
338
+ const targetValue = isArray(value) ? (value[index] as string) : ''
339
+ const maxValue = type === 'time' ? formatDate(maxDate, 'HH:mm') : maxDate
340
+ const minValue = type === 'time' ? formatDate(minDate, 'HH:mm') : minDate
341
+ return targetValue || (isEnd ? maxValue : minValue)
342
+ } else {
343
+ return isDef(value) ? (value as string) : ''
344
+ }
345
+ }
346
+
347
+ /**
348
+ * @description 对外暴露接口,打开弹框
349
+ */
350
+ function open() {
351
+ showPopup()
352
+ }
353
+
354
+ /**
355
+ * @description 对外暴露接口,关闭弹框
356
+ */
357
+ function close() {
358
+ onCancel()
359
+ }
360
+
361
+ /**
362
+ * @description 显示弹窗
363
+ */
364
+ function showPopup() {
365
+ if (popupShow.value) return
366
+ emit('open')
367
+ resetInnerValue()
368
+ popupShow.value = true
369
+ showStart.value = true
370
+ }
371
+
372
+ /**
373
+ * @description 区域选择时tab标签切换时触发
374
+ */
375
+ function onTabChange(tab: 'start' | 'end') {
376
+ const isStart = tab === 'start'
377
+ if (showStart.value === isStart) return
378
+ showStart.value = isStart
379
+ emit('toggle', showStart.value ? innerValue.value : endInnerValue.value)
380
+ }
381
+
382
+ /**
383
+ * @description datetimePickerView change 事件
384
+ * @param {object} params 参数
385
+ * @param {number | string} params.value 值
386
+ * @param {DatetimePickerViewColumn[]} params.columns 列
387
+ */
388
+ function onChangeStart({ value, columns }: { value: number | string; columns: DatetimePickerViewColumn[] }) {
389
+ if (region.value) {
390
+ const currentArray = getPickerValue(value, props.type, props.useSecond)
391
+ const boundaryArray = getPickerValue(endInnerValue.value, props.type, props.useSecond)
392
+
393
+ const needsAdjust = columns.some((column, index) => {
394
+ return isOutOfBoundary(true, column.type, currentArray[index], currentArray, boundaryArray)
395
+ })
396
+
397
+ innerValue.value = deepClone(needsAdjust ? endInnerValue.value : value)
398
+
399
+ nextTick(() => {
400
+ emit('change', {
401
+ value: [innerValue.value, endInnerValue.value]
402
+ })
403
+ })
404
+ } else {
405
+ // 非区间选择直接设置值即可
406
+ innerValue.value = deepClone(value)
407
+ emit('change', {
408
+ value: innerValue.value
409
+ })
410
+ }
411
+ }
412
+
413
+ /**
414
+ * @description 区域选择 下方 datetimePickerView change 事件
415
+ * @param {object} params 参数
416
+ * @param {number | string} params.value 值
417
+ * @param {DatetimePickerViewColumn[]} params.columns 列
418
+ */
419
+ function onChangeEnd({ value, columns }: { value: number | string; columns: DatetimePickerViewColumn[] }) {
420
+ const currentArray = getPickerValue(value, props.type, props.useSecond)
421
+ const boundaryArray = getPickerValue(innerValue.value, props.type, props.useSecond)
422
+
423
+ // 检查是否有任何列超出边界
424
+ const needsAdjust = columns.some((column, index) => {
425
+ return isOutOfBoundary(false, column.type, currentArray[index], currentArray, boundaryArray)
426
+ })
427
+
428
+ endInnerValue.value = deepClone(needsAdjust ? innerValue.value : value)
429
+
430
+ nextTick(() => {
431
+ emit('change', {
432
+ value: [innerValue.value, endInnerValue.value]
433
+ })
434
+ })
435
+ }
436
+
437
+ /**
438
+ * @description 点击取消按钮触发。关闭popup,触发cancel事件。
439
+ */
440
+ function onCancel() {
441
+ popupShow.value = false
442
+ emit('cancel')
443
+ }
444
+
445
+ /**
446
+ * @description picker触发confirm事件,同步触发confirm事件
447
+ */
448
+ function onConfirm() {
449
+ // 如果当前还在滑动且未停止下来,则锁住先不确认,等滑完再自动确认,避免pickview值未更新
450
+ if (isPicking.value) {
451
+ hasConfirmed.value = true
452
+ return
453
+ }
454
+
455
+ const { beforeConfirm } = props
456
+ callInterceptor(beforeConfirm, {
457
+ args: [region.value ? [innerValue.value, endInnerValue.value] : innerValue.value],
458
+ done: () => {
459
+ handleConfirm()
460
+ }
461
+ })
462
+ }
463
+
464
+ function onPickStart() {
465
+ isPicking.value = true
466
+ }
467
+
468
+ function onPickEnd() {
469
+ isPicking.value = false
470
+
471
+ // 延迟一会,因为组件层级嵌套过多,日期的计算时间也较长
472
+ setTimeout(() => {
473
+ if (hasConfirmed.value) {
474
+ hasConfirmed.value = false
475
+ onConfirm()
476
+ }
477
+ }, 50)
478
+ }
479
+
480
+ function handleConfirm() {
481
+ const value = region.value ? [innerValue.value, endInnerValue.value] : innerValue.value
482
+ popupShow.value = false
483
+ emit('update:modelValue', value)
484
+ emit('confirm', {
485
+ value
486
+ })
487
+ }
488
+
489
+ /**
490
+ * @description 设置展示值
491
+ * @param {Record<string, any>[]} items 获取到的选中项 包含 { value, label }
492
+ * @param {boolean} [tabLabel=false] 当前返回的是否是展示tab上的标签
493
+ * @returns {string} showValue / showTabLabel
494
+ */
495
+ function defaultDisplayFormat(items: Record<string, any>[], tabLabel: boolean = false) {
496
+ if (items.length === 0) return ''
497
+
498
+ if (tabLabel && props.displayFormatTabLabel) {
499
+ return props.displayFormatTabLabel(items)
500
+ }
501
+
502
+ switch (props.type) {
503
+ case 'year':
504
+ return items[0].label
505
+ case 'date':
506
+ return `${items[0].label}-${items[1].label}-${items[2].label}`
507
+ case 'year-month':
508
+ return `${items[0].label}-${items[1].label}`
509
+ case 'time':
510
+ return props.useSecond ? `${items[0].label}:${items[1].label}:${items[2].label}` : `${items[0].label}:${items[1].label}`
511
+ case 'datetime':
512
+ return props.useSecond
513
+ ? `${items[0].label}-${items[1].label}-${items[2].label} ${items[3].label}:${items[4].label}:${items[5].label}`
514
+ : `${items[0].label}-${items[1].label}-${items[2].label} ${items[3].label}:${items[4].label}`
515
+ }
516
+ }
517
+
518
+ defineExpose<DatetimePickerExpose>({
519
+ open,
520
+ close
521
+ })
522
+ </script>
523
+
524
+ <style lang="scss">
525
+ @use './index.scss';
526
+ </style>
@@ -0,0 +1,171 @@
1
+ import type { ComponentPublicInstance, ExtractPropTypes, PropType } from 'vue'
2
+ import { baseProps, makeBooleanProp, makeNumberProp, makeRequiredProp, makeStringProp, type Numeric } from '../../common/props'
3
+
4
+ export type DateTimeType = 'date' | 'year-month' | 'time' | 'datetime' | 'year'
5
+
6
+ export const datetimePickerViewProps = {
7
+ ...baseProps,
8
+ /**
9
+ * 选中项,当 type 为 time 时,类型为字符串,否则为 时间戳
10
+ * 类型: string | number
11
+ * 必填
12
+ */
13
+ modelValue: makeRequiredProp([String, Number]),
14
+ /**
15
+ * 选项高度
16
+ * 类型: number
17
+ * 默认值: 44
18
+ */
19
+ itemHeight: makeNumberProp(44),
20
+ /**
21
+ * 可见选项数量
22
+ * 类型: number
23
+ * 默认值: 6
24
+ */
25
+ visibleItemCount: makeNumberProp(6),
26
+ /**
27
+ * 选项对象中,value对应的 key
28
+ * 类型: string
29
+ * 默认值: 'value'
30
+ */
31
+ valueKey: makeStringProp('value'),
32
+ /**
33
+ * 选项对象中,展示的文本对应的 key
34
+ * 类型: string
35
+ * 默认值: 'label'
36
+ */
37
+ labelKey: makeStringProp('label'),
38
+ /**
39
+ * 选择器类型
40
+ * 类型: string
41
+ * 可选值: 'date' | 'year-month' | 'time' | 'datetime' | 'year'
42
+ * 默认值: 'datetime'
43
+ */
44
+ type: makeStringProp<DateTimeType>('datetime'),
45
+ /**
46
+ * 自定义过滤选项的函数,返回列的选项数组
47
+ * 类型: function
48
+ */
49
+ filter: Function as PropType<DatetimePickerViewFilter>,
50
+ /**
51
+ * 自定义弹出层选项文案的格式化函数,返回一个字符串
52
+ * 类型: function
53
+ */
54
+ formatter: Function as PropType<DatetimePickerViewFormatter>,
55
+ /**
56
+ * 自定义列的格式化函数
57
+ * 类型: function
58
+ */
59
+ columnFormatter: Function as PropType<DatetimePickerViewColumnFormatter>,
60
+ /**
61
+ * 最小日期
62
+ * 类型: number
63
+ * 默认值: 十年前的1月1日
64
+ */
65
+ minDate: makeNumberProp(new Date(new Date().getFullYear() - 10, 0, 1).getTime()),
66
+ /**
67
+ * 最大日期
68
+ * 类型: number
69
+ * 默认值: 十年后的12月31日
70
+ */
71
+ maxDate: makeNumberProp(new Date(new Date().getFullYear() + 10, 11, 31).getTime()),
72
+ /**
73
+ * 最小小时,time类型时生效
74
+ * 类型: number
75
+ * 默认值: 0
76
+ */
77
+ minHour: makeNumberProp(0),
78
+ /**
79
+ * 最大小时,time类型时生效
80
+ * 类型: number
81
+ * 默认值: 23
82
+ */
83
+ maxHour: makeNumberProp(23),
84
+ /**
85
+ * 最小分钟,time类型时生效
86
+ * 类型: number
87
+ * 默认值: 0
88
+ */
89
+ minMinute: makeNumberProp(0),
90
+ /**
91
+ * 最大分钟,time类型时生效
92
+ * 类型: number
93
+ * 默认值: 59
94
+ */
95
+ maxMinute: makeNumberProp(59),
96
+ /**
97
+ * 是否显示秒选择,仅在 time 和 datetime 类型下生效
98
+ * 类型: boolean
99
+ * 默认值: false
100
+ */
101
+ useSecond: makeBooleanProp(false),
102
+ /**
103
+ * 最小秒数,仅在 time 和 datetime 类型下生效
104
+ * 类型: number
105
+ * 默认值: 0
106
+ */
107
+ minSecond: makeNumberProp(0),
108
+ /**
109
+ * 最大秒数,仅在 time 和 datetime 类型下生效
110
+ * 类型: number
111
+ * 默认值: 59
112
+ */
113
+ maxSecond: makeNumberProp(59),
114
+ /**
115
+ * 是否在手指松开时立即触发picker-view的 change 事件。若不开启则会在滚动动画结束后触发 change 事件,1.2.25版本起提供,仅微信小程序和支付宝小程序支持。
116
+ * 类型: boolean
117
+ * 默认值: false
118
+ */
119
+ immediateChange: makeBooleanProp(false),
120
+ /**
121
+ * 范围选择时,开始时间的最小值,用于处理开始时间和结束时间的联动
122
+ * 类型: number
123
+ */
124
+ boundaryMinDate: Number,
125
+ /**
126
+ * 范围选择时,结束时间的最大值,用于处理开始时间和结束时间的联动
127
+ * 类型: number
128
+ */
129
+ boundaryMaxDate: Number
130
+ }
131
+
132
+ export type DatetimePickerViewColumnType = 'year' | 'month' | 'date' | 'hour' | 'minute' | 'second'
133
+
134
+ export type DatetimePickerViewOption = {
135
+ /**
136
+ * 选项值
137
+ * 类型: string | number
138
+ */
139
+ value: number
140
+ /**
141
+ * 选项显示文本
142
+ * 类型: string | number
143
+ */
144
+ label: string
145
+ /**
146
+ * 是否禁用
147
+ * 类型: boolean
148
+ * 默认值: false
149
+ */
150
+ disabled?: boolean
151
+ }
152
+
153
+ export type DatetimePickerViewColumn = {
154
+ type: DatetimePickerViewColumnType
155
+ values: number[]
156
+ }
157
+ export type DatetimePickerViewFilter = (options: DatetimePickerViewColumn) => number[]
158
+
159
+ export type DatetimePickerViewFormatter = (type: DatetimePickerViewColumnType, value: Numeric) => string
160
+
161
+ export type DatetimePickerViewColumnFormatter = (columns: DatetimePickerViewOption[][]) => DatetimePickerViewOption[][]
162
+
163
+ export type DatetimePickerViewProps = ExtractPropTypes<typeof datetimePickerViewProps>
164
+
165
+ export type DatetimePickerViewExpose = {
166
+ getSelectedOptions: () => Record<string, any> | Record<string, any>[] | undefined
167
+ correctValue: (value: string | number) => string | number
168
+ getOriginColumns: () => DatetimePickerViewColumn[]
169
+ }
170
+
171
+ export type DatetimePickerViewInstance = ComponentPublicInstance<DatetimePickerViewProps, DatetimePickerViewExpose>