CalendarHeader.js 4.92 KB
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _vueTypes = require('../../../_util/vue-types');

var _vueTypes2 = _interopRequireDefault(_vueTypes);

var _BaseMixin = require('../../../_util/BaseMixin');

var _BaseMixin2 = _interopRequireDefault(_BaseMixin);

var _util = require('../util');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var CalendarHeader = {
  mixins: [_BaseMixin2['default']],
  props: {
    value: _vueTypes2['default'].object,
    locale: _vueTypes2['default'].object,
    yearSelectOffset: _vueTypes2['default'].number.def(10),
    yearSelectTotal: _vueTypes2['default'].number.def(20),
    // onValueChange: PropTypes.func,
    // onTypeChange: PropTypes.func,
    Select: _vueTypes2['default'].object,
    prefixCls: _vueTypes2['default'].string,
    type: _vueTypes2['default'].string,
    showTypeSwitch: _vueTypes2['default'].bool,
    headerComponents: _vueTypes2['default'].array
  },
  methods: {
    onYearChange: function onYearChange(year) {
      var newValue = this.value.clone();
      newValue.year(parseInt(year, 10));
      this.__emit('valueChange', newValue);
    },
    onMonthChange: function onMonthChange(month) {
      var newValue = this.value.clone();
      newValue.month(parseInt(month, 10));
      this.__emit('valueChange', newValue);
    },
    yearSelectElement: function yearSelectElement(year) {
      var h = this.$createElement;
      var yearSelectOffset = this.yearSelectOffset,
          yearSelectTotal = this.yearSelectTotal,
          prefixCls = this.prefixCls,
          Select = this.Select;

      var start = year - yearSelectOffset;
      var end = start + yearSelectTotal;

      var options = [];
      for (var index = start; index < end; index++) {
        options.push(h(
          Select.Option,
          { key: '' + index },
          [index]
        ));
      }
      return h(
        Select,
        {
          'class': prefixCls + '-header-year-select',
          on: {
            'change': this.onYearChange
          },
          attrs: {
            dropdownStyle: { zIndex: 2000 },
            dropdownMenuStyle: { maxHeight: '250px', overflow: 'auto', fontSize: '12px' },
            optionLabelProp: 'children',
            value: String(year),
            showSearch: false
          }
        },
        [options]
      );
    },
    monthSelectElement: function monthSelectElement(month) {
      var h = this.$createElement;
      var value = this.value,
          Select = this.Select,
          prefixCls = this.prefixCls;

      var t = value.clone();
      var options = [];

      for (var index = 0; index < 12; index++) {
        t.month(index);
        options.push(h(
          Select.Option,
          { key: '' + index },
          [(0, _util.getMonthName)(t)]
        ));
      }

      return h(
        Select,
        {
          'class': prefixCls + '-header-month-select',
          attrs: { dropdownStyle: { zIndex: 2000 },
            dropdownMenuStyle: {
              maxHeight: '250px',
              overflow: 'auto',
              overflowX: 'hidden',
              fontSize: '12px'
            },
            optionLabelProp: 'children',
            value: String(month),
            showSearch: false
          },
          on: {
            'change': this.onMonthChange
          }
        },
        [options]
      );
    },
    changeTypeToDate: function changeTypeToDate() {
      this.__emit('typeChange', 'date');
    },
    changeTypeToMonth: function changeTypeToMonth() {
      this.__emit('typeChange', 'month');
    }
  },

  render: function render() {
    var h = arguments[0];
    var value = this.value,
        locale = this.locale,
        prefixCls = this.prefixCls,
        type = this.type,
        showTypeSwitch = this.showTypeSwitch,
        headerComponents = this.headerComponents;

    var year = value.year();
    var month = value.month();
    var yearSelect = this.yearSelectElement(year);
    var monthSelect = type === 'month' ? null : this.monthSelectElement(month);
    var switchCls = prefixCls + '-header-switcher';
    var typeSwitcher = showTypeSwitch ? h(
      'span',
      { 'class': switchCls },
      [type === 'date' ? h(
        'span',
        { 'class': switchCls + '-focus' },
        [locale.month]
      ) : h(
        'span',
        {
          on: {
            'click': this.changeTypeToDate
          },
          'class': switchCls + '-normal' },
        [locale.month]
      ), type === 'month' ? h(
        'span',
        { 'class': switchCls + '-focus' },
        [locale.year]
      ) : h(
        'span',
        {
          on: {
            'click': this.changeTypeToMonth
          },
          'class': switchCls + '-normal' },
        [locale.year]
      )]
    ) : null;

    return h(
      'div',
      { 'class': prefixCls + '-header' },
      [typeSwitcher, monthSelect, yearSelect, headerComponents]
    );
  }
};

exports['default'] = CalendarHeader;