Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: minute set to non-selectable minutes when changing selectable range #89

Merged
merged 7 commits into from
Jan 3, 2023
Merged
49 changes: 32 additions & 17 deletions src/js/timepicker/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -441,18 +441,17 @@ var TimePicker = defineClass(
/**
* Set values in spinboxes from time
* @private
* @param {boolean} silent prevents firing 'change' event if it is true.
*/
syncToInputs: function(silent) {
syncToInputs: function() {
var hour = this.hour;
var minute = this.minute;

if (this.showMeridiem) {
hour = util.getMeridiemHour(hour);
}

this.hourInput.setValue(hour, silent);
this.minuteInput.setValue(minute, silent);
this.hourInput.setValue(hour, true);
this.minuteInput.setValue(minute, true);
},

/**
Expand Down Expand Up @@ -576,7 +575,7 @@ var TimePicker = defineClass(

/**
* Set step of minute
* @param {array} step - Step to create items of minute
* @param {number} step - Step to create items of minute
*/
setMinuteStep: function(step) {
this.minuteStep = step;
Expand Down Expand Up @@ -637,7 +636,7 @@ var TimePicker = defineClass(
this.hour = hour;
this.minute = minute;

this.syncToInputs(silent);
this.syncToInputs();
if (this.showMeridiem) {
this.syncToMeridiemElements();
}
Expand Down Expand Up @@ -692,8 +691,8 @@ var TimePicker = defineClass(

/**
* Set selectable range on hour
* @param {number} begin.hour - begin hour of range
* @param {number} [end.hour] - end hour of range
* @param {number} beginHour - begin hour of range
* @param {number} [endHour] - end hour of range
* @private
*/
setRangeHour: function(beginHour, endHour) {
Expand All @@ -708,10 +707,10 @@ var TimePicker = defineClass(

/**
* Set selectable range on minute
* @param {number} begin.hour - begin hour of range
* @param {number} begin.minute - begin minute of range
* @param {number} [end.hour] - end hour of range
* @param {number} [end.minute] - end minute of range
* @param {number} beginHour - begin hour of range
* @param {number} beginMin - begin minute of range
* @param {number} [endHour] - end hour of range
* @param {number} [endMin] - end minute of range
* @private
*/
setRangeMinute: function(beginHour, beginMin, endHour, endMin) {
Expand Down Expand Up @@ -752,23 +751,39 @@ var TimePicker = defineClass(

/**
* Apply range
* @param {number} begin.hour - begin hour of range
* @param {number} begin.minute - begin minute of range
* @param {number} [end.hour] - end hour of range
* @param {number} beginHour - begin hour of range
* @param {number} beginMin - begin minute of range
* @param {number} [endHour] - end hour of range
* @private
*/
// eslint-disable-next-line complexity
applyRange: function(beginHour, beginMin, endHour) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

로직이 eslint complexity 룰에 걸리던데 disable 주석 처리 안해도 되나요?

var targetMinuteIndex = Math.ceil(beginMin / this.minuteStep);
var targetHour = beginHour;
var targetMinute = Math.ceil(beginMin / this.minuteStep) * this.minuteStep;
var targetMinute = targetMinuteIndex * this.minuteStep;
var diffFromSelectableMinute;

if (this.isLaterThanSetTime(beginHour, beginMin)) {
if (this.hourStep !== 1 && beginHour % this.hourStep !== 1) {
if (this.disabledMinutes[targetHour][targetMinuteIndex]) {
diffFromSelectableMinute =
this.disabledMinutes[targetHour]
.slice(targetMinuteIndex)
.findIndex(function(isMinuteDisabled) {
return !isMinuteDisabled;
}) * this.minuteStep;

targetMinute =
diffFromSelectableMinute >= 0 ? targetMinute + diffFromSelectableMinute : 60;
}

if ((this.hourStep !== 1 && beginHour % this.hourStep !== 1) || targetMinute >= 60) {
targetHour = beginHour + (beginHour % this.hourStep) + 1;
targetMinute = 0;
}

this.setTime(targetHour, targetMinute);
}

this.setDisabledHours();
this.setDisabledMinutes(this.hour);

Expand Down
2 changes: 1 addition & 1 deletion test/timepicker/timepicker.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ describe('Set selectable range', function() {
timepickerNoMeridiem.setRange(start);

expect(timepickerNoMeridiem.getHour()).toBe(10);
expect(timepickerNoMeridiem.getMinute()).toBe(35);
expect(timepickerNoMeridiem.getMinute()).toBe(36);
});

it('should not reset time if the time which is begin of range is earlier than set time', function() {
Expand Down