2012-06-08 2 views
8

Я использую это multidate picker. Можно ли использовать режим диапазона дат, где не были выбраны выходные дни?jquery ui multi date picker диапазон данных без выходных

Я уже делал multidatepicker, где выходные дни заблокированы, и где пользователь может выбрать только 5 дней, но это не моя цель. Я хотел бы эту функцию: когда пользователь нажимает на определенную дату, пять дней в пределах будет подсвечен без выходных дней ...

Мой код ниже:

jQuery('#deliverydate').multiDatesPicker({ 
    minDate:0, 
    beforeShowDay: noWeekendsOrHolidays, 
    mode: 'daysRangeWithoutWeekends', 
    autoselectRange: [0,5], 
    numberOfMonths: 2    
}); 

теперь я совсем недалеко от моего собственного решения :

Я считаю, что все дни, которые должны быть активированы, и весь новый день, которые должны быть выбраны, если в выходные дни есть выходные дни.

Я добавляю свой новый метод в multidatepicker.js daysRangeWithoutWeekends, где я считаю все новые и отключенные дни. Затем я использую две петли foreach, где я отключен и включаю новые даты:

$.each(all_removed_dates, function(index, value) { 
    methods.removeDates.call(obj, value); 
}); 

$.each(all_new_dates, function(index, value) { 
    methods.addDates.call(obj,value); 
}); 

Значение - дата объекта. Первый цикл foreach отлично работает и удаляет все выделенные выходные, но второй цикл не работает. Он возвращает мне ошибку:

Empty array of dates received. 

Знаете ли вы, почему?

Для всех вы не понимаете, что моя цель: multidatepicker range without weekend

я должен выбрать 5 день в диапазоне без выходных, если я нажимаю на 21.6.2012 дату 21,6, 22,6, 25,6, 26,6, 27,6.. , должны быть выбраны.

С верхним кодом мне удается удалить выделенный класс по выходным, но не знаю, почему второй цикл (посмотрите мой верхний код) не выделяется 26.6.2012 и 27.6.2012.

+0

, где вы вводите эти пять дней ??> .. у вас есть дата начала и дата окончания? –

+0

do u означает автоматическое календарное окончание даты с датой начала и 5 дней, за исключением концов недели? –

+0

Можете ли вы добавить еще какой-нибудь код, показывая, как вы заполняете all_new_dates, пожалуйста, – Ateszki

ответ

0

Прежде всего это не общее решение. У меня не было времени на общее решение. Мое решение заключается в том, что вы должны выбрать 5 дней в диапазоне без выходных.

в Jquery-ui.multidatepicker.js в onSelect метода (. CCA 81 строка) добавить:

if(this.multiDatesPicker.mode == 'daysRangeWithoutWeekends' && this.multiDatesPicker.dates.picked.length > 0){ 
     var i = 0, 
     last 

     if(this.multiDatesPicker.dates.picked[0].getDay() == 2){ //thusday 
      i = 1 
      //remove sunday 
      all_removed_dates.push(this.multiDatesPicker.dates.picked[4]) 
     } 
     if(this.multiDatesPicker.dates.picked[0].getDay() == 3){//wednesday 
      i = 2 
      //remove sunday and saturday 
      all_removed_dates.push(this.multiDatesPicker.dates.picked[3],      this.multiDatesPicker.dates.picked[4]) 
     } 
     if(this.multiDatesPicker.dates.picked[0].getDay() == 4){ //thursday 
      i=2 
      all_removed_dates.push(this.multiDatesPicker.dates.picked[2], this.multiDatesPicker.dates.picked[3])         
     } 
     if(this.multiDatesPicker.dates.picked[0].getDay() == 5){ //friday 
      i=2 
      all_removed_dates.push(this.multiDatesPicker.dates.picked[1], this.multiDatesPicker.dates.picked[2])         
     } 

     last = this.multiDatesPicker.dates.picked.pop() 
     this.multiDatesPicker.dates.picked.push(last) 

     if(this.multiDatesPicker.dates.picked[0].getDay() == 2){ //thusday 
      //if we have thusday we add 2 day after last day so last day in range was saturday and we add 2 day and we get date for monday 
      var new_date = new Date(last.getFullYear(), last.getMonth(), last.getDate() + 2) 
      all_new_dates.push(new_date) 
     }else{ 
      //if there were sunday and saturday in range we add 2 days to last date in range 
      for(var j = 1; j <= i; j++){ 
       var new_date = new Date(last.getFullYear(), last.getMonth(), last.getDate() + j) 
       all_new_dates.push(new_date) 
      } 
     } 

     var obj = this 
     //remove sunday and saturday 
     $.each(all_removed_dates, function(index, value) { 
      methods.removeDates.call(obj, value); 
     }); 
     //add new days         
     $.each(all_new_dates, function(index, value) { 
      methods.add_new_date.call(obj,value); 
     });        
} 

