@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,451 @@
1
+ import { computed } from 'vue'
2
+ import { dayjs } from '../common/dayjs'
3
+ import { isArray, isFunction, padZero } from '../common/util'
4
+ import { useTranslate } from '../composables/useTranslate'
5
+ import type { CalendarDayType, CalendarItem, CalendarTimeFilter, CalendarType } from './types'
6
+ const { translate } = useTranslate('calendar-view')
7
+
8
+ const weeks = computed(() => {
9
+ return [
10
+ translate('weeks.sun'),
11
+ translate('weeks.mon'),
12
+ translate('weeks.tue'),
13
+ translate('weeks.wed'),
14
+ translate('weeks.thu'),
15
+ translate('weeks.fri'),
16
+ translate('weeks.sat'),
17
+ ]
18
+ })
19
+
20
+ /**
21
+ * 比较两个时间的日期是否相等
22
+ * @param {timestamp} date1
23
+ * @param {timestamp} date2
24
+ */
25
+ export function compareDate(date1: number, date2: number | null) {
26
+ const dateValue1 = new Date(date1)
27
+ const dateValue2 = new Date(date2 || '')
28
+
29
+ const year1 = dateValue1.getFullYear()
30
+ const year2 = dateValue2.getFullYear()
31
+ const month1 = dateValue1.getMonth()
32
+ const month2 = dateValue2.getMonth()
33
+ const day1 = dateValue1.getDate()
34
+ const day2 = dateValue2.getDate()
35
+
36
+ if (year1 === year2) {
37
+ if (month1 === month2) {
38
+ return day1 === day2 ? 0 : day1 > day2 ? 1 : -1
39
+ }
40
+ return month1 === month2 ? 0 : month1 > month2 ? 1 : -1
41
+ }
42
+
43
+ return year1 > year2 ? 1 : -1
44
+ }
45
+
46
+ /**
47
+ * 判断是否是范围选择
48
+ * @param {string} type
49
+ */
50
+ export function isRange(type: CalendarType) {
51
+ return type.indexOf('range') > -1
52
+ }
53
+
54
+ /**
55
+ * 比较两个日期的月份是否相等
56
+ * @param {timestamp} date1
57
+ * @param {timestamp} date2
58
+ */
59
+ export function compareMonth(date1: number, date2: number) {
60
+ const dateValue1 = new Date(date1)
61
+ const dateValue2 = new Date(date2)
62
+
63
+ const year1 = dateValue1.getFullYear()
64
+ const year2 = dateValue2.getFullYear()
65
+ const month1 = dateValue1.getMonth()
66
+ const month2 = dateValue2.getMonth()
67
+
68
+ if (year1 === year2) {
69
+ return month1 === month2 ? 0 : month1 > month2 ? 1 : -1
70
+ }
71
+
72
+ return year1 > year2 ? 1 : -1
73
+ }
74
+
75
+ /**
76
+ * 比较两个日期的年份是否一致
77
+ * @param {timestamp} date1
78
+ * @param {timestamp} date2
79
+ */
80
+ export function compareYear(date1: number, date2: number) {
81
+ const dateValue1 = new Date(date1)
82
+ const dateValue2 = new Date(date2)
83
+
84
+ const year1 = dateValue1.getFullYear()
85
+ const year2 = dateValue2.getFullYear()
86
+
87
+ return year1 === year2 ? 0 : year1 > year2 ? 1 : -1
88
+ }
89
+
90
+ /**
91
+ * 获取一个月的最后一天
92
+ * @param {number} year
93
+ * @param {number} month
94
+ */
95
+ export function getMonthEndDay(year: number, month: number) {
96
+ return 32 - new Date(year, month - 1, 32).getDate()
97
+ }
98
+
99
+ /**
100
+ * 格式化年月
101
+ * @param {timestamp} date
102
+ */
103
+ export function formatMonthTitle(date: number) {
104
+ return dayjs(date).format(translate('monthTitle'))
105
+ }
106
+
107
+ /**
108
+ * 根据下标获取星期
109
+ * @param {number} index
110
+ */
111
+ export function getWeekLabel(index: number) {
112
+ if (index >= 7) {
113
+ index = index % 7
114
+ }
115
+
116
+ return weeks.value[index]
117
+ }
118
+
119
+ /**
120
+ * 获取一个月第一天的样式
121
+ * @param {number} index
122
+ * @param {timestamp} date
123
+ * @param {number} firstDayOfWeek
124
+ */
125
+ export function getFirstDayStyle(index: number, date: number, firstDayOfWeek: number) {
126
+ if (firstDayOfWeek >= 7) {
127
+ firstDayOfWeek = firstDayOfWeek % 7
128
+ }
129
+
130
+ if (index !== 0) return ''
131
+
132
+ const offset = (7 + new Date(date).getDay() - firstDayOfWeek) % 7
133
+
134
+ return 'margin-left: ' + (100 / 7) * offset + '%'
135
+ }
136
+
137
+ /**
138
+ * 格式化年份
139
+ * @param {timestamp} date
140
+ */
141
+ export function formatYearTitle(date: number) {
142
+ return dayjs(date).format(translate('yearTitle'))
143
+ }
144
+
145
+ /**
146
+ * 根据最小日期和最大日期获取这之间总共有几个月份
147
+ * @param {timestamp} minDate
148
+ * @param {timestamp} maxDate
149
+ */
150
+ export function getMonths(minDate: number, maxDate: number) {
151
+ const months: number[] = []
152
+ const month = new Date(minDate)
153
+ month.setDate(1)
154
+
155
+ while (compareMonth(month.getTime(), maxDate) < 1) {
156
+ months.push(month.getTime())
157
+ month.setMonth(month.getMonth() + 1)
158
+ }
159
+
160
+ return months
161
+ }
162
+
163
+ /**
164
+ * 根据最小日期和最大日期获取这之间总共有几年
165
+ * @param {timestamp} minDate
166
+ * @param {timestamp} maxDate
167
+ */
168
+ export function getYears(minDate: number, maxDate: number) {
169
+ const years: number[] = []
170
+ const year = new Date(minDate)
171
+ year.setMonth(0)
172
+ year.setDate(1)
173
+
174
+ while (compareYear(year.getTime(), maxDate) < 1) {
175
+ years.push(year.getTime())
176
+ year.setFullYear(year.getFullYear() + 1)
177
+ }
178
+
179
+ return years
180
+ }
181
+
182
+ /**
183
+ * 获取一个日期所在周的第一天和最后一天
184
+ * @param {timestamp} date
185
+ */
186
+ export function getWeekRange(date: number, firstDayOfWeek: number) {
187
+ if (firstDayOfWeek >= 7) {
188
+ firstDayOfWeek = firstDayOfWeek % 7
189
+ }
190
+
191
+ const dateValue = new Date(date)
192
+ dateValue.setHours(0, 0, 0, 0)
193
+ const year = dateValue.getFullYear()
194
+ const month = dateValue.getMonth()
195
+ const day = dateValue.getDate()
196
+ const week = dateValue.getDay()
197
+
198
+ const weekStart = new Date(year, month, day - ((7 + week - firstDayOfWeek) % 7))
199
+ const weekEnd = new Date(year, month, day + 6 - ((7 + week - firstDayOfWeek) % 7))
200
+
201
+ return [weekStart.getTime(), weekEnd.getTime()]
202
+ }
203
+
204
+ /**
205
+ * 获取日期偏移量
206
+ * @param {timestamp} date1
207
+ * @param {timestamp} date2
208
+ */
209
+ export function getDayOffset(date1: number, date2: number) {
210
+ return (date1 - date2) / (24 * 60 * 60 * 1000) + 1
211
+ }
212
+
213
+ /**
214
+ * 获取偏移日期
215
+ * @param {timestamp} date
216
+ * @param {number} offset
217
+ */
218
+ export function getDayByOffset(date: number, offset: number) {
219
+ const dateValue = new Date(date)
220
+ dateValue.setDate(dateValue.getDate() + offset)
221
+
222
+ return dateValue.getTime()
223
+ }
224
+
225
+ /**
226
+ * 获取月份偏移量
227
+ * @param {timestamp} date1
228
+ * @param {timestamp} date2
229
+ */
230
+ export function getMonthOffset(date1: number, date2: number) {
231
+ const dateValue1 = new Date(date1)
232
+ const dateValue2 = new Date(date2)
233
+
234
+ const year1 = dateValue1.getFullYear()
235
+ const year2 = dateValue2.getFullYear()
236
+ let month1 = dateValue1.getMonth()
237
+ const month2 = dateValue2.getMonth()
238
+
239
+ month1 = (year1 - year2) * 12 + month1
240
+
241
+ return month1 - month2 + 1
242
+ }
243
+
244
+ /**
245
+ * 获取偏移月份
246
+ * @param {timestamp} date
247
+ * @param {number} offset
248
+ */
249
+ export function getMonthByOffset(date: number, offset: number) {
250
+ const dateValue = new Date(date)
251
+ dateValue.setMonth(dateValue.getMonth() + offset)
252
+
253
+ return dateValue.getTime()
254
+ }
255
+
256
+ /**
257
+ * 获取默认时间,格式化为数组
258
+ * @param {array|string|null} defaultTime
259
+ */
260
+ export function getDefaultTime(defaultTime: string[] | string | null) {
261
+ if (isArray(defaultTime)) {
262
+ const startTime = (defaultTime[0] || '00:00:00').split(':').map((item: string) => {
263
+ return parseInt(item)
264
+ })
265
+ const endTime = (defaultTime[1] || '00:00:00').split(':').map((item) => {
266
+ return parseInt(item)
267
+ })
268
+ return [startTime, endTime]
269
+ } else {
270
+ const time = (defaultTime || '00:00:00').split(':').map((item) => {
271
+ return parseInt(item)
272
+ })
273
+
274
+ return [time, time]
275
+ }
276
+ }
277
+
278
+ /**
279
+ * 根据默认时间获取日期
280
+ * @param {timestamp} date
281
+ * @param {array} defaultTime
282
+ */
283
+ export function getDateByDefaultTime(date: number, defaultTime: number[]) {
284
+ const dateValue = new Date(date)
285
+ dateValue.setHours(defaultTime[0])
286
+ dateValue.setMinutes(defaultTime[1])
287
+ dateValue.setSeconds(defaultTime[2])
288
+
289
+ return dateValue.getTime()
290
+ }
291
+
292
+ /**
293
+ * 获取经过 iteratee 格式化后的长度为 n 的数组
294
+ * @param {number} n
295
+ * @param {function} iteratee
296
+ */
297
+ const times = (n: number, iteratee: (index: number) => CalendarItem) => {
298
+ let index: number = -1
299
+ const result: CalendarItem[] = Array(n < 0 ? 0 : n)
300
+ while (++index < n) {
301
+ result[index] = iteratee(index)
302
+ }
303
+ return result
304
+ }
305
+
306
+ /**
307
+ * 获取时分秒
308
+ * @param {timestamp}} date
309
+ */
310
+ const getTime = (date: number) => {
311
+ const dateValue = new Date(date)
312
+ return [dateValue.getHours(), dateValue.getMinutes(), dateValue.getSeconds()]
313
+ }
314
+
315
+ /**
316
+ * 根据最小最大日期获取时间数据,用于填入picker
317
+ * @param {*} param0
318
+ */
319
+ export function getTimeData({
320
+ date,
321
+ minDate,
322
+ maxDate,
323
+ isHideSecond,
324
+ filter,
325
+ }: {
326
+ date: number
327
+ minDate: number
328
+ maxDate: number
329
+ isHideSecond: boolean
330
+ filter?: CalendarTimeFilter
331
+ }) {
332
+ const compareMin = compareDate(date, minDate)
333
+ const compareMax = compareDate(date, maxDate)
334
+
335
+ let minHour = 0
336
+ let maxHour = 23
337
+ let minMinute = 0
338
+ let maxMinute = 59
339
+ let minSecond = 0
340
+ let maxSecond = 59
341
+
342
+ if (compareMin === 0) {
343
+ const minTime = getTime(minDate)
344
+ const currentTime = getTime(date)
345
+
346
+ minHour = minTime[0]
347
+ if (minTime[0] === currentTime[0]) {
348
+ minMinute = minTime[1]
349
+
350
+ if (minTime[1] === currentTime[1]) {
351
+ minSecond = minTime[2]
352
+ }
353
+ }
354
+ }
355
+
356
+ if (compareMax === 0) {
357
+ const maxTime = getTime(maxDate)
358
+ const currentTime = getTime(date)
359
+
360
+ maxHour = maxTime[0]
361
+ if (maxTime[0] === currentTime[0]) {
362
+ maxMinute = maxTime[1]
363
+
364
+ if (maxTime[1] === currentTime[1]) {
365
+ maxSecond = maxTime[2]
366
+ }
367
+ }
368
+ }
369
+
370
+ let columns: CalendarItem[][] = []
371
+ let hours = times(24, (index) => {
372
+ return {
373
+ label: translate('hour', padZero(index)),
374
+ value: index,
375
+ disabled: index < minHour || index > maxHour,
376
+ }
377
+ })
378
+ let minutes = times(60, (index) => {
379
+ return {
380
+ label: translate('minute', padZero(index)),
381
+ value: index,
382
+ disabled: index < minMinute || index > maxMinute,
383
+ }
384
+ })
385
+ let seconds: CalendarItem[] = []
386
+ if (filter && isFunction(filter)) {
387
+ hours = filter({
388
+ type: 'hour',
389
+ values: hours,
390
+ })
391
+ minutes = filter({
392
+ type: 'minute',
393
+ values: minutes,
394
+ })
395
+ }
396
+
397
+ if (!isHideSecond) {
398
+ seconds = times(60, (index) => {
399
+ return {
400
+ label: translate('second', padZero(index)),
401
+ value: index,
402
+ disabled: index < minSecond || index > maxSecond,
403
+ }
404
+ })
405
+ if (filter && isFunction(filter)) {
406
+ seconds = filter({
407
+ type: 'second',
408
+ values: seconds,
409
+ })
410
+ }
411
+ }
412
+
413
+ columns = isHideSecond ? [hours, minutes] : [hours, minutes, seconds]
414
+
415
+ return columns
416
+ }
417
+
418
+ /**
419
+ * 获取当前是第几周
420
+ * @param {timestamp} date
421
+ */
422
+ export function getWeekNumber(date: number | Date) {
423
+ date = new Date(date)
424
+ date.setHours(0, 0, 0, 0)
425
+ // Thursday in current week decides the year.
426
+ date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7))
427
+ // January 4 is always in week 1.
428
+ const week = new Date(date.getFullYear(), 0, 4)
429
+ // Adjust to Thursday in week 1 and count number of weeks from date to week 1.
430
+ // Rounding should be fine for Daylight Saving Time. Its shift should never be more than 12 hours.
431
+ return (
432
+ 1 +
433
+ Math.round(((date.getTime() - week.getTime()) / 86400000 - 3 + ((week.getDay() + 6) % 7)) / 7)
434
+ )
435
+ }
436
+
437
+ export function getItemClass(
438
+ monthType: CalendarDayType,
439
+ value: number | (number | null)[],
440
+ type: CalendarType,
441
+ ) {
442
+ const classList = ['is-' + monthType]
443
+
444
+ if (type.indexOf('range') > -1 && isArray(value)) {
445
+ if (!value || !value[1]) {
446
+ classList.push('is-without-end')
447
+ }
448
+ }
449
+
450
+ return classList.join(' ')
451
+ }
@@ -0,0 +1,111 @@
1
+ <template>
2
+ <view :class="`wd-calendar-view ${customClass}`">
3
+ <year-panel
4
+ v-if="type === 'month' || type === 'monthrange'"
5
+ ref="yearPanelRef"
6
+ :type="type"
7
+ :value="modelValue"
8
+ :min-date="minDate"
9
+ :max-date="maxDate"
10
+ :formatter="formatter"
11
+ :max-range="maxRange"
12
+ :range-prompt="rangePrompt"
13
+ :allow-same-day="allowSameDay"
14
+ :show-panel-title="showPanelTitle"
15
+ :default-time="formatDefauleTime"
16
+ :panel-height="panelHeight"
17
+ @change="handleChange"
18
+ />
19
+ <month-panel
20
+ v-else
21
+ ref="monthPanelRef"
22
+ :type="type"
23
+ :value="modelValue"
24
+ :min-date="minDate"
25
+ :max-date="maxDate"
26
+ :first-day-of-week="firstDayOfWeek"
27
+ :formatter="formatter"
28
+ :max-range="maxRange"
29
+ :range-prompt="rangePrompt"
30
+ :allow-same-day="allowSameDay"
31
+ :show-panel-title="showPanelTitle"
32
+ :default-time="formatDefauleTime"
33
+ :panel-height="panelHeight"
34
+ :immediate-change="immediateChange"
35
+ :time-filter="timeFilter"
36
+ :hide-second="hideSecond"
37
+ @change="handleChange"
38
+ @pickstart="handlePickStart"
39
+ @pickend="handlePickEnd"
40
+ />
41
+ </view>
42
+ </template>
43
+ <script lang="ts">
44
+ export default {
45
+ name: 'wd-calendar-view',
46
+ options: {
47
+ addGlobalClass: true,
48
+ virtualHost: true,
49
+ styleIsolation: 'shared',
50
+ },
51
+ }
52
+ </script>
53
+
54
+ <script lang="ts" setup>
55
+ import { ref, watch } from 'vue'
56
+ import { getDefaultTime } from './utils'
57
+ import yearPanel from './yearPanel/year-panel.vue'
58
+ import MonthPanel from './monthPanel/month-panel.vue'
59
+ import { calendarViewProps, type CalendarViewExpose } from './types'
60
+
61
+ const props = defineProps(calendarViewProps)
62
+ const emit = defineEmits(['change', 'update:modelValue', 'pickstart', 'pickend'])
63
+ const formatDefauleTime = ref<number[][]>([])
64
+
65
+ const yearPanelRef = ref()
66
+ const monthPanelRef = ref()
67
+
68
+ watch(
69
+ () => props.defaultTime,
70
+ (newValue) => {
71
+ formatDefauleTime.value = getDefaultTime(newValue)
72
+ },
73
+ {
74
+ deep: true,
75
+ immediate: true,
76
+ },
77
+ )
78
+
79
+ /**
80
+ * 使当前日期或者选中日期滚动到可视区域
81
+ */
82
+ function scrollIntoView() {
83
+ const panel = getPanel()
84
+ panel.scrollIntoView && panel.scrollIntoView()
85
+ }
86
+
87
+ function getPanel() {
88
+ return props.type.indexOf('month') > -1 ? yearPanelRef.value : monthPanelRef.value
89
+ }
90
+
91
+ function handleChange({ value }: { value: number | number[] | null }) {
92
+ emit('update:modelValue', value)
93
+ emit('change', {
94
+ value,
95
+ })
96
+ }
97
+ function handlePickStart() {
98
+ emit('pickstart')
99
+ }
100
+ function handlePickEnd() {
101
+ emit('pickend')
102
+ }
103
+
104
+ defineExpose<CalendarViewExpose>({
105
+ scrollIntoView,
106
+ })
107
+ </script>
108
+
109
+ <style lang="scss" scoped>
110
+ @import './index';
111
+ </style>
@@ -0,0 +1,148 @@
1
+ @import '../../common/abstracts/variable';
2
+ @import '../../common/abstracts/mixin';
3
+
4
+ .wot-theme-dark {
5
+ @include b(year) {
6
+ @include e(title) {
7
+ color: $-dark-color;
8
+ }
9
+
10
+ @include e(months) {
11
+ color: $-dark-color;
12
+ }
13
+
14
+ @include e(month) {
15
+ @include when(disabled) {
16
+ .wd-year__month-text {
17
+ color: $-dark-color-gray;
18
+ }
19
+ }
20
+ }
21
+ }
22
+ }
23
+
24
+ @include b(year) {
25
+ @include e(title) {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ height: 45px;
30
+ font-size: $-calendar-panel-title-fs;
31
+ color: $-calendar-panel-title-color;
32
+ }
33
+
34
+ @include e(months) {
35
+ display: flex;
36
+ flex-wrap: wrap;
37
+ font-size: $-calendar-day-fs;
38
+ color: $-calendar-day-color;
39
+ }
40
+
41
+ @include e(month) {
42
+ position: relative;
43
+ width: 25%;
44
+ height: $-calendar-day-height;
45
+ line-height: $-calendar-day-height;
46
+ text-align: center;
47
+
48
+ @include when(disabled) {
49
+ .wd-year__month-text {
50
+ color: $-calendar-disabled-color;
51
+ }
52
+ }
53
+
54
+ @include when(current) {
55
+ color: $-calendar-active-color;
56
+ }
57
+
58
+ @include when(selected) {
59
+ color: #fff;
60
+
61
+ .wd-year__month-text {
62
+ background: $-calendar-active-color;
63
+ border-radius: $-calendar-active-border;
64
+ }
65
+ }
66
+
67
+ @include when(middle) {
68
+ background: $-calendar-range-color;
69
+ }
70
+
71
+ @include when(start) {
72
+ color: #fff;
73
+
74
+ &::after {
75
+ position: absolute;
76
+ top: 0;
77
+ right: 0;
78
+ bottom: 0;
79
+ left: 50%;
80
+ content: '';
81
+ background: $-calendar-range-color;
82
+ }
83
+
84
+ .wd-year__month-text {
85
+ background: $-calendar-active-color;
86
+ border-radius: $-calendar-active-border;
87
+ }
88
+
89
+ &.is-without-end::after {
90
+ display: none;
91
+ }
92
+ }
93
+
94
+ @include when(end) {
95
+ color: #fff;
96
+
97
+ &::after {
98
+ position: absolute;
99
+ top: 0;
100
+ right: 50%;
101
+ bottom: 0;
102
+ left: 0;
103
+ content: '';
104
+ background: $-calendar-range-color;
105
+ }
106
+
107
+ .wd-year__month-text {
108
+ background: $-calendar-active-color;
109
+ border-radius: $-calendar-active-border;
110
+ }
111
+ }
112
+
113
+ @include when(same) {
114
+ color: #fff;
115
+
116
+ .wd-year__month-text {
117
+ background: $-calendar-active-color;
118
+ border-radius: $-calendar-active-border;
119
+ }
120
+ }
121
+ }
122
+
123
+ @include e(month-text) {
124
+ width: $-calendar-month-width;
125
+ margin: 0 auto;
126
+ text-align: center;
127
+ }
128
+
129
+ @include e(month-top) {
130
+ position: absolute;
131
+ top: 10px;
132
+ right: 0;
133
+ left: 0;
134
+ font-size: $-calendar-info-fs;
135
+ line-height: 1.1;
136
+ text-align: center;
137
+ }
138
+
139
+ @include e(month-bottom) {
140
+ position: absolute;
141
+ right: 0;
142
+ bottom: 10px;
143
+ left: 0;
144
+ font-size: $-calendar-info-fs;
145
+ line-height: 1.1;
146
+ text-align: center;
147
+ }
148
+ }
@@ -0,0 +1,19 @@
1
+ import type { PropType } from 'vue'
2
+ import { makeBooleanProp, makeRequiredProp } from '../../common/props'
3
+ import type { CalendarFormatter, CalendarType } from '../types'
4
+
5
+ export const yearProps = {
6
+ type: makeRequiredProp(String as PropType<CalendarType>),
7
+ date: makeRequiredProp(Number),
8
+ value: makeRequiredProp([Number, Array] as PropType<number | (number | null)[] | null>),
9
+ minDate: makeRequiredProp(Number),
10
+ maxDate: makeRequiredProp(Number),
11
+ // 日期格式化函数
12
+ formatter: Function as PropType<CalendarFormatter>,
13
+ maxRange: Number,
14
+ rangePrompt: String,
15
+ allowSameDay: makeBooleanProp(false),
16
+ defaultTime: {
17
+ type: [Array] as PropType<Array<number[]>>,
18
+ },
19
+ }