/* * @Author: 疯狂秀才(Lucas Huang) * @Date: 2019-09-04 07:39:58 * @LastEditors: 疯狂秀才(Lucas Huang) * @LastEditTime: 2019-09-04 15:03:39 * @QQ: 1055818239 * @Version: v0.0.1 */ import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation, SimpleChanges } from '@angular/core'; import { UtilService } from '../../services/public-api'; import { IMyOptions, IMyCalendarDay, IMyDate, IMyDateRange, IMyWeek } from '../../interfaces/public-api'; import { MonthId, KeyCode } from '../../enums/public-api'; import { OPTS, DATES, WEEK_DAYS, SELECTED_DATE, SELECTED_DATE_RANGE } from '../../constants/constants'; // import { IMyWeek } from '../../interfaces/my-month-row.interface' @Component({ selector: 'lib-day-view', templateUrl: './day-view.component.html', providers: [UtilService], encapsulation: ViewEncapsulation.None }) export class DayViewComponent implements OnChanges { @Input() opts: IMyOptions; @Input() dates: Array; @Input() weekDays: Array; @Input() selectedDate: IMyDate; @Input() selectedDateRange: IMyDateRange; @Input() selectedWeek: IMyWeek; @Output() dayCellClicked: EventEmitter = new EventEmitter< IMyCalendarDay >(); @Output() dayCellKeyDown: EventEmitter = new EventEmitter< IMyCalendarDay >(); @Output() weekClicked: EventEmitter = new EventEmitter(); @Output() onMouseEnter: EventEmitter = new EventEmitter(); @Output() onMouseLeave: EventEmitter = new EventEmitter(); prevMonthId: number = MonthId.prev; currMonthId: number = MonthId.curr; nextMonthId: number = MonthId.next; constructor(private utilService: UtilService) {} ngOnChanges(changes: SimpleChanges): void { if (changes.hasOwnProperty(OPTS)) { this.opts = changes[OPTS].currentValue; } if (changes.hasOwnProperty(DATES)) { this.dates = changes[DATES].currentValue; } if (changes.hasOwnProperty(WEEK_DAYS)) { this.weekDays = changes[WEEK_DAYS].currentValue; } if (changes.hasOwnProperty(SELECTED_DATE)) { this.selectedDate = changes[SELECTED_DATE].currentValue; } if (changes.hasOwnProperty(SELECTED_DATE_RANGE)) { this.selectedDateRange = changes[SELECTED_DATE_RANGE].currentValue; } } onDayCellClicked(event: any, cell: IMyCalendarDay): void { if (cell.disabled || this.opts.showType === 4) { return; } event.stopPropagation(); this.dayCellClicked.emit(cell); } onDayCellKeyDown(event: KeyboardEvent, cell: IMyCalendarDay) { const keyCode: number = this.utilService.getKeyCodeFromEvent(event); if (keyCode !== KeyCode.tab) { event.preventDefault(); if (keyCode === KeyCode.enter || keyCode === KeyCode.space) { this.onDayCellClicked(event, cell); } else if (this.opts.moveFocusByArrowKeys) { this.dayCellKeyDown.emit(cell); } } } onWeekClicked(event: KeyboardEvent, week: IMyWeek) { if (this.opts.showType !== 4) { return; } event.stopPropagation(); this.weekClicked.emit(week); } onDayCellMouseEnter(cell: any): void { if ( this.utilService.isInitializedDate(this.selectedDateRange.begin) && (!this.utilService.isInitializedDate(this.selectedDateRange.end) || JSON.stringify(this.selectedDateRange.begin) === JSON.stringify(this.selectedDateRange.end)) ) { for (const w of this.dates) { for (const day of w.week) { day.range = (this.utilService.isDateSameOrEarlier( this.selectedDateRange.begin, day.dateObj ) && this.utilService.isDateSameOrEarlier( day.dateObj, cell.dateObj )) || (this.utilService.isDateSameOrEarlier( day.dateObj, this.selectedDateRange.begin ) && this.utilService.isDateSameOrEarlier( cell.dateObj, day.dateObj )); } } this.onMouseEnter.emit(cell); } } onDayCellMouseLeave(): void { for (const w of this.dates) { for (const day of w.week) { day.range = false; } } this.onMouseLeave.emit(); } isDateInRange(date: IMyDate): boolean { return this.utilService.isDateInRange(date, this.selectedDateRange); } isDateSame(date: IMyDate): boolean { return this.utilService.isDateSame( { year: this.selectedDate.year, month: this.selectedDate.month, day: this.selectedDate.day }, date ); } isDateRangeBeginOrEndSame(date: IMyDate): boolean { const selectedDateRange = { begin: { year: this.selectedDateRange.begin.year, month: this.selectedDateRange.begin.month, day: this.selectedDateRange.begin.day }, end: { year: this.selectedDateRange.end.year, month: this.selectedDateRange.end.month, day: this.selectedDateRange.end.day } }; return this.utilService.isDateRangeBeginOrEndSame( selectedDateRange, date ); } }