forked from technikhil314/angular-components
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalendar-component.ts
115 lines (109 loc) · 3.88 KB
/
calendar-component.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
declare var require: any;
var moment = require('moment');
require('moment-range');
@Component({
moduleId: module.id,
selector: 'calendar',
templateUrl: './calendar-component.html'
})
export class CalendarComponent implements OnChanges {
@Input() month: string;
@Input() year: string;
@Input() selectedFromDate: string;
@Input() selectedToDate: string;
@Input() isLeft: boolean;
@Input() format: string;
@Input() minDate: string;
@Input() maxDate: string;
@Input() inactiveBeforeStart: boolean;
get monthText() {
let months = moment.monthsShort()
return months[this.month];
}
@Output() dateChanged = new EventEmitter();
@Output() monthChanged = new EventEmitter();
weekList: any;
getWeekNumbers(monthRange: any) {
let weekNumbers = [];
let indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
monthRange.by('days', function(moment) {
let ref;
if (weekNumbers.length < 6 && (ref = moment.week(), indexOf.call(weekNumbers, ref)) < 0) {
return weekNumbers.push(moment.week());
}
});
return weekNumbers;
}
getWeeksRange(weeks: any, year: any, month: any) {
let weeksRange = [];
for (let i = 0, len = weeks.length; i < len; i++) {
let week = weeks[i];
let firstWeekDay, lastWeekDay;
if (i > 0 && week < weeks[i - 1]) {
firstWeekDay = moment([year, month]).add(1, "year").week(week).day(0);
lastWeekDay = moment([year, month]).add(1, "year").week(week).day(6);
}
else {
firstWeekDay = moment([year, month]).week(week).day(0);
lastWeekDay = moment([year, month]).week(week).day(6);
}
let weekRange = moment.range(firstWeekDay, lastWeekDay);
weeksRange.push(weekRange);
}
return weeksRange;
}
createCalendarGridData(): void {
let year = this.year;
let month = this.month;
let startDate = moment([year, month]);
let firstDay = moment(startDate).startOf('month');
let endDay = moment(startDate).add(60, 'd');
let monthRange = moment.range(firstDay, endDay);
let weeksRange = [];
weeksRange = this.getWeeksRange(this.getWeekNumbers(monthRange), year, month);
let weekList = [];
weeksRange.map(function(week) {
let daysList = [];
week.by('days', function(day) {
daysList.push(day);
});
weekList.push(daysList);
});
this.weekList = weekList;
}
ngOnChanges(changes: SimpleChanges): void {
this.createCalendarGridData();
}
isDisabled(day) {
if (day.isBefore(moment(this.minDate, this.format)) || day.isAfter(moment(this.maxDate, this.format))) {
return true;
}
}
isDateAvailable(day){
if(day.get('month') !== this.month) {
return false;
}
if (this.inactiveBeforeStart && !this.isLeft && day.isBefore(this.selectedFromDate)) {
return false;
}
return true;
}
isSelectedDate(day) {
if (day.get('month') === this.month && day.isSameOrAfter(this.selectedFromDate, 'date') && day.isSameOrBefore(this.selectedToDate, 'date')) {
return true;
}
}
dateSelected(day) {
this.dateChanged.emit({
day: day,
isLeft: this.isLeft
});
}
monthSelected(value) {
this.monthChanged.emit({
value: value,
isLeft: this.isLeft
})
}
}