ant-design-vue/components/vc-calendar/src/full-calendar/CalendarHeader.jsx

139 lines
3.8 KiB
Vue
Raw Normal View History

2018-03-19 02:16:27 +00:00
2018-03-19 02:25:42 +00:00
import PropTypes from '../../../_util/vue-types'
import BaseMixin from '../../../_util/BaseMixin'
2018-03-10 14:10:13 +00:00
import { getMonthName } from '../util'
const CalendarHeader = {
mixins: [BaseMixin],
props: {
value: PropTypes.object,
locale: PropTypes.object,
yearSelectOffset: PropTypes.number.def(10),
yearSelectTotal: PropTypes.number.def(20),
// onValueChange: PropTypes.func,
// onTypeChange: PropTypes.func,
2018-03-12 14:13:59 +00:00
Select: PropTypes.object,
2018-03-10 14:10:13 +00:00
prefixCls: PropTypes.string,
type: PropTypes.string,
showTypeSwitch: PropTypes.bool,
headerComponents: PropTypes.array,
},
methods: {
onYearChange (year) {
const newValue = this.value.clone()
newValue.year(parseInt(year, 10))
this.__emit('valueChange', newValue)
},
onMonthChange (month) {
const newValue = this.value.clone()
newValue.month(parseInt(month, 10))
this.__emit('valueChange', newValue)
},
yearSelectElement (year) {
const { yearSelectOffset, yearSelectTotal, prefixCls, Select } = this
const start = year - yearSelectOffset
const end = start + yearSelectTotal
const options = []
for (let index = start; index < end; index++) {
options.push(<Select.Option key={`${index}`}>{index}</Select.Option>)
}
return (
<Select
class={`${prefixCls}-header-year-select`}
onChange={this.onYearChange}
dropdownStyle={{ zIndex: 2000 }}
dropdownMenuStyle={{ maxHeight: '250px', overflow: 'auto', fontSize: '12px' }}
optionLabelProp='children'
value={String(year)}
showSearch={false}
>
{ options }
</Select>
)
},
monthSelectElement (month) {
const { value, Select, prefixCls } = this
const t = value.clone()
const options = []
for (let index = 0; index < 12; index++) {
t.month(index)
options.push(
<Select.Option key={`${index}`}>
{getMonthName(t)}
</Select.Option>
)
}
return (
<Select
class={`${prefixCls}-header-month-select`}
dropdownStyle={{ zIndex: 2000 }}
dropdownMenuStyle={{ maxHeight: '250px', overflow: 'auto', overflowX: 'hidden', fontSize: '12px' }}
optionLabelProp='children'
value={String(month)}
showSearch={false}
onChange={this.onMonthChange}
>
{ options }
</Select>
)
},
changeTypeToDate () {
this.__emit('typeChange', 'date')
},
changeTypeToMonth () {
this.__emit('typeChange', 'month')
},
},
render () {
const { value, locale, prefixCls, type, showTypeSwitch, headerComponents } = this
const year = value.year()
const month = value.month()
const yearSelect = this.yearSelectElement(year)
const monthSelect = type === 'month' ? null : this.monthSelectElement(month)
const switchCls = `${prefixCls}-header-switcher`
const typeSwitcher = showTypeSwitch ? (
<span class={switchCls}>
{ type === 'date'
? <span class={`${switchCls}-focus`}>{locale.month}</span>
: <span
onClick={this.changeTypeToDate}
class={`${switchCls}-normal`}
>
{locale.month}
</span>
}
{ type === 'month'
? <span class={`${switchCls}-focus`}>{locale.year}</span>
: <span
onClick={this.changeTypeToMonth}
class={`${switchCls}-normal`}
>
{locale.year}
</span>
}
</span>
) : null
return (
<div class={`${prefixCls}-header`}>
{ typeSwitcher }
{ monthSelect }
{ yearSelect }
{ headerComponents }
</div>
)
},
}
export default CalendarHeader
2018-03-19 02:16:27 +00:00