You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ant-design-vue/components/vc-time-picker/TimePicker.jsx

303 lines
7.6 KiB

import PropTypes from '../_util/vue-types'
import BaseMixin from '../_util/BaseMixin'
import Trigger from '../trigger'
import Panel from './Panel'
import placements from './placements'
import moment from 'moment'
import { initDefaultProps, hasProp } from '../_util/props-util'
function noop () {
}
export default {
mixins: [BaseMixin],
props: initDefaultProps({
prefixCls: PropTypes.string,
clearText: PropTypes.string,
value: PropTypes.any,
defaultOpenValue: {
type: Object,
default: () => {
return moment()
},
},
inputReadOnly: PropTypes.bool,
disabled: PropTypes.bool,
allowEmpty: PropTypes.bool,
defaultValue: PropTypes.any,
open: PropTypes.bool,
defaultOpen: PropTypes.bool,
align: PropTypes.object,
placement: PropTypes.any,
transitionName: PropTypes.string,
getPopupContainer: PropTypes.func,
placeholder: PropTypes.string,
format: PropTypes.string,
showHour: PropTypes.bool,
showMinute: PropTypes.bool,
showSecond: PropTypes.bool,
popupClassName: PropTypes.string,
disabledHours: PropTypes.func,
disabledMinutes: PropTypes.func,
disabledSeconds: PropTypes.func,
hideDisabledOptions: PropTypes.bool,
// onChange: PropTypes.func,
// onOpen: PropTypes.func,
// onClose: PropTypes.func,
// onFocus: PropTypes.func,
// onBlur: PropTypes.func,
name: PropTypes.string,
autoComplete: PropTypes.string,
use12Hours: PropTypes.bool,
hourStep: PropTypes.number,
minuteStep: PropTypes.number,
secondStep: PropTypes.number,
focusOnOpen: PropTypes.bool,
// onKeyDown: PropTypes.func,
autoFocus: PropTypes.bool,
id: PropTypes.string,
}, {
clearText: 'clear',
prefixCls: 'rc-time-picker',
defaultOpen: false,
inputReadOnly: false,
popupClassName: '',
align: {},
id: '',
allowEmpty: true,
showHour: true,
showMinute: true,
showSecond: true,
disabledHours: noop,
disabledMinutes: noop,
disabledSeconds: noop,
hideDisabledOptions: false,
placement: 'bottomLeft',
use12Hours: false,
focusOnOpen: false,
}),
data () {
const { defaultOpen, defaultValue, open = defaultOpen, value = defaultValue } = this
return {
sOpen: open,
sValue: value,
}
},
watch: {
value (val) {
this.setState({
sValue: val,
})
},
open (val) {
if (val !== undefined) {
this.setState({
sOpen: val,
})
}
},
},
methods: {
onPanelChange (value) {
this.setValue(value)
},
onPanelClear () {
this.setValue(null)
this.setOpen(false)
},
onVisibleChange (open) {
this.setOpen(open)
},
onEsc () {
this.setOpen(false)
this.focus()
},
onKeyDown (e) {
if (e.keyCode === 40) {
this.setOpen(true)
}
},
onKeyDown2 (e) {
this.__emit('keydown', e)
},
setValue (value) {
if (!hasProp(this, 'value')) {
this.setState({
sValue: value,
})
}
this.__emit('change', value)
},
getFormat () {
const { format, showHour, showMinute, showSecond, use12Hours } = this
if (format) {
return format
}
if (use12Hours) {
const fmtString = ([
showHour ? 'h' : '',
showMinute ? 'mm' : '',
showSecond ? 'ss' : '',
].filter(item => !!item).join(':'))
return fmtString.concat(' a')
}
return [
showHour ? 'HH' : '',
showMinute ? 'mm' : '',
showSecond ? 'ss' : '',
].filter(item => !!item).join(':')
},
getPanelElement () {
const {
prefixCls, placeholder, disabledHours,
disabledMinutes, disabledSeconds, hideDisabledOptions, inputReadOnly,
allowEmpty, showHour, showMinute, showSecond, defaultOpenValue, clearText,
use12Hours, focusOnOpen, onKeyDown2, hourStep, minuteStep, secondStep,
sValue,
} = this
return (
<Panel
clearText={clearText}
prefixCls={`${prefixCls}-panel`}
ref='panel'
value={sValue}
inputReadOnly={inputReadOnly}
onChange={this.onPanelChange}
onClear={this.onPanelClear}
defaultOpenValue={defaultOpenValue}
showHour={showHour}
showMinute={showMinute}
showSecond={showSecond}
onEsc={this.onEsc}
allowEmpty={allowEmpty}
format={this.getFormat()}
placeholder={placeholder}
disabledHours={disabledHours}
disabledMinutes={disabledMinutes}
disabledSeconds={disabledSeconds}
hideDisabledOptions={hideDisabledOptions}
use12Hours={use12Hours}
hourStep={hourStep}
minuteStep={minuteStep}
secondStep={secondStep}
focusOnOpen={focusOnOpen}
onKeyDown={onKeyDown2}
>
{this.$slots.addon}
</Panel>
)
},
getPopupClassName () {
const { showHour, showMinute, showSecond, use12Hours, prefixCls } = this
let popupClassName = this.popupClassName
// Keep it for old compatibility
if ((!showHour || !showMinute || !showSecond) && !use12Hours) {
popupClassName += ` ${prefixCls}-panel-narrow`
}
let selectColumnCount = 0
if (showHour) {
selectColumnCount += 1
}
if (showMinute) {
selectColumnCount += 1
}
if (showSecond) {
selectColumnCount += 1
}
if (use12Hours) {
selectColumnCount += 1
}
popupClassName += ` ${prefixCls}-panel-column-${selectColumnCount}`
return popupClassName
},
setOpen (open) {
if (this.sOpen !== open) {
if (!hasProp(this, 'open')) {
this.setState({ sOpen: open })
}
if (open) {
this.__emit('open', { open })
} else {
this.__emit('close', { open })
}
}
},
focus () {
this.$refs.picker.focus()
},
blur () {
this.$refs.picker.blur()
},
onFocus (e) {
this.__emit('focus', e)
},
onBlur (e) {
this.__emit('blur', e)
},
},
render () {
const {
prefixCls, placeholder, placement, align, id,
disabled, transitionName, getPopupContainer, name, autoComplete,
autoFocus, inputReadOnly, sOpen, sValue, onFocus, onBlur,
} = this
const popupClassName = this.getPopupClassName()
return (
<Trigger
prefixCls={`${prefixCls}-panel`}
popupClassName={popupClassName}
popupAlign={align}
builtinPlacements={placements}
popupPlacement={placement}
action={disabled ? [] : ['click']}
destroyPopupOnHide
getPopupContainer={getPopupContainer}
popupTransitionName={transitionName}
popupVisible={sOpen}
onPopupVisibleChange={this.onVisibleChange}
>
<template slot='popup'>
{this.getPanelElement()}
</template>
<span class={`${prefixCls}`}>
<input
class={`${prefixCls}-input`}
ref='picker'
type='text'
placeholder={placeholder}
name={name}
onKeydown={this.onKeyDown}
disabled={disabled}
value={sValue && sValue.format(this.getFormat()) || ''}
autoComplete={autoComplete}
onFocus={onFocus}
onBlur={onBlur}
autoFocus={autoFocus}
readOnly={!!inputReadOnly}
id={id}
/>
<span class={`${prefixCls}-icon`}/>
</span>
</Trigger>
)
},
}