@zkwq/business 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 (231) hide show
  1. package/dist/index.css +1 -0
  2. package/dist/index.js +21861 -0
  3. package/dist/index.umd.cjs +46 -0
  4. package/package.json +27 -0
  5. package/src/components/base/ui/alert/Alert.vue +94 -0
  6. package/src/components/base/ui/autocomplete/autocomplete-suggestions.vue +77 -0
  7. package/src/components/base/ui/autocomplete/autocomplete.vue +305 -0
  8. package/src/components/base/ui/backtop/main.vue +112 -0
  9. package/src/components/base/ui/button/Button.vue +84 -0
  10. package/src/components/base/ui/button/ButtonGroup.vue +10 -0
  11. package/src/components/base/ui/carousel/Carousel.vue +304 -0
  12. package/src/components/base/ui/carousel/CarouselItem.vue +137 -0
  13. package/src/components/base/ui/cascader/cascader.vue +650 -0
  14. package/src/components/base/ui/cascader-panel/cascader-menu.vue +138 -0
  15. package/src/components/base/ui/cascader-panel/cascader-node.vue +246 -0
  16. package/src/components/base/ui/cascader-panel/cascader-panel.vue +382 -0
  17. package/src/components/base/ui/cascader-panel/node.js +166 -0
  18. package/src/components/base/ui/cascader-panel/store.js +62 -0
  19. package/src/components/base/ui/checkbox/checkbox-button.vue +199 -0
  20. package/src/components/base/ui/checkbox/checkbox-group.vue +48 -0
  21. package/src/components/base/ui/checkbox/checkbox.vue +222 -0
  22. package/src/components/base/ui/col/col.js +71 -0
  23. package/src/components/base/ui/collapse/collapse-item.vue +180 -0
  24. package/src/components/base/ui/collapse/collapse.vue +73 -0
  25. package/src/components/base/ui/color-picker/color.js +317 -0
  26. package/src/components/base/ui/color-picker/components/alpha-slider.vue +132 -0
  27. package/src/components/base/ui/color-picker/components/hue-slider.vue +123 -0
  28. package/src/components/base/ui/color-picker/components/picker-dropdown.vue +119 -0
  29. package/src/components/base/ui/color-picker/components/predefine.vue +61 -0
  30. package/src/components/base/ui/color-picker/components/sv-panel.vue +100 -0
  31. package/src/components/base/ui/color-picker/draggable.js +36 -0
  32. package/src/components/base/ui/color-picker/index.js +2 -0
  33. package/src/components/base/ui/color-picker/main.vue +188 -0
  34. package/src/components/base/ui/date-picker/basic/date-table.vue +441 -0
  35. package/src/components/base/ui/date-picker/basic/month-table.vue +254 -0
  36. package/src/components/base/ui/date-picker/basic/time-spinner.vue +304 -0
  37. package/src/components/base/ui/date-picker/basic/year-table.vue +101 -0
  38. package/src/components/base/ui/date-picker/panel/date-range.vue +680 -0
  39. package/src/components/base/ui/date-picker/panel/date.vue +597 -0
  40. package/src/components/base/ui/date-picker/panel/month-range.vue +289 -0
  41. package/src/components/base/ui/date-picker/panel/time-range.vue +248 -0
  42. package/src/components/base/ui/date-picker/panel/time-select.vue +178 -0
  43. package/src/components/base/ui/date-picker/panel/time.vue +186 -0
  44. package/src/components/base/ui/date-picker/picker/date-picker.js +43 -0
  45. package/src/components/base/ui/date-picker/picker/time-picker.js +39 -0
  46. package/src/components/base/ui/date-picker/picker/time-select.js +21 -0
  47. package/src/components/base/ui/date-picker/picker.vue +942 -0
  48. package/src/components/base/ui/dialog/Index.vue +212 -0
  49. package/src/components/base/ui/directive/repeat-click.js +24 -0
  50. package/src/components/base/ui/directive/ripple.js +303 -0
  51. package/src/components/base/ui/divider/Divider.vue +37 -0
  52. package/src/components/base/ui/drawer/Drawer.vue +202 -0
  53. package/src/components/base/ui/dropdown/dropdown-item.vue +39 -0
  54. package/src/components/base/ui/dropdown/dropdown-menu.vue +63 -0
  55. package/src/components/base/ui/dropdown/dropdown.vue +308 -0
  56. package/src/components/base/ui/form/Form.vue +167 -0
  57. package/src/components/base/ui/form/FormItem.vue +334 -0
  58. package/src/components/base/ui/form/LabelWrap.vue +69 -0
  59. package/src/components/base/ui/icon/icon.vue +13 -0
  60. package/src/components/base/ui/image/image-viewer.vue +302 -0
  61. package/src/components/base/ui/image/main.vue +248 -0
  62. package/src/components/base/ui/index.js +189 -0
  63. package/src/components/base/ui/input/Input.vue +438 -0
  64. package/src/components/base/ui/input/calcTextareaHeight.js +104 -0
  65. package/src/components/base/ui/input-number/input-number.vue +285 -0
  66. package/src/components/base/ui/locale/format.js +32 -0
  67. package/src/components/base/ui/locale/index.js +48 -0
  68. package/src/components/base/ui/locale/lang/zh-CN.js +120 -0
  69. package/src/components/base/ui/menu/menu-item-group.vue +45 -0
  70. package/src/components/base/ui/menu/menu-item.vue +112 -0
  71. package/src/components/base/ui/menu/menu-mixin.js +44 -0
  72. package/src/components/base/ui/menu/menu.vue +312 -0
  73. package/src/components/base/ui/menu/submenu.vue +408 -0
  74. package/src/components/base/ui/message/index.js +2 -0
  75. package/src/components/base/ui/message/main.js +87 -0
  76. package/src/components/base/ui/message/main.vue +110 -0
  77. package/src/components/base/ui/message-box/main.js +216 -0
  78. package/src/components/base/ui/message-box/main.vue +323 -0
  79. package/src/components/base/ui/mixin/emitter.js +31 -0
  80. package/src/components/base/ui/mixin/focus.js +9 -0
  81. package/src/components/base/ui/mixin/locale.js +9 -0
  82. package/src/components/base/ui/mixin/migrating.js +33 -0
  83. package/src/components/base/ui/pagination/pager.vue +163 -0
  84. package/src/components/base/ui/pagination/pagination.jsx +391 -0
  85. package/src/components/base/ui/popover/directive.js +20 -0
  86. package/src/components/base/ui/popover/index.js +14 -0
  87. package/src/components/base/ui/popover/main.vue +236 -0
  88. package/src/components/base/ui/progress/Progress.vue +227 -0
  89. package/src/components/base/ui/radio/radio-button.vue +114 -0
  90. package/src/components/base/ui/radio/radio-group.vue +111 -0
  91. package/src/components/base/ui/radio/radio.vue +134 -0
  92. package/src/components/base/ui/row/row.js +47 -0
  93. package/src/components/base/ui/scrollbar/bar.jsx +91 -0
  94. package/src/components/base/ui/scrollbar/index.jsx +203 -0
  95. package/src/components/base/ui/scrollbar/util.js +32 -0
  96. package/src/components/base/ui/select/Option.vue +168 -0
  97. package/src/components/base/ui/select/OptionGroup.vue +60 -0
  98. package/src/components/base/ui/select/Select.vue +920 -0
  99. package/src/components/base/ui/select/SelectDropdown.vue +74 -0
  100. package/src/components/base/ui/select/navigation-mixin.js +54 -0
  101. package/src/components/base/ui/skeleton/index.js +8 -0
  102. package/src/components/base/ui/skeleton/src/img-placeholder.vue +16 -0
  103. package/src/components/base/ui/skeleton/src/index.vue +80 -0
  104. package/src/components/base/ui/skeleton/src/item.vue +22 -0
  105. package/src/components/base/ui/skeleton-item/index.js +8 -0
  106. package/src/components/base/ui/slider/button.vue +238 -0
  107. package/src/components/base/ui/slider/main.vue +427 -0
  108. package/src/components/base/ui/slider/marker.js +18 -0
  109. package/src/components/base/ui/style/alert.scss +147 -0
  110. package/src/components/base/ui/style/animations.scss +65 -0
  111. package/src/components/base/ui/style/autocomplete.scss +81 -0
  112. package/src/components/base/ui/style/backtop.scss +20 -0
  113. package/src/components/base/ui/style/button-group.scss +0 -0
  114. package/src/components/base/ui/style/button.scss +380 -0
  115. package/src/components/base/ui/style/carousel-item.scss +50 -0
  116. package/src/components/base/ui/style/carousel.scss +161 -0
  117. package/src/components/base/ui/style/cascader-panel.scss +120 -0
  118. package/src/components/base/ui/style/cascader.scss +185 -0
  119. package/src/components/base/ui/style/checkbox-button.scss +0 -0
  120. package/src/components/base/ui/style/checkbox-group.scss +0 -0
  121. package/src/components/base/ui/style/checkbox.scss +360 -0
  122. package/src/components/base/ui/style/col.scss +156 -0
  123. package/src/components/base/ui/style/collapse-item.scss +0 -0
  124. package/src/components/base/ui/style/collapse.scss +114 -0
  125. package/src/components/base/ui/style/color-picker.scss +387 -0
  126. package/src/components/base/ui/style/config.scss +4 -0
  127. package/src/components/base/ui/style/date-picker/date-picker.scss +97 -0
  128. package/src/components/base/ui/style/date-picker/date-range-picker.scss +101 -0
  129. package/src/components/base/ui/style/date-picker/date-table.scss +151 -0
  130. package/src/components/base/ui/style/date-picker/month-table.scss +82 -0
  131. package/src/components/base/ui/style/date-picker/picker-panel.scss +117 -0
  132. package/src/components/base/ui/style/date-picker/picker.scss +197 -0
  133. package/src/components/base/ui/style/date-picker/time-picker.scss +85 -0
  134. package/src/components/base/ui/style/date-picker/time-range-picker.scss +31 -0
  135. package/src/components/base/ui/style/date-picker/time-spinner.scss +110 -0
  136. package/src/components/base/ui/style/date-picker/year-table.scss +51 -0
  137. package/src/components/base/ui/style/date-picker.scss +12 -0
  138. package/src/components/base/ui/style/dialog.scss +123 -0
  139. package/src/components/base/ui/style/divider.scss +47 -0
  140. package/src/components/base/ui/style/drawer.scss +218 -0
  141. package/src/components/base/ui/style/dropdown-item.scss +0 -0
  142. package/src/components/base/ui/style/dropdown-menu.scss +0 -0
  143. package/src/components/base/ui/style/dropdown.scss +185 -0
  144. package/src/components/base/ui/style/form-item.scss +0 -0
  145. package/src/components/base/ui/style/form.scss +203 -0
  146. package/src/components/base/ui/style/function.scss +43 -0
  147. package/src/components/base/ui/style/icon.scss +1167 -0
  148. package/src/components/base/ui/style/image.scss +184 -0
  149. package/src/components/base/ui/style/index.scss +57 -0
  150. package/src/components/base/ui/style/input-number.scss +187 -0
  151. package/src/components/base/ui/style/input.scss +477 -0
  152. package/src/components/base/ui/style/menu-item-group.scss +0 -0
  153. package/src/components/base/ui/style/menu-item.scss +0 -0
  154. package/src/components/base/ui/style/menu.scss +294 -0
  155. package/src/components/base/ui/style/message-box.scss +231 -0
  156. package/src/components/base/ui/style/message.scss +120 -0
  157. package/src/components/base/ui/style/mixins.scss +196 -0
  158. package/src/components/base/ui/style/option-group.scss +42 -0
  159. package/src/components/base/ui/style/option.scss +36 -0
  160. package/src/components/base/ui/style/pagination.scss +295 -0
  161. package/src/components/base/ui/style/popover.scss +40 -0
  162. package/src/components/base/ui/style/popper.scss +102 -0
  163. package/src/components/base/ui/style/popup.scss +42 -0
  164. package/src/components/base/ui/style/progress.scss +141 -0
  165. package/src/components/base/ui/style/radio-button.scss +113 -0
  166. package/src/components/base/ui/style/radio-group.scss +9 -0
  167. package/src/components/base/ui/style/radio.scss +203 -0
  168. package/src/components/base/ui/style/ripple.scss +35 -0
  169. package/src/components/base/ui/style/row.scss +39 -0
  170. package/src/components/base/ui/style/scrollbar.scss +75 -0
  171. package/src/components/base/ui/style/select-dropdown.scss +59 -0
  172. package/src/components/base/ui/style/select.scss +154 -0
  173. package/src/components/base/ui/style/skeleton-item.scss +84 -0
  174. package/src/components/base/ui/style/skeleton.scss +40 -0
  175. package/src/components/base/ui/style/slider.scss +250 -0
  176. package/src/components/base/ui/style/switch.scss +116 -0
  177. package/src/components/base/ui/style/tabs.scss +602 -0
  178. package/src/components/base/ui/style/tag.scss +174 -0
  179. package/src/components/base/ui/style/tooltip.scss +146 -0
  180. package/src/components/base/ui/style/transition.scss +138 -0
  181. package/src/components/base/ui/style/upload.scss +603 -0
  182. package/src/components/base/ui/style/utils.scss +39 -0
  183. package/src/components/base/ui/style/var.scss +1007 -0
  184. package/src/components/base/ui/switch/index.vue +174 -0
  185. package/src/components/base/ui/tabs/tab-bar.vue +57 -0
  186. package/src/components/base/ui/tabs/tab-nav.vue +294 -0
  187. package/src/components/base/ui/tabs/tab-pane.vue +56 -0
  188. package/src/components/base/ui/tabs/tabs.vue +191 -0
  189. package/src/components/base/ui/tag/Tag.vue +60 -0
  190. package/src/components/base/ui/tooltip/tooltip.jsx +234 -0
  191. package/src/components/base/ui/upload/Index.vue +340 -0
  192. package/src/components/base/ui/upload/Upload.vue +216 -0
  193. package/src/components/base/ui/upload/UploadDragger.vue +70 -0
  194. package/src/components/base/ui/upload/UploadList.vue +100 -0
  195. package/src/components/base/ui/upload/ajax.js +85 -0
  196. package/src/components/base/ui/util/aria-dialog.js +90 -0
  197. package/src/components/base/ui/util/aria-utils.js +122 -0
  198. package/src/components/base/ui/util/clickoutside.js +76 -0
  199. package/src/components/base/ui/util/date-util.js +292 -0
  200. package/src/components/base/ui/util/date.js +370 -0
  201. package/src/components/base/ui/util/debounce.js +21 -0
  202. package/src/components/base/ui/util/deepmerge.js +100 -0
  203. package/src/components/base/ui/util/dom.js +215 -0
  204. package/src/components/base/ui/util/index.js +262 -0
  205. package/src/components/base/ui/util/menu/aria-menubar.js +14 -0
  206. package/src/components/base/ui/util/menu/aria-menuitem.js +49 -0
  207. package/src/components/base/ui/util/menu/aria-submenu.js +59 -0
  208. package/src/components/base/ui/util/merge.js +14 -0
  209. package/src/components/base/ui/util/popper.js +1235 -0
  210. package/src/components/base/ui/util/popup/index.js +218 -0
  211. package/src/components/base/ui/util/popup/popup-manager.js +194 -0
  212. package/src/components/base/ui/util/resize-events.js +32 -0
  213. package/src/components/base/ui/util/scroll-into-view.js +27 -0
  214. package/src/components/base/ui/util/scrollbar-width.js +29 -0
  215. package/src/components/base/ui/util/shared.js +7 -0
  216. package/src/components/base/ui/util/throttle.js +91 -0
  217. package/src/components/base/ui/util/types.js +24 -0
  218. package/src/components/base/ui/util/vdom.js +5 -0
  219. package/src/components/base/ui/util/vue-popper.js +188 -0
  220. package/src/components/normal/AggsItemH.vue +139 -0
  221. package/src/index.js +10 -0
  222. package/src/static/base-icons.ttf +0 -0
  223. package/src/static/base-icons.woff +0 -0
  224. package/src/static/label_bg.png +0 -0
  225. package/src/static/term-label-bg.png +0 -0
  226. package/src/style/app-article.scss +698 -0
  227. package/src/style/app-comment.scss +259 -0
  228. package/src/style/app-recommend.scss +48 -0
  229. package/src/style/app-richtext.scss +176 -0
  230. package/src/style/index.scss +523 -0
  231. package/vite.config.js +38 -0
