Skip to content

Commit 101ba95

Browse files
committed
Allow direct time input from widget
1 parent 47dbb0f commit 101ba95

File tree

3 files changed

+78
-4
lines changed

3 files changed

+78
-4
lines changed

Diff for: src/jquery-ui-timepicker-addon.css

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
77
.ui-timepicker-div .ui_tpicker_unit_hide{ display: none; }
88

9+
.ui-timepicker-div.ui_tpicker_time.ui_tpicker_time_input { background: none; color: inherit; border: none; outline-style: none; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: grey; width: 100%; }
10+
.ui-timepicker-div.ui_tpicker_time.ui_tpicker_time_input:focus { border-bottom-color: white; }
11+
912
.ui-timepicker-rtl{ direction: rtl; }
1013
.ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; }
1114
.ui-timepicker-rtl dl dt{ float: right; clear: right; }

Diff for: src/jquery-ui-timepicker-addon.js

+21-4
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@
393393
if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) {
394394
var noDisplay = ' ui_tpicker_unit_hide',
395395
html = '<div class="ui-timepicker-div' + (o.isRTL ? ' ui-timepicker-rtl' : '') + (o.oneLine && o.controlType === 'select' ? ' ui-timepicker-oneLine' : '') + '"><dl>' + '<dt class="ui_tpicker_time_label' + ((o.showTime) ? '' : noDisplay) + '">' + o.timeText + '</dt>' +
396-
'<dd class="ui_tpicker_time '+ ((o.showTime) ? '' : noDisplay) + '"></dd>';
396+
'<dd class="ui_tpicker_time '+ ((o.showTime) ? '' : noDisplay) + '"><input class="ui_tpicker_time_input" ' + (o.timeInput ? '' : 'disabled') + '/></dd>';
397397

398398
// Create the markup
399399
for (i = 0, l = this.units.length; i < l; i++) {
@@ -530,7 +530,21 @@
530530
$dp.append($tp);
531531
}
532532

533-
this.$timeObj = $tp.find('.ui_tpicker_time');
533+
this.$timeObj = $tp.find('.ui_tpicker_time_input');
534+
this.$timeObj.change(function () {
535+
var timeFormat = tp_inst.inst.settings.timeFormat;
536+
var parsedTime = $.datepicker.parseTime(timeFormat, this.value);
537+
var update = new Date();
538+
if (parsedTime) {
539+
update.setHours(parsedTime.hour);
540+
update.setMinutes(parsedTime.minute);
541+
update.setSeconds(parsedTime.second);
542+
$.datepicker._setTime(tp_inst.inst, update);
543+
} else {
544+
this.value = tp_inst.formattedTime;
545+
this.blur();
546+
}
547+
})
534548

535549
if (this.inst !== null) {
536550
var timeDefined = this.timeDefined;
@@ -868,12 +882,15 @@
868882
// Updates the time within the timepicker
869883
this.formattedTime = $.datepicker.formatTime(o.timeFormat, this, o);
870884
if (this.$timeObj) {
885+
var sPos = this.$timeObj[0].selectionStart;
886+
var ePos = this.$timeObj[0].selectionEnd;
871887
if (pickerTimeFormat === o.timeFormat) {
872-
this.$timeObj.text(this.formattedTime + pickerTimeSuffix);
888+
this.$timeObj.val(this.formattedTime + pickerTimeSuffix);
873889
}
874890
else {
875-
this.$timeObj.text($.datepicker.formatTime(pickerTimeFormat, this, o) + pickerTimeSuffix);
891+
this.$timeObj.val($.datepicker.formatTime(pickerTimeFormat, this, o) + pickerTimeSuffix);
876892
}
893+
this.$timeObj[0].setSelectionRange(sPos, ePos);
877894
}
878895

879896
this.timeDefined = true;

Diff for: test/jquery-ui-timepicker-addon_spec.js

+54
Original file line numberDiff line numberDiff line change
@@ -696,4 +696,58 @@ describe('datetimepicker', function() {
696696
expect(inputFocusSpy).not.toHaveBeenCalled();
697697
});
698698
});
699+
700+
describe('timeInput', function () {
701+
var $input;
702+
beforeEach(function () {
703+
$input = affix('input');
704+
});
705+
describe('option', function () {
706+
it('just display, input disabled', function () {
707+
$input.datetimepicker();
708+
$input.trigger('focus');
709+
var $timeInput = $('.ui_tpicker_time_input');
710+
expect($timeInput.attr('disabled')).toBe('disabled');
711+
});
712+
713+
it('allow type new time', function () {
714+
$input.datetimepicker({timeInput: true});
715+
$input.trigger('focus');
716+
var $timeInput = $('.ui_tpicker_time_input');
717+
expect($timeInput.attr('disabled')).toBeUndefined();
718+
});
719+
});
720+
721+
describe('behavior', function () {
722+
beforeEach(function () {
723+
$input.datetimepicker({timeInput: true});
724+
$input.trigger('focus');
725+
});
726+
it('should update timepicker time', function () {
727+
var inputTime = '12:34';
728+
var inst = $.datepicker._getInst($input.get(0));
729+
var tp_inst = $.datepicker._get(inst, 'timepicker');
730+
var $timeInput = inst.dpDiv.find('.ui_tpicker_time_input');
731+
732+
$timeInput.val(inputTime).trigger('change');
733+
expect(tp_inst.formattedTime).toEqual(inputTime);
734+
});
735+
it('revert to previous time value if input is invalid', function () {
736+
var invalidTime = '123:456';
737+
var inst = $.datepicker._getInst($input.get(0));
738+
var tp_inst = $.datepicker._get(inst, 'timepicker');
739+
var $timeInput = inst.dpDiv.find('.ui_tpicker_time_input');
740+
741+
var previousTimeString = tp_inst.formattedTime;
742+
$timeInput.val(invalidTime).trigger('change');
743+
expect(tp_inst.formattedTime).toEqual(previousTimeString);
744+
});
745+
});
746+
747+
afterEach(function () {
748+
var $widget = $input.datepicker('widget');
749+
$input.datepicker('destroy');
750+
$widget.remove();
751+
});
752+
});
699753
});

0 commit comments

Comments
 (0)