Blame view

src/components/date-picker/base/date-table.vue 9.55 KB
17e1fcf1   梁灏   init DatePicker
1
  <template>
50637863   梁灏   update DatePicker
2
      <div
0f677893   梁灏   update DatePicker
3
          :class="classes"
0f677893   梁灏   update DatePicker
4
          @mousemove="handleMouseMove">
50637863   梁灏   update DatePicker
5
          <div :class="[prefixCls + '-header']">
4ab11811   梁灏   some component su...
6
              <span>{{ t('i.datepicker.weeks.sun') }}</span><span>{{ t('i.datepicker.weeks.mon') }}</span><span>{{ t('i.datepicker.weeks.tue') }}</span><span>{{ t('i.datepicker.weeks.wed') }}</span><span>{{ t('i.datepicker.weeks.thu') }}</span><span>{{ t('i.datepicker.weeks.fri') }}</span><span>{{ t('i.datepicker.weeks.sat') }}</span>
50637863   梁灏   update DatePicker
7
          </div>
3747aecd   Sergio Crisostomo   Refactor date-pic...
8
          <span :class="getCellCls(cell)" v-for="(cell, index) in readCells"><em :index="index" @click="handleClick(cell)">{{ cell.text }}</em></span>
50637863   梁灏   update DatePicker
9
      </div>
17e1fcf1   梁灏   init DatePicker
10
11
  </template>
  <script>
b0893113   jingsam   :art: add eslint
12
      import { getFirstDayOfMonth, getDayCountOfMonth } from '../util';
50637863   梁灏   update DatePicker
13
      import { deepCopy } from '../../../utils/assist';
4ab11811   梁灏   some component su...
14
      import Locale from '../../../mixins/locale';
50637863   梁灏   update DatePicker
15
16
17
18
19
20
21
22
  
      const prefixCls = 'ivu-date-picker-cells';
  
      const clearHours = function (time) {
          const cloneDate = new Date(time);
          cloneDate.setHours(0, 0, 0, 0);
          return cloneDate.getTime();
      };
0f677893   梁灏   update DatePicker
23
  
