Blame view

src/components/date-picker/panel/Date/date-range.vue 15.1 KB
c4e3fe33   Sergio Crisostomo   move date-range.v...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  <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="[prefixCls + '-content', prefixCls + '-content-left']" v-show="!isTime">
                  <div :class="[datePrefixCls + '-header']" v-show="currentView !== 'time'">
                      <span
                          :class="iconBtnCls('prev', '-double')"
                          @click="prevYear('left')"><Icon type="ios-arrow-left"></Icon></span>
                      <span
73a34dfa   Sergio Crisostomo   Fix year/month pr...
16
                          v-if="splitPanels || leftPickerTable === 'date-table'"
c4e3fe33   Sergio Crisostomo   move date-range.v...
17
18
19
20
21
                          :class="iconBtnCls('prev')"
                          @click="prevMonth('left')"
                          v-show="currentView === 'date'"><Icon type="ios-arrow-left"></Icon></span>
                      <date-panel-label
                          :date-panel-label="leftDatePanelLabel"
73a34dfa   Sergio Crisostomo   Fix year/month pr...
22
                          :current-view="leftDatePanelView"
c4e3fe33   Sergio Crisostomo   move date-range.v...
23
24
                          :date-prefix-cls="datePrefixCls"></date-panel-label>
                      <span
73a34dfa   Sergio Crisostomo   Fix year/month pr...
25
                          v-if="splitPanels || leftPickerTable !== 'date-table'"
c4e3fe33   Sergio Crisostomo   move date-range.v...
26
27
28
                          :class="iconBtnCls('next', '-double')"
                          @click="nextYear('left')"><Icon type="ios-arrow-right"></Icon></span>
                      <span
435bf781   Sergio Crisostomo   add split panel p...
29
                          v-if="splitPanels"
c4e3fe33   Sergio Crisostomo   move date-range.v...
30
31
32
33
34
                          :class="iconBtnCls('next')"
                          @click="nextMonth('left')"
                          v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span>
                  </div>
                  <component
b52e02e4   Sergio Crisostomo   Fix month|year pr...
35
                      :is="leftPickerTable"
c4e3fe33   Sergio Crisostomo   move date-range.v...
36
37
38
39
40
41
                      ref="leftYearTable"
                      v-if="currentView !== 'time'"
                      :table-date="leftPanelDate"
                      selection-mode="range"
                      :disabled-date="disabledDate"
                      :range-state="rangeState"
e55ba7a2   Sergio Crisostomo   Add week numbers
42
                      :show-week-numbers="showWeekNumbers"
c4e3fe33   Sergio Crisostomo   move date-range.v...
43
44
                      :value="dates"
                      @on-change-range="handleChangeRange"
b52e02e4   Sergio Crisostomo   Fix month|year pr...
45
                      @on-pick="panelPickerHandlers.left"
c4e3fe33   Sergio Crisostomo   move date-range.v...
46
47
48
49
50
51
                      @on-pick-click="handlePickClick"
                  ></component>
              </div>
              <div :class="[prefixCls + '-content', prefixCls + '-content-right']" v-show="!isTime">
                  <div :class="[datePrefixCls + '-header']" v-show="currentView !== 'time'">
                      <span
73a34dfa   Sergio Crisostomo   Fix year/month pr...
52
                          v-if="splitPanels || rightPickerTable !== 'date-table'"
c4e3fe33   Sergio Crisostomo   move date-range.v...
53
54
55
                          :class="iconBtnCls('prev', '-double')"
                          @click="prevYear('right')"><Icon type="ios-arrow-left"></Icon></span>
                      <span
435bf781   Sergio Crisostomo   add split panel p...
56
                          v-if="splitPanels"
c4e3fe33   Sergio Crisostomo   move date-range.v...
57
58
59
60
61
                          :class="iconBtnCls('prev')"
                          @click="prevMonth('right')"
                          v-show="currentView === 'date'"><Icon type="ios-arrow-left"></Icon></span>
                      <date-panel-label
                          :date-panel-label="rightDatePanelLabel"
73a34dfa   Sergio Crisostomo   Fix year/month pr...
62
                          :current-view="rightDatePanelView"
c4e3fe33   Sergio Crisostomo   move date-range.v...
63
64
65
66
67
                          :date-prefix-cls="datePrefixCls"></date-panel-label>
                      <span
                          :class="iconBtnCls('next', '-double')"
                          @click="nextYear('right')"><Icon type="ios-arrow-right"></Icon></span>
                      <span
