iview/src/components/date-picker/base/time-spinner.vue

202 lines
7.1 KiB
Vue
Raw Normal View History

2016-12-26 14:50:39 +08:00
<template>
<div :class="classes">
<div :class="[prefixCls+ '-list']" ref="hours">
<ul :class="[prefixCls + '-ul']">
<li :class="getCellCls(item)" v-for="item in hoursList" v-show="!item.hide" @click="handleClick('hours', item)">{{ formatTime(item.text) }}</li>
2016-12-26 14:50:39 +08:00
</ul>
</div>
<div :class="[prefixCls+ '-list']" ref="minutes">
<ul :class="[prefixCls + '-ul']">
<li :class="getCellCls(item)" v-for="item in minutesList" v-show="!item.hide" @click="handleClick('minutes', item)">{{ formatTime(item.text) }}</li>
2016-12-26 15:57:12 +08:00
</ul>
2016-12-26 14:50:39 +08:00
</div>
<div :class="[prefixCls+ '-list']" v-show="showSeconds" ref="seconds">
<ul :class="[prefixCls + '-ul']">
<li :class="getCellCls(item)" v-for="item in secondsList" v-show="!item.hide" @click="handleClick('seconds', item)">{{ formatTime(item.text) }}</li>
2016-12-26 15:57:12 +08:00
</ul>
2016-12-26 14:50:39 +08:00
</div>
</div>
</template>
<script>
2016-12-26 15:57:12 +08:00
import Options from '../time-mixins';
2016-12-27 15:50:07 +08:00
import { deepCopy, scrollTop, firstUpperCase } from '../../../utils/assist';
2016-12-26 15:57:12 +08:00
2016-12-26 14:50:39 +08:00
const prefixCls = 'ivu-time-picker-cells';
export default {
2016-12-26 15:57:12 +08:00
mixins: [Options],
2016-12-26 14:50:39 +08:00
props: {
hours: {
2016-12-27 17:16:11 +08:00
type: [Number, String],
2016-12-26 14:50:39 +08:00
default: 0
},
minutes: {
2016-12-27 17:16:11 +08:00
type: [Number, String],
2016-12-26 14:50:39 +08:00
default: 0
},
seconds: {
2016-12-27 17:16:11 +08:00
type: [Number, String],
2016-12-26 14:50:39 +08:00
default: 0
},
showSeconds: {
type: Boolean,
default: true
},
steps: {
type: Array,
default: () => []
2016-12-26 14:50:39 +08:00
}
},
data () {
return {
spinerSteps: [1, 1, 1].map((one, i) => Math.abs(this.steps[i]) || one),
2016-12-27 17:41:35 +08:00
prefixCls: prefixCls,
compiled: false
2016-12-26 14:50:39 +08:00
};
},
computed: {
classes () {
return [
`${prefixCls}`,
{
[`${prefixCls}-with-seconds`]: this.showSeconds
}
];
},
hoursList () {
2016-12-26 15:57:12 +08:00
let hours = [];
const step = this.spinerSteps[0];
2016-12-26 15:57:12 +08:00
const hour_tmpl = {
text: 0,
2016-12-26 15:57:12 +08:00
selected: false,
disabled: false,
hide: false
};
for (let i = 0; i < 24; i += step) {
2016-12-26 15:57:12 +08:00
const hour = deepCopy(hour_tmpl);
hour.text = i;
2016-12-27 15:50:07 +08:00
if (this.disabledHours.length && this.disabledHours.indexOf(i) > -1) {
2016-12-26 15:57:12 +08:00
hour.disabled = true;
if (this.hideDisabledOptions) hour.hide = true;
}
if (this.hours === i) hour.selected = true;
2016-12-26 15:57:12 +08:00
hours.push(hour);
}
return hours;
2016-12-26 14:50:39 +08:00
},
minutesList () {
2016-12-26 15:57:12 +08:00
let minutes = [];
const step = this.spinerSteps[1];
2016-12-26 15:57:12 +08:00
const minute_tmpl = {
text: 0,
2016-12-26 15:57:12 +08:00
selected: false,
disabled: false,
hide: false
};
for (let i = 0; i < 60; i += step) {
2016-12-26 15:57:12 +08:00
const minute = deepCopy(minute_tmpl);
minute.text = i;
2016-12-27 15:50:07 +08:00
if (this.disabledMinutes.length && this.disabledMinutes.indexOf(i) > -1) {
2016-12-26 15:57:12 +08:00
minute.disabled = true;
if (this.hideDisabledOptions) minute.hide = true;
}
if (this.minutes === i) minute.selected = true;
2016-12-26 15:57:12 +08:00
minutes.push(minute);
}
return minutes;
2016-12-26 14:50:39 +08:00
},
secondsList () {
2016-12-26 15:57:12 +08:00
let seconds = [];
const step = this.spinerSteps[2];
2016-12-26 15:57:12 +08:00
const second_tmpl = {
text: 0,
2016-12-26 15:57:12 +08:00
selected: false,
disabled: false,
hide: false
};
for (let i = 0; i < 60; i += step) {
2016-12-26 15:57:12 +08:00
const second = deepCopy(second_tmpl);
second.text = i;
2016-12-27 15:50:07 +08:00
if (this.disabledSeconds.length && this.disabledSeconds.indexOf(i) > -1) {
2016-12-26 15:57:12 +08:00
second.disabled = true;
if (this.hideDisabledOptions) second.hide = true;
}
if (this.seconds === i) second.selected = true;
2016-12-26 15:57:12 +08:00
seconds.push(second);
}
return seconds;
2016-12-26 14:50:39 +08:00
}
},
methods: {
2016-12-26 15:57:12 +08:00
getCellCls (cell) {
return [
`${prefixCls}-cell`,
{
[`${prefixCls}-cell-selected`]: cell.selected,
[`${prefixCls}-cell-disabled`]: cell.disabled
}
];
},
handleClick (type, cell) {
if (cell.disabled) return;
const data = {};
data[type] = cell.text;
this.$emit('on-change', data);
2016-12-29 12:11:22 +08:00
this.$emit('on-pick-click');
2016-12-27 16:14:45 +08:00
},
2016-12-27 17:41:35 +08:00
scroll (type, index) {
const from = this.$refs[type].scrollTop;
2016-12-27 17:41:35 +08:00
const to = 24 * this.getScrollIndex(type, index);
scrollTop(this.$refs[type], from, to, 500);
2016-12-27 17:41:35 +08:00
},
2016-12-27 16:14:45 +08:00
getScrollIndex (type, index) {
const Type = firstUpperCase(type);
const disabled = this[`disabled${Type}`];
if (disabled.length && this.hideDisabledOptions) {
let _count = 0;
disabled.forEach(item => item <= index ? _count++ : '');
index -= _count;
}
return index;
},
updateScroll () {
const times = ['hours', 'minutes', 'seconds'];
this.$nextTick(() => {
times.forEach(type => {
2017-09-26 22:50:57 +02:00
this.$refs[type].scrollTop = 24 * this[`${type}List`].findIndex(obj => obj.text == this[type]);
2016-12-27 16:14:45 +08:00
});
});
2016-12-29 10:50:51 +08:00
},
formatTime (text) {
return text < 10 ? '0' + text : text;
2016-12-26 15:57:12 +08:00
}
2016-12-27 16:14:45 +08:00
},
2016-12-27 17:41:35 +08:00
watch: {
hours (val) {
if (!this.compiled) return;
2017-10-11 09:29:16 +08:00
this.scroll('hours', this.hoursList.findIndex(obj => obj.text == val));
2016-12-27 17:41:35 +08:00
},
minutes (val) {
if (!this.compiled) return;
2017-10-11 09:29:16 +08:00
this.scroll('minutes', this.minutesList.findIndex(obj => obj.text == val));
2016-12-27 17:41:35 +08:00
},
seconds (val) {
if (!this.compiled) return;
2017-10-11 09:29:16 +08:00
this.scroll('seconds', this.secondsList.findIndex(obj => obj.text == val));
2016-12-27 17:41:35 +08:00
}
},
mounted () {
2016-12-27 16:14:45 +08:00
this.updateScroll();
2016-12-27 17:41:35 +08:00
this.$nextTick(() => this.compiled = true);
2016-12-26 14:50:39 +08:00
}
};
</script>