salix/modules/agency/front/calendar/index.js

109 lines
2.7 KiB
JavaScript

import ngModule from '../module';
import Section from 'core/lib/section';
import './style.scss';
class Controller extends Section {
constructor($el, $, $t, $http, $state) {
super($el, $, $t, $http, $state);
this.excls = {};
this.resetEvents();
this.ndMonthDate = new Date();
this.ndMonthDate.setMonth(this.ndMonthDate.getMonth() + 1);
}
onSelection($days, $type, $weekday) {
this.emit('selection', {$days, $type, $weekday});
}
resetEvents() {
this.wdays = [];
this.days = {};
this.ranges = [];
}
get events() {
return this._events;
}
set events(value) {
this._events = value;
this.resetEvents();
if (!value) return;
function setWdays(wdays, weekDays) {
let codes = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
if (!weekDays) return [];
weekDays = weekDays.split(',');
for (let wday of weekDays)
wdays[codes.indexOf(wday)] = true;
return wdays;
}
for (let event of value) {
if (event.from && event.to) {
this.ranges.push({
from: new Date(event.from).setHours(0, 0, 0, 0),
to: new Date(event.to).setHours(0, 0, 0, 0),
wdays: setWdays([], event.weekDays)
});
} else if (event.from) {
let day = new Date(event.from).setHours(0, 0, 0, 0);
this.days[day] = true;
} else
setWdays(this.wdays, event.weekDays);
}
this.repaint();
}
get exclusions() {
return this._exclusions;
}
set exclusions(value) {
this._exclusions = value;
this.excls = {};
if (!value) return;
value.forEach(exclusion => {
let day = new Date(exclusion.day).setHours(0, 0, 0, 0);
this.excls[day] = true;
});
this.repaint();
}
hasRange(time, wday) {
let range = this.ranges.find(e => e.from <= time && e.to >= time);
return range && range.wdays[wday];
}
hasEvents(day) {
let time = day.getTime();
let wday = day.getDay();
return this.wdays[wday]
|| this.days[time]
|| this.hasRange(time, wday);
}
getClass(day) {
if (this.excls[day.getTime()])
return 'excluded';
}
repaint() {
this.$.stMonth.repaint();
this.$.ndMonth.repaint();
}
}
ngModule.component('vnZoneCalendar', {
template: require('./index.html'),
controller: Controller,
bindings: {
events: '<?',
exclusions: '<?'
}
});