iview/src/components/date-picker/panel/Time/time.vue

146 lines
5.4 KiB
Vue
Raw Normal View History

2016-12-26 14:50:39 +08:00
<template>
2017-09-21 08:22:05 +02:00
<div :class="[prefixCls + '-body-wrapper']" @mousedown.prevent>
2016-12-26 14:50:39 +08:00
<div :class="[prefixCls + '-body']">
<div :class="[timePrefixCls + '-header']" v-if="showDate">{{ visibleDate }}</div>
2016-12-26 14:50:39 +08:00
<div :class="[prefixCls + '-content']">
<time-spinner
ref="timeSpinner"
2016-12-26 14:50:39 +08:00
:show-seconds="showSeconds"
:steps="steps"
:hours="timeSlots[0]"
:minutes="timeSlots[1]"
:seconds="timeSlots[2]"
:disabled-hours="disabledHMS.disabledHours"
:disabled-minutes="disabledHMS.disabledMinutes"
:disabled-seconds="disabledHMS.disabledSeconds"
2016-12-26 15:57:12 +08:00
:hide-disabled-options="hideDisabledOptions"
2016-12-26 14:50:39 +08:00
@on-change="handleChange"
@on-pick-click="handlePickClick"></time-spinner>
</div>
<Confirm
2016-12-29 18:09:16 +08:00
v-if="confirm"
2016-12-26 14:50:39 +08:00
@on-pick-clear="handlePickClear"
@on-pick-success="handlePickSuccess"></Confirm>
</div>
</div>
</template>
<script>
2018-01-16 22:24:21 +01:00
import TimeSpinner from '../../base/time-spinner.vue';
import Confirm from '../../base/confirm.vue';
import Options from '../../time-mixins';
2016-12-26 14:50:39 +08:00
2018-01-16 22:24:21 +01:00
import Mixin from '../panel-mixin';
import Locale from '../../../../mixins/locale';
import { initTimeDate } from '../../util';
2016-12-27 17:16:11 +08:00
2016-12-26 14:50:39 +08:00
const prefixCls = 'ivu-picker-panel';
const timePrefixCls = 'ivu-time-picker';
2018-01-16 22:24:21 +01:00
const capitalize = (str) => str[0].toUpperCase() + str.slice(1);
const mergeDateHMS = (date, hours, minutes, seconds) => {
const newDate = new Date(date.getTime());
newDate.setHours(hours);
newDate.setMinutes(minutes);
newDate.setSeconds(seconds);
return newDate;
};
const unique = (el, i, arr) => arr.indexOf(el) === i;
const returnFalse = () => false;
2018-01-16 22:24:21 +01:00
2016-12-26 14:50:39 +08:00
export default {
2018-01-16 22:24:21 +01:00
name: 'TimePickerPanel',
mixins: [ Mixin, Locale, Options ],
2016-12-26 14:50:39 +08:00
components: { TimeSpinner, Confirm },
props: {
disabledDate: {
type: Function,
default: returnFalse
},
steps: {
type: Array,
default: () => []
2018-01-16 22:24:21 +01:00
},
format: {
type: String,
default: 'HH:mm:ss'
},
value: {
type: Array,
required: true
},
},
2016-12-26 14:50:39 +08:00
data () {
return {
prefixCls: prefixCls,
timePrefixCls: timePrefixCls,
2018-01-16 22:24:21 +01:00
date: this.value[0] || initTimeDate(),
showDate: false
2016-12-26 14:50:39 +08:00
};
},
computed: {
showSeconds () {
2018-01-24 13:34:02 +01:00
return !(this.format || '').match(/mm$/);
},
2018-01-16 22:24:21 +01:00
visibleDate () { // TODO
const date = this.date;
const month = date.getMonth() + 1;
const tYear = this.t('i.datepicker.year');
const tMonth = this.t(`i.datepicker.month${month}`);
return `${date.getFullYear()}${tYear} ${tMonth}`;
},
timeSlots(){
if (!this.value[0]) return [];
return ['getHours', 'getMinutes', 'getSeconds'].map(slot => this.date[slot]());
},
disabledHMS(){
const disabledTypes = ['disabledHours', 'disabledMinutes', 'disabledSeconds'];
if (this.disabledDate === returnFalse || !this.value[0]) {
const disabled = disabledTypes.reduce(
(obj, type) => (obj[type] = this[type], obj), {}
);
return disabled;
} else {
const slots = [24, 60, 60];
const disabled = ['Hours', 'Minutes', 'Seconds'].map(type => this[`disabled${type}`]);
const disabledHMS = disabled.map((preDisabled, j) => {
const slot = slots[j];
const toDisable = preDisabled;
for (let i = 0; i < slot; i+= (this.steps[j] || 1)){
const hms = this.timeSlots.map((slot, x) => x === j ? i : slot);
const testDateTime = mergeDateHMS(this.date, ...hms);
if (this.disabledDate(testDateTime, true)) toDisable.push(i);
}
return toDisable.filter(unique);
});
return disabledTypes.reduce(
(obj, type, i) => (obj[type] = disabledHMS[i], obj), {}
);
}
2016-12-26 14:50:39 +08:00
}
},
watch: {
2018-01-16 22:24:21 +01:00
value (dates) {
let newVal = dates[0] || initTimeDate();
2016-12-26 14:50:39 +08:00
newVal = new Date(newVal);
2018-01-16 22:24:21 +01:00
this.date = newVal;
2016-12-26 14:50:39 +08:00
}
},
methods: {
2016-12-27 15:15:29 +08:00
handleChange (date, emit = true) {
2018-01-16 22:24:21 +01:00
const newDate = new Date(this.date);
Object.keys(date).forEach(
type => newDate[`set${capitalize(type)}`](date[type])
);
if (emit) this.$emit('on-pick', newDate, true);
},
},
mounted () {
if (this.$parent && this.$parent.$options.name === 'DatePicker') this.showDate = true;
2016-12-26 14:50:39 +08:00
}
};
</script>