import { Component, Input, ElementRef, Output, EventEmitter, OnInit, OnChanges, AfterViewInit } from '@angular/core'; import { RdComponent } from '../../base/rdComponent'; import { AppComponent } from '../../app.component'; import { RdLib } from '../../base/rdLib'; import { ScriptLoaderService } from '../../library/script-loader.service'; import { StyleLoaderService } from '../../library/style-loader.service'; import { CalendarEventModal } from './calendarEventModal'; /** * Sample Events { title: "Meeting", allDay: true/false, start: "2018-11-27T10:00:00", end: "2018-11-27T11:00:00", url: "http://google.com.tr", className: "m-fc-event--accent m-fc-event--solid-danger" } */ export type EventModes = "update" | "create"; export interface ICalenderEventItem { _id: any; title: string; description: string; allDay?: boolean; start: any; end: any; url?: string; className: string; } declare const moment; @Component({ selector: 'rd-calendar', template: `
` }) export class Calendar extends RdComponent implements OnInit, OnChanges, AfterViewInit { constructor( private element: ElementRef, private script: ScriptLoaderService, private style: StyleLoaderService) { super(); this.style.load(["./assets/css/fullcalendar.bundle.css"]); this.script.load([ "./assets/js/fullcalendar.bundle.js", "./assets/js/fullcalendar.locale.tr.js", "./assets/js/moment.min.js", "./assets/js/moment-tr.js", ]) } @Input("rd-events") events: Array = []; @Output("rd-change") changeEvent: EventEmitter = new EventEmitter(); container; calendarText: string = RdLib.localization.translateEn("Calendar"); iconText: string = RdLib.localization.translateEn("Add Event"); ngOnInit() { for (let item of this.events) { this.setClasses(item); this.setMomentDate(item); } } ngOnChanges(changes) { if (!this.container) return; if (changes.events) this.container.fullCalendar("updateEvents", this.events); } ngAfterViewInit() { this.container = this.jQuery(this.element.nativeElement).find('#calendar'); this.container.fullCalendar({ firstDay: 1, // Monday locale: AppComponent.user.language, header: { left: "prev, next, today", center: "title", right: "month, agendaWeek, agendaDay, listWeek" }, height: "10rem", editable: true, eventLimit: true, navLinks: true, events: this.events, dayClick: (date) => this.container.fullCalendar("changeView", "agendaDay", date), eventClick: (e) => { if (!e.url) this.openEventPopup(e); }, eventDrop: (e, dateChanges) => { this.changeEvent.emit(this.container.fullCalendar("clientEvents")); }, eventResize: (e, dateChanges) => { this.changeEvent.emit(this.container.fullCalendar("clientEvents")); } }); } setMomentDate(item) { let sDate = moment(RdLib.typeOperations.longToDate(item.start)); let eDate = moment(RdLib.typeOperations.longToDate(item.end)); if (item.allDay) { item.start = sDate.format("YYYY-MM-DD"); if (item.end) item.end = eDate.format("YYYY-MM-DD"); } else { item.start = sDate.format("YYYY-MM-DD") + 'T' + sDate.format("HH:mm"); item.end = eDate.format("YYYY-MM-DD") + 'T' + eDate.format("HH:mm"); } } setClasses(item: ICalenderEventItem) { let random = Math.floor(Math.random() * this.dotClasses.length); if (!item._id) item.className = this.dotClasses[random] + ' ' + this.bgClasses[random]; } openEventPopup(event?) { CalendarEventModal.open() .onLoad(controller => { controller.event = event ? event : {}; controller.mode = event ? "update" : "create"; }) .onDismiss((e: ICalenderEventItem) => { if (e) { this.setClasses(e); this.setMomentDate(e); if (e._id) this.container.fullCalendar("updateEvent", e); else this.container.fullCalendar("addEventSource", [e]); } else this.container.fullCalendar("removeEvents", [event._id]); this.changeEvent.emit(this.container.fullCalendar("clientEvents")); }); } bgClasses = [ "m-fc-event--solid-info", "m-fc-event--solid-focus", "m-fc-event--solid-warning", "m-fc-event--solid-danger", "m-fc-event--solid-primary", "m-fc-event--solid-accent" ]; dotClasses = [ "m-fc-event--danger", "m-fc-event--warning", "m-fc-event--info", "m-fc-event--primary", "m-fc-event--accent", "m-fc-event--metal" ]; }