import { Component, EventEmitter, Input, Output } from '@angular/core'; import { pDatepickerViewMode, BsNavigationDirection, BsNavigationEvent, CellHoverEvent, DatepickerRenderOptions, DaysCalendarViewModel, DayViewModel, WeekViewModel } from '../../models'; import { pDatepickerConfig } from '../../p-datepicker.config'; @Component({ selector: 'p-days-calendar-view', // changeDetection: ChangeDetectionStrategy.OnPush, template: ` {{ calendar.weekdays[i] }} {{ calendar.weekNumbers[i] }} {{ calendar.weekNumbers[i] }} {{ day.label }} {{ day.label }} ` }) export class BsDaysCalendarViewComponent { @Input() calendar: DaysCalendarViewModel; @Input() options: DatepickerRenderOptions; @Output() onNavigate = new EventEmitter(); @Output() onViewMode = new EventEmitter(); @Output() onSelect = new EventEmitter(); @Output() onHover = new EventEmitter(); @Output() onHoverWeek = new EventEmitter(); isWeekHovered: boolean; isiOS: boolean; constructor(private _config: pDatepickerConfig) { this.isiOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); } navigateTo(event: BsNavigationDirection): void { const step = BsNavigationDirection.DOWN === event ? -1 : 1; this.onNavigate.emit({ step: { month: step } }); } changeViewMode(event: pDatepickerViewMode): void { this.onViewMode.emit(event); } selectDay(event: DayViewModel): void { this.onSelect.emit(event); } selectWeek(week: WeekViewModel): void { if (!this._config.selectWeek && !this._config.selectWeekDateRange) { return; } if (week.days.length === 0) { return; } if (this._config.selectWeek && week.days[0] && !week.days[0].isDisabled && this._config.selectFromOtherMonth) { this.onSelect.emit(week.days[0]); return; } const selectedDay = week.days.find((day: DayViewModel) => { return this._config.selectFromOtherMonth ? !day.isDisabled : !day.isOtherMonth && !day.isDisabled; }); this.onSelect.emit(selectedDay); if (this._config.selectWeekDateRange) { const days = week.days.slice(0); const lastDayOfRange = days.reverse().find((day: DayViewModel) => { return this._config.selectFromOtherMonth ? !day.isDisabled : !day.isOtherMonth && !day.isDisabled; }); this.onSelect.emit(lastDayOfRange); } } weekHoverHandler(cell: WeekViewModel, isHovered: boolean): void { if (!this._config.selectWeek && !this._config.selectWeekDateRange) { return; } const hasActiveDays = cell.days.find((day: DayViewModel) => { return this._config.selectFromOtherMonth ? !day.isDisabled : !day.isOtherMonth && !day.isDisabled; }); if (hasActiveDays) { cell.isHovered = isHovered; this.isWeekHovered = isHovered; this.onHoverWeek.emit(cell); } } hoverDay(cell: DayViewModel, isHovered: boolean): void { if (this._config.selectFromOtherMonth && cell.isOtherMonth) { cell.isOtherMonthHovered = isHovered; } this.onHover.emit({ cell, isHovered }); } }