まず第一に、これは一般的な解決策ではありません。一般的な解決策を考える時間がありませんでした。私の解決策は、週末のない範囲で 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':
ケース「daysRange」の前に、jquery-ui.multidatepicker.js の setMode(cca. 473row) に次を追加します。
case 'daysRangeWithoutWeekends':
カレンダーは次のように初期化されます:
jQuery('#deliverydate').multiDatesPicker({
minDate:0,
beforeShowDay: noWeekendsOrHolidays,
mode: 'daysRangeWithoutWeekends',
autoselectRange: [0,5],
numberOfMonths: 2
});
誰かが一般的なアルゴリズムを作ったら、それを共有してください =)