в Jquery-ui.multidatepicker.js в методе toogleDate до того случая '(CCA 431 строк.) daysRange»добавить:

case 'daysRangeWithoutWeekends': 

в Jquery-ui.multidatepicker.js в SetMode (ОАС.473row) перед случае оного 'daysRange':

case 'daysRangeWithoutWeekends': 

каландр является инициализация с:

jQuery('#deliverydate').multiDatesPicker({ 
    minDate:0, 
    beforeShowDay: noWeekendsOrHolidays, 
    mode: 'daysRangeWithoutWeekends', 
    autoselectRange: [0,5], 
    numberOfMonths: 2    
}); 

Если кто-нибудь сделать общий алгоритм пожалуйста, поделитесь =)

+0

todo: добавить национальные дни в верхнем коде – Gasper

0

Почему бы вам не попробовать этот

methods.addDates.call(obj,all_new_dates); 

вместо этого

$.each(all_new_dates, function(index, value) { 
    methods.addDates.call(obj,value); 
}); 
0

Возможно, будет работать только цикл и изменение содержимого массива?

if (this.multiDatesPicker.mode === 'daysRangeWithoutWeekends' && this.multiDatesPicker.dates.picked.length > 0) { 
    var i = 0, 
     saturdayFound = false, 
     sundayFound = false; 
    for (i = 0; i < this.multiDatesPicker.dates.picked.length; i += 1) { 
     if (this.multiDatesPicker.dates.picked[i].getDay() === 6) { 
      this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(2); //make it Monday 
      saturdayFound = true; 
     } 
     if (this.multiDatesPicker.dates.picked[i].getDay() === 0) { 
      this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(1); //make it Monday 
      sundayFound = true; 
     } 
     if (saturdayFound || sundayFound) { 
      //weekend exists before this element in the array 
      if ((this.multiDatesPicker.dates.picked[i].getDay() > 0) || (this.multiDatesPicker.dates.picked[i].getDay() < 6)) { 
       //weekday found following weekend 
       if (saturdayFound) { 
        this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(1); //add a day to offset for Saturday 
       } 
       if (sundayFound) { 
        this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(1); //add a day to offset for Sunday 
       } 
      } 
     } 
    } 
    all_new_dates = this.multiDatesPicker.dates.picked; 
} 
0

Изменение daysRange случай со следующим кодом

случай 'daysRange':

this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled 
var end = this.multiDatesPicker.autoselectRange[1]; 
var begin = this.multiDatesPicker.autoselectRange[0]; 
if(end < begin) { // switch 
    end = this.multiDatesPicker.autoselectRange[0]; 
    begin = this.multiDatesPicker.autoselectRange[1]; 
} 

var i1=begin; 
var i2=begin; 
while(i1<end){ 
    var tep= new Date(methods.sumDays(date, i2)); 
    if(tep.getDay()!=0 && tep.getDay()!=6){ 
     methods.addDates.call(this, methods.sumDays(date, i2), type); 
     i1++; 
    } 
    i2++; 
} 
0

отключить только воскресные: добавить в опции beforeShowDay: noWeekendsOrHolidays

function noWeekendsOrHolidays(date) { 
    DateRemove = date.getFullYear()+'-'+date.getMonth()+'-'+date.getDate(); 
    if (date.getDay() == 0) { // remove dimanche 
     return [false, '']; 
    } else { 
     return [true, '']; 
    } 
} 

если вы есть ошибка в консоли: Ошибка: пустой массив полученных дат. в jquery-ui.multidatespicker.js ищет «addDates: function (date, type)» и добавьте return true;

addDates : function(dates, type) { 
      if(dates.length > 0) { 
       if(!type) type = 'picked'; 
       switch(typeof dates) { 
        case 'object': 
        case 'array': 
         if(dates.length) { 
          for(var i = 0; i < dates.length; i++) 
           addDate.call(this, dates[i], type, true); 
          sortDates.call(this, type); 
          break; 
         } // else does the same as 'string' 
        case 'string': 
        case 'number': 
         addDate.call(this, dates, type); 
         break; 
        default: 
         $.error('Date format "'+ typeof dates +'" not allowed on jQuery.multiDatesPicker'); 
       } 
       //$(this).datepicker('refresh'); 
      } else { 
       return true; // ADD THIS ONE 
       $.error('Empty array of dates received.'); 
      } 
     }, 
Смежные вопросы