Skip to content
This repository was archived by the owner on Feb 18, 2022. It is now read-only.

Commit 33fb171

Browse files
authored
Merge pull request #264 from fabianoroberto/master
Add option to disable weekdays
2 parents bbc01aa + fce0e87 commit 33fb171

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ date-min-limit="" | String | false | Set a minimum date limit - you can use all
8686
date-max-limit="" | String | false | Set a maximum date limit - you can use all the accepted date formats by the javascript `new Date()`
8787
date-set-hidden="" | String(Boolean) | false | Set the default date to be shown only in calendar and not in the input field
8888
date-disabled-dates="" | String([Date(), Date(), ...]) | false | Disable specific dates using an _Array_ of dates
89+
date-disabled-weekdays="" | String(1, 5, ...]) | false | Disable specific weekdays using an _Array_ of weeks number
8990
date-refocus="" | String(Boolean) | false | Set the datepicker to re-focus the input after selecting a date
9091
date-typer="" | String(Boolean) | false | Set the datepicker to update calendar date when user is typing a date, see validation [tips](#date-validation)
9192
date-week-start-day="" | String(Number) | 0 | Set the first day of the week. Must be an integer between 0 (Sunday) and 6 (Saturday). (e.g. 1 for Monday)

src/js/angular-datepicker.js

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
'<div class="_720kb-datepicker-calendar-header">',
3232
'<div class="_720kb-datepicker-calendar-header-middle _720kb-datepicker-mobile-item _720kb-datepicker-calendar-month">',
3333
'<select ng-model="month" title="{{ dateMonthTitle }}" ng-change="selectedMonthHandle(month)">',
34-
'<option ng-repeat="item in months" ng-selected="item === month" ng-disabled=\'!isSelectableMaxDate($index + 1 + " " + day + ", " + year) || !isSelectableMinDate($index + 1 + " " + day + ", " + year)\' ng-value="$index + 1" value="$index + 1">',
34+
'<option ng-repeat="item in months" ng-selected="item === month" ng-disabled=\'!isSelectableMaxDate(item + " " + day + ", " + year) || !isSelectableMinDate(item + " " + day + ", " + year)\' ng-value="$index + 1" value="$index + 1">',
3535
'{{ item }}',
3636
'</option>',
3737
'</select>',
@@ -110,7 +110,7 @@
110110
'<a href="javascript:void(0)" ng-repeat="px in prevMonthDays" class="_720kb-datepicker-calendar-day _720kb-datepicker-disabled">',
111111
'{{px}}',
112112
'</a>',
113-
'<a href="javascript:void(0)" ng-repeat="item in days" ng-click="setDatepickerDay(item)" ng-class="{\'_720kb-datepicker-active\': selectedDay === item && selectedMonth === monthNumber && selectedYear === year, \'_720kb-datepicker-disabled\': !isSelectableMinDate(year + \'/\' + monthNumber + \'/\' + item ) || !isSelectableMaxDate(year + \'/\' + monthNumber + \'/\' + item) || !isSelectableDate(monthNumber, year, item),\'_720kb-datepicker-today\': item === today.getDate() && monthNumber === (today.getMonth() + 1) && year === today.getFullYear() && !selectedDay}" class="_720kb-datepicker-calendar-day">',
113+
'<a href="javascript:void(0)" ng-repeat="item in days" ng-click="setDatepickerDay(item)" ng-class="{\'_720kb-datepicker-active\': selectedDay === item && selectedMonth === monthNumber && selectedYear === year, \'_720kb-datepicker-disabled\': !isSelectableMinDate(year + \'/\' + monthNumber + \'/\' + item ) || !isSelectableMaxDate(year + \'/\' + monthNumber + \'/\' + item) || !isSelectableDate(monthNumber, year, item) || !isSelectableDay(monthNumber, year, item),\'_720kb-datepicker-today\': item === today.getDate() && monthNumber === (today.getMonth() + 1) && year === today.getFullYear() && !selectedDay}" class="_720kb-datepicker-calendar-day">',
114114
'{{item}}',
115115
'</a>',
116116
'<a href="javascript:void(0)" ng-repeat="nx in nextMonthDays" class="_720kb-datepicker-calendar-day _720kb-datepicker-disabled">',
@@ -157,6 +157,7 @@
157157
//, dateMinLimit
158158
//, dateMaxLimit
159159
, dateDisabledDates = $scope.$eval($scope.dateDisabledDates)
160+
, dateDisabledWeekdays = $scope.$eval($scope.dateDisabledWeekdays)
160161
, date = new Date()
161162
, isMouseOn = false
162163
, isMouseOnInput = false
@@ -477,6 +478,17 @@
477478
if (newValue) {
478479
setInputValue();
479480
}
481+
})
482+
, unregisterDateDisabledDatesWatcher = $scope.$watch('dateDisabledDates', function dateDisabledDatesWatcher(newValue) {
483+
if (newValue) {
484+
dateDisabledDates = $scope.$eval(newValue);
485+
486+
if (!$scope.isSelectableDate($scope.monthNumber, $scope.year, $scope.day)) {
487+
thisInput.val('');
488+
thisInput.triggerHandler('input');
489+
thisInput.triggerHandler('change');//just to be sure;
490+
}
491+
}
480492
});
481493

