Skip to content

Commit 4204cfd

Browse files
authored
Merge branch 'master' into patch-1
2 parents f50e732 + 0db6f1e commit 4204cfd

File tree

6 files changed

+222
-72
lines changed

6 files changed

+222
-72
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,11 @@ Inline always open version
8383
| calendar-button-icon | String | | Use icon for button (ex: fa fa-calendar) |
8484
| calendar-button-icon-content | String | | Use for material-icons (ex: event) |
8585
| bootstrapStyling | Boolean | false | Output bootstrap styling classes |
86-
| initial-view | String | 'day' | If 'month' or 'year', open on that view |
86+
| initial-view | String | minimumView | If set, open on that view |
8787
| disabled-picker | Boolean | false | If true, disable Datepicker on screen |
8888
| required | Boolean | false | Sets html required attribute on input |
89-
| day-view-only | Boolean | false | If true, month and year views won't show |
89+
| minimum-view | String | 'day' | If set, lower-level views won't show |
90+
| maximum-view | String | 'year' | If set, higher-level views won't show |
9091

9192
## Events
9293

@@ -264,6 +265,8 @@ Available languages
264265
| sk | Slovak | |
265266
| sl-si | Slovenian | |
266267
| sv | Swedish | |
268+
| sr | Serbian (Latin) | |
269+
| sr-Cyrl | Serbian (Cyrl) | |
267270
| th | Thai | |
268271
| tr | Turkish | |
269272
| uk | Ukrainian | |

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vuejs-datepicker",
3-
"version": "0.9.18",
3+
"version": "0.9.19",
44
"description": "A simple Vue.js datepicker component. Supports disabling of dates, inline mode, translations",
55
"keywords": [
66
"vue",

src/Demo.vue

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@
151151
<div class="settings">
152152
<h5>Settings</h5>
153153
<select v-model="language">
154-
<option :value="key" v-for="(language, key) in languages">{{ language.language }}</option>
154+
<option :value="key" v-for="(language, key) in languages" :key="key">{{ language.language }}</option>
155155
</select>
156156
</div>
157157
</div>
@@ -167,23 +167,47 @@
167167
<h3>RTL datepicker</h3>
168168
<datepicker language="he"></datepicker>
169169
<code>
170-
&lt;datepicker :inline="true"&gt;&lt;/datepicker&gt;
170+
&lt;datepicker language="he"&gt;&lt;/datepicker&gt;
171+
</code>
172+
</div>
173+
174+
<div class="example">
175+
<h3>Day view only</h3>
176+
<datepicker :minimumView="'day'" :maximumView="'day'"></datepicker>
177+
<code>
178+
&lt;datepicker :minimumView="'day'" :maximumView="'day'"&gt;&lt;/datepicker&gt;
171179
</code>
172180
</div>
173181

174182
<div class="example">
175183
<h3>Day view only RTL</h3>
176-
<datepicker :day-view-only="true" language="he"></datepicker>
184+
<datepicker :minimumView="'day'" :maximumView="'day'" language="he"></datepicker>
177185
<code>
178-
&lt;datepicker :day-view-only="true"&gt;&lt;/datepicker&gt;
186+
&lt;datepicker :minimumView="'day'" :maximumView="'day'" language="he"&gt;&lt;/datepicker&gt;
179187
</code>
180188
</div>
181189

182190
<div class="example">
183-
<h3>Day view only</h3>
184-
<datepicker :day-view-only="true"></datepicker>
191+
<h3>Month view only</h3>
192+
<datepicker :minimumView="'month'" :maximumView="'month'"></datepicker>
193+
<code>
194+
&lt;datepicker :minimumView="'month'" :maximumView="'month'"&gt;&lt;/datepicker&gt;
195+
</code>
196+
</div>
197+
198+
<div class="example">
199+
<h3>Day and month view only</h3>
200+
<datepicker :minimumView="'day'" :maximumView="'month'" :initialView="'month'"></datepicker>
201+
<code>
202+
&lt;datepicker :minimumView="'day'" :maximumView="'month'" :initialView="'month'"&gt;&lt;/datepicker&gt;
203+
</code>
204+
</div>
205+
206+
<div class="example">
207+
<h3>Year and month view only</h3>
208+
<datepicker :minimumView="'month'" :maximumView="'year'" :initialView="'year'"></datepicker>
185209
<code>
186-
&lt;datepicker :day-view-only="true"&gt;&lt;/datepicker&gt;
210+
&lt;datepicker :minimumView="'month'" :maximumView="'year'" :initialView="'year'"&gt;&lt;/datepicker&gt;
187211
</code>
188212
</div>
189213

src/components/Datepicker.vue

Lines changed: 89 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -30,40 +30,42 @@
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) }">&lt;</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) }">&gt;</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) }">&lt;</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) }">&gt;</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) }">&lt;</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"
@@ -79,7 +81,7 @@
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}

src/utils/DateLanguages.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ export default {
262262
'language': 'Swedish',
263263
'months': {
264264
'original': ['Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni', 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'],
265-
'abbr': ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
265+
'abbr': ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec']
266266
},
267267
'days': ['Sön', 'Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör']
268268
},
@@ -282,6 +282,22 @@ export default {
282282
},
283283
'days': ['Ned', 'Pon', 'Tor', 'Sre', 'Čet', 'Pet', 'Sob']
284284
},
285+
'sr': {
286+
'language': 'Serbian',
287+
'months': {
288+
'original': ['Januar', 'Februar', 'Mart', 'April', 'Maj', 'Jun', 'Jul', 'Avgust', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'],
289+
'abbr': ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec']
290+
},
291+
'days': ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub']
292+
},
293+
'sr-Cyrl': {
294+
'language': 'Serbian in Cyrillic script',
295+
'months': {
296+
'original': ['Јануар', 'Фебруар', 'Март', 'Април', 'Мај', 'Јун', 'Јул', 'Август', 'Септембар', 'Октобар', 'Новембар', 'Децембар'],
297+
'abbr': ['Јан', 'Феб', 'Мар', 'Апр', 'Мај', 'Јун', 'Јул', 'Авг', 'Сеп', 'Окт', 'Нов', 'Дец']
298+
},
299+
'days': ['Нед', 'Пон', 'Уто', 'Сре', 'Чет', 'Пет', 'Суб']
300+
},
285301
'th': {
286302
'language': 'Thai',
287303
'months': {

0 commit comments

Comments
 (0)