import { Component, Input, Output, OnInit, AfterViewInit, HostListener, AfterContentChecked, AfterViewChecked, ElementRef, EventEmitter } from '@angular/core';
import $ from 'jquery';
import 'fullcalendar';
import { Options } from 'fullcalendar';
import { ButtonClickModel } from './models/buttonClickModel';
import { UpdateEventModel } from './models/updateEventModel';
@Component({
selector: 'ng-fullcalendar',
template: '
',
})
export class CalendarComponent implements OnInit, AfterViewInit, AfterContentChecked, AfterViewChecked {
@Input() options: Options;
@Output() eventDrop = new EventEmitter();
@Output() eventResize = new EventEmitter();
@Output() eventClick = new EventEmitter();
@Output() clickButton = new EventEmitter();
@Output() windowResize = new EventEmitter();
@Output() viewRender = new EventEmitter();
@Output() viewDestroy = new EventEmitter();
@Output() select = new EventEmitter();
text: string;
calendarInitiated: boolean;
constructor(private element: ElementRef) {
}
ngOnInit(): void {
}
ngAfterViewInit() {
setTimeout(() => {
this.updaterOptions();
$('ng-fullcalendar').fullCalendar(this.options);
// Click listeners
let elem = document.getElementsByTagName('ng-fullcalendar');
$('[class ^="fc"][class *="button"]').click(el => {
let classnames = el.currentTarget.className.split(' ');
classnames.forEach(name => {
if (name.indexOf('button') == name.length - 6) {
name = name.replace(/fc|button|-/g, '');
if (name != '') {
eventDispatch(name);
}
}
});
});
function eventDispatch(buttonType: string) {
let data = $('ng-fullcalendar').fullCalendar('getDate');
let currentDetail: ButtonClickModel = {
buttonType: buttonType,
data: data
};
var widgetEvent = new CustomEvent('clickButton', {
bubbles: true,
detail: currentDetail
});
elem[0].dispatchEvent(widgetEvent);
}
}, 100);
}
ngAfterContentChecked() {
}
ngAfterViewChecked() {
}
updaterOptions() {
let elem = document.getElementsByTagName('ng-fullcalendar');
this.options.eventDrop = function (event, duration) {
let detail: UpdateEventModel = { event: event, duration: duration };
var widgetEvent = new CustomEvent('eventDrop', {
bubbles: true,
detail: detail
});
elem[0].dispatchEvent(widgetEvent);
};
this.options.eventResize = function (event, duration) {
let detail: UpdateEventModel = { event: event, duration: duration };
var widgetEvent = new CustomEvent('eventResize', {
bubbles: true,
detail: detail
});
elem[0].dispatchEvent(widgetEvent);
};
this.options.eventClick = function (event) {
let detail: UpdateEventModel = { event: event, duration: null };
var widgetEvent = new CustomEvent('eventClick', {
bubbles: true,
detail: detail
});
elem[0].dispatchEvent(widgetEvent);
};
this.options.windowResize = function (view) {
let detail = { view: view };
var widgetEvent = new CustomEvent('windowResize', {
bubbles: true,
detail: detail
});
elem[0].dispatchEvent(widgetEvent);
};
this.options.viewRender = function (view, element) {
let detail = { view: view, element: element };
var widgetEvent = new CustomEvent('viewRender', {
bubbles: true,
detail: detail
});
elem[0].dispatchEvent(widgetEvent);
};
this.options.viewDestroy = function (view, element) {
let detail = { view: view, element: element };
var widgetEvent = new CustomEvent('viewDestroy', {
bubbles: true,
detail: detail
});
elem[0].dispatchEvent(widgetEvent);
};
this.options.select = function (start, end, jsEvent, view, resource ) {
let detail = { start:start, end:end, jsEvent:jsEvent, view:view, resource:resource };
var widgetEvent = new CustomEvent('select', {
bubbles: true,
detail: detail
});
elem[0].dispatchEvent(widgetEvent);
};
}
fullCalendar(...args: any[]) {
if (!args) {
return;
}
switch (args.length) {
case 0:
return;
case 1:
return $(this.element.nativeElement).fullCalendar(args[0]);
case 2:
return $(this.element.nativeElement).fullCalendar(args[0], args[1]);
case 3:
return $(this.element.nativeElement).fullCalendar(args[0], args[1], args[2]);
}
}
updateEvent(event: any) {
return $(this.element.nativeElement).fullCalendar('updateEvent', event);
}
clientEvents(idOrFilter: any): any {
return $(this.element.nativeElement).fullCalendar('clientEvents', idOrFilter);
}
}