73a34dfa   Sergio Crisostomo   Fix year/month pr...
68
                          v-if="splitPanels || rightPickerTable === 'date-table'"
c4e3fe33   Sergio Crisostomo   move date-range.v...
69
70
71
72
73
                          :class="iconBtnCls('next')"
                          @click="nextMonth('right')"
                          v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span>
                  </div>
                  <component
b52e02e4   Sergio Crisostomo   Fix month|year pr...
74
                      :is="rightPickerTable"
c4e3fe33   Sergio Crisostomo   move date-range.v...
75
76
77
78
79
80
                      ref="rightYearTable"
                      v-if="currentView !== 'time'"
                      :table-date="rightPanelDate"
                      selection-mode="range"
                      :range-state="rangeState"
                      :disabled-date="disabledDate"
e55ba7a2   Sergio Crisostomo   Add week numbers
81
                      :show-week-numbers="showWeekNumbers"
c4e3fe33   Sergio Crisostomo   move date-range.v...
82
83
                      :value="dates"
                      @on-change-range="handleChangeRange"
b52e02e4   Sergio Crisostomo   Fix month|year pr...
84
                      @on-pick="panelPickerHandlers.right"
c4e3fe33   Sergio Crisostomo   move date-range.v...
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
                      @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"
                      @on-pick="handleRangePick"
                      @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"
                  :time-disabled="timeDisabled"
                  @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-range.vue';
      import Confirm from '../../base/confirm.vue';
  
      import { toDate, initTimeDate, formatDateLabels } from '../../util';
      import datePanelLabel from './date-panel-label.vue';
  
      import Mixin from '../panel-mixin';
      import DateMixin from './date-panel-mixin';
      import Locale from '../../../../mixins/locale';
  
      const prefixCls = 'ivu-picker-panel';
      const datePrefixCls = 'ivu-date-picker';
  
5092777d   Sergio Crisostomo   Fix sort of date ...
130
131
132
133
      const dateSorter = (a, b) => {
          if (!a || !b) return 0;
          return a.getTime() - b.getTime();
      };
