class Calendar {
/**
* constructor
*/
constructor() {
this.month = new Date().getMonth()+1;
console.log('init: month: ' + this.month);
this.year = new Date().getFullYear();
}
set month(month) {
this._month = month;
}
get month() {
return this._month;
}
get monthName() {
var monthReturn = '';
switch (this._month) {
case 1:
monthReturn = 'Januar';
break;
case 2:
monthReturn = 'Februar';
break;
case 3:
monthReturn = 'März';
break;
case 4:
monthReturn = 'April';
break;
case 5:
monthReturn = 'Mai';
break;
case 6:
monthReturn = 'Juni';
break;
case 7:
monthReturn = 'Juli';
break;
case 8:
monthReturn = 'August';
break;
case 9:
monthReturn = 'September';
break;
case 10:
monthReturn = 'Oktober';
break;
case 11:
monthReturn = 'November';
break;
case 12:
monthReturn = 'Dezember';
break;
}
return monthReturn;
}
getGridFor() {
var month = this.month;
var year = this.year;
var html = '';
// get number of days in month
var daysInMonth = this.getDaysInMonth(month, year);
// get number of days in last month
var lastMonth = month - 1;
var lastYear = year;
if (lastMonth < 1) {
lastMonth = 12;
lastYear = year - 1;
}
var daysInLastMonth = this.getDaysInMonth(lastMonth, lastYear);
console.log('days in last month: ' + daysInLastMonth);
// get weekday of first day in month
var weekDayStart = this.getWeekdayMonthStartsWith(month, year);
console.log('weekDayStart: ' + weekDayStart);
// render preleading days of last month
if (weekDayStart > 1) {
var startOffsetDays = weekDayStart - 1;
var i;
for (i = 0; i < startOffsetDays; i++) {
html += ' <div class="day day--disabled">' + (daysInLastMonth - i) + '</div>';
}
}
// render days of month
var i;
for (i = 1; i <= daysInMonth; i++) {
html += '<div class="day">' + i + '</div>'
}
// get weekday of first day in month
var weekDayEnd = this.getWeekdayMonthEndsWith(month, year);
// render trailing days of following month
if (weekDayEnd < 7) {
var endOffsetDays = 7 - weekDayEnd;
var i;
for (i = 0; i < endOffsetDays; i++) {
html += ' <div class="day day--disabled">' + (i+1) + '</div>';
}
}
return html;
}
addEntry(title, col, row) {
var html = '<section class="task task--danger" style="grid-column: ' + col + ' / span 1; grid-row: ' + row + ';">' + title + '</section>';
return html;
}
/**
* Returns number of days of month in year
*/
getDaysInMonth() {
return new Date(this.year, this.month, 0).getDate();
}
/**
* Returns weekday a month starts with
*/
getWeekdayMonthStartsWith() {
var day = new Date(this.year + "-" + this.month + "-01").getDay();
if (day === 0) day = 7;
return day;
}
getWeekdayMonthEndsWith() {
var day = new Date(this.year + "-" + this.month + "-" + this.getDaysInMonth(this.month, this.year)).getDay();
return day;
}
getDaysInLastMonth() {
return this.getWeekdayMonthStartsWith() - 1;
}
/**
* returns row in calendar for day
* @param {integer} day
*/
getRowForDay(day) {
if (typeof day === 'string') {
day = parseInt(day);
}
var base = day + this.getDaysInLastMonth();
var rowFloat = base / 7;
var row = 0;
if (rowFloat <= 1) {
row = 1;
} else if (rowFloat <= 2) {
row = 2;
} else if (rowFloat <= 3) {
row = 3;
} else if (rowFloat <= 4) {
row = 4;
} else if (rowFloat <= 5) {
row = 5;
} else if (rowFloat <= 6) {
row = 6;
} else if (rowFloat <= 7) {
row = 7;
}
return row;
}
/**
* Returns column for given day in month
* @param {integer} day
*/
getColumnForDay(day) {
if (typeof day === 'string') {
day = parseInt(day);
}
var column = 1;
var endCol1 = 7 - this.getDaysInLastMonth();
var endCol2 = (7*2) - this.getDaysInLastMonth();
var endCol3 = (7*3) - this.getDaysInLastMonth();
var endCol4 = (7*4) - this.getDaysInLastMonth();
var endCol5 = (7*5) - this.getDaysInLastMonth();
if (day <= endCol1) {
column = 7-(endCol1 - day);
} else if (day <= endCol2) {
column = 7-(endCol2 - day);
} else if (day <= endCol3) {
column = 7-(endCol3 - day);
} else if (day <= endCol4) {
column = 7-(endCol4 - day);
} else if (day <= endCol5) {
column = 7-(endCol5 - day);
}
return column;
}
}
module.exports = Calendar;