import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
declare var require: any;
var moment = require('moment');
require('moment-range');
@Component({
selector: 'calendar',
template: `
Su |
Mo |
Tu |
We |
Th |
Fr |
Sa |
{{ day.format('D') }}
|
`
})
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;
@Input() disableBeforeStart: boolean;
@Input() timePicker: any;
@Input() singleCalendar: boolean = false;
get monthText() {
let months = moment.monthsShort()
return months[this.month];
}
@Output() dateChanged = new EventEmitter();
@Output() monthChanged = new EventEmitter();
@Output() yearChanged = 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 = [];
let that = this;
weeksRange = this.getWeeksRange(this.getWeekNumbers(monthRange), year, month);
let weekList = [];
weeksRange.map(function(week) {
let daysList = [];
week.by('days', function(day) {
if (day.isSame(moment(that.minDate, that.format), 'date')) {
day = moment(that.minDate, that.format);
};
if (day.isSame(moment(that.maxDate, that.format), 'date')) {
day = moment(that.maxDate, that.format);
};
daysList.push(day);
});
weekList.push(daysList);
});
this.weekList = weekList;
}
ngOnChanges(changes: SimpleChanges): void {
this.createCalendarGridData();
}
isDisabled(day) {
return (day.isBefore(moment(this.minDate, this.format)) || day.isAfter(moment(this.maxDate, this.format))) || (day.isBefore(moment(this.selectedFromDate, this.format)) && this.disableBeforeStart && !this.isLeft)
}
isDateAvailable(day) {
if (day.get('month') !== this.month) {
return false;
}
if (this.inactiveBeforeStart && day.isBefore(this.selectedFromDate, 'date')) {
return false;
}
return true;
}
isSelectedDate(day) {
if (day.get('month') === this.month && day.isSame(this.selectedFromDate, 'date')) {
return true;
}
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
})
}
yearSelected(value) {
this.yearChanged.emit({
value: value,
isLeft: this.isLeft
})
}
}