@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,597 @@
1
+ <template>
2
+ <transition name="base-zoom-in-top" @after-enter="handleEnter" @after-leave="handleLeave">
3
+ <div
4
+ v-show="visible"
5
+ class="base-picker-panel base-date-picker base-popper"
6
+ :class="[{
7
+ 'has-sidebar': $slots.sidebar || shortcuts,
8
+ 'has-time': showTime
9
+ }, popperClass]">
10
+ <div class="base-picker-panel__body-wrapper">
11
+ <slot name="sidebar" class="base-picker-panel__sidebar"></slot>
12
+ <div class="base-picker-panel__sidebar" v-if="shortcuts">
13
+ <button
14
+ type="button"
15
+ class="base-picker-panel__shortcut"
16
+ v-for="(shortcut, key) in shortcuts"
17
+ :key="key"
18
+ @click="handleShortcutClick(shortcut)">{{ shortcut.text }}</button>
19
+ </div>
20
+ <div class="base-picker-panel__body">
21
+ <div class="base-date-picker__time-header" v-if="showTime">
22
+ <span class="base-date-picker__editor-wrap">
23
+ <base-input
24
+ :placeholder="t('base.datepicker.selectDate')"
25
+ :value="visibleDate"
26
+ size="small"
27
+ @input="val => userInputDate = val"
28
+ @change="handleVisibleDateChange" />
29
+ </span>
30
+ <span class="base-date-picker__editor-wrap" v-clickoutside="handleTimePickClose">
31
+ <base-input
32
+ ref="input"
33
+ @focus="timePickerVisible = true"
34
+ :placeholder="t('base.datepicker.selectTime')"
35
+ :value="visibleTime"
36
+ size="small"
37
+ @input="val => userInputTime = val"
38
+ @change="handleVisibleTimeChange" />
39
+ <time-picker
40
+ ref="timepicker"
41
+ :time-arrow-control="arrowControl"
42
+ @pick="handleTimePick"
43
+ :visible="timePickerVisible"
44
+ @mounted="proxyTimePickerDataProperties">
45
+ </time-picker>
46
+ </span>
47
+ </div>
48
+ <div
49
+ class="base-date-picker__header"
50
+ :class="{ 'base-date-picker__header--bordered': currentView === 'year' || currentView === 'month' }"
51
+ v-show="currentView !== 'time'">
52
+ <button
53
+ type="button"
54
+ @click="prevYear"
55
+ :aria-label="t(`base.datepicker.prevYear`)"
56
+ class="base-picker-panel__icon-btn base-date-picker__prev-btn base-icon-d-arrow-left">
57
+ </button>
58
+ <button
59
+ type="button"
60
+ @click="prevMonth"
61
+ v-show="currentView === 'date'"
62
+ :aria-label="t(`base.datepicker.prevMonth`)"
63
+ class="base-picker-panel__icon-btn base-date-picker__prev-btn base-icon-arrow-left">
64
+ </button>
65
+ <span
66
+ @click="showYearPicker"
67
+ role="button"
68
+ class="base-date-picker__header-label">{{ yearLabel }}</span>
69
+ <span
70
+ @click="showMonthPicker"
71
+ v-show="currentView === 'date'"
72
+ role="button"
73
+ class="base-date-picker__header-label"
74
+ :class="{ active: currentView === 'month' }">{{t(`base.datepicker.month${ month + 1 }`)}}</span>
75
+ <button
76
+ type="button"
77
+ @click="nextYear"
78
+ :aria-label="t(`base.datepicker.nextYear`)"
79
+ class="base-picker-panel__icon-btn base-date-picker__next-btn base-icon-d-arrow-right">
80
+ </button>
81
+ <button
82
+ type="button"
83
+ @click="nextMonth"
84
+ v-show="currentView === 'date'"
85
+ :aria-label="t(`base.datepicker.nextMonth`)"
86
+ class="base-picker-panel__icon-btn base-date-picker__next-btn base-icon-arrow-right">
87
+ </button>
88
+ </div>
89
+
90
+ <div class="base-picker-panel__content">
91
+ <date-table
92
+ v-show="currentView === 'date'"
93
+ @pick="handleDatePick"
94
+ :selection-mode="selectionMode"
95
+ :first-day-of-week="firstDayOfWeek"
96
+ :value="value"
97
+ :default-value="defaultValue ? new Date(defaultValue) : null"
98
+ :date="date"
99
+ :cell-class-name="cellClassName"
100
+ :disabled-date="disabledDate">
101
+ </date-table>
102
+ <year-table
103
+ v-show="currentView === 'year'"
104
+ @pick="handleYearPick"
105
+ :value="value"
106
+ :default-value="defaultValue ? new Date(defaultValue) : null"
107
+ :date="date"
108
+ :disabled-date="disabledDate">
109
+ </year-table>
110
+ <month-table
111
+ v-show="currentView === 'month'"
112
+ @pick="handleMonthPick"
113
+ :value="value"
114
+ :default-value="defaultValue ? new Date(defaultValue) : null"
115
+ :date="date"
116
+ :disabled-date="disabledDate">
117
+ </month-table>
118
+ </div>
119
+ </div>
120
+ </div>
121
+
122
+ <div
123
+ class="base-picker-panel__footer"
124
+ v-show="footerVisible && currentView === 'date'">
125
+ <base-button
126
+ size="mini"
127
+ type="text"
128
+ class="base-picker-panel__link-btn"
129
+ @click="changeToNow"
130
+ v-show="selectionMode !== 'dates'">
131
+ {{ t('base.datepicker.now') }}
132
+ </base-button>
133
+ <base-button
134
+ plain
135
+ size="mini"
136
+ class="base-picker-panel__link-btn"
137
+ @click="confirm">
138
+ {{ t('base.datepicker.confirm') }}
139
+ </base-button>
140
+ </div>
141
+ </div>
142
+ </transition>
143
+ </template>
144
+
145
+ <script type="text/babel">
146
+ import {
147
+ formatDate,
148
+ parseDate,
149
+ getWeekNumber,
150
+ isDate,
151
+ modifyDate,
152
+ modifyTime,
153
+ modifyWithTimeString,
154
+ clearMilliseconds,
155
+ clearTime,
156
+ prevYear,
157
+ nextYear,
158
+ prevMonth,
159
+ nextMonth,
160
+ changeYearMonthAndClampDate,
161
+ extractDateFormat,
162
+ extractTimeFormat,
163
+ timeWithinRange
164
+ } from '../../util/date-util';
165
+ import Clickoutside from '../../util/clickoutside';
166
+ import Locale from '../../mixin/locale';
167
+ import BaseInput from '../../input/Input';
168
+ import BaseButton from '../../button/Button';
169
+ import TimePicker from './time';
170
+ import YearTable from '../basic/year-table';
171
+ import MonthTable from '../basic/month-table';
172
+ import DateTable from '../basic/date-table';
173
+
174
+ export default {
175
+ mixins: [Locale],
176
+
177
+ directives: { Clickoutside },
178
+
179
+ watch: {
180
+ showTime(val) {
181
+ /* istanbul ignore if */
182
+ if (!val) return;
183
+ this.$nextTick(_ => {
184
+ const inputElm = this.$refs.input.$el;
185
+ if (inputElm) {
186
+ this.pickerWidth = inputElm.getBoundingClientRect().width + 10;
187
+ }
188
+ });
189
+ },
190
+
191
+ value(val) {
192
+ if (this.selectionMode === 'dates' && this.value) return;
193
+ if (isDate(val)) {
194
+ this.date = new Date(val);
195
+ } else {
196
+ this.date = this.getDefaultValue();
197
+ }
198
+ },
199
+
200
+ defaultValue(val) {
201
+ if (!isDate(this.value)) {
202
+ this.date = val ? new Date(val) : new Date();
203
+ }
204
+ },
205
+
206
+ timePickerVisible(val) {
207
+ if (val) this.$nextTick(() => this.$refs.timepicker.adjustSpinners());
208
+ },
209
+
210
+ selectionMode(newVal) {
211
+ if (newVal === 'month') {
212
+ /* istanbul ignore next */
213
+ if (this.currentView !== 'year' || this.currentView !== 'month') {
214
+ this.currentView = 'month';
215
+ }
216
+ } else if (newVal === 'dates') {
217
+ this.currentView = 'date';
218
+ }
219
+ }
220
+ },
221
+
222
+ methods: {
223
+ proxyTimePickerDataProperties() {
224
+ const format = timeFormat => {this.$refs.timepicker.format = timeFormat;};
225
+ const value = value => {this.$refs.timepicker.value = value;};
226
+ const date = date => {this.$refs.timepicker.date = date;};
227
+ const selectableRange = selectableRange => {this.$refs.timepicker.selectableRange = selectableRange;};
228
+
229
+ this.$watch('value', value);
230
+ this.$watch('date', date);
231
+ this.$watch('selectableRange', selectableRange);
232
+
233
+ format(this.timeFormat);
234
+ value(this.value);
235
+ date(this.date);
236
+ selectableRange(this.selectableRange);
237
+ },
238
+
239
+ handleClear() {
240
+ this.date = this.getDefaultValue();
241
+ this.$emit('pick', null);
242
+ },
243
+
244
+ emit(value, ...args) {
245
+ if (!value) {
246
+ this.$emit('pick', value, ...args);
247
+ } else if (Array.isArray(value)) {
248
+ const dates = value.map(date => this.showTime ? clearMilliseconds(date) : clearTime(date));
249
+ this.$emit('pick', dates, ...args);
250
+ } else {
251
+ this.$emit('pick', this.showTime ? clearMilliseconds(value) : clearTime(value), ...args);
252
+ }
253
+ this.userInputDate = null;
254
+ this.userInputTime = null;
255
+ },
256
+
257
+ // resetDate() {
258
+ // this.date = new Date(this.date);
259
+ // },
260
+
261
+ showMonthPicker() {
262
+ this.currentView = 'month';
263
+ },
264
+
265
+ showYearPicker() {
266
+ this.currentView = 'year';
267
+ },
268
+
269
+ // XXX: 没用到
270
+ // handleLabelClick() {
271
+ // if (this.currentView === 'date') {
272
+ // this.showMonthPicker();
273
+ // } else if (this.currentView === 'month') {
274
+ // this.showYearPicker();
275
+ // }
276
+ // },
277
+
278
+ prevMonth() {
279
+ this.date = prevMonth(this.date);
280
+ },
281
+
282
+ nextMonth() {
283
+ this.date = nextMonth(this.date);
284
+ },
285
+
286
+ prevYear() {
287
+ if (this.currentView === 'year') {
288
+ this.date = prevYear(this.date, 10);
289
+ } else {
290
+ this.date = prevYear(this.date);
291
+ }
292
+ },
293
+
294
+ nextYear() {
295
+ if (this.currentView === 'year') {
296
+ this.date = nextYear(this.date, 10);
297
+ } else {
298
+ this.date = nextYear(this.date);
299
+ }
300
+ },
301
+
302
+ handleShortcutClick(shortcut) {
303
+ if (shortcut.onClick) {
304
+ shortcut.onClick(this);
305
+ }
306
+ },
307
+
308
+ handleTimePick(value, visible, first) {
309
+ if (isDate(value)) {
310
+ const newDate = this.value
311
+ ? modifyTime(this.value, value.getHours(), value.getMinutes(), value.getSeconds())
312
+ : modifyWithTimeString(this.getDefaultValue(), this.defaultTime);
313
+ this.date = newDate;
314
+ this.emit(this.date, true);
315
+ } else {
316
+ this.emit(value, true);
317
+ }
318
+ if (!first) {
319
+ this.timePickerVisible = visible;
320
+ }
321
+ },
322
+
323
+ handleTimePickClose() {
324
+ this.timePickerVisible = false;
325
+ },
326
+
327
+ handleMonthPick(month) {
328
+ if (this.selectionMode === 'month') {
329
+ this.date = modifyDate(this.date, this.year, month, 1);
330
+ this.emit(this.date);
331
+ } else {
332
+ this.date = changeYearMonthAndClampDate(this.date, this.year, month);
333
+ // TODO: should emit intermediate value ??
334
+ // this.emit(this.date);
335
+ this.currentView = 'date';
336
+ }
337
+ },
338
+
339
+ handleDatePick(value) {
340
+ if (this.selectionMode === 'day') {
341
+ let newDate = this.value
342
+ ? modifyDate(this.value, value.getFullYear(), value.getMonth(), value.getDate())
343
+ : modifyWithTimeString(value, this.defaultTime);
344
+ // change default time while out of selectableRange
345
+ if (!this.checkDateWithinRange(newDate)) {
346
+ newDate = modifyDate(this.selectableRange[0][0], value.getFullYear(), value.getMonth(), value.getDate());
347
+ }
348
+ this.date = newDate;
349
+ this.emit(this.date, this.showTime);
350
+ } else if (this.selectionMode === 'week') {
351
+ this.emit(value.date);
352
+ } else if (this.selectionMode === 'dates') {
353
+ this.emit(value, true); // set false to keep panel open
354
+ }
355
+ },
356
+
357
+ handleYearPick(year) {
358
+ if (this.selectionMode === 'year') {
359
+ this.date = modifyDate(this.date, year, 0, 1);
360
+ this.emit(this.date);
361
+ } else {
362
+ this.date = changeYearMonthAndClampDate(this.date, year, this.month);
363
+ // TODO: should emit intermediate value ??
364
+ // this.emit(this.date, true);
365
+ this.currentView = 'month';
366
+ }
367
+ },
368
+
369
+ changeToNow() {
370
+ // NOTE: not a permanent solution
371
+ // consider disable "now" button in the future
372
+ if ((!this.disabledDate || !this.disabledDate(new Date())) && this.checkDateWithinRange(new Date())) {
373
+ this.date = new Date();
374
+ this.emit(this.date);
375
+ }
376
+ },
377
+
378
+ confirm() {
379
+ if (this.selectionMode === 'dates') {
380
+ this.emit(this.value);
381
+ } else {
382
+ // value were emitted in handle{Date,Time}Pick, nothing to update here
383
+ // deal with the scenario where: user opens the picker, then confirm without doing anything
384
+ const value = this.value
385
+ ? this.value
386
+ : modifyWithTimeString(this.getDefaultValue(), this.defaultTime);
387
+ this.date = new Date(value); // refresh date
388
+ this.emit(value);
389
+ }
390
+ },
391
+
392
+ resetView() {
393
+ if (this.selectionMode === 'month') {
394
+ this.currentView = 'month';
395
+ } else if (this.selectionMode === 'year') {
396
+ this.currentView = 'year';
397
+ } else {
398
+ this.currentView = 'date';
399
+ }
400
+ },
401
+
402
+ handleEnter() {
403
+ document.body.addEventListener('keydown', this.handleKeydown);
404
+ },
405
+
406
+ handleLeave() {
407
+ this.$emit('dodestroy');
408
+ document.body.removeEventListener('keydown', this.handleKeydown);
409
+ },
410
+
411
+ handleKeydown(event) {
412
+ const keyCode = event.keyCode;
413
+ const list = [38, 40, 37, 39];
414
+ if (this.visible && !this.timePickerVisible) {
415
+ if (list.indexOf(keyCode) !== -1) {
416
+ this.handleKeyControl(keyCode);
417
+ event.stopPropagation();
418
+ event.preventDefault();
419
+ }
420
+ if (keyCode === 13 && this.userInputDate === null && this.userInputTime === null) { // Enter
421
+ this.emit(this.date, false);
422
+ }
423
+ }
424
+ },
425
+
426
+ handleKeyControl(keyCode) {
427
+ const mapping = {
428
+ 'year': {
429
+ 38: -4, 40: 4, 37: -1, 39: 1, offset: (date, step) => date.setFullYear(date.getFullYear() + step)
430
+ },
431
+ 'month': {
432
+ 38: -4, 40: 4, 37: -1, 39: 1, offset: (date, step) => date.setMonth(date.getMonth() + step)
433
+ },
434
+ 'week': {
435
+ 38: -1, 40: 1, 37: -1, 39: 1, offset: (date, step) => date.setDate(date.getDate() + step * 7)
436
+ },
437
+ 'day': {
438
+ 38: -7, 40: 7, 37: -1, 39: 1, offset: (date, step) => date.setDate(date.getDate() + step)
439
+ }
440
+ };
441
+ const mode = this.selectionMode;
442
+ const year = 3.1536e10;
443
+ const now = this.date.getTime();
444
+ const newDate = new Date(this.date.getTime());
445
+ while (Math.abs(now - newDate.getTime()) <= year) {
446
+ const map = mapping[mode];
447
+ map.offset(newDate, map[keyCode]);
448
+ if (typeof this.disabledDate === 'function' && this.disabledDate(newDate)) {
449
+ continue;
450
+ }
451
+ this.date = newDate;
452
+ this.$emit('pick', newDate, true);
453
+ break;
454
+ }
455
+ },
456
+
457
+ handleVisibleTimeChange(value) {
458
+ const time = parseDate(value, this.timeFormat);
459
+ if (time && this.checkDateWithinRange(time)) {
460
+ this.date = modifyDate(time, this.year, this.month, this.monthDate);
461
+ this.userInputTime = null;
462
+ this.$refs.timepicker.value = this.date;
463
+ this.timePickerVisible = false;
464
+ this.emit(this.date, true);
465
+ }
466
+ },
467
+
468
+ handleVisibleDateChange(value) {
469
+ const date = parseDate(value, this.dateFormat);
470
+ if (date) {
471
+ if (typeof this.disabledDate === 'function' && this.disabledDate(date)) {
472
+ return;
473
+ }
474
+ this.date = modifyTime(date, this.date.getHours(), this.date.getMinutes(), this.date.getSeconds());
475
+ this.userInputDate = null;
476
+ this.resetView();
477
+ this.emit(this.date, true);
478
+ }
479
+ },
480
+
481
+ isValidValue(value) {
482
+ return value && !isNaN(value) && (
483
+ typeof this.disabledDate === 'function'
484
+ ? !this.disabledDate(value)
485
+ : true
486
+ ) && this.checkDateWithinRange(value);
487
+ },
488
+
489
+ getDefaultValue() {
490
+ // if default-value is set, return it
491
+ // otherwise, return now (the moment this method gets called)
492
+ return this.defaultValue ? new Date(this.defaultValue) : new Date();
493
+ },
494
+
495
+ checkDateWithinRange(date) {
496
+ return this.selectableRange.length > 0
497
+ ? timeWithinRange(date, this.selectableRange, this.format || 'HH:mm:ss')
498
+ : true;
499
+ }
500
+ },
501
+
502
+ components: {
503
+ TimePicker, YearTable, MonthTable, DateTable, BaseInput, BaseButton
504
+ },
505
+
506
+ data() {
507
+ return {
508
+ popperClass: '',
509
+ date: new Date(),
510
+ value: '',
511
+ defaultValue: null, // use getDefaultValue() for time computation
512
+ defaultTime: null,
513
+ showTime: false,
514
+ selectionMode: 'day',
515
+ shortcuts: '',
516
+ visible: false,
517
+ currentView: 'date',
518
+ disabledDate: '',
519
+ cellClassName: '',
520
+ selectableRange: [],
521
+ firstDayOfWeek: 7,
522
+ showWeekNumber: false,
523
+ timePickerVisible: false,
524
+ format: '',
525
+ arrowControl: false,
526
+ userInputDate: null,
527
+ userInputTime: null
528
+ };
529
+ },
530
+
531
+ computed: {
532
+ year() {
533
+ return this.date.getFullYear();
534
+ },
535
+
536
+ month() {
537
+ return this.date.getMonth();
538
+ },
539
+
540
+ week() {
541
+ return getWeekNumber(this.date);
542
+ },
543
+
544
+ monthDate() {
545
+ return this.date.getDate();
546
+ },
547
+
548
+ footerVisible() {
549
+ return this.showTime || this.selectionMode === 'dates';
550
+ },
551
+
552
+ visibleTime() {
553
+ if (this.userInputTime !== null) {
554
+ return this.userInputTime;
555
+ } else {
556
+ return formatDate(this.value || this.defaultValue, this.timeFormat);
557
+ }
558
+ },
559
+
560
+ visibleDate() {
561
+ if (this.userInputDate !== null) {
562
+ return this.userInputDate;
563
+ } else {
564
+ return formatDate(this.value || this.defaultValue, this.dateFormat);
565
+ }
566
+ },
567
+
568
+ yearLabel() {
569
+ const yearTranslation = this.t('base.datepicker.year');
570
+ if (this.currentView === 'year') {
571
+ const startYear = Math.floor(this.year / 10) * 10;
572
+ if (yearTranslation) {
573
+ return startYear + ' ' + yearTranslation + ' - ' + (startYear + 9) + ' ' + yearTranslation;
574
+ }
575
+ return startYear + ' - ' + (startYear + 9);
576
+ }
577
+ return this.year + ' ' + yearTranslation;
578
+ },
579
+
580
+ timeFormat() {
581
+ if (this.format) {
582
+ return extractTimeFormat(this.format);
583
+ } else {
584
+ return 'HH:mm:ss';
585
+ }
586
+ },
587
+
588
+ dateFormat() {
589
+ if (this.format) {
590
+ return extractDateFormat(this.format);
591
+ } else {
592
+ return 'yyyy-MM-dd';
593
+ }
594
+ }
595
+ }
596
+ };
597
+ </script>