2929 </div >
3030
3131 <!-- 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 >
5658
5759 <!-- Month View -->
58- <template v-if =" ! dayViewOnly " >
60+ <template v-if =" allowedToShowView ( ' month ' ) " >
5961 <div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showMonthView" v-bind:style =" calendarStyle" >
6062 <header >
6163 <span
6264 @click =" previousYear"
6365 class =" prev"
6466 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 >
6668 <span
6769 @click =" nextYear"
6870 class =" next"
7880 </template >
7981
8082 <!-- Year View -->
81- <template v-if =" ! dayViewOnly " >
83+ <template v-if =" allowedToShowView ( ' year ' ) " >
8284 <div :class =" [calendarClass, 'vdp-datepicker__calendar']" v-show =" showYearView" v-bind:style =" calendarStyle" >
8385 <header >
8486 <span @click =" previousDecade" class =" prev"
@@ -134,13 +136,17 @@ export default {
134136 calendarButton: Boolean ,
135137 calendarButtonIcon: String ,
136138 bootstrapStyling: Boolean ,
137- initialView: {
139+ initialView: String ,
140+ disabledPicker: Boolean ,
141+ required: Boolean ,
142+ minimumView: {
138143 type: String ,
139144 default: ' day'
140145 },
141- disabledPicker: Boolean ,
142- required: Boolean ,
143- dayViewOnly: Boolean
146+ maximumView: {
147+ type: String ,
148+ default: ' year'
149+ }
144150 },
145151 data () {
146152 return {
@@ -177,6 +183,13 @@ export default {
177183 }
178184 },
179185 computed: {
186+ computedInitialView () {
187+ if (! this .initialView ) {
188+ return this .minimumView
189+ }
190+
191+ return this .initialView
192+ },
180193 pageDate () {
181194 return new Date (this .pageTimestamp )
182195 },
@@ -321,9 +334,18 @@ export default {
321334 return this .close ()
322335 }
323336 this .setInitialView ()
337+ if (! this .isInline ) {
338+ this .$emit (' opened' )
339+ }
324340 },
325341 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) {
327349 case ' year' :
328350 this .showYearCalendar ()
329351 break
@@ -335,23 +357,35 @@ export default {
335357 break
336358 }
337359 },
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+ },
338368 showDayCalendar () {
369+ if (! this .allowedToShowView (' day' )) return false
370+
339371 this .close ()
340372 this .showDayView = true
341373 if (! this .isInline ) {
342- this .$emit (' opened' )
343374 document .addEventListener (' click' , this .clickOutside , false )
344375 }
345376 },
346377 showMonthCalendar () {
347- if (this .dayViewOnly ) return false
378+ if (! this .allowedToShowView (' month' )) return false
379+
348380 this .close ()
349381 this .showMonthView = true
350382 if (! this .isInline ) {
351383 document .addEventListener (' click' , this .clickOutside , false )
352384 }
353385 },
354386 showYearCalendar () {
387+ if (! this .allowedToShowView (' year' )) return false
388+
355389 this .close ()
356390 this .showYearView = true
357391 if (! this .isInline ) {
@@ -381,9 +415,10 @@ export default {
381415 }
382416 this .setDate (day .timestamp )
383417 if (this .isInline ) {
384- return this .showDayCalendar ()
418+ this .showDayCalendar ()
419+ } else {
420+ this .close ()
385421 }
386- this .close ()
387422 },
388423 /**
389424 * @param {Object} month
@@ -392,10 +427,16 @@ export default {
392427 if (month .isDisabled ) {
393428 return false
394429 }
430+
395431 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+ }
399440 },
400441 /**
401442 * @param {Object} year
@@ -404,10 +445,16 @@ export default {
404445 if (year .isDisabled ) {
405446 return false
406447 }
448+
407449 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+ }
411458 },
412459 /**
413460 * @return {Number}
0 commit comments