Skip to content

Commit 891600a

Browse files
committed
Merge branch 'codekraft-studio-features/disable-year' into v1.x
* codekraft-studio-features/disable-year: Update tests Fix code style Removed forgotten comments :( Added tests Disable invalid year in yearpicker
2 parents a806b76 + ae5ef11 commit 891600a

File tree

4 files changed

+84
-5
lines changed

4 files changed

+84
-5
lines changed

src/DatetimePopup.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<datetime-year-picker
99
v-if="step === 'year'"
1010
@change="onChangeYear"
11+
:min-date="minDatetime"
12+
:max-date="maxDatetime"
1113
:year="year"></datetime-year-picker>
1214
<datetime-calendar
1315
v-if="step === 'date'"

src/DatetimeYearPicker.vue

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,49 @@
11
<template>
22
<div class="vdatetime-year-picker">
33
<div class="vdatetime-year-picker__list vdatetime-year-picker__list" ref="yearList">
4-
<div class="vdatetime-year-picker__item" v-for="year in years" @click="select(year.number)" :class="{'vdatetime-year-picker__item--selected': year.selected}">{{ year.number }}</div>
4+
<div class="vdatetime-year-picker__item" v-for="year in years" @click="select(year)" :class="{'vdatetime-year-picker__item--selected': year.selected, 'vdatetime-year-picker__item--disabled': year.disabled}">{{ year.number }}
5+
</div>
56
</div>
67
</div>
78
</template>
89

910
<script>
10-
import { years } from './util'
11+
import { DateTime } from 'luxon'
12+
import { yearIsDisabled, years } from './util'
1113
1214
export default {
1315
props: {
1416
year: {
1517
type: Number,
1618
required: true
19+
},
20+
minDate: {
21+
type: DateTime,
22+
default: null
23+
},
24+
maxDate: {
25+
type: DateTime,
26+
default: null
1727
}
1828
},
1929
2030
computed: {
2131
years () {
2232
return years(this.year).map(year => ({
2333
number: year,
24-
selected: year === this.year
34+
selected: year === this.year,
35+
disabled: !year || yearIsDisabled(this.minDate, this.maxDate, year)
2536
}))
2637
}
2738
},
2839
2940
methods: {
3041
select (year) {
31-
this.$emit('change', parseInt(year))
42+
if (year.disabled) {
43+
return
44+
}
45+
46+
this.$emit('change', parseInt(year.number))
3247
},
3348
3449
scrollToCurrent () {
@@ -97,4 +112,14 @@ export default {
97112
color: #3f51b5;
98113
font-size: 32px;
99114
}
115+
116+
.vdatetime-year-picker__item--disabled {
117+
opacity: 0.4;
118+
cursor: default;
119+
120+
&:hover {
121+
color: inherit;
122+
background: transparent;
123+
}
124+
}
100125
</style>

src/util.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ export function monthDayIsDisabled (minDate, maxDate, year, month, day) {
4040
(maxDate && date > maxDate)
4141
}
4242

43+
export function yearIsDisabled (minDate, maxDate, year) {
44+
const minYear = minDate ? minDate.year : null
45+
const maxYear = maxDate ? maxDate.year : null
46+
47+
return (minYear && year < minYear) ||
48+
(maxYear && year > maxYear)
49+
}
50+
4351
export function timeComponentIsDisabled (min, max, component) {
4452
return (min && component < min) ||
4553
(max && component > max)

test/specs/DatetimeYearPicker.spec.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { DateTime } from 'luxon'
12
import { createVM } from '../helpers/utils.js'
23
import DatetimeYearPicker from 'src/DatetimeYearPicker.vue'
34

@@ -12,14 +13,41 @@ describe('DatetimeYearPicker.vue', function () {
1213

1314
expect(vm.$('.vdatetime-year-picker')).to.exist
1415

15-
const years = vm.$$('.vdatetime-year-picker__list .vdatetime-year-picker__item').map(el => parseInt(el.textContent))
16+
const years = vm.$$('.vdatetime-year-picker__list .vdatetime-year-picker__item')
17+
.map(el => parseInt(el.textContent))
1618
const yearList = new Array(201).fill(null).map((item, index) => 1920 + index)
1719

1820
expect(years).eql(yearList)
1921

2022
const selected = parseInt(vm.$('.vdatetime-year-picker__item--selected').textContent)
2123
expect(selected).eql(2020)
2224
})
25+
26+
it('should disable years', function () {
27+
const vm = createVM(this,
28+
`<DatetimeYearPicker :min-date="minDate" :max-date="maxDate" :year="2018"></DatetimeYearPicker>`,
29+
{
30+
components: { DatetimeYearPicker },
31+
data () {
32+
return {
33+
minDate: DateTime.fromISO('2018-01-01T00:00:00.000Z').toUTC(),
34+
maxDate: DateTime.fromISO('2018-12-01T00:00:00.000Z').toUTC()
35+
}
36+
}
37+
})
38+
39+
const years = vm.$$('.vdatetime-year-picker__list .vdatetime-year-picker__item')
40+
41+
years.forEach(year => {
42+
const yearNumber = parseInt(year.textContent)
43+
44+
if (yearNumber === 2018) {
45+
expect(year).to.have.not.class('vdatetime-year-picker__item--disabled')
46+
} else {
47+
expect(year).to.have.class('vdatetime-year-picker__item--disabled')
48+
}
49+
})
50+
})
2351
})
2452

2553
describe('events', function () {
@@ -43,5 +71,21 @@ describe('DatetimeYearPicker.vue', function () {
4371
vm.$$('.vdatetime-year-picker__list .vdatetime-year-picker__item')[110].click()
4472
expect(vm.year).to.be.equal(2030)
4573
})
74+
75+
it('should disable change event when year is disabled', function () {
76+
const vm = createVM(this,
77+
`<DatetimeYearPicker :min-date="minDate" :max-date="maxDate" :year="2018"></DatetimeYearPicker>`,
78+
{
79+
components: { DatetimeYearPicker },
80+
data () {
81+
return {
82+
minDate: DateTime.fromISO('1920-01-01'),
83+
maxDate: DateTime.fromISO('2000-12-01')
84+
}
85+
}
86+
})
87+
vm.$$('.vdatetime-year-picker__list .vdatetime-year-picker__item')[0].click()
88+
expect(vm.year).not.to.be.equal(1918)
89+
})
4690
})
4791
})

0 commit comments

Comments
 (0)