webhandle-calendar
Version:
Calendar tools for node webhandle
125 lines (104 loc) • 2.99 kB
JavaScript
const Event = require('./event')
const eventStartCompare = require('../utils/event-start-compare')
const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
const monthNamesShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
const dayNamesAbr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
const shortDayNames = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
class MonthGrid {
constructor(options) {
options = options || {}
this.events = []
this.monthNum = options.monthNum || 0
this.year = options.year || 2018
this.dayNames = dayNames
this.shortDayNames = shortDayNames
this.monthNames = monthNames
this.monthNamesShort = monthNamesShort
this.dayNamesAbr = dayNamesAbr
}
addEvent(event) {
if(event instanceof Event == false) {
event = new Event(event)
}
this.events.push(event)
this.events.sort(eventStartCompare)
}
getMonthName() {
return monthNames[this.monthNum]
}
getNextMonthName() {
return monthNames[this.monthNum + 1 > 11 ? 0 : this.monthNum + 1]
}
getPreviousMonthName() {
return monthNames[this.monthNum - 1 < 0 ? 11 : this.monthNum - 1]
}
getNextMonthStartDay() {
let mon = this.monthNum + 2
let y = this.year
if(mon > 12) {
mon = 1
y++
}
return '' + y + '-' + mon + '-01'
}
getPreviousMonthStartDay() {
let mon = this.monthNum
let y = this.year
if(mon < 1) {
mon = 12
y--
}
return '' + y + '-' + mon + '-01'
}
createBoxes() {
let dayCount = new Date(this.year, this.monthNum + 1, 0).getDate()
let curMonth = []
let today = new Date()
for(let i = 1; i <= dayCount; i++) {
curMonth.push({
date: i,
month: this.monthNum,
year: this.year,
dateString: `${this.year}-${this.monthNum + 1}-${i}`,
events: [],
markers: i < today.getDate() ? 'occurred' : 'forthcoming'
})
}
let gridDays = []
let lastMonthMaxDate = new Date(this.year, this.monthNum, 0).getDate()
for(let i = new Date(this.year, this.monthNum, 1).getDay(); i > 0; i--) {
gridDays.unshift({
date: lastMonthMaxDate--,
events: [],
markers: 'non-cur-month'
})
}
this.events.forEach(event => {
let eventMonth = event.start.getMonth()
event.month = eventMonth
if(eventMonth == this.monthNum) {
curMonth[event.start.getDate() - 1].events.push(event)
}
})
gridDays.push(...curMonth)
let nextMonthDate = 1
for(let i = 6 - new Date(this.year, this.monthNum + 1, 0).getDay(); i > 0; i--) {
gridDays.push({
date: nextMonthDate++,
events: [],
markers: 'non-cur-month'
})
}
gridDays.forEach(day => {
if(day.events.length > 0) {
day.markers += ' has-events'
}
else {
day.markers += ' no-events'
}
})
return gridDays
}
}
module.exports = MonthGrid