c4e3fe33   Sergio Crisostomo   move date-range.v...
134
135
136
137
138
139
  
      export default {
          name: 'RangeDatePickerPanel',
          mixins: [ Mixin, Locale, DateMixin ],
          components: { Icon, DateTable, YearTable, MonthTable, TimePicker, Confirm, datePanelLabel },
          props: {
435bf781   Sergio Crisostomo   add split panel p...
140
141
142
143
144
              // more props in the mixin
              splitPanels: {
                  type: Boolean,
                  default: false
              },
c4e3fe33   Sergio Crisostomo   move date-range.v...
145
146
147
          },
          data(){
              const [minDate, maxDate] = this.value.map(date => date || initTimeDate());
63bd0f7d   Sergio Crisostomo   Add start-date pr...
148
149
              const leftPanelDate = this.startDate ? this.startDate : minDate;
  
c4e3fe33   Sergio Crisostomo   move date-range.v...
150
151
152
153
154
155
              return {
                  prefixCls: prefixCls,
                  datePrefixCls: datePrefixCls,
                  dates: this.value,
                  rangeState: {from: this.value[0], to: this.value[1], selecting: minDate && !maxDate},
                  currentView: this.selectionMode || 'range',
b52e02e4   Sergio Crisostomo   Fix month|year pr...
156
157
                  leftPickerTable: `${this.selectionMode}-table`,
                  rightPickerTable: `${this.selectionMode}-table`,
63bd0f7d   Sergio Crisostomo   Add start-date pr...
158
159
                  leftPanelDate: leftPanelDate,
                  rightPanelDate: new Date(leftPanelDate.getFullYear(), leftPanelDate.getMonth() + 1, leftPanelDate.getDate())
c4e3fe33   Sergio Crisostomo   move date-range.v...
160
161
162
163
164
165
166
167
168
169
170
171
              };
          },
          computed: {
              classes(){
                  return [
                      `${prefixCls}-body-wrapper`,
                      `${datePrefixCls}-with-range`,
                      {
                          [`${prefixCls}-with-sidebar`]: this.shortcuts.length
                      }
                  ];
              },
c4e3fe33   Sergio Crisostomo   move date-range.v...
172
173
174
175
176
177
              leftDatePanelLabel(){
                  return this.panelLabelConfig('left');
              },
              rightDatePanelLabel(){
                  return this.panelLabelConfig('right');
              },
73a34dfa   Sergio Crisostomo   Fix year/month pr...
178
179
180
181
182
183
              leftDatePanelView(){
                  return this.leftPickerTable.split('-').shift();
              },
              rightDatePanelView(){
                  return this.rightPickerTable.split('-').shift();
              },
c4e3fe33   Sergio Crisostomo   move date-range.v...
184
185
              timeDisabled(){
                  return !(this.dates[0] && this.dates[1]);
b52e02e4   Sergio Crisostomo   Fix month|year pr...
186
187
188
189
190
191
              },
              panelPickerHandlers(){
                  const tableType = `${this.currentView}-table`;
                  return {
                      left: this.leftPickerTable === tableType ? this.handleRangePick : this.handlePreSelection.bind(this, 'left'),
                      right: this.leftPickerTable === tableType ? this.handleRangePick : this.handlePreSelection.bind(this, 'right'),
5092777d   Sergio Crisostomo   Fix sort of date ...
192
                  };
c4e3fe33   Sergio Crisostomo   move date-range.v...
193
194
195
196
197
198
              }
          },
          watch: {
              value(newVal) {
                  const minDate = newVal[0] ? toDate(newVal[0]) : null;
                  const maxDate = newVal[1] ? toDate(newVal[1]) : null;
5092777d   Sergio Crisostomo   Fix sort of date ...
199
                  this.dates = [minDate, maxDate].sort(dateSorter);
15457562   Sergio Crisostomo   Reset panel date ...
200
  
c4e3fe33   Sergio Crisostomo   move date-range.v...
201
                  this.rangeState = {
15457562   Sergio Crisostomo   Reset panel date ...
202
203
                      from: this.dates[0],
                      to: this.dates[1],
c4e3fe33   Sergio Crisostomo   move date-range.v...
204
205
                      selecting: false
                  };
c2b7fed0   Sergio Crisostomo   Reset panel selec...
206
207
208
209
210
211
212
  
  
                  // set panels positioning
                  const leftPanelDate = this.startDate || this.dates[0] || new Date();
                  this.leftPanelDate = leftPanelDate;
                  const rightPanelDate = new Date(leftPanelDate.getFullYear(), leftPanelDate.getMonth() + 1, leftPanelDate.getDate());
                  this.rightPanelDate = this.splitPanels ? new Date(Math.max(this.dates[1], rightPanelDate)) : rightPanelDate;
c4e3fe33   Sergio Crisostomo   move date-range.v...
213
214
215
216
217
218
              },
              currentView(currentView){
                  const leftMonth = this.leftPanelDate.getMonth();
                  const rightMonth = this.rightPanelDate.getMonth();
                  const isSameYear = this.leftPanelDate.getFullYear() === this.rightPanelDate.getFullYear();
  
c4e3fe33   Sergio Crisostomo   move date-range.v...
219
220
221
222
223
224
225
226
227
                  if (currentView === 'date' && isSameYear && leftMonth === rightMonth){
                      this.changePanelDate('right', 'Month', 1);
                  }
                  if (currentView === 'month' && isSameYear){
                      this.changePanelDate('right', 'FullYear', 1);
                  }
                  if (currentView === 'year' && isSameYear){
                      this.changePanelDate('right', 'FullYear', 10);
                  }
c2b7fed0   Sergio Crisostomo   Reset panel selec...
228
229
              },
              selectionMode(type){
c2b7fed0   Sergio Crisostomo   Reset panel selec...
230
                  this.currentView = type || 'range';
c4e3fe33   Sergio Crisostomo   move date-range.v...
231
232
233
              }
          },
          methods: {
46726afd   Sergio Crisostomo   Fix panels reset ...
234
235
236
237
238
              reset(){
                  this.currentView = this.selectionMode;
                  this.leftPickerTable = `${this.currentView}-table`;
                  this.rightPickerTable = `${this.currentView}-table`;
              },
c4e3fe33   Sergio Crisostomo   move date-range.v...
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
              panelLabelConfig (direction) {
                  const locale = this.t('i.locale');
                  const datePanelLabel = this.t('i.datepicker.datePanelLabel');
                  const handler = type => {
                      const fn = type == 'month' ? this.showMonthPicker : this.showYearPicker;
                      return () => fn(direction);
                  };
  
                  const date = this[`${direction}PanelDate`];
                  const { labels, separator } = formatDateLabels(locale, datePanelLabel, date);
  
                  return {
                      separator: separator,
                      labels: labels.map(obj => ((obj.handler = handler(obj.type)), obj))
                  };
              },
77e43f2b   Sergio Crisostomo   Correct year date...
255
              prevYear (panel) {
77e43f2b   Sergio Crisostomo   Correct year date...
256
257
                  const increment = this.currentView === 'year' ? -10 : -1;
                  this.changePanelDate(panel, 'FullYear', increment);
c4e3fe33   Sergio Crisostomo   move date-range.v...
258
              },
77e43f2b   Sergio Crisostomo   Correct year date...
259
260
261
              nextYear (panel) {
                  const increment = this.currentView === 'year' ? 10 : 1;
                  this.changePanelDate(panel, 'FullYear', increment);
c4e3fe33   Sergio Crisostomo   move date-range.v...
262
              },
77e43f2b   Sergio Crisostomo   Correct year date...
263
264
              prevMonth(panel){
                  this.changePanelDate(panel, 'Month', -1);
c4e3fe33   Sergio Crisostomo   move date-range.v...
265
              },
77e43f2b   Sergio Crisostomo   Correct year date...
266
267
              nextMonth(panel){
                  this.changePanelDate(panel, 'Month', 1);
c4e3fe33   Sergio Crisostomo   move date-range.v...
268
269
270
271
272
273
              },
              changePanelDate(panel, type, increment){
                  const current = new Date(this[`${panel}PanelDate`]);
                  current[`set${type}`](current[`get${type}`]() + increment);
                  this[`${panel}PanelDate`] = current;
  
77e43f2b   Sergio Crisostomo   Correct year date...
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
  
                  if (this.splitPanels){
                      // change other panel if dates overlap
                      const otherPanel = panel === 'left' ? 'right' : 'left';
                      if (panel === 'left' && this.leftPanelDate >= this.rightPanelDate){
                          this.changePanelDate(otherPanel, type, 1);
                      }
                      if (panel === 'right' && this.rightPanelDate <= this.leftPanelDate){
                          this.changePanelDate(otherPanel, type, -1);
                      }
                  } else {
                      // keep the panels together
                      const otherPanel = panel === 'left' ? 'right' : 'left';
                      const otherCurrent = new Date(this[`${otherPanel}PanelDate`]);
                      otherCurrent[`set${type}`](otherCurrent[`get${type}`]() + increment);
                      if (current[`get${type}`]() !== otherCurrent[`get${type}`]()){
                          this[`${otherPanel}PanelDate`] = otherCurrent;
                      }
c4e3fe33   Sergio Crisostomo   move date-range.v...
292
293
                  }
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
294
295
296
297
298
              showYearPicker (panel) {
                  this[`${panel}PickerTable`] = 'year-table';
              },
              showMonthPicker (panel) {
                  this[`${panel}PickerTable`] = 'month-table';
c4e3fe33   Sergio Crisostomo   move date-range.v...
299
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
300
301
              handlePreSelection(panel, value){
                  this[`${panel}PanelDate`] = value;
73a34dfa   Sergio Crisostomo   Fix year/month pr...
302
303
304
305
306
307
308
309
310
311
                  const currentViewType = this[`${panel}PickerTable`];
                  if (currentViewType === 'year-table') this[`${panel}PickerTable`] = 'month-table';
                  else this[`${panel}PickerTable`] = `${this.currentView}-table`;
  
                  if (!this.splitPanels){
                      const otherPanel = panel === 'left' ? 'right' : 'left';
                      const type = currentViewType === 'year-table' ? 'FullYear' : 'Month';
                      this[`${otherPanel}PanelDate`] = value;
                      this.changePanelDate(otherPanel, type, 1);
                  }
c4e3fe33   Sergio Crisostomo   move date-range.v...
312
313
314
              },
              handleRangePick (val) {
                  if (this.rangeState.selecting || this.currentView === 'time'){
5092777d   Sergio Crisostomo   Fix sort of date ...
315
                      const [minDate, maxDate] = [this.rangeState.from, val].sort(dateSorter);
c4e3fe33   Sergio Crisostomo   move date-range.v...
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
                      this.dates = [minDate, maxDate];
                      if (this.currentView === 'time'){
                          this.dates = val;
                      } else {
                          this.rangeState = {
                              from: minDate,
                              to: maxDate,
                              selecting: false
                          };
                      }
                      this.handleConfirm(false);
                  } else {
                      this.rangeState = {
                          from: val,
                          to: null,
                          selecting: true
                      };
                  }
              },
              handleChangeRange (val) {
                  this.rangeState.to = val;
              },
          },
      };
  </script>