TimePicker: selectable range will affect to column minutes in spinner (#12312)

pull/13042/head
Harlan 2018-10-12 22:40:41 +08:00 committed by hetech
parent b182a67174
commit edb3c9b785
3 changed files with 52 additions and 6 deletions

View File

@ -27,9 +27,9 @@
ref="minutes"> ref="minutes">
<li <li
@click="handleClick('minutes', { value: key, disabled: false })" @click="handleClick('minutes', { value: key, disabled: false })"
v-for="(minute, key) in 60" v-for="(enabled, key) in minutesList"
class="el-time-spinner__item" class="el-time-spinner__item"
:class="{ 'active': key === minutes }">{{ ('0' + key).slice(-2) }}</li> :class="{ 'active': key === minutes, disabled: !enabled }">{{ ('0' + key).slice(-2) }}</li>
</el-scrollbar> </el-scrollbar>
<el-scrollbar <el-scrollbar
v-show="showSeconds" v-show="showSeconds"
@ -99,7 +99,7 @@
</template> </template>
<script type="text/babel"> <script type="text/babel">
import { getRangeHours, modifyTime } from '../util'; import { getRangeHours, getRangeMinutes, modifyTime } from '../util';
import ElScrollbar from 'element-ui/packages/scrollbar'; import ElScrollbar from 'element-ui/packages/scrollbar';
import RepeatClick from 'element-ui/src/directives/repeat-click'; import RepeatClick from 'element-ui/src/directives/repeat-click';
@ -137,6 +137,9 @@
hoursList() { hoursList() {
return getRangeHours(this.selectableRange); return getRangeHours(this.selectableRange);
}, },
minutesList() {
return getRangeMinutes(this.selectableRange, this.hours);
},
arrowHourList() { arrowHourList() {
const hours = this.hours; const hours = this.hours;
return [ return [

View File

@ -131,6 +131,39 @@ export const getRangeHours = function(ranges) {
return hours; return hours;
}; };
function setRangeData(arr, start, end, value) {
for (let i = start; i < end; i++) {
arr[i] = value;
}
}
export const getRangeMinutes = function(ranges, hour) {
const minutes = new Array(60);
if (ranges.length > 0) {
ranges.forEach(range => {
const start = range[0];
const end = range[1];
const startHour = start.getHours();
const startMinute = start.getMinutes();
const endHour = end.getHours();
const endMinute = end.getMinutes();
if (startHour === hour && endHour !== hour) {
setRangeData(minutes, startMinute, 60, true);
} else if (startHour === hour && endHour === hour) {
setRangeData(minutes, startMinute, endMinute + 1, true);
} else if (startHour !== hour && endHour === hour) {
setRangeData(minutes, 0, endMinute + 1, true);
} else if (startHour < hour && endHour > hour) {
setRangeData(minutes, 0, 60, true);
}
});
} else {
setRangeData(minutes, 0, 60, true);
}
return minutes;
};
export const range = function(n) { export const range = function(n) {
// see https://stackoverflow.com/questions/3746725/create-a-javascript-array-containing-1-n // see https://stackoverflow.com/questions/3746725/create-a-javascript-array-containing-1-n
return Array.apply(null, {length: n}).map((_, n) => n); return Array.apply(null, {length: n}).map((_, n) => n);

View File

@ -202,7 +202,7 @@ describe('TimePicker', () => {
it('selectableRange', done => { it('selectableRange', done => {
vm = createTest(TimePicker, { vm = createTest(TimePicker, {
pickerOptions: { pickerOptions: {
selectableRange: '18:30:00 - 20:30:00' selectableRange: ['17:30:00 - 18:30:00', '18:50:00 - 20:30:00', '21:00:00 - 22:00:00']
} }
}, true); }, true);
const input = vm.$el.querySelector('input'); const input = vm.$el.querySelector('input');
@ -218,8 +218,18 @@ describe('TimePicker', () => {
.map(node => Number(node.textContent)); .map(node => Number(node.textContent));
hoursEl.querySelectorAll('.disabled')[0].click(); hoursEl.querySelectorAll('.disabled')[0].click();
expect(disabledHours).to.not.include.members([18, 19, 20]); expect(disabledHours).to.not.include.members([17, 18, 19, 20, 21, 22]);
done();
const minutesEl = list[1];
hoursEl.querySelectorAll('.el-time-spinner__item')[18].click();
setTimeout(_ => {
const disabledMinutes = [].slice
.call(minutesEl.querySelectorAll('.disabled'))
.map(node => Number(node.textContent));
expect(disabledMinutes.every(t => t > 30 && t < 50)).to.equal(true);
expect(disabledMinutes.length).to.equal(19);
done();
}, DELAY);
}, DELAY); }, DELAY);
}); });