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"
@@ -136,13 +138,17 @@ export default {
136138 calendarButtonIcon: String ,
137139 calendarButtonIconContent: String ,
138140 bootstrapStyling: Boolean ,
139- initialView: {
141+ initialView: String ,
142+ disabledPicker: Boolean ,
143+ required: Boolean ,
144+ minimumView: {
140145 type: String ,
141146 default: ' day'
142147 },
143- disabledPicker: Boolean ,
144- required: Boolean ,
145- dayViewOnly: Boolean
148+ maximumView: {
149+ type: String ,
150+ default: ' year'
151+ }
146152 },
147153 data () {
148154 return {
@@ -179,6 +185,13 @@ export default {
179185 }
180186 },
181187 computed: {
188+ computedInitialView () {
189+ if (! this .initialView ) {
190+ return this .minimumView
191+ }
192+
193+ return this .initialView
194+ },
182195 pageDate () {
183196 return new Date (this .pageTimestamp )
184197 },
@@ -323,9 +336,18 @@ export default {
323336 return this .close ()
324337 }
325338 this .setInitialView ()
339+ if (! this .isInline ) {
340+ this .$emit (' opened' )
341+ }
326342 },
327343 setInitialView () {
328- switch (this .initialView ) {
344+ const initialView = this .computedInitialView
345+
346+ if (! this .allowedToShowView (initialView)) {
347+ throw new Error (` initialView '${ this .initialView } ' cannot be rendered based on minimum '${ this .minimumView } ' and maximum '${ this .maximumView } '` )
348+ }
349+
350+ switch (initialView) {
329351 case ' year' :
330352 this .showYearCalendar ()
331353 break
@@ -337,23 +359,35 @@ export default {
337359 break
338360 }
339361 },
362+ allowedToShowView (view ) {
363+ const views = [' day' , ' month' , ' year' ]
364+ const minimumViewIndex = views .indexOf (this .minimumView )
365+ const maximumViewIndex = views .indexOf (this .maximumView )
366+ const viewIndex = views .indexOf (view)
367+
368+ return viewIndex >= minimumViewIndex && viewIndex <= maximumViewIndex
369+ },
340370 showDayCalendar () {
371+ if (! this .allowedToShowView (' day' )) return false
372+
341373 this .close ()
342374 this .showDayView = true
343375 if (! this .isInline ) {
344- this .$emit (' opened' )
345376 document .addEventListener (' click' , this .clickOutside , false )
346377 }
347378 },
348379 showMonthCalendar () {
349- if (this .dayViewOnly ) return false
380+ if (! this .allowedToShowView (' month' )) return false
381+
350382 this .close ()
351383 this .showMonthView = true
352384 if (! this .isInline ) {
353385 document .addEventListener (' click' , this .clickOutside , false )
354386 }
355387 },
356388 showYearCalendar () {
389+ if (! this .allowedToShowView (' year' )) return false
390+
357391 this .close ()
358392 this .showYearView = true
359393 if (! this .isInline ) {
@@ -383,9 +417,10 @@ export default {
383417 }
384418 this .setDate (day .timestamp )
385419 if (this .isInline ) {
386- return this .showDayCalendar ()
420+ this .showDayCalendar ()
421+ } else {
422+ this .close ()
387423 }
388- this .close ()
389424 },
390425 /**
391426 * @param {Object} month
@@ -394,10 +429,16 @@ export default {
394429 if (month .isDisabled ) {
395430 return false
396431 }
432+
397433 const date = new Date (month .timestamp )
398- this .setPageDate (date)
399- this .showDayCalendar ()
400- this .$emit (' changedMonth' , month)
434+ if (this .allowedToShowView (' day' )) {
435+ this .setPageDate (date)
436+ this .$emit (' changedMonth' , month)
437+ this .showDayCalendar ()
438+ } else {
439+ this .setDate (date)
440+ this .close ()
441+ }
401442 },
402443 /**
403444 * @param {Object} year
@@ -406,10 +447,16 @@ export default {
406447 if (year .isDisabled ) {
407448 return false
408449 }
450+
409451 const date = new Date (year .timestamp )
410- this .setPageDate (date)
411- this .showMonthCalendar ()
412- this .$emit (' changedYear' , year)
452+ if (this .allowedToShowView (' month' )) {
453+ this .setPageDate (date)
454+ this .$emit (' changedYear' , year)
455+ this .showMonthCalendar ()
456+ } else {
457+ this .setDate (date)
458+ this .close ()
459+ }
413460 },
414461 /**
415462 * @return {Number}
0 commit comments