2012-06-08 13 views
8

Używam tego multidate picker. Czy można korzystać z trybu zakresu dat, w którym nie wybrano weekendów?jquery ui zakres dat wielu próbników bez weekendów

Wykonałem już wiele zadań, w których weekendy są blokowane, a użytkownik może wybrać tylko 5 dni, ale to nie jest mój cel. Chciałbym tej funkcji: gdy użytkownik kliknie na dany termin pięciu dni w przedziale będzie podświetlony bez dni weekendowe ...

Mój kod poniżej:

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

teraz jestem dość blisko mojego własnego rozwiązania :

Liczę wszystkie dni, które muszą być włączone i wszystkie nowe dni, które muszą być wybrane, jeśli jest weekend w zakresie dni.

Dodam nową metodę w multidatepicker.js daysRangeWithoutWeekends, w której liczę wszystkie nowe i wyłączone dni. Następnie używam dwóch pętli foreach, w których wyłączam i włączam nowe daty:

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

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

wartością jest obiekt Date. Pierwsza pętla foreach działa doskonale i usuwa wszystkie wyróżnione weekendy, ale druga pętla nie działa. Zwraca mi błąd:

Empty array of dates received. 

Czy wiesz, dlaczego?

Dla wszystkich nie rozumiesz co moim celem jest: multidatepicker range without weekend

muszę odebrać 5-dniowa w zakresie bez weekendów jeśli kliknięciu na 21.6.2012 Terminy 21,6, 22,6, 25,6, 26,6, 27,6.. . muszą być wybrane.

Z górnym kodem udało mi się usunąć wyróżnioną klasę w weekendy, ale nie wiem dlaczego druga pętla (patrz mój górny kod) nie jest podświetlona 26.6.2012 i 27.6.2012.

+0

gdzie wprowadzasz te pięć dni?> .. czy masz datę początkową i końcową? –

+0

oznacza automatyczną kalibrację daty końcowej z datą początkową i 5 dni z wyłączeniem końca tygodnia? –

+0

Czy możesz umieścić więcej kodu, pokazując w jaki sposób wypełniasz wszystkie_new_daty? – Ateszki

Odpowiedz

0

Po pierwsze nie jest to rozwiązanie ogólne. Nie miałem czasu na ogólne rozwiązanie. Moim rozwiązaniem jest, jeśli musisz wybrać 5 dni w zasięgu bez weekendów.

w jQuery ui.multidatepicker.js w metodzie onSelect (. Ok 81 wiersz) dodaje się:

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); 
     });        
} 

w jQuery ui.multidatepicker.js w metodzie toogleDate przed przypadku "(około 431) rzędu. dniRange 'add:

case 'daysRangeWithoutWeekends': 

w jquery-ui.multidatepicker.js w trybie setMode (cca.473row) przed Case Dodaj 'daysRange':

case 'daysRangeWithoutWeekends': 

kalandra jest init, z:

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

Jeśli ktoś zrobić algorytm generic proszę podzielić go =)

+0

todo: dodaj liczbę dni w górnym kodzie – Gasper

0

Dlaczego nie spróbować tego

methods.addDates.call(obj,all_new_dates); 

zamiast tego

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

Być może wystarczy pętla i modyfikowanie zawartości tablicy?

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

zmiana sprawa daysRange z następującego kodu

przypadek '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

wyłączyć tylko niedziela: dodać w opcji beforeShowDay: noWeekendsOrHolidays

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

jeśli ciebie błąd w konsoli: Błąd: odebrano pustą tablicę dat. w jquery-ui.multidatespicker.js poszukuje "addDates: funkcja (daty, typ)" i dodaje zwrot 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.'); 
      } 
     },