@@ -0,0 +1,304 @@
1
+ <template>
2
+ <div class="base-time-spinner" :class="{ 'has-seconds': showSeconds }">
3
+ <template v-if="!arrowControl">
4
+ <base-scrollbar
5
+ @mouseenter.native="emitSelectRange('hours')"
6
+ @mousemove.native="adjustCurrentSpinner('hours')"
7
+ class="base-time-spinner__wrapper"
8
+ wrap-style="max-height: inherit;"
9
+ view-class="base-time-spinner__list"
10
+ noresize
11
+ tag="ul"
12
+ ref="hours">
13
+ <li
14
+ @click="handleClick('hours', { value: hour, disabled: disabled })"
15
+ v-for="(disabled, hour) in hoursList"
16
+ class="base-time-spinner__item"
17
+ :key="hour"
18
+ :class="{ 'active': hour === hours, 'disabled': disabled }">{{ ('0' + (amPmMode ? (hour % 12 || 12) : hour )).slice(-2) }}{{ amPm(hour) }}</li>
19
+ </base-scrollbar>
20
+ <base-scrollbar
21
+ @mouseenter.native="emitSelectRange('minutes')"
22
+ @mousemove.native="adjustCurrentSpinner('minutes')"
23
+ class="base-time-spinner__wrapper"
24
+ wrap-style="max-height: inherit;"
25
+ view-class="base-time-spinner__list"
26
+ noresize
27
+ tag="ul"
28
+ ref="minutes">
29
+ <li
30
+ @click="handleClick('minutes', { value: key, disabled: false })"
31
+ v-for="(enabled, key) in minutesList"
32
+ :key="key"
33
+ class="base-time-spinner__item"
34
+ :class="{ 'active': key === minutes, disabled: !enabled }">{{ ('0' + key).slice(-2) }}</li>
35
+ </base-scrollbar>
36
+ <base-scrollbar
37
+ v-show="showSeconds"
38
+ @mouseenter.native="emitSelectRange('seconds')"
39
+ @mousemove.native="adjustCurrentSpinner('seconds')"
40
+ class="base-time-spinner__wrapper"
41
+ wrap-style="max-height: inherit;"
42
+ view-class="base-time-spinner__list"
43
+ noresize
44
+ tag="ul"
45
+ ref="seconds">
46
+ <li
47
+ @click="handleClick('seconds', { value: key, disabled: false })"
48
+ v-for="(second, key) in 60"
49
+ class="base-time-spinner__item"
50
+ :class="{ 'active': key === seconds }"
51
+ :key="key">{{ ('0' + key).slice(-2) }}</li>
52
+ </base-scrollbar>
53
+ </template>
54
+ <template v-if="arrowControl">
55
+ <div
56
+ @mouseenter="emitSelectRange('hours')"
57
+ class="base-time-spinner__wrapper is-arrow">
58
+ <i v-repeat-click="decrease" class="base-time-spinner__arrow base-icon-arrow-up"></i>
59
+ <i v-repeat-click="increase" class="base-time-spinner__arrow base-icon-arrow-down"></i>
60
+ <ul class="base-time-spinner__list" ref="hours">
61
+ <li
62
+ class="base-time-spinner__item"
63
+ :class="{ 'active': hour === hours, 'disabled': hoursList[hour] }"
64
+ v-for="(hour, key) in arrowHourList"
65
+ :key="key">{{ hour === undefined ? '' : ('0' + (amPmMode ? (hour % 12 || 12) : hour )).slice(-2) + amPm(hour) }}</li>
66
+ </ul>
67
+ </div>
68
+ <div
69
+ @mouseenter="emitSelectRange('minutes')"
70
+ class="base-time-spinner__wrapper is-arrow">
71
+ <i v-repeat-click="decrease" class="base-time-spinner__arrow base-icon-arrow-up"></i>
72
+ <i v-repeat-click="increase" class="base-time-spinner__arrow base-icon-arrow-down"></i>
73
+ <ul class="base-time-spinner__list" ref="minutes">
74
+ <li
75
+ class="base-time-spinner__item"
76
+ :class="{ 'active': minute === minutes }"
77
+ v-for="(minute, key) in arrowMinuteList"
78
+ :key="key">
79
+ {{ minute === undefined ? '' : ('0' + minute).slice(-2) }}
80
+ </li>
81
+ </ul>
82
+ </div>
83
+ <div
84
+ @mouseenter="emitSelectRange('seconds')"
85
+ class="base-time-spinner__wrapper is-arrow"
86
+ v-if="showSeconds">
87
+ <i v-repeat-click="decrease" class="base-time-spinner__arrow base-icon-arrow-up"></i>
88
+ <i v-repeat-click="increase" class="base-time-spinner__arrow base-icon-arrow-down"></i>
89
+ <ul class="base-time-spinner__list" ref="seconds">
90
+ <li
91
+ v-for="(second, key) in arrowSecondList"
92
+ class="base-time-spinner__item"
93
+ :class="{ 'active': second === seconds }"
94
+ :key="key">
95
+ {{ second === undefined ? '' : ('0' + second).slice(-2) }}
96
+ </li>
97
+ </ul>
98
+ </div>
99
+ </template>
100
+ </div>
101
+ </template>
102
+
103
+ <script type="text/babel">
104
+ import { getRangeHours, getRangeMinutes, modifyTime } from '../../util/date-util';
105
+ import BaseScrollbar from '../../scrollbar';
106
+ import RepeatClick from '../../directive/repeat-click';
107
+
108
+ export default {
109
+ components: { BaseScrollbar },
110
+
111
+ directives: {
112
+ repeatClick: RepeatClick
113
+ },
114
+
115
+ props: {
116
+ date: {},
117
+ defaultValue: {}, // reserved for future use
118
+ showSeconds: {
119
+ type: Boolean,
120
+ default: true
121
+ },
122
+ arrowControl: Boolean,
123
+ amPmMode: {
124
+ type: String,
125
+ default: '' // 'a': am/pm; 'A': AM/PM
126
+ }
127
+ },
128
+
129
+ computed: {
130
+ hours() {
131
+ return this.date.getHours();
132
+ },
133
+ minutes() {
134
+ return this.date.getMinutes();
135
+ },
136
+ seconds() {
137
+ return this.date.getSeconds();
138
+ },
139
+ hoursList() {
140
+ return getRangeHours(this.selectableRange);
141
+ },
142
+ minutesList() {
143
+ return getRangeMinutes(this.selectableRange, this.hours);
144
+ },
145
+ arrowHourList() {
146
+ const hours = this.hours;
147
+ return [
148
+ hours > 0 ? hours - 1 : undefined,
149
+ hours,
150
+ hours < 23 ? hours + 1 : undefined
151
+ ];
152
+ },
153
+ arrowMinuteList() {
154
+ const minutes = this.minutes;
155
+ return [
156
+ minutes > 0 ? minutes - 1 : undefined,
157
+ minutes,
158
+ minutes < 59 ? minutes + 1 : undefined
159
+ ];
160
+ },
161
+ arrowSecondList() {
162
+ const seconds = this.seconds;
163
+ return [
164
+ seconds > 0 ? seconds - 1 : undefined,
165
+ seconds,
166
+ seconds < 59 ? seconds + 1 : undefined
167
+ ];
168
+ }
169
+ },
170
+
171
+ data() {
172
+ return {
173
+ selectableRange: [],
174
+ currentScrollbar: null
175
+ };
176
+ },
177
+
178
+ mounted() {
179
+ this.$nextTick(() => {
180
+ !this.arrowControl && this.bindScrollEvent();
181
+ });
182
+ },
183
+
184
+ methods: {
185
+ increase() {
186
+ this.scrollDown(1);
187
+ },
188
+
189
+ decrease() {
190
+ this.scrollDown(-1);
191
+ },
192
+
193
+ modifyDateField(type, value) {
194
+ switch (type) {
195
+ case 'hours': this.$emit('change', modifyTime(this.date, value, this.minutes, this.seconds)); break;
196
+ case 'minutes': this.$emit('change', modifyTime(this.date, this.hours, value, this.seconds)); break;
197
+ case 'seconds': this.$emit('change', modifyTime(this.date, this.hours, this.minutes, value)); break;
198
+ }
199
+ },
200
+
201
+ handleClick(type, {value, disabled}) {
202
+ if (!disabled) {
203
+ this.modifyDateField(type, value);
204
+ this.emitSelectRange(type);
205
+ this.adjustSpinner(type, value);
206
+ }
207
+ },
208
+
209
+ emitSelectRange(type) {
210
+ if (type === 'hours') {
211
+ this.$emit('select-range', 0, 2);
212
+ } else if (type === 'minutes') {
213
+ this.$emit('select-range', 3, 5);
214
+ } else if (type === 'seconds') {
215
+ this.$emit('select-range', 6, 8);
216
+ }
217
+ this.currentScrollbar = type;
218
+ },
219
+
220
+ bindScrollEvent() {
221
+ const bindFuntion = (type) => {
222
+ this.$refs[type].wrap.onscroll = (e) => {
223
+ // TODO: scroll is emitted when set scrollTop programatically
224
+ // should find better solutions in the future!
225
+ this.handleScroll(type, e);
226
+ };
227
+ };
228
+ bindFuntion('hours');
229
+ bindFuntion('minutes');
230
+ bindFuntion('seconds');
231
+ },
232
+
233
+ handleScroll(type) {
234
+ const value = Math.min(Math.round((this.$refs[type].wrap.scrollTop - (this.scrollBarHeight(type) * 0.5 - 10) / this.typeItemHeight(type) + 3) / this.typeItemHeight(type)), (type === 'hours' ? 23 : 59));
235
+ this.modifyDateField(type, value);
236
+ },
237
+
238
+ // NOTE: used by datetime / date-range panel
239
+ // renamed from adjustScrollTop
240
+ // should try to refactory it
241
+ adjustSpinners() {
242
+ this.adjustSpinner('hours', this.hours);
243
+ this.adjustSpinner('minutes', this.minutes);
244
+ this.adjustSpinner('seconds', this.seconds);
245
+ },
246
+
247
+ adjustCurrentSpinner(type) {
248
+ this.adjustSpinner(type, this[type]);
249
+ },
250
+
251
+ adjustSpinner(type, value) {
252
+ if (this.arrowControl) return;
253
+ const el = this.$refs[type].wrap;
254
+ if (el) {
255
+ el.scrollTop = Math.max(0, value * this.typeItemHeight(type));
256
+ }
257
+ },
258
+
259
+ scrollDown(step) {
260
+ if (!this.currentScrollbar) {
261
+ this.emitSelectRange('hours');
262
+ }
263
+
264
+ const label = this.currentScrollbar;
265
+ const hoursList = this.hoursList;
266
+ let now = this[label];
267
+
268
+ if (this.currentScrollbar === 'hours') {
269
+ let total = Math.abs(step);
270
+ step = step > 0 ? 1 : -1;
271
+ let length = hoursList.length;
272
+ while (length-- && total) {
273
+ now = (now + step + hoursList.length) % hoursList.length;
274
+ if (hoursList[now]) {
275
+ continue;
276
+ }
277
+ total--;
278
+ }
279
+ if (hoursList[now]) return;
280
+ } else {
281
+ now = (now + step + 60) % 60;
282
+ }
283
+
284
+ this.modifyDateField(label, now);
285
+ this.adjustSpinner(label, now);
286
+ this.$nextTick(() => this.emitSelectRange(this.currentScrollbar));
287
+ },
288
+ amPm(hour) {
289
+ let shouldShowAmPm = this.amPmMode.toLowerCase() === 'a';
290
+ if (!shouldShowAmPm) return '';
291
+ let isCapital = this.amPmMode === 'A';
292
+ let content = (hour < 12) ? ' am' : ' pm';
293
+ if (isCapital) content = content.toUpperCase();
294
+ return content;
295
+ },
296
+ typeItemHeight(type) {
297
+ return this.$refs[type].$el.querySelector('li').offsetHeight;
298
+ },
299
+ scrollBarHeight(type) {
300
+ return this.$refs[type].$el.offsetHeight;
301
+ }
302
+ }
303
+ };
304
+ </script>
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <table @click="handleYearTableClick" class="base-year-table">
3
+ <tbody>
4
+ <tr>
5
+ <td class="available" :class="getCellStyle(startYear + 0)">
6
+ <a class="cell">{{ startYear }}</a>
7
+ </td>
8
+ <td class="available" :class="getCellStyle(startYear + 1)">
9
+ <a class="cell">{{ startYear + 1 }}</a>
10
+ </td>
11
+ <td class="available" :class="getCellStyle(startYear + 2)">
12
+ <a class="cell">{{ startYear + 2 }}</a>
13
+ </td>
14
+ <td class="available" :class="getCellStyle(startYear + 3)">
15
+ <a class="cell">{{ startYear + 3 }}</a>
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td class="available" :class="getCellStyle(startYear + 4)">
20
+ <a class="cell">{{ startYear + 4 }}</a>
21
+ </td>
22
+ <td class="available" :class="getCellStyle(startYear + 5)">
23
+ <a class="cell">{{ startYear + 5 }}</a>
24
+ </td>
25
+ <td class="available" :class="getCellStyle(startYear + 6)">
26
+ <a class="cell">{{ startYear + 6 }}</a>
27
+ </td>
28
+ <td class="available" :class="getCellStyle(startYear + 7)">
29
+ <a class="cell">{{ startYear + 7 }}</a>
30
+ </td>
31
+ </tr>
32
+ <tr>
33
+ <td class="available" :class="getCellStyle(startYear + 8)">
34
+ <a class="cell">{{ startYear + 8 }}</a>
35
+ </td>
36
+ <td class="available" :class="getCellStyle(startYear + 9)">
37
+ <a class="cell">{{ startYear + 9 }}</a>
38
+ </td>
39
+ <td></td>
40
+ <td></td>
41
+ </tr>
42
+ </tbody>
43
+ </table>
44
+ </template>
45
+
46
+ <script type="text/babel">
47
+ import { hasClass } from '../../util/dom';
48
+ import { isDate, range, nextDate, getDayCountOfYear } from '../../util/date-util';
49
+ import { arrayFindIndex, coerceTruthyValueToArray } from '../../util';
50
+
51
+ const datesInYear = year => {
52
+ const numOfDays = getDayCountOfYear(year);
53
+ const firstDay = new Date(year, 0, 1);
54
+ return range(numOfDays).map(n => nextDate(firstDay, n));
55
+ };
56
+
57
+ export default {
58
+ props: {
59
+ disabledDate: {},
60
+ value: {},
61
+ defaultValue: {
62
+ validator(val) {
63
+ // null or valid Date Object
64
+ return val === null || (val instanceof Date && isDate(val));
65
+ }
66
+ },
67
+ date: {}
68
+ },
69
+
70
+ computed: {
71
+ startYear() {
72
+ return Math.floor(this.date.getFullYear() / 10) * 10;
73
+ }
74
+ },
75
+
76
+ methods: {
77
+ getCellStyle(year) {
78
+ const style = {};
79
+ const today = new Date();
80
+
81
+ style.disabled = typeof this.disabledDate === 'function'
82
+ ? datesInYear(year).every(this.disabledDate)
83
+ : false;
84
+ style.current = arrayFindIndex(coerceTruthyValueToArray(this.value), date => date.getFullYear() === year) >= 0;
85
+ style.today = today.getFullYear() === year;
86
+ style.default = this.defaultValue && this.defaultValue.getFullYear() === year;
87
+
88
+ return style;
89
+ },
90
+
91
+ handleYearTableClick(event) {
92
+ const target = event.target;
93
+ if (target.tagName === 'A') {
94
+ if (hasClass(target.parentNode, 'disabled')) return;
95
+ const year = target.textContent || target.innerText;
96
+ this.$emit('pick', Number(year));
97
+ }
98
+ }
99
+ }
100
+ };
101
+ </script>