3030 </div >
3131
3232 <!-- Day View -->
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 =" !dayViewOnly ? '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 >
33+ <template v-if =" allowedToShowView (' day' )" >
34+ <div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showDayView" v-bind:style =" calendarStyle" >
35+ <header >
36+ <span
37+ @click =" isRtl ? nextMonth() : previousMonth()"
38+ class =" prev"
39+ v-bind:class =" { 'disabled' : isRtl ? nextMonthDisabled(pageTimestamp) : previousMonthDisabled(pageTimestamp) }" >< ; </span >
40+ <span @click =" showMonthCalendar" :class =" allowedToShowView('month') ? 'up' : ''" >{{ currMonthName }} {{ currYear }}
41+ </span >
42+ <span
43+ @click =" isRtl ? previousMonth() : nextMonth()"
44+ class =" next"
45+ v-bind:class =" { 'disabled' : isRtl ? previousMonthDisabled(pageTimestamp) : nextMonthDisabled(pageTimestamp) }" >> ; </span >
46+ </header >
47+ <div :class =" isRtl ? 'flex-rtl' : ''" >
48+ <span class =" cell day-header" v-for =" d in daysOfWeek" :key =" d.timestamp" >{{ d }}</span >
49+ <span class =" cell day blank" v-for =" d in blankDays" :key =" d.timestamp" ></span ><!--
50+ --> <span class =" cell day"
51+ v-for =" day in days"
52+ :key =" day.timestamp"
53+ track-by =" timestamp"
54+ v-bind:class =" dayClasses(day)"
55+ @click =" selectDate(day)" >{{ day.date }}</span >
56+ </div >
57+ </div >
58+ </template >
5759
5860 <!-- Month View -->
59- <template v-if =" ! dayViewOnly " >
61+ <template v-if =" allowedToShowView ( ' month ' ) " >
6062 <div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showMonthView" v-bind:style =" calendarStyle" >
6163 <header >
6264 <span
6365 @click =" previousYear"
6466 class =" prev"
6567 v-bind:class =" { 'disabled' : previousYearDisabled(pageTimestamp) }" >< ; </span >
66- <span @click =" showYearCalendar" class =" up " >{{ getPageYear() }}</span >
68+ <span @click =" showYearCalendar" : class =" allowedToShowView('year') ? 'up' : '' " >{{ getPageYear() }}</span >
6769 <span
6870 @click =" nextYear"
6971 class =" next"
7981 </template >
8082
8183 <!-- Year View -->
82- <template v-if =" ! dayViewOnly " >
84+ <template v-if =" allowedToShowView ( ' year ' ) " >
8385 <div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showYearView" v-bind:style =" calendarStyle" >
8486 <header >
8587 <span @click =" previousDecade" class =" prev"
@@ -140,13 +142,17 @@ export default {
140142 calendarButton: Boolean ,
141143 calendarButtonIcon: String ,
142144 bootstrapStyling: Boolean ,
143- initialView: {
145+ initialView: String ,
146+ disabledPicker: Boolean ,
147+ required: Boolean ,
148+ minimumView: {
144149 type: String ,
145150 default: ' day'
146151 },
147- disabledPicker: Boolean ,
148- required: Boolean ,
149- dayViewOnly: Boolean
152+ maximumView: {
153+ type: String ,
154+ default: ' year'
155+ }
150156 },
151157 data () {
152158 const startDate = this .openDate ? new Date (this .openDate ) : new Date ()
@@ -187,6 +193,13 @@ export default {
187193 }
188194 },
189195 computed: {
196+ computedInitialView () {
197+ if (! this .initialView ) {
198+ return this .minimumView
199+ }
200+
201+ return this .initialView
202+ },
190203 pageDate () {
191204 return new Date (this .pageTimestamp )
192205 },
@@ -331,9 +344,18 @@ export default {
331344 return this .close ()
332345 }
333346 this .setInitialView ()
347+ if (! this .isInline ) {
348+ this .$emit (' opened' )
349+ }
334350 },
335351 setInitialView () {
336- switch (this .initialView ) {
352+ const initialView = this .computedInitialView
353+
354+ if (! this .allowedToShowView (initialView)) {
355+ throw new Error (` initialView '${ this .initialView } ' cannot be rendered based on minimum '${ this .minimumView } ' and maximum '${ this .maximumView } '` )
356+ }
357+
358+ switch (initialView) {
337359 case ' year' :
338360 this .showYearCalendar ()
339361 break
@@ -345,23 +367,35 @@ export default {
345367 break
346368 }
347369 },
370+ allowedToShowView (view ) {
371+ const views = [' day' , ' month' , ' year' ]
372+ const minimumViewIndex = views .indexOf (this .minimumView )
373+ const maximumViewIndex = views .indexOf (this .maximumView )
374+ const viewIndex = views .indexOf (view)
375+
376+ return viewIndex >= minimumViewIndex && viewIndex <= maximumViewIndex
377+ },
348378 showDayCalendar () {
379+ if (! this .allowedToShowView (' day' )) return false
380+
349381 this .close ()
350382 this .showDayView = true
351383 if (! this .isInline ) {
352- this .$emit (' opened' )
353384 document .addEventListener (' click' , this .clickOutside , false )
354385 }
355386 },
356387 showMonthCalendar () {
357- if (this .dayViewOnly ) return false
388+ if (! this .allowedToShowView (' month' )) return false
389+
358390 this .close ()
359391 this .showMonthView = true
360392 if (! this .isInline ) {
361393 document .addEventListener (' click' , this .clickOutside , false )
362394 }
363395 },
364396 showYearCalendar () {
397+ if (! this .allowedToShowView (' year' )) return false
398+
365399 this .close ()
366400 this .showYearView = true
367401 if (! this .isInline ) {
@@ -391,9 +425,10 @@ export default {
391425 }
392426 this .setDate (day .timestamp )
393427 if (this .isInline ) {
394- return this .showDayCalendar ()
428+ this .showDayCalendar ()
429+ } else {
430+ this .close ()
395431 }
396- this .close ()
397432 },
398433 /**
399434 * @param {Object} month
@@ -402,10 +437,16 @@ export default {
402437 if (month .isDisabled ) {
403438 return false
404439 }
440+
405441 const date = new Date (month .timestamp )
406- this .setPageDate (date)
407- this .showDayCalendar ()
408- this .$emit (' changedMonth' , month)
442+ if (this .allowedToShowView (' day' )) {
443+ this .setPageDate (date)
444+ this .$emit (' changedMonth' , month)
445+ this .showDayCalendar ()
446+ } else {
447+ this .setDate (date)
448+ this .close ()
449+ }
409450 },
410451 /**
411452 * @param {Object} year
@@ -414,10 +455,16 @@ export default {
414455 if (year .isDisabled ) {
415456 return false
416457 }
458+
417459 const date = new Date (year .timestamp )
418- this .setPageDate (date)
419- this .showMonthCalendar ()
420- this .$emit (' changedYear' , year)
460+ if (this .allowedToShowView (' month' )) {
461+ this .setPageDate (date)
462+ this .$emit (' changedYear' , year)
463+ this .showMonthCalendar ()
464+ } else {
465+ this .setDate (date)
466+ this .close ()
467+ }
421468 },
422469 /**
423470 * @return {Number}
0 commit comments