Skip to content

Commit 01a947d

Browse files
committed
fix(picker): isseu with default date in disabled range
1 parent 0a2195f commit 01a947d

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

src/components/Datepicker.vue

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ import PickerDay from '~/components/PickerDay.vue'
103103
import PickerMonth from '~/components/PickerMonth.vue'
104104
import PickerYear from '~/components/PickerYear.vue'
105105
import Popup from '~/components/Popup.vue'
106+
import DisabledDate from '~/utils/DisabledDate'
106107
107108
const validDate = (val) =>
108109
val === null ||
@@ -266,6 +267,9 @@ export default {
266267
translation() {
267268
return this.language
268269
},
270+
disabledDatesClass() {
271+
return new DisabledDate(this.utils, this.disabledDates)
272+
},
269273
},
270274
watch: {
271275
initialView() {
@@ -275,7 +279,8 @@ export default {
275279
this.setPageDate()
276280
},
277281
value(value) {
278-
this.setValue(value)
282+
const parsedValue = this.parseValue(value)
283+
this.setValue(parsedValue)
279284
},
280285
},
281286
mounted() {
@@ -326,7 +331,14 @@ export default {
326331
*/
327332
init() {
328333
if (this.value) {
329-
this.setValue(this.value)
334+
let parsedValue = this.parseValue(this.value)
335+
const isDateDisabled =
336+
parsedValue && this.disabledDatesClass.isDateDisabled(parsedValue)
337+
if (isDateDisabled) {
338+
parsedValue = null
339+
this.$emit('input', parsedValue)
340+
}
341+
this.setValue(parsedValue)
330342
}
331343
if (this.isInline) {
332344
this.setInitialView()
@@ -414,18 +426,25 @@ export default {
414426
* @param {Date|String|Number|null} date
415427
*/
416428
setValue(date) {
429+
if (!date) {
430+
this.setPageDate()
431+
this.selectedDate = null
432+
return
433+
}
434+
this.selectedDate = date
435+
this.setPageDate(date)
436+
},
437+
/**
438+
* parse a datepicker value from string/number to date
439+
* @param {Date|String|Number|null} date
440+
*/
441+
parseValue(date) {
417442
let dateTemp = date
418443
if (typeof dateTemp === 'string' || typeof dateTemp === 'number') {
419444
const parsed = new Date(dateTemp)
420445
dateTemp = Number.isNaN(parsed.valueOf()) ? null : parsed
421446
}
422-
if (!dateTemp) {
423-
this.setPageDate()
424-
this.selectedDate = null
425-
return
426-
}
427-
this.selectedDate = dateTemp
428-
this.setPageDate(dateTemp)
447+
return dateTemp
429448
},
430449
/**
431450
* @param {Object} date

test/unit/specs/Datepicker/Datepicker.spec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { mount, shallowMount } from '@vue/test-utils'
2+
import { addDays } from 'date-fns'
23
import DateInput from '~/components/DateInput.vue'
34
import Datepicker from '~/components/Datepicker.vue'
45

@@ -255,6 +256,26 @@ describe('Datepicker shallowMounted', () => {
255256
})
256257
expect(wrapper.emitted()['changed-month']).toBeTruthy()
257258
})
259+
260+
it('should clear date on default date disabled', async () => {
261+
const someDate = new Date('2021-01-15')
262+
const wrapperTemp = shallowMount(Datepicker, {
263+
propsData: {
264+
value: someDate,
265+
disabledDates: {
266+
customPredictor(customPredictorDate) {
267+
if (customPredictorDate < addDays(someDate, 4)) {
268+
return true
269+
}
270+
return false
271+
},
272+
},
273+
},
274+
})
275+
await wrapperTemp.vm.$nextTick()
276+
expect(wrapperTemp.vm.selectedDate).toEqual(null)
277+
expect(wrapperTemp.emitted().input).toBeTruthy()
278+
})
258279
})
259280

260281
describe('Datepicker.vue set by string', () => {

0 commit comments

Comments
 (0)