Date range selector example given in the official documentation of JQuery UI datepicker is not that handy, so I have modified it a bit and have designed the same which is more intuitive. You can have a look at this demo HTML of the range picker is simple, I have created two text field separated by a hyphen.
<div align="center"> <div class="date-range"><input id="start_date" class="datepicker" name="start_date" readonly="readonly" type="text" data-should_refresh="end_date" data-type="minDate" /> <div class="saperator">-</div> <input id="end_date" class="datepicker" name="end_date" readonly="readonly" type="text" data-should_refresh="start_date" data-type="maxDate" /> </div> </div>
Add CSS to make it look better
.datepicker { width: 80px; border: 0; } .date-range { padding: 0 0 0 5px; display: inline-block; border: 1px solid silver; } .date-range div { display: inline-block; } .highlightRange a { background: #7D93A8 !important; color: white !important; }
Now, finally the JS. There are 3 main functions in the JS class below:
- setDatePickerDefaults : Which is used to set defaults of the datepicker. I am overriding few callbacks - beforeShow to change the datepicker position; beforeShowDay which is highlighting the date range selected by calling highlightDays method; onSelect which is refreshing the datepicker to set the maxDate and minDate; onClose which is used to focus the selected date filed.
- bindRangeDatePickers : This method is simply binding the JQuery UI datepicker with the start and end date field.
- highlightDays : This method is adding highlightRange class to the dates in datepicker which are between start_date and end_date.
var DateRangePicker = function() { this.init(); } DateRangePicker.prototype = { init: function() { var today = new Date(); this.end_date = new Date(today.setDate(today.getDate() - 1)); this.start_date = new Date(today.setDate(today.getDate() - 7)); this.setDatePickerDefaults(); this.bindRangeDatePickers(); }, highlightDays: function(date) { if($(this).attr("name").match(/current/)) { if((date <= myDateRangePicker.end_date) && (date >= myDateRangePicker.start_date)) { return [true, "highlightRange"]; } } else { if((date <= myDateRangePicker.end_date) && (date >= myDateRangePicker.start_date)) { return [true, "highlightRange"]; } } return [true, '']; }, setDatePickerDefaults: function() { var that = this; $.datepicker.setDefaults({ dateFormat: "M d, yy", numberOfMonths: 2, showButtonPanel: true, beforeShowDay: that.highlightDays, beforeShow: function(input, inst) { $(this).css("background", "#D5E3ED"); if($(this).attr("name").match(/end/)) { var originalLeft = $(inst.input).position().left; setTimeout(function(){ $('#ui-datepicker-div').css({'left': originalLeft - 94 + 'px'}); }, 1); } }, onSelect: function(dateText) { var datePickerOptions = {}; var selectedDate = $.datepicker.parseDate("M d, yy", dateText); datePickerOptions[$(this).data("type")] = selectedDate; $("#" + $(this).data("should_refresh")).datepicker("destroy"); $("#" + $(this).data("should_refresh")).datepicker(datePickerOptions); $("#" + $(this).data("should_refresh")).datepicker("refresh"); eval("that."+$(this).attr("id") + " = selectedDate"); }, onClose: function(dateText) { var $this = $(this) if($this.data("type") == "minDate") { $("#"+$this.data("should_refresh")).trigger("focus"); } $(this).css("background", "#fffff"); } }); }, bindRangeDatePickers: function() { var that = this; $("#start_date").datepicker({maxDate: that.end_date_current}).val($.datepicker.formatDate("M d, yy", that.start_date)); $("#end_date").datepicker({minDate: that.start_date_current}).val($.datepicker.formatDate("M d, yy", that.end_date)); } } var myDateRangePicker;
Hope this will solve your purpose.