482494
$scope.nextMonth = function nextMonth() {
@@ -631,7 +643,8 @@
631643

632644
$scope.setDatepickerDay = function setDatepickerDay(day) {
633645

634-
if ($scope.isSelectableDate($scope.monthNumber, $scope.year, day) &&
646+
if ($scope.isSelectableDay($scope.monthNumber, $scope.year, day) &&
647+
$scope.isSelectableDate($scope.monthNumber, $scope.year, day) &&
635648
$scope.isSelectableMaxDate($scope.year + '/' + $scope.monthNumber + '/' + day) &&
636649
$scope.isSelectableMinDate($scope.year + '/' + $scope.monthNumber + '/' + day)) {
637650

@@ -697,7 +710,8 @@
697710
if (date.getFullYear() &&
698711
!isNaN(date.getDay()) &&
699712
!isNaN(date.getMonth()) &&
700-
$scope.isSelectableDate(date) &&
713+
$scope.isSelectableDay(date.getMonth(), date.getFullYear(), date.getDay()) &&
714+
$scope.isSelectableDate(date.getMonth(), date.getFullYear(), date.getDay()) &&
701715
$scope.isSelectableMaxDate(date) &&
702716
$scope.isSelectableMinDate(date)) {
703717

@@ -746,6 +760,20 @@
746760
$scope.paginationYears = theNewYears;
747761
};
748762

763+
$scope.isSelectableDay = function isSelectableDay(monthNumber, year, day) {
764+
var i = 0;
765+
766+
if (dateDisabledWeekdays && dateDisabledWeekdays.length > 0) {
767+
for (i; i <= dateDisabledWeekdays.length; i += 1) {
768+
if (dateDisabledWeekdays[i] === new Date(monthNumber + '/' + day + '/' + year).getDay()) {
769+
return false;
770+
}
771+
}
772+
}
773+
774+
return true;
775+
};
776+
749777
$scope.isSelectableDate = function isSelectableDate(monthNumber, year, day) {
750778
var i = 0;
751779

@@ -944,6 +972,7 @@
944972
unregisterDateMinLimitWatcher();
945973
unregisterDateMaxLimitWatcher();
946974
unregisterDateFormatWatcher();
975+
unregisterDateDisabledDatesWatcher();
947976
thisInput.off('focus click focusout blur');
948977
angular.element(theCalendar).off('mouseenter mouseleave focusin');
949978
angular.element($window).off('click focus focusin', onClickOnWindow);
@@ -961,6 +990,7 @@
961990
'buttonNextTitle': '@',
962991
'buttonPrevTitle': '@',
963992
'dateDisabledDates': '@',
993+
'dateDisabledWeekdays': '@',
964994
'dateSetHidden': '@',
965995
'dateTyper': '@',
966996
'dateWeekStartDay': '@',

0 commit comments

Comments
 (0)