import PropTypes from '../_util/vue-types' import Select from './Select' import BaseMixin from '../_util/BaseMixin' const formatOption = (option, disabledOptions) => { let value = `${option}` if (option < 10) { value = `0${option}` } let disabled = false if (disabledOptions && disabledOptions.indexOf(option) >= 0) { disabled = true } return { value, disabled, } } const Combobox = { mixins: [BaseMixin], name: 'Combobox', props: { format: PropTypes.string, defaultOpenValue: PropTypes.object, prefixCls: PropTypes.string, value: PropTypes.object, // onChange: PropTypes.func, showHour: PropTypes.bool, showMinute: PropTypes.bool, showSecond: PropTypes.bool, hourOptions: PropTypes.array, minuteOptions: PropTypes.array, secondOptions: PropTypes.array, disabledHours: PropTypes.func, disabledMinutes: PropTypes.func, disabledSeconds: PropTypes.func, // onCurrentSelectPanelChange: PropTypes.func, use12Hours: PropTypes.bool, isAM: PropTypes.bool, }, methods: { onItemChange (type, itemValue) { const { defaultOpenValue, use12Hours, isAM } = this const value = (this.value || defaultOpenValue).clone() if (type === 'hour') { if (use12Hours) { if (isAM) { value.hour(+itemValue % 12) } else { value.hour((+itemValue % 12) + 12) } } else { value.hour(+itemValue) } } else if (type === 'minute') { value.minute(+itemValue) } else if (type === 'ampm') { const ampm = itemValue.toUpperCase() if (use12Hours) { if (ampm === 'PM' && value.hour() < 12) { value.hour((value.hour() % 12) + 12) } if (ampm === 'AM') { if (value.hour() >= 12) { value.hour(value.hour() - 12) } } } } else { value.second(+itemValue) } this.__emit('change', value) }, onEnterSelectPanel (range) { this.__emit('currentSelectPanelChange', range) }, getHourSelect (hour) { const { prefixCls, hourOptions, disabledHours, showHour, use12Hours } = this if (!showHour) { return null } const disabledOptions = disabledHours() let hourOptionsAdj let hourAdj if (use12Hours) { hourOptionsAdj = [12].concat(hourOptions.filter(h => h < 12 && h > 0)) hourAdj = (hour % 12) || 12 } else { hourOptionsAdj = hourOptions hourAdj = hour } return ( formatOption(option, disabledOptions))} selectedIndex={minuteOptions.indexOf(minute)} type='minute' onSelect={this.onItemChange} onMouseenter={this.onEnterSelectPanel.bind(this, 'minute')} /> ) }, getSecondSelect (second) { const { prefixCls, secondOptions, disabledSeconds, showSecond, defaultOpenValue } = this if (!showSecond) { return null } const value = this.value || defaultOpenValue const disabledOptions = disabledSeconds(value.hour(), value.minute()) return ( ) }, }, render () { const { prefixCls, defaultOpenValue } = this const value = this.value || defaultOpenValue return (
{this.getHourSelect(value.hour())} {this.getMinuteSelect(value.minute())} {this.getSecondSelect(value.second())} {this.getAMPMSelect(value.hour())}
) }, } export default Combobox