Blame view

src/components/date-picker/panel/Date/date.vue 8.12 KB
e32b86e9   Sergio Crisostomo   move date.vue to ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  <template>
      <div :class="classes" @mousedown.prevent>
          <div :class="[prefixCls + '-sidebar']" v-if="shortcuts.length">
              <div
                  :class="[prefixCls + '-shortcut']"
                  v-for="shortcut in shortcuts"
                  @click="handleShortcutClick(shortcut)">{{ shortcut.text }}</div>
          </div>
          <div :class="[prefixCls + '-body']">
              <div :class="[datePrefixCls + '-header']" v-show="currentView !== 'time'">
                  <span
                      :class="iconBtnCls('prev', '-double')"
                      @click="changeYear(-1)"><Icon type="ios-arrow-left"></Icon></span>
                  <span
73a34dfa   Sergio Crisostomo   Fix year/month pr...
15
                      v-if="pickerTable === 'date-table'"
e32b86e9   Sergio Crisostomo   move date.vue to ...
16
17
18
19
20
                      :class="iconBtnCls('prev')"
                      @click="changeMonth(-1)"
                      v-show="currentView === 'date'"><Icon type="ios-arrow-left"></Icon></span>
                  <date-panel-label
                      :date-panel-label="datePanelLabel"
73a34dfa   Sergio Crisostomo   Fix year/month pr...
21
                      :current-view="pickerTable.split('-').shift()"
e32b86e9   Sergio Crisostomo   move date.vue to ...
22
23
24
25
26
                      :date-prefix-cls="datePrefixCls"></date-panel-label>
                  <span
                      :class="iconBtnCls('next', '-double')"
                      @click="changeYear(+1)"><Icon type="ios-arrow-right"></Icon></span>
                  <span
73a34dfa   Sergio Crisostomo   Fix year/month pr...
27
                      v-if="pickerTable === 'date-table'"
e32b86e9   Sergio Crisostomo   move date.vue to ...
28
29
30
31
32
33
34
35
36
37
                      :class="iconBtnCls('next')"
                      @click="changeMonth(+1)"
                      v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span>
              </div>
              <div :class="[prefixCls + '-content']">
                  <component
                      :is="pickerTable"
                      ref="pickerTable"
                      v-if="currentView !== 'time'"
                      :table-date="panelDate"
e55ba7a2   Sergio Crisostomo   Add week numbers
38
                      :show-week-numbers="showWeekNumbers"
e32b86e9   Sergio Crisostomo   move date.vue to ...
39
40
41
                      :value="dates"
                      :selection-mode="selectionMode"
                      :disabled-date="disabledDate"
b52e02e4   Sergio Crisostomo   Fix month|year pr...
42
                      @on-pick="panelPickerHandlers"
e32b86e9   Sergio Crisostomo   move date.vue to ...
43
44
45
46
47
48
49
50
51
52
                      @on-pick-click="handlePickClick"
                  ></component>
              </div>
              <div :class="[prefixCls + '-content']" v-show="isTime">
                  <time-picker
                      ref="timePicker"
                      v-if="currentView === 'time'"
                      :value="dates"
                      :format="format"
                      :time-disabled="timeDisabled"
3cd62242   Sergio Crisostomo   Allow disableDate...
53
                      :disabled-date="disabledDate"
79ac2457   Sergio Crisostomo   Allow DatePicker ...
54
                      v-bind="timePickerOptions"
