@@ -28,11 +28,33 @@ angular.module("materialCalendar").service("materialCalendar.Calendar", [functio
28
28
return this . weekStartsOn ;
29
29
} ;
30
30
31
+ this . setStartDateOfMonth = function ( i ) {
32
+ var d = parseInt ( i || 1 , 10 ) ;
33
+ if ( ! isNaN ( d ) && d >= 1 && d <= 31 ) {
34
+ this . startDateOfMonth = d ;
35
+ } else {
36
+ this . startDateOfMonth = 1 ;
37
+ }
38
+ return this . startDateOfMonth ;
39
+ } ;
40
+
41
+ this . setNoOfDays = function ( i ) {
42
+ var d = parseInt ( i || 0 , 10 ) ;
43
+ if ( ! isNaN ( d ) && d > 0 ) {
44
+ this . noOfDays = d ;
45
+ } else {
46
+ this . noOfDays = 0 ;
47
+ }
48
+ return this . noOfDays ;
49
+ } ;
50
+
31
51
this . options = angular . isObject ( options ) ? options : { } ;
32
52
this . year = now . getFullYear ( ) ;
33
53
this . month = now . getMonth ( ) ;
34
54
this . weeks = [ ] ;
35
55
this . weekStartsOn = this . setWeekStartsOn ( this . options . weekStartsOn ) ;
56
+ this . startDateOfMonth = this . setStartDateOfMonth ( this . options . startDateOfMonth ) ;
57
+ this . noOfDays = this . setNoOfDays ( this . options . noOfDays ) ;
36
58
37
59
this . next = function ( ) {
38
60
if ( this . start . getMonth ( ) < 11 ) {
@@ -68,11 +90,30 @@ angular.module("materialCalendar").service("materialCalendar.Calendar", [functio
68
90
}
69
91
70
92
// First day of calendar month.
71
- this . start = new Date ( this . year , this . month , 1 ) ;
93
+ if ( angular . isDefined ( this . options . startDateOfMonth ) ) {
94
+ this . start = new Date ( this . year , this . month , this . startDateOfMonth ) ;
95
+ } else {
96
+ this . start = new Date ( this . year , this . month , 1 ) ;
97
+ }
98
+
72
99
var date = angular . copy ( this . start ) ;
73
- while ( date . getDay ( ) !== this . weekStartsOn ) {
74
- date . setDate ( date . getDate ( ) - 1 ) ;
75
- monthLength ++ ;
100
+ if ( date . getDate ( ) === 1 ) {
101
+ while ( date . getDay ( ) !== this . weekStartsOn ) {
102
+ date . setDate ( date . getDate ( ) - 1 ) ;
103
+ monthLength ++ ;
104
+ }
105
+ }
106
+
107
+ if ( this . noOfDays !== 0 ) {
108
+ while ( this . noOfDays % 7 !== 0 ) {
109
+ this . noOfDays ++ ;
110
+ }
111
+ monthLength = this . noOfDays ;
112
+ } else {
113
+ // Last day of calendar month.
114
+ while ( monthLength % 7 !== 0 ) {
115
+ monthLength ++ ;
116
+ }
76
117
}
77
118
78
119
// Last day of calendar month.
@@ -125,7 +166,7 @@ angular.module("materialCalendar").service("MaterialCalendarData", [function ()
125
166
126
167
angular . module ( "materialCalendar" ) . directive ( "calendarMd" , [ "$compile" , "$parse" , "$templateRequest" , "$q" , "materialCalendar.Calendar" , "MaterialCalendarData" , function ( $compile , $parse , $templateRequest , $q , Calendar , CalendarData ) {
127
168
128
- var defaultTemplate = "<md-content layout='column' layout-fill md-swipe-left='next()' md-swipe-right='prev()'><md-toolbar><div class='md-toolbar-tools' layout='row'><md-button class='md-icon-button' ng-click='prev()' aria-label='Previous month'><md-tooltip ng-if='::tooltips()'>Previous month</md-tooltip>«</md-button><div flex></div><h2 class='calendar-md-title'><span>{{ calendar.start | date:titleFormat:timezone }}</span></h2><div flex></div><md-button class='md-icon-button' ng-click='next()' aria-label='Next month'><md-tooltip ng-if='::tooltips()'>Next month</md-tooltip>»</md-button></div></md-toolbar><!-- agenda view --><md-content ng-if='weekLayout === columnWeekLayout' class='agenda'><div ng-repeat='week in calendar.weeks track by $index'><div ng-if='sameMonth(day)' ng-class='{"disabled" : isDisabled(day), active: active === day, currentDayHighlight : isCurrentDay(day) }' ng-click='handleDayClick(day)' ng-repeat='day in week' layout><md-tooltip ng-if='::tooltips()'>{{ day | date:dayTooltipFormat:timezone }}</md-tooltip><div>{{ day | date:dayFormat:timezone }}</div><div flex ng-bind-html='dataService.data[dayKey(day)]'></div></div></div></md-content><!-- calendar view --><md-content ng-if='weekLayout !== columnWeekLayout' flex layout='column' class='calendar'><div layout='row' class='subheader'><div layout-padding class='subheader-day' flex ng-repeat='day in calendar.weeks[0]'><md-tooltip ng-if='::tooltips()'>{{ day | date:dayLabelTooltipFormat }}</md-tooltip>{{ day | date:dayLabelFormat }}</div></div><div ng-if='week.length' ng-repeat='week in calendar.weeks track by $index' flex layout='row'><div tabindex='{{ sameMonth(day) ? (day | date:dayFormat:timezone) : 0 }}' ng-repeat='day in week track by $index' ng-click='handleDayClick(day)' flex layout layout-padding ng-class='{"disabled" : isDisabled(day), "active": isActive(day), "md-whiteframe-12dp": hover || focus }' ng-focus='focus = true;' ng-blur='focus = false;' ng-mouseleave='hover = false' ng-mouseenter='hover = true'><md-tooltip ng-if='::tooltips()'>{{ day | date:dayTooltipFormat }}</md-tooltip><div>{{ day | date:dayFormat }}</div><div flex ng-bind-html='dataService.data[dayKey(day)]'></div></div></div></md-content></md-content>" ;
169
+ var defaultTemplate = "<md-content layout='column' layout-fill md-swipe-left='next()' md-swipe-right='prev()'><md-toolbar><div class='md-toolbar-tools' layout='row'><md-button class='md-icon-button' ng-click='prev()' aria-label='Previous month'><md-tooltip ng-if='::tooltips()'>Previous month</md-tooltip>«</md-button><div flex></div><h2 class='calendar-md-title'><span>{{ calendar.start | date:titleFormat:timezone }}</span></h2><div flex></div><md-button class='md-icon-button' ng-click='next()' aria-label='Next month'><md-tooltip ng-if='::tooltips()'>Next month</md-tooltip>»</md-button></div></md-toolbar><!-- agenda view --><md-content ng-if='weekLayout === columnWeekLayout' class='agenda'><div ng-repeat='week in calendar.weeks track by $index'><div ng-if='sameMonth(day)' ng-class='{"disabled" : isDisabled(day,startDateOfMonth,noOfDays), active: active === day, currentDayHighlight : isCurrentDay(day) }' ng-click='handleDayClick(day)' ng-repeat='day in week' layout><md-tooltip ng-if='::tooltips()'>{{ day | date:dayTooltipFormat:timezone }}</md-tooltip><div>{{ day | date:dayFormat:timezone }}</div><div flex ng-bind-html='dataService.data[dayKey(day)]'></div></div></div></md-content><!-- calendar view --><md-content ng-if='weekLayout !== columnWeekLayout' flex layout='column' class='calendar'><div layout='row' class='subheader'><div layout-padding class='subheader-day' flex ng-repeat='day in calendar.weeks[0]'><md-tooltip ng-if='::tooltips()'>{{ day | date:dayLabelTooltipFormat }}</md-tooltip>{{ day | date:dayLabelFormat }}</div></div><div ng-if='week.length' ng-repeat='week in calendar.weeks track by $index' flex layout='row'><div tabindex='{{ sameMonth(day) ? (day | date:dayFormat:timezone) : 0 }}' ng-repeat='day in week track by $index' ng-click='handleDayClick(day)' flex layout layout-padding ng-class='{"disabled" : isDisabled(day,startDateOfMonth,noOfDays), "active": isActive(day), "md-whiteframe-12dp": hover || focus }' ng-focus='focus = true;' ng-blur='focus = false;' ng-mouseleave='hover = false' ng-mouseenter='hover = true'><md-tooltip ng-if='::tooltips()'>{{ day | date:dayTooltipFormat }}</md-tooltip><div>{{ day | date:dayFormat }}</div><div flex ng-bind-html='dataService.data[dayKey(day)]'></div></div></div></md-content></md-content>" ;
129
170
130
171
var injectCss = function ( ) {
131
172
var styleId = "calendarMdCss" ;
@@ -158,6 +199,8 @@ angular.module("materialCalendar").directive("calendarMd", ["$compile", "$parse"
158
199
dayTooltipFormat : "=?" ,
159
200
weekStartsOn : "=?" ,
160
201
tooltips : "&?" ,
202
+ startDateOfMonth : "=?" ,
203
+ noOfDays : "=?" ,
161
204
clearDataCacheOnLoad : "=?" ,
162
205
disableFutureSelection : "=?"
163
206
} ,
@@ -203,7 +246,8 @@ angular.module("materialCalendar").directive("calendarMd", ["$compile", "$parse"
203
246
d . getMonth ( ) === $scope . calendar . month ;
204
247
} ;
205
248
206
- $scope . isDisabled = function ( date ) {
249
+ $scope . isDisabled = function ( date , startDateOfMonth , noOfDays ) {
250
+ if ( noOfDays != 0 && date . getDate ( ) >= ( startDateOfMonth + noOfDays ) ) { return true ; }
207
251
if ( $scope . disableFutureSelection && date > new Date ( ) ) { return true ; }
208
252
return ! $scope . sameMonth ( date ) ;
209
253
} ;
@@ -314,7 +358,9 @@ angular.module("materialCalendar").directive("calendarMd", ["$compile", "$parse"
314
358
var init = function ( ) {
315
359
316
360
$scope . calendar = new Calendar ( year , month , {
317
- weekStartsOn : $scope . weekStartsOn || 0
361
+ weekStartsOn : $scope . weekStartsOn || 0 ,
362
+ startDateOfMonth : $scope . startDateOfMonth || 1 ,
363
+ noOfDays : $scope . noOfDays || 0
318
364
} ) ;
319
365
320
366
// Allows fetching of dynamic templates via $templateCache.
@@ -378,7 +424,7 @@ angular.module("materialCalendar").directive("calendarMd", ["$compile", "$parse"
378
424
} ) ;
379
425
} ;
380
426
381
- $scope . $watch ( "weekStartsOn" , init ) ;
427
+ $scope . $watchGroup ( [ "weekStartsOn" , "startDateOfMonth" , "noOfDays" ] , init ) ;
382
428
bootstrap ( ) ;
383
429
384
430
// These are for tests, don't remove them..
0 commit comments