17e1fcf1   梁灏   init DatePicker
24
      export default {
4ab11811   梁灏   some component su...
25
          mixins: [ Locale ],
0f677893   梁灏   update DatePicker
26
27
28
29
          props: {
              date: {},
              year: {},
              month: {},
0f677893   梁灏   update DatePicker
30
31
32
              selectionMode: {
                  default: 'day'
              },
0f677893   梁灏   update DatePicker
33
34
35
36
37
38
39
              disabledDate: {},
              minDate: {},
              maxDate: {},
              rangeState: {
                  default () {
                      return {
                          endDate: null,
3cf7cfd1   梁灏   update DatePicker
40
                          selecting: false
0f677893   梁灏   update DatePicker
41
42
43
                      };
                  }
              },
50637863   梁灏   update DatePicker
44
              value: ''
0f677893   梁灏   update DatePicker
45
          },
17e1fcf1   梁灏   init DatePicker
46
          data () {
0f677893   梁灏   update DatePicker
47
              return {
fa3a666d   梁灏   update DatePicker
48
49
                  prefixCls: prefixCls,
                  readCells: []
b0893113   jingsam   :art: add eslint
50
              };
0f677893   梁灏   update DatePicker
51
          },
472b4ff1   梁灏   update DatePicker
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
          watch: {
              'rangeState.endDate' (newVal) {
                  this.markRange(newVal);
              },
              minDate(newVal, oldVal) {
                  if (newVal && !oldVal) {
                      this.rangeState.selecting = true;
                      this.markRange(newVal);
                  } else if (!newVal) {
                      this.rangeState.selecting = false;
                      this.markRange(newVal);
                  } else {
                      this.markRange();
                  }
              },
              maxDate(newVal, oldVal) {
                  if (newVal && !oldVal) {
                      this.rangeState.selecting = false;
                      this.markRange(newVal);
3602b78d   梁灏   update DatePicker
71
72
73
74
  //                    this.$emit('on-pick', {
  //                        minDate: this.minDate,
  //                        maxDate: this.maxDate
  //                    });
472b4ff1   梁灏   update DatePicker
75
                  }
fa3a666d   梁灏   update DatePicker
76
              },
7c5ccdab   梁灏   update DatePicker
77
78
79
80
81
              cells: {
                  handler (cells) {
                      this.readCells = cells;
                  },
                  immediate: true
472b4ff1   梁灏   update DatePicker
82
83
              }
          },
0f677893   梁灏   update DatePicker
84
85
86
          computed: {
              classes () {
                  return [
50637863   梁灏   update DatePicker
87
                      `${prefixCls}`
b0893113   jingsam   :art: add eslint
88
                  ];
50637863   梁灏   update DatePicker
89
              },
50637863   梁灏   update DatePicker
90
91
92
93
94
95
              cells () {
                  const date = new Date(this.year, this.month, 1);
                  let day = getFirstDayOfMonth(date);    // day of first day
                  day = (day === 0 ? 7 : day);
                  const today = clearHours(new Date());    // timestamp of today
                  const selectDay = clearHours(new Date(this.value));    // timestamp of selected day
3cf7cfd1   梁灏   update DatePicker
96
97
                  const minDay = clearHours(new Date(this.minDate));
                  const maxDay = clearHours(new Date(this.maxDate));
50637863   梁灏   update DatePicker
98
99
100
101
102
103
104
105
106
107
  
                  const dateCountOfMonth = getDayCountOfMonth(date.getFullYear(), date.getMonth());
                  const dateCountOfLastMonth = getDayCountOfMonth(date.getFullYear(), (date.getMonth() === 0 ? 11 : date.getMonth() - 1));
  
                  const disabledDate = this.disabledDate;
  
                  let cells = [];
                  const cell_tmpl = {
                      text: '',
                      type: '',
3747aecd   Sergio Crisostomo   Refactor date-pic...
108
                      date: null,
50637863   梁灏   update DatePicker
109
                      selected: false,
3cf7cfd1   梁灏   update DatePicker
110
111
112
113
                      disabled: false,
                      range: false,
                      start: false,
                      end: false
50637863   梁灏   update DatePicker
114
115
116
117
118
119
                  };
                  if (day !== 7) {
                      for (let i = 0; i < day; i++) {
                          const cell = deepCopy(cell_tmpl);
                          cell.type = 'prev-month';
                          cell.text = dateCountOfLastMonth - (day - 1) + i;
3747aecd   Sergio Crisostomo   Refactor date-pic...
120
121
                          cell.date = new Date(this.year, this.month - 1, cell.text);
                          const time = clearHours(cell.date);
50637863   梁灏   update DatePicker
122
123
124
125
126
127
128
                          cell.disabled = typeof disabledDate === 'function' && disabledDate(new Date(time));
                          cells.push(cell);
                      }
                  }
  
                  for (let i = 1; i <= dateCountOfMonth; i++) {
                      const cell = deepCopy(cell_tmpl);
50637863   梁灏   update DatePicker
129
                      cell.text = i;
3747aecd   Sergio Crisostomo   Refactor date-pic...
130
131
132
                      cell.date = new Date(this.year, this.month, cell.text);
                      const time = clearHours(cell.date);
                      cell.type = time === today ? 'today' : 'normal';
50637863   梁灏   update DatePicker
133
134
                      cell.selected = time === selectDay;
                      cell.disabled = typeof disabledDate === 'function' && disabledDate(new Date(time));
3cf7cfd1   梁灏   update DatePicker
135
136
137
138
                      cell.range = time >= minDay && time <= maxDay;
                      cell.start = this.minDate && time === minDay;
                      cell.end = this.maxDate && time === maxDay;
  
50637863   梁灏   update DatePicker
139
140
141
142
143
144
145
146
                      cells.push(cell);
                  }
  
                  const nextMonthCount = 42 - cells.length;
                  for (let i = 1; i <= nextMonthCount; i++) {
                      const cell = deepCopy(cell_tmpl);
                      cell.type = 'next-month';
                      cell.text = i;
3747aecd   Sergio Crisostomo   Refactor date-pic...
147
148
                      cell.date = new Date(this.year, this.month + 1, cell.text);
                      const time = clearHours(cell.date);
50637863   梁灏   update DatePicker
149
150
151
152
153
                      cell.disabled = typeof disabledDate === 'function' && disabledDate(new Date(time));
                      cells.push(cell);
                  }
  
                  return cells;
0f677893   梁灏   update DatePicker
154
              }
17e1fcf1   梁灏   init DatePicker
155
          },
0f677893   梁灏   update DatePicker
156
          methods: {
3747aecd   Sergio Crisostomo   Refactor date-pic...
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
              handleClick (cell) {
  
                  if (cell.disabled) return;
                  const newDate = cell.date;
  
                  if (this.selectionMode === 'range') {
                      if (this.minDate && this.maxDate) {
                          const minDate = new Date(newDate.getTime());
                          const maxDate = null;
                          this.rangeState.selecting = true;
                          this.markRange(this.minDate);
  
                          this.$emit('on-pick', {minDate, maxDate}, false);
                      } else if (this.minDate && !this.maxDate) {
                          if (newDate >= this.minDate) {
                              const maxDate = new Date(newDate.getTime());
                              this.rangeState.selecting = false;
  
                              this.$emit('on-pick', {minDate: this.minDate, maxDate});
                          } else {
3cf7cfd1   梁灏   update DatePicker
177
                              const minDate = new Date(newDate.getTime());
472b4ff1   梁灏   update DatePicker
178
179
  
                              this.$emit('on-pick', {minDate, maxDate: this.maxDate}, false);
3cf7cfd1   梁灏   update DatePicker
180
                          }
3747aecd   Sergio Crisostomo   Refactor date-pic...
181
182
183
184
185
186
                      } else if (!this.minDate) {
                          const minDate = new Date(newDate.getTime());
                          this.rangeState.selecting = true;
                          this.markRange(this.minDate);
  
                          this.$emit('on-pick', {minDate, maxDate: this.maxDate}, false);
c46f385a   梁灏   update DatePicker
187
                      }
3747aecd   Sergio Crisostomo   Refactor date-pic...
188
189
                  } else {
                      this.$emit('on-pick', newDate);
c46f385a   梁灏   update DatePicker
190
                  }
68e9b100   梁灏   update DatePicker
191
                  this.$emit('on-pick-click');
0f677893   梁灏   update DatePicker
192
              },
472b4ff1   梁灏   update DatePicker
193
194
              handleMouseMove (event) {
                  if (!this.rangeState.selecting) return;
0f677893   梁灏   update DatePicker
195
  
472b4ff1   梁灏   update DatePicker
196
197
198
199
200
201
202
203
204
205
                  this.$emit('on-changerange', {
                      minDate: this.minDate,
                      maxDate: this.maxDate,
                      rangeState: this.rangeState
                  });
  
                  const target = event.target;
                  if (target.tagName === 'EM') {
                      const cell = this.cells[parseInt(event.target.getAttribute('index'))];
  //                    if (cell.disabled) return;    // todo 待确定
3747aecd   Sergio Crisostomo   Refactor date-pic...
206
                      this.rangeState.endDate = cell.date;
472b4ff1   梁灏   update DatePicker
207
                  }
0f677893   梁灏   update DatePicker
208
              },
3cf7cfd1   梁灏   update DatePicker
209
              markRange (maxDate) {
3cf7cfd1   梁灏   update DatePicker
210
                  const minDate = this.minDate;
472b4ff1   梁灏   update DatePicker
211
212
213
214
215
216
217
218
219
220
221
                  if (!maxDate) maxDate = this.maxDate;
  
                  const minDay = clearHours(new Date(minDate));
                  const maxDay = clearHours(new Date(maxDate));
  
                  this.cells.forEach(cell => {
                      if (cell.type === 'today' || cell.type === 'normal') {
                          const time = clearHours(new Date(this.year, this.month, cell.text));
                          cell.range = time >= minDay && time <= maxDay;
                          cell.start = minDate && time === minDay;
                          cell.end = maxDate && time === maxDay;
3cf7cfd1   梁灏   update DatePicker
222
                      }
472b4ff1   梁灏   update DatePicker
223
                  });
3cf7cfd1   梁灏   update DatePicker
224
              },
0f677893   梁灏   update DatePicker
225
226
227
228
              getCellCls (cell) {
                  return [
                      `${prefixCls}-cell`,
                      {
3cf7cfd1   梁灏   update DatePicker
229
                          [`${prefixCls}-cell-selected`]: cell.selected || cell.start || cell.end,
50637863   梁灏   update DatePicker
230
231
232
                          [`${prefixCls}-cell-disabled`]: cell.disabled,
                          [`${prefixCls}-cell-today`]: cell.type === 'today',
                          [`${prefixCls}-cell-prev-month`]: cell.type === 'prev-month',
3cf7cfd1   梁灏   update DatePicker
233
234
                          [`${prefixCls}-cell-next-month`]: cell.type === 'next-month',
                          [`${prefixCls}-cell-range`]: cell.range && !cell.start && !cell.end
0f677893   梁灏   update DatePicker
235
                      }
b0893113   jingsam   :art: add eslint
236
                  ];
50637863   梁灏   update DatePicker
237
238
              },
  
0f677893   梁灏   update DatePicker
239
          }
b0893113   jingsam   :art: add eslint
240
241
      };
  </script>