Blame view

src/components/date-picker/picker.vue 16.3 KB
17e1fcf1   梁灏   init DatePicker
1
  <template>
ecaf8d51   梁灏   Date add transfer...
2
      <div :class="[prefixCls]" v-clickoutside="handleClose">
531cd165   梁灏   support DatePicke...
3
          <div ref="reference" :class="[prefixCls + '-rel']">
e9dd4dab   梁灏   publish 0.9.11-rc-1
4
5
              <slot>
                  <i-input
4863a75d   Sergio Crisostomo   Correct logic whe...
6
                      :key="forceInputRerender"
acb79ba3   梁灏   fixed #433
7
                      :element-id="elementId"
e9dd4dab   梁灏   publish 0.9.11-rc-1
8
9
10
11
12
13
                      :class="[prefixCls + '-editor']"
                      :readonly="!editable || readonly"
                      :disabled="disabled"
                      :size="size"
                      :placeholder="placeholder"
                      :value="visualValue"
0460a1e8   梁灏   fixed #812
14
                      :name="name"
531cd165   梁灏   support DatePicke...
15
                      @on-input-change="handleInputChange"
e9dd4dab   梁灏   publish 0.9.11-rc-1
16
                      @on-focus="handleFocus"
030a522d   Sergio Crisostomo   make picker close...
17
                      @on-blur="handleBlur"
e9dd4dab   梁灏   publish 0.9.11-rc-1
18
                      @on-click="handleIconClick"
531cd165   梁灏   support DatePicke...
19
20
                      @mouseenter.native="handleInputMouseenter"
                      @mouseleave.native="handleInputMouseleave"
e55ba7a2   Sergio Crisostomo   Add week numbers
21
22
23
  
                      :icon="iconType"
                  ></i-input>
e9dd4dab   梁灏   publish 0.9.11-rc-1
24
25
              </slot>
          </div>
e09b07b7   huanghong   解决drop弹出动画异常
26
          <transition name="transition-drop">
ecaf8d51   梁灏   Date add transfer...
27
28
29
30
31
32
33
34
              <Drop
                  @click.native="handleTransferClick"
                  v-show="opened"
                  :class="{ [prefixCls + '-transfer']: transfer }"
                  :placement="placement"
                  ref="drop"
                  :data-transfer="transfer"
                  v-transfer-dom>
95eae081   Sergio Crisostomo   refactor Datepicker
35
36
37
                  <div>
                      <component
                          :is="panel"
46726afd   Sergio Crisostomo   Fix panels reset ...
38
                          ref="pickerPanel"
95eae081   Sergio Crisostomo   refactor Datepicker
39
40
41
42
43
44
45
                          :visible="visible"
                          :showTime="type === 'datetime' || type === 'datetimerange'"
                          :confirm="isConfirm"
                          :selectionMode="selectionMode"
                          :steps="steps"
                          :format="format"
                          :value="internalValue"
63bd0f7d   Sergio Crisostomo   Add start-date pr...
46
                          :start-date="startDate"
435bf781   Sergio Crisostomo   add split panel p...
47
                          :split-panels="splitPanels"
e55ba7a2   Sergio Crisostomo   Add week numbers
48
                          :show-week-numbers="showWeekNumbers"
b52e02e4   Sergio Crisostomo   Fix month|year pr...
49
                          :picker-type="type"
02859de9   Sergio Crisostomo   Use the last pic...
50
                          :multiple="multiple"
95eae081   Sergio Crisostomo   refactor Datepicker
51
  
79ac2457   Sergio Crisostomo   Allow DatePicker ...
52
53
                          :time-picker-options="timePickerOptions"
  
95eae081   Sergio Crisostomo   refactor Datepicker
54
55
56
57
58
59
60
61
62
                          v-bind="ownPickerProps"
  
                          @on-pick="onPick"
                          @on-pick-clear="handleClear"
                          @on-pick-success="onPickSuccess"
                          @on-pick-click="disableClickOutSide = true"
                          @on-selection-mode-change="onSelectionModeChange"
                      ></component>
                  </div>
