Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to disable specific date range in bootstrap daterangepicker?

I want to disable specific date range in bootstrap daterangepicker.

I need to use bootstrap daterangepicker which provides me the option of restricting the specific date range.

like image 889
php developer Avatar asked Nov 18 '16 05:11

php developer


2 Answers

To disable dates, use datesDisabled method to provide an array.

Some dates are disabled in this CodePen.

$("#picker").datepicker({
    datesDisabled:["11/24/2016","11/28/2016","12/02/2016","12/23/2016"]
});



EDIT

Previous answer was for Bootstap DatePicker...
Sorry for the misreading, my bad.

Here is what I have found for Bootstrap DateRangePicker:

// Define the disabled date array
var disabledArr = ["11/24/2016","11/28/2016","12/02/2016","12/23/2016"];

$("#picker").daterangepicker({

     isInvalidDate: function(arg){
         console.log(arg);

         // Prepare the date comparision
         var thisMonth = arg._d.getMonth()+1;   // Months are 0 based
         if (thisMonth<10){
             thisMonth = "0"+thisMonth; // Leading 0
         }
         var thisDate = arg._d.getDate();
         if (thisDate<10){
             thisDate = "0"+thisDate; // Leading 0
         }
         var thisYear = arg._d.getYear()+1900;   // Years are 1900 based

         var thisCompare = thisMonth +"/"+ thisDate +"/"+ thisYear;
         console.log(thisCompare);

         if($.inArray(thisCompare,disabledArr)!=-1){
             console.log("      ^--------- DATE FOUND HERE");
             return true;
         }
     }

}).focus();

This is working in this CodePen.



EDIT for the bonus question in comments ;)

Above, is to draw the calendar with disabled dates.
Now, what you need is to compare the selected range again, on Apply (when user has selected a range), to disallow a range that would include some disabled dates.

So here is an additional function:

$("#picker").on("apply.daterangepicker",function(e,picker){

    // Get the selected bound dates.
    var startDate = picker.startDate.format('MM/DD/YYYY')
    var endDate = picker.endDate.format('MM/DD/YYYY')
    console.log(startDate+" to "+endDate);

    // Compare the dates again.
    var clearInput = false;
    for(i=0;i<disabledArr.length;i++){
        if(startDate<disabledArr[i] && endDate>disabledArr[i]){
            console.log("Found a disabled Date in selection!");
            clearInput = true;
        }
    }

    // If a disabled date is in between the bounds, clear the range.
    if(clearInput){

        // To clear selected range (on the calendar).
        var today = new Date();
        $(this).data('daterangepicker').setStartDate(today);
        $(this).data('daterangepicker').setEndDate(today);

        // To clear input field and keep calendar opened.
        $(this).val("").focus();
        console.log("Cleared the input field...");

        // Alert user!
        alert("Your range selection includes disabled dates!");
    }
});

See the improved CodePen here.

like image 146
Louys Patrice Bessette Avatar answered Oct 13 '22 09:10

Louys Patrice Bessette


Louys Patrice Bessette's answer is awesome.

I just want to make it more accurate because I found 1 bug that it not alert when you choose start date and end date in different month and disabled date in between them. The reason is here

startDate<disabledArr[i] && endDate>disabledArr[i]

you need to parse to Date Object before comparing or it will be false like this

startDate = new Date(picker.startDate.format('MM/DD/YYYY'))
endDate = new Date(picker.endDate.format('MM/DD/YYYY'))

similar to disabled date in disableArr

Thank you

like image 27
Phu Avatar answered Oct 13 '22 11:10

Phu