Commit af713093ab1c5cea2c0794bc3c931f6f6834b880
1 parent
2dbbd7de
update TimePicker
update TimePicker
Showing
6 changed files
with
62 additions
and
10 deletions
Show diff stats
src/components/date-picker/base/time-spinner.vue
| ... | ... | @@ -45,7 +45,8 @@ |
| 45 | 45 | }, |
| 46 | 46 | data () { |
| 47 | 47 | return { |
| 48 | - prefixCls: prefixCls | |
| 48 | + prefixCls: prefixCls, | |
| 49 | + compiled: false | |
| 49 | 50 | }; |
| 50 | 51 | }, |
| 51 | 52 | computed: { |
| ... | ... | @@ -155,11 +156,16 @@ |
| 155 | 156 | data[type] = cell.text; |
| 156 | 157 | this.$emit('on-change', data); |
| 157 | 158 | |
| 158 | - const from = this.$els[type].scrollTop; | |
| 159 | - const to = 24 * this.getScrollIndex(type, cell.text); | |
| 160 | - scrollTop(this.$els[type], from, to, 500); | |
| 159 | +// const from = this.$els[type].scrollTop; | |
| 160 | +// const to = 24 * this.getScrollIndex(type, cell.text); | |
| 161 | +// scrollTop(this.$els[type], from, to, 500); | |
| 161 | 162 | } |
| 162 | 163 | }, |
| 164 | + scroll (type, index) { | |
| 165 | + const from = this.$els[type].scrollTop; | |
| 166 | + const to = 24 * this.getScrollIndex(type, index); | |
| 167 | + scrollTop(this.$els[type], from, to, 500); | |
| 168 | + }, | |
| 163 | 169 | getScrollIndex (type, index) { |
| 164 | 170 | const Type = firstUpperCase(type); |
| 165 | 171 | const disabled = this[`disabled${Type}`]; |
| ... | ... | @@ -181,8 +187,23 @@ |
| 181 | 187 | }); |
| 182 | 188 | } |
| 183 | 189 | }, |
| 190 | + watch: { | |
| 191 | + hours (val) { | |
| 192 | + if (!this.compiled) return; | |
| 193 | + this.scroll('hours', val); | |
| 194 | + }, | |
| 195 | + minutes (val) { | |
| 196 | + if (!this.compiled) return; | |
| 197 | + this.scroll('minutes', val); | |
| 198 | + }, | |
| 199 | + seconds (val) { | |
| 200 | + if (!this.compiled) return; | |
| 201 | + this.scroll('seconds', val); | |
| 202 | + } | |
| 203 | + }, | |
| 184 | 204 | compiled () { |
| 185 | 205 | this.updateScroll(); |
| 206 | + this.$nextTick(() => this.compiled = true); | |
| 186 | 207 | } |
| 187 | 208 | }; |
| 188 | 209 | </script> |
| 189 | 210 | \ No newline at end of file | ... | ... |
src/components/date-picker/panel/time.vue
src/components/date-picker/picker.vue
| ... | ... | @@ -30,7 +30,7 @@ |
| 30 | 30 | import Drop from '../../components/select/dropdown.vue'; |
| 31 | 31 | import clickoutside from '../../directives/clickoutside'; |
| 32 | 32 | import { oneOf } from '../../utils/assist'; |
| 33 | - import { formatDate, parseDate, initTimeDate } from './util'; | |
| 33 | + import { formatDate, parseDate } from './util'; | |
| 34 | 34 | |
| 35 | 35 | const prefixCls = 'ivu-date-picker'; |
| 36 | 36 | |
| ... | ... | @@ -294,6 +294,30 @@ |
| 294 | 294 | } |
| 295 | 295 | |
| 296 | 296 | correctDate = parser(correctValue, format); |
| 297 | + } else if (type === 'time') { | |
| 298 | + const parsedDate = parseDate(value, format); | |
| 299 | + | |
| 300 | + if (parsedDate instanceof Date) { | |
| 301 | + if (this.disabledHours.length || this.disabledMinutes.length || this.disabledSeconds.length) { | |
| 302 | + const hours = parsedDate.getHours(); | |
| 303 | + const minutes = parsedDate.getMinutes(); | |
| 304 | + const seconds = parsedDate.getSeconds(); | |
| 305 | + | |
| 306 | + if ((this.disabledHours.length && this.disabledHours.indexOf(hours) > -1) || | |
| 307 | + (this.disabledMinutes.length && this.disabledMinutes.indexOf(minutes) > -1) || | |
| 308 | + (this.disabledSeconds.length && this.disabledSeconds.indexOf(seconds) > -1)) { | |
| 309 | + correctValue = oldValue; | |
| 310 | + } else { | |
| 311 | + correctValue = formatDate(parsedDate, format); | |
| 312 | + } | |
| 313 | + } else { | |
| 314 | + correctValue = formatDate(parsedDate, format); | |
| 315 | + } | |
| 316 | + } else { | |
| 317 | + correctValue = oldValue; | |
| 318 | + } | |
| 319 | + | |
| 320 | + correctDate = parseDate(correctValue, format); | |
| 297 | 321 | } else { |
| 298 | 322 | const parsedDate = parseDate(value, format); |
| 299 | 323 | ... | ... |
src/components/date-picker/util.js
| ... | ... | @@ -76,7 +76,7 @@ export const nextMonth = function(src) { |
| 76 | 76 | return new Date(src.getTime()); |
| 77 | 77 | }; |
| 78 | 78 | |
| 79 | -export const initTimeDate = function (time) { | |
| 79 | +export const initTimeDate = function () { | |
| 80 | 80 | const date = new Date(); |
| 81 | 81 | date.setHours(0); |
| 82 | 82 | date.setMinutes(0); | ... | ... |
src/utils/assist.js
| ... | ... | @@ -144,7 +144,7 @@ export function scrollTop(el, from = 0, to, duration = 500) { |
| 144 | 144 | function (callback) { |
| 145 | 145 | return window.setTimeout(callback, 1000/60); |
| 146 | 146 | } |
| 147 | - ) | |
| 147 | + ); | |
| 148 | 148 | } |
| 149 | 149 | const difference = Math.abs(from - to); |
| 150 | 150 | const step = Math.ceil(difference / duration * 50); | ... | ... |
test/routers/date.vue
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | <template> |
| 7 | 7 | <row> |
| 8 | 8 | <i-col span="12"> |
| 9 | - <date-picker type="date" placeholder="选择日期" style="width: 200px"></date-picker> | |
| 9 | + <date-picker type="date" placeholder="选择日期" style="width: 200px" @on-ok="ok" confirm @on-clear="clear"></date-picker> | |
| 10 | 10 | </i-col> |
| 11 | 11 | <i-col span="12"> |
| 12 | 12 | <date-picker type="daterange" placement="bottom-end" placeholder="选择日期" style="width: 200px"></date-picker> |
| ... | ... | @@ -20,6 +20,8 @@ |
| 20 | 20 | :hide-disabled-options="false" |
| 21 | 21 | :disabled-hours="[1,2,5,10,11]" |
| 22 | 22 | @on-change="c" |
| 23 | + @on-ok="ok" | |
| 24 | + @on-clear="clear" | |
| 23 | 25 | style="width: 168px"></time-picker> |
| 24 | 26 | </i-col> |
| 25 | 27 | </row> |
| ... | ... | @@ -34,8 +36,14 @@ |
| 34 | 36 | }, |
| 35 | 37 | methods: { |
| 36 | 38 | c (s) { |
| 37 | - console.log(s) | |
| 39 | + console.log(1,s); | |
| 38 | 40 | this.value = s; |
| 41 | + }, | |
| 42 | + ok () { | |
| 43 | + console.log('ok'); | |
| 44 | + }, | |
| 45 | + clear () { | |
| 46 | + console.log('clear'); | |
| 39 | 47 | } |
| 40 | 48 | } |
| 41 | 49 | } | ... | ... |