e32b86e9   Sergio Crisostomo   move date.vue to ...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
                      @on-pick="handlePick"
                      @on-pick-click="handlePickClick"
                      @on-pick-clear="handlePickClear"
                      @on-pick-success="handlePickSuccess"
                      @on-pick-toggle-time="handleToggleTime"
                  ></time-picker>
              </div>
              <Confirm
                  v-if="confirm"
                  :show-time="showTime"
                  :is-time="isTime"
                  @on-pick-toggle-time="handleToggleTime"
                  @on-pick-clear="handlePickClear"
                  @on-pick-success="handlePickSuccess"
              ></Confirm>
          </div>
      </div>
  </template>
  <script>
      import Icon from '../../../icon/icon.vue';
      import DateTable from '../../base/date-table.vue';
      import YearTable from '../../base/year-table.vue';
      import MonthTable from '../../base/month-table.vue';
      import TimePicker from '../Time/time.vue';
      import Confirm from '../../base/confirm.vue';
      import datePanelLabel from './date-panel-label.vue';
  
      import Mixin from '../panel-mixin';
      import DateMixin from './date-panel-mixin';
      import Locale from '../../../../mixins/locale';
  
      import { siblingMonth, formatDateLabels } from '../../util';
  
      const prefixCls = 'ivu-picker-panel';
      const datePrefixCls = 'ivu-date-picker';
  
      export default {
          name: 'DatePickerPanel',
          mixins: [ Mixin, Locale, DateMixin ],
          components: { Icon, DateTable, YearTable, MonthTable, TimePicker, Confirm, datePanelLabel },
          props: {
02859de9   Sergio Crisostomo   Use the last pic...
96
97
98
99
100
              // more props in the mixin
              multiple: {
                  type: Boolean,
                  default: false
              }
e32b86e9   Sergio Crisostomo   move date.vue to ...
101
102
          },
          data () {
b52e02e4   Sergio Crisostomo   Fix month|year pr...
103
104
105
              const {selectionMode, value} = this;
  
              const dates = value.slice().sort();
e32b86e9   Sergio Crisostomo   move date.vue to ...
106
107
108
              return {
                  prefixCls: prefixCls,
                  datePrefixCls: datePrefixCls,
b52e02e4   Sergio Crisostomo   Fix month|year pr...
109
110
                  currentView: selectionMode || 'date',
                  pickerTable: this.getTableType(selectionMode),
e32b86e9   Sergio Crisostomo   move date.vue to ...
111
                  dates: dates,
63bd0f7d   Sergio Crisostomo   Add start-date pr...
112
                  panelDate: this.startDate || dates[0] || new Date()
e32b86e9   Sergio Crisostomo   move date.vue to ...
113
114
115
116
117
118
119
120
121
122
123
              };
          },
          computed: {
              classes () {
                  return [
                      `${prefixCls}-body-wrapper`,
                      {
                          [`${prefixCls}-with-sidebar`]: this.shortcuts.length
                      }
                  ];
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
124
              panelPickerHandlers(){
8d532306   Sergio Crisostomo   update panel date...
125
                  return this.pickerTable === `${this.currentView}-table` ? this.handlePick : this.handlePreSelection;
e32b86e9   Sergio Crisostomo   move date.vue to ...
126
127
128
129
130
131
132
133
              },
              datePanelLabel () {
                  const locale = this.t('i.locale');
                  const datePanelLabel = this.t('i.datepicker.datePanelLabel');
                  const date = this.panelDate;
                  const { labels, separator } = formatDateLabels(locale, datePanelLabel, date);
  
                  const handler = type => {
b52e02e4   Sergio Crisostomo   Fix month|year pr...
134
                      return () => this.pickerTable = this.getTableType(type);
e32b86e9   Sergio Crisostomo   move date.vue to ...
135
136
137
138
139
140
141
142
143
144
145
146
147
148
                  };
  
                  return {
                      separator: separator,
                      labels: labels.map(obj => ((obj.handler = handler(obj.type)), obj))
                  };
              },
              timeDisabled(){
                  return !this.dates[0];
              }
          },
          watch: {
              value (newVal) {
                  this.dates = newVal;
02859de9   Sergio Crisostomo   Use the last pic...
149
                  this.panelDate = this.startDate || (this.multiple ? this.dates[this.dates.length - 1] : this.dates[0]) || new Date();
e32b86e9   Sergio Crisostomo   move date.vue to ...
150
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
151
152
153
              currentView (currentView) {
                  this.$emit('on-selection-mode-change', currentView);
                  this.pickertable = this.getTableType(currentView);
3cd62242   Sergio Crisostomo   Allow disableDate...
154
155
156
157
158
159
160
  
                  if (this.currentView === 'time') {
                      this.$nextTick(() => {
                          const spinner = this.$refs.timePicker.$refs.timeSpinner;
                          spinner.updateScroll();
                      });
                  }
46726afd   Sergio Crisostomo   Fix panels reset ...
161
162
163
164
              },
              selectionMode(type){
                  this.currentView = type;
                  this.pickerTable = this.getTableType(type);
e32b86e9   Sergio Crisostomo   move date.vue to ...
165
166
167
              }
          },
          methods: {
46726afd   Sergio Crisostomo   Fix panels reset ...
168
169
170
171
              reset(){
                  this.currentView = this.selectionMode;
                  this.pickerTable = this.getTableType(this.currentView);
              },
e32b86e9   Sergio Crisostomo   move date.vue to ...
172
              changeYear(dir){
73a34dfa   Sergio Crisostomo   Fix year/month pr...
173
                  if (this.selectionMode === 'year' || this.pickerTable === 'year-table'){
77e43f2b   Sergio Crisostomo   Correct year date...
174
175
176
177
                      this.panelDate = new Date(this.panelDate.getFullYear() + dir * 10, 0, 1);
                  } else {
                      this.panelDate = siblingMonth(this.panelDate, dir * 12);
                  }
e32b86e9   Sergio Crisostomo   move date.vue to ...
178
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
179
180
181
              getTableType(currentView){
                  return currentView.match(/^time/) ? 'time-picker' : `${currentView}-table`;
              },
e32b86e9   Sergio Crisostomo   move date.vue to ...
182
183
184
              changeMonth(dir){
                  this.panelDate = siblingMonth(this.panelDate, dir);
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
185
186
              handlePreSelection(value){
                  this.panelDate = value;
73a34dfa   Sergio Crisostomo   Fix year/month pr...
187
188
189
                  if (this.pickerTable === 'year-table') this.pickerTable = 'month-table';
                  else this.pickerTable = this.getTableType(this.currentView);
  
b52e02e4   Sergio Crisostomo   Fix month|year pr...
190
              },
90ebd5a7   Sergio Crisostomo   Expose changed da...
191
              handlePick (value, type) {
bcf09be7   Sergio Crisostomo   fix handlePick an...
192
                  const {selectionMode, panelDate} = this;
4ec8bc8a   Sergio Crisostomo   Fix month picker ...
193
194
                  if (selectionMode === 'year') value = new Date(value.getFullYear(), 0, 1);
                  else if (selectionMode === 'month') value = new Date(panelDate.getFullYear(), value.getMonth(), 1);
e32b86e9   Sergio Crisostomo   move date.vue to ...
195
196
                  else value = new Date(value);
  
3cd62242   Sergio Crisostomo   Allow disableDate...
197
                  this.dates = [value];
90ebd5a7   Sergio Crisostomo   Expose changed da...
198
                  this.$emit('on-pick', value, false, type || selectionMode);
e32b86e9   Sergio Crisostomo   move date.vue to ...
199
200
201
202
              },
          },
      };
  </script>