29
29
</div >
30
30
31
31
<!-- Day View -->
32
- <div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showDayView" v-bind:style =" calendarStyle" >
33
- <header >
34
- <span
35
- @click =" isRtl ? nextMonth() : previousMonth()"
36
- class =" prev"
37
- v-bind:class =" { 'disabled' : isRtl ? nextMonthDisabled(pageTimestamp) : previousMonthDisabled(pageTimestamp) }" >< ; </span >
38
- <span @click =" showMonthCalendar" :class =" !dayViewOnly ? 'up' : ''" >{{ currMonthName }} {{ currYear }}
39
- </span >
40
- <span
41
- @click =" isRtl ? previousMonth() : nextMonth()"
42
- class =" next"
43
- v-bind:class =" { 'disabled' : isRtl ? previousMonthDisabled(pageTimestamp) : nextMonthDisabled(pageTimestamp) }" >> ; </span >
44
- </header >
45
- <div :class =" isRtl ? 'flex-rtl' : ''" >
46
- <span class =" cell day-header" v-for =" d in daysOfWeek" :key =" d.timestamp" >{{ d }}</span >
47
- <span class =" cell day blank" v-for =" d in blankDays" :key =" d.timestamp" ></span ><!--
48
- --> <span class =" cell day"
49
- v-for =" day in days"
50
- :key =" day.timestamp"
51
- track-by =" timestamp"
52
- v-bind:class =" dayClasses(day)"
53
- @click =" selectDate(day)" >{{ day.date }}</span >
54
- </div >
55
- </div >
32
+ <template v-if =" allowedToShowView (' day' )" >
33
+ <div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showDayView" v-bind:style =" calendarStyle" >
34
+ <header >
35
+ <span
36
+ @click =" isRtl ? nextMonth() : previousMonth()"
37
+ class =" prev"
38
+ v-bind:class =" { 'disabled' : isRtl ? nextMonthDisabled(pageTimestamp) : previousMonthDisabled(pageTimestamp) }" >< ; </span >
39
+ <span @click =" showMonthCalendar" :class =" allowedToShowView('month') ? 'up' : ''" >{{ currMonthName }} {{ currYear }}
40
+ </span >
41
+ <span
42
+ @click =" isRtl ? previousMonth() : nextMonth()"
43
+ class =" next"
44
+ v-bind:class =" { 'disabled' : isRtl ? previousMonthDisabled(pageTimestamp) : nextMonthDisabled(pageTimestamp) }" >> ; </span >
45
+ </header >
46
+ <div :class =" isRtl ? 'flex-rtl' : ''" >
47
+ <span class =" cell day-header" v-for =" d in daysOfWeek" :key =" d.timestamp" >{{ d }}</span >
48
+ <span class =" cell day blank" v-for =" d in blankDays" :key =" d.timestamp" ></span ><!--
49
+ --> <span class =" cell day"
50
+ v-for =" day in days"
51
+ :key =" day.timestamp"
52
+ track-by =" timestamp"
53
+ v-bind:class =" dayClasses(day)"
54
+ @click =" selectDate(day)" >{{ day.date }}</span >
55
+ </div >
56
+ </div >
57
+ </template >
56
58
57
59
<!-- Month View -->
58
- <template v-if =" ! dayViewOnly " >
60
+ <template v-if =" allowedToShowView ( ' month ' ) " >
59
61
<div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showMonthView" v-bind:style =" calendarStyle" >
60
62
<header >
61
63
<span
62
64
@click =" previousYear"
63
65
class =" prev"
64
66
v-bind:class =" { 'disabled' : previousYearDisabled(pageTimestamp) }" >< ; </span >
65
- <span @click =" showYearCalendar" class =" up " >{{ getPageYear() }}</span >
67
+ <span @click =" showYearCalendar" : class =" allowedToShowView('year') ? 'up' : '' " >{{ getPageYear() }}</span >
66
68
<span
67
69
@click =" nextYear"
68
70
class =" next"
78
80
</template >
79
81
80
82
<!-- Year View -->
81
- <template v-if =" ! dayViewOnly " >
83
+ <template v-if =" allowedToShowView ( ' year ' ) " >
82
84
<div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showYearView" v-bind:style =" calendarStyle" >
83
85
<header >
84
86
<span @click =" previousDecade" class =" prev"
@@ -134,13 +136,17 @@ export default {
134
136
calendarButton: Boolean ,
135
137
calendarButtonIcon: String ,
136
138
bootstrapStyling: Boolean ,
137
- initialView: {
139
+ initialView: String ,
140
+ disabledPicker: Boolean ,
141
+ required: Boolean ,
142
+ minimumView: {
138
143
type: String ,
139
144
default: ' day'
140
145
},
141
- disabledPicker: Boolean ,
142
- required: Boolean ,
143
- dayViewOnly: Boolean
146
+ maximumView: {
147
+ type: String ,
148
+ default: ' year'
149
+ }
144
150
},
145
151
data () {
146
152
return {
@@ -177,6 +183,13 @@ export default {
177
183
}
178
184
},
179
185
computed: {
186
+ computedInitialView () {
187
+ if (! this .initialView ) {
188
+ return this .minimumView
189
+ }
190
+
191
+ return this .initialView
192
+ },
180
193
pageDate () {
181
194
return new Date (this .pageTimestamp )
182
195
},
@@ -321,9 +334,18 @@ export default {
321
334
return this .close ()
322
335
}
323
336
this .setInitialView ()
337
+ if (! this .isInline ) {
338
+ this .$emit (' opened' )
339
+ }
324
340
},
325
341
setInitialView () {
326
- switch (this .initialView ) {
342
+ const initialView = this .computedInitialView
343
+
344
+ if (! this .allowedToShowView (initialView)) {
345
+ throw new Error (` initialView '${ this .initialView } ' cannot be rendered based on minimum '${ this .minimumView } ' and maximum '${ this .maximumView } '` )
346
+ }
347
+
348
+ switch (initialView) {
327
349
case ' year' :
328
350
this .showYearCalendar ()
329
351
break
@@ -335,23 +357,35 @@ export default {
335
357
break
336
358
}
337
359
},
360
+ allowedToShowView (view ) {
361
+ const views = [' day' , ' month' , ' year' ]
362
+ const minimumViewIndex = views .indexOf (this .minimumView )
363
+ const maximumViewIndex = views .indexOf (this .maximumView )
364
+ const viewIndex = views .indexOf (view)
365
+
366
+ return viewIndex >= minimumViewIndex && viewIndex <= maximumViewIndex
367
+ },
338
368
showDayCalendar () {
369
+ if (! this .allowedToShowView (' day' )) return false
370
+
339
371
this .close ()
340
372
this .showDayView = true
341
373
if (! this .isInline ) {
342
- this .$emit (' opened' )
343
374
document .addEventListener (' click' , this .clickOutside , false )
344
375
}
345
376
},
346
377
showMonthCalendar () {
347
- if (this .dayViewOnly ) return false
378
+ if (! this .allowedToShowView (' month' )) return false
379
+
348
380
this .close ()
349
381
this .showMonthView = true
350
382
if (! this .isInline ) {
351
383
document .addEventListener (' click' , this .clickOutside , false )
352
384
}
353
385
},
354
386
showYearCalendar () {
387
+ if (! this .allowedToShowView (' year' )) return false
388
+
355
389
this .close ()
356
390
this .showYearView = true
357
391
if (! this .isInline ) {
@@ -381,9 +415,10 @@ export default {
381
415
}
382
416
this .setDate (day .timestamp )
383
417
if (this .isInline ) {
384
- return this .showDayCalendar ()
418
+ this .showDayCalendar ()
419
+ } else {
420
+ this .close ()
385
421
}
386
- this .close ()
387
422
},
388
423
/**
389
424
* @param {Object} month
@@ -392,10 +427,16 @@ export default {
392
427
if (month .isDisabled ) {
393
428
return false
394
429
}
430
+
395
431
const date = new Date (month .timestamp )
396
- this .setPageDate (date)
397
- this .showDayCalendar ()
398
- this .$emit (' changedMonth' , month)
432
+ if (this .allowedToShowView (' day' )) {
433
+ this .setPageDate (date)
434
+ this .$emit (' changedMonth' , month)
435
+ this .showDayCalendar ()
436
+ } else {
437
+ this .setDate (date)
438
+ this .close ()
439
+ }
399
440
},
400
441
/**
401
442
* @param {Object} year
@@ -404,10 +445,16 @@ export default {
404
445
if (year .isDisabled ) {
405
446
return false
406
447
}
448
+
407
449
const date = new Date (year .timestamp )
408
- this .setPageDate (date)
409
- this .showMonthCalendar ()
410
- this .$emit (' changedYear' , year)
450
+ if (this .allowedToShowView (' month' )) {
451
+ this .setPageDate (date)
452
+ this .$emit (' changedYear' , year)
453
+ this .showMonthCalendar ()
454
+ } else {
455
+ this .setDate (date)
456
+ this .close ()
457
+ }
411
458
},
412
459
/**
413
460
* @return {Number}
0 commit comments