import { Component, OnInit} from '@angular/core'; import { CalendarEvent, CalendarEventAction, CalendarEventTimesChangedEvent, CalendarView, } from 'angular-calendar'; import { startOfDay, endOfDay, subDays, addDays, endOfMonth, isSameDay, isSameMonth, addHours, } from 'date-fns'; import { Subject } from 'rxjs'; const colors: any = { red: { primary: '#705ec8', secondary: '#6958be', }, blue: { primary: '#5a66f1', secondary: '#dee0fc', }, yellow: { primary: '#ffab00', secondary: '#f3a403', }, }; @Component({ selector: 'app-calender', templateUrl: './calender.component.html', styleUrls: ['./calender.component.scss'] }) export class CalenderComponent implements OnInit { constructor() {} ngOnInit(): void { } CalendarView = CalendarView; view: CalendarView = CalendarView.Month; viewDate: Date = new Date(); actions: CalendarEventAction[] = [ { label: '<i class="fas fa-fw fa-pencil-alt"></i>', a11yLabel: 'Edit', onClick: ({ event }: { event: CalendarEvent }): void => { this.handleEvent('Edited', event); }, }, { label: '<i class="fas fa-fw fa-trash-alt"></i>', a11yLabel: 'Delete', onClick: ({ event }: { event: CalendarEvent }): void => { this.events = this.events.filter((iEvent) => iEvent !== event); this.handleEvent('Deleted', event); }, }, ]; refresh: Subject<any> = new Subject(); events: CalendarEvent[] = [ { start: subDays(startOfDay(new Date()), 1), end: addDays(new Date(), 1), title: 'A 3 day event', color: colors.red, actions: this.actions, allDay: true, draggable: true, }, { start: startOfDay(new Date()), end: new Date(), title: 'An event with no end date', color: colors.yellow, actions: this.actions, draggable: true, }, { start: subDays(endOfMonth(new Date()), 3), end: addDays(endOfMonth(new Date()), 3), title: 'A long event that spans 2 months', color: colors.blue, allDay: true, draggable: true, }, { start: addHours(startOfDay(new Date()), 2), end: addHours(new Date(), 2), title: 'A draggable and resizable event', color: colors.blue, actions: this.actions, draggable: true, }, ]; activeDayIsOpen = false; dayClicked({ date, events }: { date: Date; events: CalendarEvent[] }): void { if (isSameMonth(date, this.viewDate)) { if ( (isSameDay(this.viewDate, date) && this.activeDayIsOpen === true) || events.length === 0 ) { this.activeDayIsOpen = false; } else { this.activeDayIsOpen = true; } this.viewDate = date; } } eventTimesChanged({ event, newStart, newEnd, }: CalendarEventTimesChangedEvent): void { this.events = this.events.map((iEvent) => { if (iEvent === event) { return { ...event, start: newStart, end: newEnd, }; } return iEvent; }); this.handleEvent('Dropped or resized', event); } handleEvent(action: string, event: CalendarEvent): void {} newEvent!: CalendarEvent; addEvent(): void { this.newEvent = { title: 'New event', start: startOfDay(new Date()), end: endOfDay(new Date()), color: colors.red, draggable: true, actions: this.actions, }; this.events.push(this.newEvent); this.handleEvent('Add new event', this.newEvent); this.refresh.next; } eventDropped({ event, newStart, newEnd, allDay, }: CalendarEventTimesChangedEvent): void { const externalIndex = this.events.indexOf(event); if (typeof allDay !== 'undefined') { event.allDay = allDay; } if (externalIndex > -1) { this.events.splice(externalIndex, 1); this.events.push(event); } event.start = newStart; if (newEnd) { event.end = newEnd; } if (this.view === 'month') { this.viewDate = newStart; this.activeDayIsOpen = true; } this.events = [...this.events]; } externalDrop(event: CalendarEvent) { if (this.events.indexOf(event) === -1) { this.events = this.events.filter((iEvent) => iEvent !== event); this.events.push(event); } } deleteEvent(eventToDelete: CalendarEvent) { this.events = this.events.filter((event) => event !== eventToDelete); } setView(view: CalendarView) { this.view = view; } closeOpenMonthViewDay() { this.activeDayIsOpen = false; } }