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>
|
531cd165
梁灏
support DatePicke...
|
26
|
<transition :name="transition">
|
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
38
39
40
41
42
43
44
|
<div>
<component
:is="panel"
:visible="visible"
:showTime="type === 'datetime' || type === 'datetimerange'"
:confirm="isConfirm"
:selectionMode="selectionMode"
:steps="steps"
:format="format"
:value="internalValue"
|
63bd0f7d
Sergio Crisostomo
Add start-date pr...
|
45
|
:start-date="startDate"
|
435bf781
Sergio Crisostomo
add split panel p...
|
46
|
:split-panels="splitPanels"
|
e55ba7a2
Sergio Crisostomo
Add week numbers
|
47
|
:show-week-numbers="showWeekNumbers"
|
b52e02e4
Sergio Crisostomo
Fix month|year pr...
|
48
|
:picker-type="type"
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
49
50
51
52
53
54
55
56
57
58
|
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...
|
59
60
|
</Drop>
</transition>
|
0f677893
梁灏
update DatePicker
|
61
|
</div>
|
17e1fcf1
梁灏
init DatePicker
|
62
63
|
</template>
<script>
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
64
65
|
|
0f677893
梁灏
update DatePicker
|
66
67
68
|
import iInput from '../../components/input/input.vue';
import Drop from '../../components/select/dropdown.vue';
import clickoutside from '../../directives/clickoutside';
|
ecaf8d51
梁灏
Date add transfer...
|
69
|
import TransferDom from '../../directives/transfer-dom';
|
0f677893
梁灏
update DatePicker
|
70
|
import { oneOf } from '../../utils/assist';
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
71
|
import { DEFAULT_FORMATS, TYPE_VALUE_RESOLVER_MAP } from './util';
|
cd78c9c4
梁灏
some comps suppor...
|
72
|
import Emitter from '../../mixins/emitter';
|
0f677893
梁灏
update DatePicker
|
73
74
75
|
const prefixCls = 'ivu-date-picker';
|
17e1fcf1
梁灏
init DatePicker
|
76
|
export default {
|
21dad188
梁灏
prevent dispatch ...
|
77
|
name: 'CalendarPicker',
|
cd78c9c4
梁灏
some comps suppor...
|
78
|
mixins: [ Emitter ],
|
0f677893
梁灏
update DatePicker
|
79
|
components: { iInput, Drop },
|
ecaf8d51
梁灏
Date add transfer...
|
80
|
directives: { clickoutside, TransferDom },
|
0f677893
梁灏
update DatePicker
|
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
props: {
format: {
type: String
},
readonly: {
type: Boolean,
default: false
},
disabled: {
type: Boolean,
default: false
},
editable: {
type: Boolean,
default: true
},
|
fe44201b
梁灏
DatePicker add cl...
|
97
98
99
100
|
clearable: {
type: Boolean,
default: true
},
|
b9041a0d
梁灏
DatePicker add co...
|
101
102
103
104
|
confirm: {
type: Boolean,
default: false
},
|
e9dd4dab
梁灏
publish 0.9.11-rc-1
|
105
106
107
108
|
open: {
type: Boolean,
default: null
},
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
109
110
111
112
|
multiple: {
type: Boolean,
default: false
},
|
435bf781
Sergio Crisostomo
add split panel p...
|
113
114
115
116
|
splitPanels: {
type: Boolean,
default: false
},
|
e55ba7a2
Sergio Crisostomo
Add week numbers
|
117
118
119
120
|
showWeekNumbers: {
type: Boolean,
default: false
},
|
63bd0f7d
Sergio Crisostomo
Add start-date pr...
|
121
122
123
|
startDate: {
type: Date
},
|
0f677893
梁灏
update DatePicker
|
124
125
|
size: {
validator (value) {
|
f00a037c
梁灏
some Components's...
|
126
|
return oneOf(value, ['small', 'large', 'default']);
|
0f677893
梁灏
update DatePicker
|
127
128
129
130
131
132
|
}
},
placeholder: {
type: String,
default: ''
},
|
68e9b100
梁灏
update DatePicker
|
133
|
placement: {
|
0f677893
梁灏
update DatePicker
|
134
|
validator (value) {
|
68e9b100
梁灏
update DatePicker
|
135
|
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
|
136
|
},
|
68e9b100
梁灏
update DatePicker
|
137
|
default: 'bottom-start'
|
0f677893
梁灏
update DatePicker
|
138
|
},
|
ecaf8d51
梁灏
Date add transfer...
|
139
140
141
|
transfer: {
type: Boolean,
default: false
|
0460a1e8
梁灏
fixed #812
|
142
143
144
|
},
name: {
type: String
|
acb79ba3
梁灏
fixed #433
|
145
146
147
|
},
elementId: {
type: String
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
},
steps: {
type: Array,
default: () => []
},
value: {
type: [Date, String, Array],
validator(val){
if (Array.isArray(val)){
const [start, end] = val.map(v => new Date(v));
return !isNaN(start.getTime()) && !isNaN(end.getTime());
} else {
if (typeof val === 'string') val = val.trim();
const date = new Date(val);
return val === '' || val === null || !isNaN(date.getTime());
}
}
|
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(){
|
0f677893
梁灏
update DatePicker
|
172
173
174
|
return {
prefixCls: prefixCls,
showClose: false,
|
0f677893
梁灏
update DatePicker
|
175
|
visible: false,
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
176
|
internalValue: this.parseDate(this.value),
|
531cd165
梁灏
support DatePicke...
|
177
|
disableClickOutSide: false, // fixed when click a date,trigger clickoutside to close picker
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
178
|
disableCloseUnderTransfer: false, // transfer 模式下,点击Drop也会触发关闭,
|
4863a75d
Sergio Crisostomo
Correct logic whe...
|
179
180
|
selectionMode: this.onSelectionModeChange(this.type),
forceInputRerender: 1
|
b0893113
jingsam
add eslint
|
181
|
};
|
0f677893
梁灏
update DatePicker
|
182
183
|
},
computed: {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
184
|
publicValue(){
|
d07b4f33
Sergio Crisostomo
fix logic for mul...
|
185
|
if (this.multiple){
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
186
|
return this.internalValue.slice();
|
d07b4f33
Sergio Crisostomo
fix logic for mul...
|
187
188
|
} else {
const isRange = this.type.includes('range');
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
189
190
|
const val = this.internalValue.map(date => date instanceof Date ? new Date(date) : date);
return (isRange || this.multiple) ? val : val[0];
|
d07b4f33
Sergio Crisostomo
fix logic for mul...
|
191
|
}
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
192
|
},
|
e9dd4dab
梁灏
publish 0.9.11-rc-1
|
193
194
195
|
opened () {
return this.open === null ? this.visible : this.open;
},
|
0f677893
梁灏
update DatePicker
|
196
|
iconType () {
|
9d844d53
梁灏
fixed Layout bug
|
197
|
let icon = 'ios-calendar-outline';
|
456877a1
梁灏
update TimePicker
|
198
|
if (this.type === 'time' || this.type === 'timerange') icon = 'ios-clock-outline';
|
9d844d53
梁灏
fixed Layout bug
|
199
200
|
if (this.showClose) icon = 'ios-close';
return icon;
|
0f677893
梁灏
update DatePicker
|
201
|
},
|
d20fe0ee
梁灏
update DatePicker
|
202
|
transition () {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
203
204
|
const bottomPlaced = this.placement.match(/^bottom/);
return bottomPlaced ? 'slide-up' : 'slide-down';
|
d20fe0ee
梁灏
update DatePicker
|
205
|
},
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
206
|
visualValue() {
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
207
|
return this.formatDate(this.internalValue);
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
208
209
|
},
isConfirm(){
|
d07b4f33
Sergio Crisostomo
fix logic for mul...
|
210
|
return this.confirm || this.type === 'datetime' || this.type === 'datetimerange' || this.multiple;
|
0f677893
梁灏
update DatePicker
|
211
212
213
|
}
},
methods: {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
214
215
216
217
218
219
|
onSelectionModeChange(type){
if (type.match(/^date/)) type = 'date';
this.selectionMode = type;
return type;
},
|
ecaf8d51
梁灏
Date add transfer...
|
220
221
222
223
|
// 开启 transfer 时,点击 Drop 即会关闭,这里不让其关闭
handleTransferClick () {
if (this.transfer) this.disableCloseUnderTransfer = true;
},
|
0f677893
梁灏
update DatePicker
|
224
|
handleClose () {
|
ecaf8d51
梁灏
Date add transfer...
|
225
226
227
228
|
if (this.disableCloseUnderTransfer) {
this.disableCloseUnderTransfer = false;
return false;
}
|
1b7aefea
梁灏
update Picker
|
229
|
if (this.open !== null) return;
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
230
|
|
762c8ddf
梁灏
update DatePicker
|
231
|
this.visible = false;
|
68e9b100
梁灏
update DatePicker
|
232
|
this.disableClickOutSide = false;
|
0f677893
梁灏
update DatePicker
|
233
234
|
},
handleFocus () {
|
e1874103
梁灏
update DatePicker
|
235
|
if (this.readonly) return;
|
0f677893
梁灏
update DatePicker
|
236
237
|
this.visible = true;
},
|
030a522d
Sergio Crisostomo
make picker close...
|
238
239
240
|
handleBlur () {
this.visible = false;
},
|
e1874103
梁灏
update DatePicker
|
241
|
handleInputChange (event) {
|
4863a75d
Sergio Crisostomo
Correct logic whe...
|
242
|
const isArrayValue = this.type.includes('range') || this.multiple;
|
e1874103
梁灏
update DatePicker
|
243
|
const oldValue = this.visualValue;
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
244
|
const newValue = event.target.value;
|
4863a75d
Sergio Crisostomo
Correct logic whe...
|
245
246
247
248
249
250
|
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 ...
|
251
|
const isDisabled = disabledDateFn && disabledDateFn(valueToTest);
|
e1874103
梁灏
update DatePicker
|
252
|
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
253
|
if (newValue !== oldValue && !isDisabled) {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
254
|
this.emitChange();
|
4863a75d
Sergio Crisostomo
Correct logic whe...
|
255
256
257
|
this.internalValue = newDate;
} else {
this.forceInputRerender++;
|
7c5ccdab
梁灏
update DatePicker
|
258
|
}
|
c46f385a
梁灏
update DatePicker
|
259
260
|
},
handleInputMouseenter () {
|
0f677893
梁灏
update DatePicker
|
261
|
if (this.readonly || this.disabled) return;
|
fe44201b
梁灏
DatePicker add cl...
|
262
|
if (this.visualValue && this.clearable) {
|
0f677893
梁灏
update DatePicker
|
263
264
265
|
this.showClose = true;
}
},
|
c46f385a
梁灏
update DatePicker
|
266
|
handleInputMouseleave () {
|
0f677893
梁灏
update DatePicker
|
267
268
269
|
this.showClose = false;
},
handleIconClick () {
|
7b7178f1
梁灏
fixed #528
|
270
271
|
if (this.showClose) {
this.handleClear();
|
f1f0206c
Aresn
fixed Date bug
|
272
|
} else if (!this.disabled) {
|
7b7178f1
梁灏
fixed #528
|
273
274
|
this.handleFocus();
}
|
b9041a0d
梁灏
DatePicker add co...
|
275
276
|
},
handleClear () {
|
c46f385a
梁灏
update DatePicker
|
277
|
this.visible = false;
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
278
|
this.internalValue = this.internalValue.map(() => null);
|
d20fe0ee
梁灏
update DatePicker
|
279
|
this.$emit('on-clear');
|
cd78c9c4
梁灏
some comps suppor...
|
280
|
this.dispatch('FormItem', 'on-form-change', '');
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
281
|
this.emitChange();
|
9d844d53
梁灏
fixed Layout bug
|
282
|
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
283
284
285
286
|
setTimeout(
() => this.onSelectionModeChange(this.type),
500 // delay to improve dropdown close visual effect
);
|
344131a7
梁灏
update DatePicker
|
287
|
},
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
288
289
|
emitChange () {
this.$emit('on-change', this.publicValue);
|
fc0c4c78
梁灏
fixed #494
|
290
|
this.$nextTick(() => {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
291
|
this.dispatch('FormItem', 'on-form-change', this.publicValue);
|
fc0c4c78
梁灏
fixed #494
|
292
|
});
|
21dad188
梁灏
prevent dispatch ...
|
293
|
},
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
294
|
parseDate(val) {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
295
|
const isRange = this.type.includes('range');
|
456877a1
梁灏
update TimePicker
|
296
|
const type = this.type;
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
297
|
const parser = (
|
456877a1
梁灏
update TimePicker
|
298
|
TYPE_VALUE_RESOLVER_MAP[type] ||
|
699a9dc8
梁灏
update DatePicker
|
299
|
TYPE_VALUE_RESOLVER_MAP['default']
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
300
|
).parser;
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
301
302
|
const format = this.format || DEFAULT_FORMATS[type];
const multipleParser = TYPE_VALUE_RESOLVER_MAP['multiple'].parser;
|
699a9dc8
梁灏
update DatePicker
|
303
|
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
304
|
if (val && type === 'time' && !(val instanceof Date)) {
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
305
306
307
|
val = parser(val, format);
} else if (this.multiple && val) {
val = multipleParser(val, format);
|
4863a75d
Sergio Crisostomo
Correct logic whe...
|
308
|
} else if (isRange) {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
309
310
311
312
313
314
|
if (!val){
val = [null, null];
} else {
val = val.map(date => new Date(date)); // try to parse
val = val.map(date => isNaN(date.getTime()) ? null : date); // check if parse passed
}
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
315
|
} else if (typeof val === 'string' && type.indexOf('time') !== 0){
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
316
|
val = parser(val, format) || val;
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
317
|
}
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
318
319
|
return (isRange || this.multiple) ? (val || []) : [val];
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
320
|
},
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
321
|
formatDate(value){
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
322
|
const format = DEFAULT_FORMATS[this.type];
|
2fb29fae
Sergio Crisostomo
export utilities ...
|
323
324
325
326
327
328
329
330
331
332
333
|
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...
|
334
|
},
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
335
336
|
onPick(dates, visible = false) {
|
d07b4f33
Sergio Crisostomo
fix logic for mul...
|
337
338
339
340
|
if (this.multiple){
const allDates = [...this.internalValue, dates].filter(Boolean);
const timeStamps = allDates.map(date => date.getTime()).filter((ts, i, arr) => arr.indexOf(ts) === i); // filter away duplicates
this.internalValue = timeStamps.map(ts => new Date(ts));
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
341
342
|
} else {
this.internalValue = Array.isArray(dates) ? dates : [dates];
|
0fd13696
梁灏
fixed DatePicker ...
|
343
|
}
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
344
345
346
347
348
349
350
351
|
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');
|
e55ba7a2
Sergio Crisostomo
Add week numbers
|
352
|
},
|
0f677893
梁灏
update DatePicker
|
353
354
|
},
watch: {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
355
356
|
visible (state) {
if (state === false){
|
0f677893
梁灏
update DatePicker
|
357
|
this.$refs.drop.destroy();
|
030a522d
Sergio Crisostomo
make picker close...
|
358
359
|
const input = this.$el.querySelector('input');
if (input) input.blur();
|
c46f385a
梁灏
update DatePicker
|
360
|
}
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
361
|
this.$emit('on-open-change', state);
|
c46f385a
梁灏
update DatePicker
|
362
|
},
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
363
|
value(val) {
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
364
|
this.internalValue = this.parseDate(val);
|
0dd7b94a
梁灏
update TimePicker
|
365
|
|
d20fe0ee
梁灏
update DatePicker
|
366
367
|
},
open (val) {
|
95eae081
Sergio Crisostomo
refactor Datepicker
|
368
369
370
371
|
this.visible = val === true;
},
type(type){
this.onSelectionModeChange(type);
|
8f6aeda4
Sergio Crisostomo
Fix parser and fo...
|
372
373
374
375
|
},
publicValue(now, before){
const newValue = JSON.stringify(now);
const oldValue = JSON.stringify(before);
|
d9ff845f
Sergio Crisostomo
Emit input event ...
|
376
377
|
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...
|
378
|
},
|
e9dd4dab
梁灏
publish 0.9.11-rc-1
|
379
|
},
|
531cd165
梁灏
support DatePicke...
|
380
|
mounted () {
|
d9ff845f
Sergio Crisostomo
Emit input event ...
|
381
382
383
384
385
|
const initialValue = this.value;
const parsedValue = this.publicValue;
if (typeof initialValue !== typeof parsedValue || JSON.stringify(initialValue) !== JSON.stringify(parsedValue)){
this.$emit('input', this.publicValue); // to update v-model
}
|
d20fe0ee
梁灏
update DatePicker
|
386
|
if (this.open !== null) this.visible = this.open;
|
0f677893
梁灏
update DatePicker
|
387
|
}
|
b0893113
jingsam
add eslint
|
388
389
|
};
</script>
|