Blame view

src/components/date-picker/panel/Date/date.vue 7.56 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
53
54
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
96
                      @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="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: {
              // in the mixin
          },
          data () {
b52e02e4   Sergio Crisostomo   Fix month|year pr...
97
98
99
              const {selectionMode, value} = this;
  
              const dates = value.slice().sort();
e32b86e9   Sergio Crisostomo   move date.vue to ...
100
101
102
              return {
                  prefixCls: prefixCls,
                  datePrefixCls: datePrefixCls,
b52e02e4   Sergio Crisostomo   Fix month|year pr...
103
104
                  currentView: selectionMode || 'date',
                  pickerTable: this.getTableType(selectionMode),
e32b86e9   Sergio Crisostomo   move date.vue to ...
105
                  dates: dates,
63bd0f7d   Sergio Crisostomo   Add start-date pr...
106
                  panelDate: this.startDate || dates[0] || new Date()
e32b86e9   Sergio Crisostomo   move date.vue to ...
107
108
109
110
111
112
113
114
115
116
117
              };
          },
          computed: {
              classes () {
                  return [
                      `${prefixCls}-body-wrapper`,
                      {
                          [`${prefixCls}-with-sidebar`]: this.shortcuts.length
                      }
                  ];
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
118
119
              panelPickerHandlers(){
                  return this.pickerTable === `${this.currentView}-table` ? this.handlePick : this.handlePreSelection
e32b86e9   Sergio Crisostomo   move date.vue to ...
120
121
122
123
124
125
126
127
              },
              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...
128
                      return () => this.pickerTable = this.getTableType(type);
e32b86e9   Sergio Crisostomo   move date.vue to ...
129
130
131
132
133
134
135
136
137
138
139
140
141
142
                  };
  
                  return {
                      separator: separator,
                      labels: labels.map(obj => ((obj.handler = handler(obj.type)), obj))
                  };
              },
              timeDisabled(){
                  return !this.dates[0];
              }
          },
          watch: {
              value (newVal) {
                  this.dates = newVal;
15457562   Sergio Crisostomo   Reset panel date ...
143
                  if (JSON.stringify(newVal) === '[null]') this.panelDate = this.startDate || new Date();
e32b86e9   Sergio Crisostomo   move date.vue to ...
144
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
145
146
147
              currentView (currentView) {
                  this.$emit('on-selection-mode-change', currentView);
                  this.pickertable = this.getTableType(currentView);
46726afd   Sergio Crisostomo   Fix panels reset ...
148
149
150
151
              },
              selectionMode(type){
                  this.currentView = type;
                  this.pickerTable = this.getTableType(type);
e32b86e9   Sergio Crisostomo   move date.vue to ...
152
153
154
              }
          },
          methods: {
46726afd   Sergio Crisostomo   Fix panels reset ...
155
156
157
158
              reset(){
                  this.currentView = this.selectionMode;
                  this.pickerTable = this.getTableType(this.currentView);
              },
e32b86e9   Sergio Crisostomo   move date.vue to ...
159
              changeYear(dir){
73a34dfa   Sergio Crisostomo   Fix year/month pr...
160
                  if (this.selectionMode === 'year' || this.pickerTable === 'year-table'){
77e43f2b   Sergio Crisostomo   Correct year date...
161
162
163
164
                      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 ...
165
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
166
167
168
              getTableType(currentView){
                  return currentView.match(/^time/) ? 'time-picker' : `${currentView}-table`;
              },
e32b86e9   Sergio Crisostomo   move date.vue to ...
169
170
171
              changeMonth(dir){
                  this.panelDate = siblingMonth(this.panelDate, dir);
              },
b52e02e4   Sergio Crisostomo   Fix month|year pr...
172
173
              handlePreSelection(value){
                  this.panelDate = value;
73a34dfa   Sergio Crisostomo   Fix year/month pr...
174
175
176
                  if (this.pickerTable === 'year-table') this.pickerTable = 'month-table';
                  else this.pickerTable = this.getTableType(this.currentView);
  
b52e02e4   Sergio Crisostomo   Fix month|year pr...
177
              },
e32b86e9   Sergio Crisostomo   move date.vue to ...
178
              handlePick (value) {
bcf09be7   Sergio Crisostomo   fix handlePick an...
179
                  const {selectionMode, panelDate} = this;
4ec8bc8a   Sergio Crisostomo   Fix month picker ...
180
181
                  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 ...
182
183
                  else value = new Date(value);
  
bcf09be7   Sergio Crisostomo   fix handlePick an...
184
                  this.$emit('on-pick', value);
e32b86e9   Sergio Crisostomo   move date.vue to ...
185
186
187
188
              },
          },
      };
  </script>