531cd165   梁灏   support DatePicke...
63
64
              </Drop>
          </transition>
0f677893   梁灏   update DatePicker
65
      </div>
17e1fcf1   梁灏   init DatePicker
66
67
  </template>
  <script>
95eae081   Sergio Crisostomo   refactor Datepicker
68
69
  
  
0f677893   梁灏   update DatePicker
70
71
72
      import iInput from '../../components/input/input.vue';
      import Drop from '../../components/select/dropdown.vue';
      import clickoutside from '../../directives/clickoutside';
ecaf8d51   梁灏   Date add transfer...
73
      import TransferDom from '../../directives/transfer-dom';
0f677893   梁灏   update DatePicker
74
      import { oneOf } from '../../utils/assist';
2fb29fae   Sergio Crisostomo   export utilities ...
75
      import { DEFAULT_FORMATS, TYPE_VALUE_RESOLVER_MAP } from './util';
cd78c9c4   梁灏   some comps suppor...
76
      import Emitter from '../../mixins/emitter';
0f677893   梁灏   update DatePicker
77
78
79
  
      const prefixCls = 'ivu-date-picker';
  
34867ff9   Sergio Crisostomo   normalise empty i...
80
81
      const isEmptyArray = val => val.reduce((isEmpty, str) => isEmpty && !str || (typeof str === 'string' && str.trim() === ''), true);
  
17e1fcf1   梁灏   init DatePicker
82
      export default {
21dad188   梁灏   prevent dispatch ...
83
          name: 'CalendarPicker',
cd78c9c4   梁灏   some comps suppor...
84
          mixins: [ Emitter ],
0f677893   梁灏   update DatePicker
85
          components: { iInput, Drop },
ecaf8d51   梁灏   Date add transfer...
86
          directives: { clickoutside, TransferDom },
0f677893   梁灏   update DatePicker
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
          props: {
              format: {
                  type: String
              },
              readonly: {
                  type: Boolean,
                  default: false
              },
              disabled: {
                  type: Boolean,
                  default: false
              },
              editable: {
                  type: Boolean,
                  default: true
              },
fe44201b   梁灏   DatePicker add cl...
103
104
105
106
              clearable: {
                  type: Boolean,
                  default: true
              },
b9041a0d   梁灏   DatePicker add co...
107
108
109
110
              confirm: {
                  type: Boolean,
                  default: false
              },
e9dd4dab   梁灏   publish 0.9.11-rc-1
111
112
113
114
              open: {
                  type: Boolean,
                  default: null
              },
95eae081   Sergio Crisostomo   refactor Datepicker
115
116
117
118
              multiple: {
                  type: Boolean,
                  default: false
              },
79ac2457   Sergio Crisostomo   Allow DatePicker ...
119
120
121
122
              timePickerOptions: {
                  default: () => ({}),
                  type: Object,
              },
435bf781   Sergio Crisostomo   add split panel p...
123
124
125
126
              splitPanels: {
                  type: Boolean,
                  default: false
              },
e55ba7a2   Sergio Crisostomo   Add week numbers
127
128
129
130
              showWeekNumbers: {
                  type: Boolean,
                  default: false
              },
63bd0f7d   Sergio Crisostomo   Add start-date pr...
131
132
133
              startDate: {
                  type: Date
              },
0f677893   梁灏   update DatePicker
134
135
              size: {
                  validator (value) {
f00a037c   梁灏   some Components's...
136
                      return oneOf(value, ['small', 'large', 'default']);
0f677893   梁灏   update DatePicker
137
138
139
140
141
142
                  }
              },
              placeholder: {
                  type: String,
                  default: ''
              },
68e9b100   梁灏   update DatePicker
143
              placement: {
0f677893   梁灏   update DatePicker
144
                  validator (value) {
68e9b100   梁灏   update DatePicker
145
                      return oneOf(value, ['top', 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'left', 'left-start', 'left-end', 'right', 'right-start', 'right-end']);
0f677893   梁灏   update DatePicker
146
                  },
68e9b100   梁灏   update DatePicker
147
                  default: 'bottom-start'
0f677893   梁灏   update DatePicker
148
              },
ecaf8d51   梁灏   Date add transfer...
149
150
151
              transfer: {
                  type: Boolean,
                  default: false
0460a1e8   梁灏   fixed #812
152
153
154
              },
              name: {
                  type: String
acb79ba3   梁灏   fixed #433
155
156
157
              },
              elementId: {
                  type: String
95eae081   Sergio Crisostomo   refactor Datepicker
158
159
160
161
162
163
              },
              steps: {
                  type: Array,
                  default: () => []
              },
              value: {
8878e4a3   Sergio Crisostomo   Remove validator ...
164
                  type: [Date, String, Array]
4863a75d   Sergio Crisostomo   Correct logic whe...
165
166
167
168
              },
              options: {
                  type: Object,
                  default: () => ({})
0f677893   梁灏   update DatePicker
169
170
              }
          },
95eae081   Sergio Crisostomo   refactor Datepicker
171
          data(){
34867ff9   Sergio Crisostomo   normalise empty i...
172
173
              const isRange = this.type.includes('range');
              const emptyArray = isRange ? [null, null] : [null];
4a1734b7   Sergio Crisostomo   fix time and time...
174
175
              const initialValue = isEmptyArray((isRange ? this.value : [this.value]) || []) ? emptyArray : this.parseDate(this.value);
  
0f677893   梁灏   update DatePicker
176
177
178
              return {
                  prefixCls: prefixCls,
                  showClose: false,
0f677893   梁灏   update DatePicker
179
                  visible: false,
34867ff9   Sergio Crisostomo   normalise empty i...
180
                  internalValue: initialValue,
531cd165   梁灏   support DatePicke...
181
                  disableClickOutSide: false,    // fixed when click a date,trigger clickoutside to close picker
95eae081   Sergio Crisostomo   refactor Datepicker
182
                  disableCloseUnderTransfer: false,  // transfer 模式下,点击Drop也会触发关闭,
4863a75d   Sergio Crisostomo   Correct logic whe...
183
184
                  selectionMode: this.onSelectionModeChange(this.type),
                  forceInputRerender: 1
b0893113   jingsam   :art: add eslint
185
              };
0f677893   梁灏   update DatePicker
186
187
          },
          computed: {
b42322fe   Sergio Crisostomo   Pass Strings to @...
188
              publicVModelValue(){
d07b4f33   Sergio Crisostomo   fix logic for mul...
189
                  if (this.multiple){
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
190
                      return this.internalValue.slice();
d07b4f33   Sergio Crisostomo   fix logic for mul...
191
192
                  } else {
                      const isRange = this.type.includes('range');
57f0582b   Sergio Crisostomo   Pass correct argu...
193
194
195
                      let val = this.internalValue.map(date => date instanceof Date ? new Date(date) : (date || ''));
  
                      if (this.type.match(/^time/)) val = val.map(this.formatDate);
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
196
                      return (isRange || this.multiple) ? val : val[0];
d07b4f33   Sergio Crisostomo   fix logic for mul...
197
                  }
95eae081   Sergio Crisostomo   refactor Datepicker
198
              },
b42322fe   Sergio Crisostomo   Pass Strings to @...
199
200
201
              publicStringValue(){
                  const {formatDate, publicVModelValue, type} = this;
                  if (type.match(/^time/)) return publicVModelValue;
2332ac9b   Sergio Crisostomo   Fix error in form...
202
                  if (this.multiple) return formatDate(publicVModelValue);
b42322fe   Sergio Crisostomo   Pass Strings to @...
203
204
                  return Array.isArray(publicVModelValue) ? publicVModelValue.map(formatDate) : formatDate(publicVModelValue);
              },
e9dd4dab   梁灏   publish 0.9.11-rc-1
205
206
207
              opened () {
                  return this.open === null ? this.visible : this.open;
              },
0f677893   梁灏   update DatePicker
208
              iconType () {
9d844d53   梁灏   fixed Layout bug
209
                  let icon = 'ios-calendar-outline';
456877a1   梁灏   update TimePicker
210
                  if (this.type === 'time' || this.type === 'timerange') icon = 'ios-clock-outline';
9d844d53   梁灏   fixed Layout bug
211
212
                  if (this.showClose) icon = 'ios-close';
                  return icon;
0f677893   梁灏   update DatePicker
213
              },
d20fe0ee   梁灏   update DatePicker
214
              transition () {
95eae081   Sergio Crisostomo   refactor Datepicker
215
216
                  const bottomPlaced = this.placement.match(/^bottom/);
                  return bottomPlaced ? 'slide-up' : 'slide-down';
d20fe0ee   梁灏   update DatePicker
217
              },
95eae081   Sergio Crisostomo   refactor Datepicker
218
              visualValue() {
2fb29fae   Sergio Crisostomo   export utilities ...
219
                  return this.formatDate(this.internalValue);
95eae081   Sergio Crisostomo   refactor Datepicker
220
221
              },
              isConfirm(){
d07b4f33   Sergio Crisostomo   fix logic for mul...
222
                  return this.confirm || this.type === 'datetime' || this.type === 'datetimerange' || this.multiple;
0f677893   梁灏   update DatePicker
223
224
225
              }
          },
          methods: {
95eae081   Sergio Crisostomo   refactor Datepicker
226
              onSelectionModeChange(type){
95eae081   Sergio Crisostomo   refactor Datepicker
227
                  if (type.match(/^date/)) type = 'date';
46726afd   Sergio Crisostomo   Fix panels reset ...
228
229
                  this.selectionMode = oneOf(type, ['year', 'month', 'date', 'time']) && type;
                  return this.selectionMode;
95eae081   Sergio Crisostomo   refactor Datepicker
230
              },
ecaf8d51   梁灏   Date add transfer...
231
232
233
234
              // 开启 transfer 时,点击 Drop 即会关闭,这里不让其关闭
              handleTransferClick () {
                  if (this.transfer) this.disableCloseUnderTransfer = true;
              },
0f677893   梁灏   update DatePicker
235
              handleClose () {
ecaf8d51   梁灏   Date add transfer...
236
237
238
239
                  if (this.disableCloseUnderTransfer) {
                      this.disableCloseUnderTransfer = false;
                      return false;
                  }
1b7aefea   梁灏   update Picker
240
                  if (this.open !== null) return;
95eae081   Sergio Crisostomo   refactor Datepicker
241
  
762c8ddf   梁灏   update DatePicker
242
                  this.visible = false;
68e9b100   梁灏   update DatePicker
243
                  this.disableClickOutSide = false;
0f677893   梁灏   update DatePicker
244
245
              },
              handleFocus () {
e1874103   梁灏   update DatePicker
246
                  if (this.readonly) return;
0f677893   梁灏   update DatePicker
247
                  this.visible = true;
6017ed75   Sergio Crisostomo   update scroll whe...
248
                  this.$refs.pickerPanel.onToggleVisibility(true);
0f677893   梁灏   update DatePicker
249
              },
030a522d   Sergio Crisostomo   make picker close...
250
251
              handleBlur () {
                  this.visible = false;
46726afd   Sergio Crisostomo   Fix panels reset ...
252
                  this.onSelectionModeChange(this.type);
c2b7fed0   Sergio Crisostomo   Reset panel selec...
253
                  this.internalValue = this.internalValue.slice(); // trigger panel watchers to reset views
46726afd   Sergio Crisostomo   Fix panels reset ...
254
                  this.reset();
6017ed75   Sergio Crisostomo   update scroll whe...
255
256
                  this.$refs.pickerPanel.onToggleVisibility(false);
  
46726afd   Sergio Crisostomo   Fix panels reset ...
257
258
259
              },
              reset(){
                  this.$refs.pickerPanel.reset && this.$refs.pickerPanel.reset();
030a522d   Sergio Crisostomo   make picker close...
260
              },
e1874103   梁灏   update DatePicker
261
              handleInputChange (event) {
4863a75d   Sergio Crisostomo   Correct logic whe...
262
                  const isArrayValue = this.type.includes('range') || this.multiple;
e1874103   梁灏   update DatePicker
263
                  const oldValue = this.visualValue;
95eae081   Sergio Crisostomo   refactor Datepicker
264
                  const newValue = event.target.value;
4863a75d   Sergio Crisostomo   Correct logic whe...
265
266
267
268
269
270
                  const newDate = this.parseDate(newValue);
                  const disabledDateFn =
                      this.options &&
                      typeof this.options.disabledDate === 'function' &&
                      this.options.disabledDate;
                  const valueToTest = isArrayValue ? newDate : newDate[0];
d9ff845f   Sergio Crisostomo   Emit input event ...
271
                  const isDisabled = disabledDateFn && disabledDateFn(valueToTest);
72f225e9   Sergio Crisostomo   Fix date manual i...
272
                  const isValidDate = newDate.reduce((valid, date) => valid && date instanceof Date, true);
e1874103   梁灏   update DatePicker
273
  
72f225e9   Sergio Crisostomo   Fix date manual i...
274
                  if (newValue !== oldValue && !isDisabled && isValidDate) {
95eae081   Sergio Crisostomo   refactor Datepicker
275
                      this.emitChange();
4863a75d   Sergio Crisostomo   Correct logic whe...
276
277
278
                      this.internalValue = newDate;
                  } else {
                      this.forceInputRerender++;
7c5ccdab   梁灏   update DatePicker
279
                  }
c46f385a   梁灏   update DatePicker
280
281
              },
              handleInputMouseenter () {
0f677893   梁灏   update DatePicker
282
                  if (this.readonly || this.disabled) return;
fe44201b   梁灏   DatePicker add cl...
283
                  if (this.visualValue && this.clearable) {
0f677893   梁灏   update DatePicker
284
285
286
                      this.showClose = true;
                  }
              },
c46f385a   梁灏   update DatePicker
287
              handleInputMouseleave () {
0f677893   梁灏   update DatePicker
288
289
290
                  this.showClose = false;
              },
              handleIconClick () {
7b7178f1   梁灏   fixed #528
291
292
                  if (this.showClose) {
                      this.handleClear();
f1f0206c   Aresn   fixed Date bug
293
                  } else if (!this.disabled) {
7b7178f1   梁灏   fixed #528
294
295
                      this.handleFocus();
                  }
b9041a0d   梁灏   DatePicker add co...
296
297
              },
              handleClear () {
c46f385a   梁灏   update DatePicker
298
                  this.visible = false;
95eae081   Sergio Crisostomo   refactor Datepicker
299
                  this.internalValue = this.internalValue.map(() => null);
d20fe0ee   梁灏   update DatePicker
300
                  this.$emit('on-clear');
cd78c9c4   梁灏   some comps suppor...
301
                  this.dispatch('FormItem', 'on-form-change', '');
95eae081   Sergio Crisostomo   refactor Datepicker
302
                  this.emitChange();
46726afd   Sergio Crisostomo   Fix panels reset ...
303
                  this.reset();
9d844d53   梁灏   fixed Layout bug
304
  
95eae081   Sergio Crisostomo   refactor Datepicker
305
306
307
308
                  setTimeout(
                      () => this.onSelectionModeChange(this.type),
                      500 // delay to improve dropdown close visual effect
                  );
344131a7   梁灏   update DatePicker
309
              },
95eae081   Sergio Crisostomo   refactor Datepicker
310
              emitChange () {
fc0c4c78   梁灏   fixed #494
311
                  this.$nextTick(() => {
b42322fe   Sergio Crisostomo   Pass Strings to @...
312
313
                      this.$emit('on-change', this.publicStringValue);
                      this.dispatch('FormItem', 'on-form-change', this.publicStringValue);
fc0c4c78   梁灏   fixed #494
314
                  });
21dad188   梁灏   prevent dispatch ...
315
              },
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
316
              parseDate(val) {
95eae081   Sergio Crisostomo   refactor Datepicker
317
                  const isRange = this.type.includes('range');
456877a1   梁灏   update TimePicker
318
                  const type = this.type;
95eae081   Sergio Crisostomo   refactor Datepicker
319
                  const parser = (
456877a1   梁灏   update TimePicker
320
                      TYPE_VALUE_RESOLVER_MAP[type] ||
699a9dc8   梁灏   update DatePicker
321
                      TYPE_VALUE_RESOLVER_MAP['default']
95eae081   Sergio Crisostomo   refactor Datepicker
322
                  ).parser;
2fb29fae   Sergio Crisostomo   export utilities ...
323
324
                  const format = this.format || DEFAULT_FORMATS[type];
                  const multipleParser = TYPE_VALUE_RESOLVER_MAP['multiple'].parser;
699a9dc8   梁灏   update DatePicker
325
  
95eae081   Sergio Crisostomo   refactor Datepicker
326
                  if (val && type === 'time' && !(val instanceof Date)) {
2fb29fae   Sergio Crisostomo   export utilities ...
327
328
329
                      val = parser(val, format);
                  } else if (this.multiple && val) {
                      val = multipleParser(val, format);
4863a75d   Sergio Crisostomo   Correct logic whe...
330
                  } else if (isRange) {
95eae081   Sergio Crisostomo   refactor Datepicker
331
332
333
                      if (!val){
                          val = [null, null];
                      } else {
283b90aa   Sergio Crisostomo   Fix daterange man...
334
335
                          if (typeof val === 'string') {
                              val = parser(val, format);
4a1734b7   Sergio Crisostomo   fix time and time...
336
337
                          } else if (type === 'timerange') {
                              val = parser(val, format);
283b90aa   Sergio Crisostomo   Fix daterange man...
338
339
340
341
                          } else {
                              val = val.map(date => new Date(date)); // try to parse
                              val = val.map(date => isNaN(date.getTime()) ? null : date); // check if parse passed
                          }
95eae081   Sergio Crisostomo   refactor Datepicker
342
                      }
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
343
                  } else if (typeof val === 'string' && type.indexOf('time') !== 0){
72f225e9   Sergio Crisostomo   Fix date manual i...
344
                      val = parser(val, format) || null;
95eae081   Sergio Crisostomo   refactor Datepicker
345
                  }
2fb29fae   Sergio Crisostomo   export utilities ...
346
347
  
                  return (isRange || this.multiple) ? (val || []) : [val];
95eae081   Sergio Crisostomo   refactor Datepicker
348
              },
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
349
              formatDate(value){
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
350
                  const format = DEFAULT_FORMATS[this.type];
2fb29fae   Sergio Crisostomo   export utilities ...
351
352
353
354
355
356
357
358
359
360
361
  
                  if (this.multiple) {
                      const formatter = TYPE_VALUE_RESOLVER_MAP.multiple.formatter;
                      return formatter(value, this.format || format);
                  } else {
                      const {formatter} = (
                          TYPE_VALUE_RESOLVER_MAP[this.type] ||
                          TYPE_VALUE_RESOLVER_MAP['default']
                      );
                      return formatter(value, this.format || format);
                  }
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
362
              },
95eae081   Sergio Crisostomo   refactor Datepicker
363
              onPick(dates, visible = false) {
d07b4f33   Sergio Crisostomo   fix logic for mul...
364
                  if (this.multiple){
88d24200   Sergio Crisostomo   Fix date toggle i...
365
366
                      const pickedTimeStamp = dates.getTime();
                      const indexOfPickedDate = this.internalValue.findIndex(date => date && date.getTime() === pickedTimeStamp);
d07b4f33   Sergio Crisostomo   fix logic for mul...
367
                      const allDates = [...this.internalValue, dates].filter(Boolean);
88d24200   Sergio Crisostomo   Fix date toggle i...
368
                      const timeStamps = allDates.map(date => date.getTime()).filter((ts, i, arr) => arr.indexOf(ts) === i && i !== indexOfPickedDate); // filter away duplicates
d07b4f33   Sergio Crisostomo   fix logic for mul...
369
                      this.internalValue = timeStamps.map(ts => new Date(ts));
95eae081   Sergio Crisostomo   refactor Datepicker
370
371
                  } else {
                      this.internalValue = Array.isArray(dates) ? dates : [dates];
0fd13696   梁灏   fixed DatePicker ...
372
                  }
95eae081   Sergio Crisostomo   refactor Datepicker
373
374
375
376
377
378
379
380
  
                  if (!this.isConfirm) this.onSelectionModeChange(this.type); // reset the selectionMode
                  if (!this.isConfirm) this.visible = visible;
                  this.emitChange();
              },
              onPickSuccess(){
                  this.visible = false;
                  this.$emit('on-ok');
46726afd   Sergio Crisostomo   Fix panels reset ...
381
                  this.reset();
e55ba7a2   Sergio Crisostomo   Add week numbers
382
              },
0f677893   梁灏   update DatePicker
383
384
          },
          watch: {
95eae081   Sergio Crisostomo   refactor Datepicker
385
386
              visible (state) {
                  if (state === false){
0f677893   梁灏   update DatePicker
387
                      this.$refs.drop.destroy();
030a522d   Sergio Crisostomo   make picker close...
388
389
                      const input = this.$el.querySelector('input');
                      if (input) input.blur();
c46f385a   梁灏   update DatePicker
390
                  }
65ce6ced   Sergio Crisostomo   keep `this.$refs....
391
                  this.$refs.drop.update();
95eae081   Sergio Crisostomo   refactor Datepicker
392
                  this.$emit('on-open-change', state);
c46f385a   梁灏   update DatePicker
393
              },
95eae081   Sergio Crisostomo   refactor Datepicker
394
              value(val) {
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
395
                  this.internalValue = this.parseDate(val);
0dd7b94a   梁灏   update TimePicker
396
  
d20fe0ee   梁灏   update DatePicker
397
398
              },
              open (val) {
95eae081   Sergio Crisostomo   refactor Datepicker
399
400
401
402
                  this.visible = val === true;
              },
              type(type){
                  this.onSelectionModeChange(type);
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
403
              },
b42322fe   Sergio Crisostomo   Pass Strings to @...
404
              publicVModelValue(now, before){
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
405
406
                  const newValue = JSON.stringify(now);
                  const oldValue = JSON.stringify(before);
d9ff845f   Sergio Crisostomo   Emit input event ...
407
408
                  const shouldEmitInput = newValue !== oldValue || typeof now !== typeof before;
                  if (shouldEmitInput) this.$emit('input', now); // to update v-model
8f6aeda4   Sergio Crisostomo   Fix parser and fo...
409
              },
e9dd4dab   梁灏   publish 0.9.11-rc-1
410
          },
531cd165   梁灏   support DatePicke...
411
          mounted () {
d9ff845f   Sergio Crisostomo   Emit input event ...
412
              const initialValue = this.value;
b42322fe   Sergio Crisostomo   Pass Strings to @...
413
              const parsedValue = this.publicVModelValue;
d9ff845f   Sergio Crisostomo   Emit input event ...
414
              if (typeof initialValue !== typeof parsedValue || JSON.stringify(initialValue) !== JSON.stringify(parsedValue)){
b42322fe   Sergio Crisostomo   Pass Strings to @...
415
                  this.$emit('input', this.publicVModelValue); // to update v-model
d9ff845f   Sergio Crisostomo   Emit input event ...
416
              }
d20fe0ee   梁灏   update DatePicker
417
              if (this.open !== null) this.visible = this.open;
0f677893   梁灏   update DatePicker
418
          }
b0893113   jingsam   :art: add eslint
419
420
      };
  </script>