UNPKG

fundamental-ngx

Version:

SAP Fundamentals, implemented in Angular

210 lines 15.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, ViewEncapsulation, EventEmitter, ElementRef, ChangeDetectorRef } from '@angular/core'; import { FdDate } from '../../models/fd-date'; import { CalendarI18n } from '../../i18n/calendar-i18n'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { CalendarService } from '../../calendar.service'; /** * Component representing the month view of the calendar. */ export class CalendarMonthViewComponent { /** * @param {?} eRef * @param {?} cdRef * @param {?} calendarI18n * @param {?} calendarService */ constructor(eRef, cdRef, calendarI18n, calendarService) { this.eRef = eRef; this.cdRef = cdRef; this.calendarI18n = calendarI18n; this.calendarService = calendarService; /** * A number offset used to achieve the 1-12 representation of the calendar */ this._monthOffset = 1; /** * An RxJS Subject that will kill the data stream upon component’s destruction (for unsubscribing) */ this.onDestroy$ = new Subject(); /** * An event fired when a new month is selected */ this.monthClicked = new EventEmitter(); } /** * @hidden * @return {?} */ ngOnInit() { this.monthNames = this.calendarI18n.getAllShortMonthNames(); this.calendarI18n.i18nChange .pipe(takeUntil(this.onDestroy$)) .subscribe((/** * @return {?} */ () => { this.monthNames = this.calendarI18n.getAllShortMonthNames(); this.cdRef.detectChanges(); })); this.calendarService.focusEscapeFunction = this.focusEscapeFunction; this.calendarService.onFocusIdChange .pipe(takeUntil(this.onDestroy$)) .subscribe((/** * @param {?} index * @return {?} */ index => this.focusElement('#' + this.id + '-fd-month-' + index))); this.calendarService.onKeySelect .pipe(takeUntil(this.onDestroy$)) .subscribe((/** * @param {?} index * @return {?} */ index => this.selectMonth(index))); } /** * @hidden * @return {?} */ ngOnDestroy() { this.onDestroy$.next(); this.onDestroy$.complete(); } /** * Get a number (1-12) representing the current month * @return {?} */ get currentMonth() { return FdDate.getToday().month; } /** * Getter for the private class member _monthOffset * @return {?} */ get monthOffset() { return this._monthOffset; } /** * Method for handling the mouse click event when a month is selected * @param {?} selectedMonth * @param {?=} event * @return {?} */ selectMonth(selectedMonth, event) { if (event) { event.stopPropagation(); } this.monthSelected = selectedMonth + this.monthOffset; this.monthClicked.emit(this.monthSelected); } /** * Method for handling the keyboard events (a11y) * @param {?} event * @param {?} index * @return {?} */ onKeydownMonthHandler(event, index) { this.calendarService.onKeydownHandler(event, index); } /** * Method that allows to focus elements inside this component * @param {?} elementSelector * @return {?} */ focusElement(elementSelector) { /** @type {?} */ const elementToFocus = this.eRef.nativeElement.querySelector(elementSelector); if (elementToFocus) { elementToFocus.focus(); } } } CalendarMonthViewComponent.decorators = [ { type: Component, args: [{ selector: 'fd-calendar-month-view', template: "<div class=\"fd-calendar__months\">\n <ul class=\"fd-calendar__list\">\n <li class=\"fd-calendar__item\"\n *ngFor=\"let month of monthNames; let i = index\"\n [ngClass]=\"{\n 'fd-calendar__item--current': i + monthOffset === currentMonth,\n 'is-selected': i + monthOffset === monthSelected\n }\"\n [attr.tabIndex]=\"i + monthOffset === monthSelected ? 0 : -1\"\n [attr.id]=\"id + '-fd-month-' + i\"\n (keydown)=\"onKeydownMonthHandler($event, i)\"\n (click)=\"selectMonth(i, $event)\">\n <span role=\"button\" class=\"fd-calendar__text\">\n {{ month }}\n </span>\n </li>\n </ul>\n</div>\n", encapsulation: ViewEncapsulation.None, host: { '[attr.id]': 'id + "-month-view"' }, styles: [""] }] } ]; /** @nocollapse */ CalendarMonthViewComponent.ctorParameters = () => [ { type: ElementRef }, { type: ChangeDetectorRef }, { type: CalendarI18n }, { type: CalendarService } ]; CalendarMonthViewComponent.propDecorators = { id: [{ type: Input }], monthSelected: [{ type: Input }], focusEscapeFunction: [{ type: Input }], monthClicked: [{ type: Output }] }; if (false) { /** * A list of month names (short names) * @type {?} */ CalendarMonthViewComponent.prototype.monthNames; /** * A number offset used to achieve the 1-12 representation of the calendar * @type {?} * @private */ CalendarMonthViewComponent.prototype._monthOffset; /** * An RxJS Subject that will kill the data stream upon component’s destruction (for unsubscribing) * @type {?} * @private */ CalendarMonthViewComponent.prototype.onDestroy$; /** * The id of the calendar passed from the parent component * @type {?} */ CalendarMonthViewComponent.prototype.id; /** * A number (1-12) representing the selected month * @type {?} */ CalendarMonthViewComponent.prototype.monthSelected; /** * A function that handles escape focus * @type {?} */ CalendarMonthViewComponent.prototype.focusEscapeFunction; /** * An event fired when a new month is selected * @type {?} */ CalendarMonthViewComponent.prototype.monthClicked; /** * @type {?} * @private */ CalendarMonthViewComponent.prototype.eRef; /** * @type {?} * @private */ CalendarMonthViewComponent.prototype.cdRef; /** * @type {?} * @private */ CalendarMonthViewComponent.prototype.calendarI18n; /** * @type {?} * @private */ CalendarMonthViewComponent.prototype.calendarService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItbW9udGgtdmlldy9jYWxlbmRhci1tb250aC12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQXFCLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBWXpELE1BQU0sT0FBTywwQkFBMEI7Ozs7Ozs7SUEyQm5DLFlBQ1ksSUFBZ0IsRUFDaEIsS0FBd0IsRUFDeEIsWUFBMEIsRUFDMUIsZUFBZ0M7UUFIaEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7Ozs7UUF6QjNCLGlCQUFZLEdBQVcsQ0FBQyxDQUFDOzs7O1FBR3pCLGVBQVUsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQzs7OztRQWdCeEQsaUJBQVksR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQU90RSxDQUFDOzs7OztJQUdKLFFBQVE7UUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZ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MENBQXdCOzs7OztJQUN4QiwyQ0FBZ0M7Ozs7O0lBQ2hDLGtEQUFrQzs7Ozs7SUFDbEMscURBQXdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBPbkluaXQsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZkRGF0ZSB9IGZyb20gJy4uLy4uL21vZGVscy9mZC1kYXRlJztcbmltcG9ydCB7IENhbGVuZGFySTE4biB9IGZyb20gJy4uLy4uL2kxOG4vY2FsZW5kYXItaTE4bic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jYWxlbmRhci5zZXJ2aWNlJztcblxuLyoqIENvbXBvbmVudCByZXByZXNlbnRpbmcgdGhlIG1vbnRoIHZpZXcgb2YgdGhlIGNhbGVuZGFyLiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1jYWxlbmRhci1tb250aC12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuaWRdJzogJ2lkICsgXCItbW9udGgtdmlld1wiJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJNb250aFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICAvKiogQSBsaXN0IG9mIG1vbnRoIG5hbWVzIChzaG9ydCBuYW1lcykgKi9cbiAgICBtb250aE5hbWVzOiBzdHJpbmdbXTtcblxuICAgIC8qKiBBIG51bWJlciBvZmZzZXQgdXNlZCB0byBhY2hpZXZlIHRoZSAxLTEyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYWxlbmRhciAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vbnRoT2Zmc2V0OiBudW1iZXIgPSAxO1xuXG4gICAgLyoqIEFuIFJ4SlMgU3ViamVjdCB0aGF0IHdpbGwga2lsbCB0aGUgZGF0YSBzdHJlYW0gdXBvbiBjb21wb25lbnTigJlzIGRlc3RydWN0aW9uIChmb3IgdW5zdWJzY3JpYmluZykgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBvbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBUaGUgaWQgb2YgdGhlIGNhbGVuZGFyIHBhc3NlZCBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50ICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgLyoqIEEgbnVtYmVyICgxLTEyKSByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIG1vbnRoICovXG4gICAgQElucHV0KClcbiAgICBtb250aFNlbGVjdGVkOiBudW1iZXI7XG5cbiAgICAvKiogQSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgZXNjYXBlIGZvY3VzICovXG4gICAgQElucHV0KClcbiAgICBmb2N1c0VzY2FwZUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKiBBbiBldmVudCBmaXJlZCB3aGVuIGEgbmV3IG1vbnRoIGlzIHNlbGVjdGVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgbW9udGhDbGlja2VkOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXJJMThuOiBDYWxlbmRhckkxOG4sXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2VcbiAgICApIHt9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vbnRoTmFtZXMgPSB0aGlzLmNhbGVuZGFySTE4bi5nZXRBbGxTaG9ydE1vbnRoTmFtZXMoKTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFySTE4bi5pMThuQ2hhbmdlXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW9udGhOYW1lcyA9IHRoaXMuY2FsZW5kYXJJMThuLmdldEFsbFNob3J0TW9udGhOYW1lcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmZvY3VzRXNjYXBlRnVuY3Rpb24gPSB0aGlzLmZvY3VzRXNjYXBlRnVuY3Rpb247XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25Gb2N1c0lkQ2hhbmdlXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaW5kZXggPT4gdGhpcy5mb2N1c0VsZW1lbnQoJyMnICsgdGhpcy5pZCArICctZmQtbW9udGgtJyArIGluZGV4KSlcbiAgICAgICAgO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uS2V5U2VsZWN0XG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaW5kZXggPT4gdGhpcy5zZWxlY3RNb250aChpbmRleCkpXG4gICAgICAgIDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKiogR2V0IGEgbnVtYmVyICgxLTEyKSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbW9udGggICovXG4gICAgZ2V0IGN1cnJlbnRNb250aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gRmREYXRlLmdldFRvZGF5KCkubW9udGg7XG4gICAgfVxuXG4gICAgLyoqICBHZXR0ZXIgZm9yIHRoZSBwcml2YXRlIGNsYXNzIG1lbWJlciBfbW9udGhPZmZzZXQgKi9cbiAgICBnZXQgbW9udGhPZmZzZXQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgZm9yIGhhbmRsaW5nIHRoZSBtb3VzZSBjbGljayBldmVudCB3aGVuIGEgbW9udGggaXMgc2VsZWN0ZWQgICovXG4gICAgc2VsZWN0TW9udGgoc2VsZWN0ZWRNb250aDogbnVtYmVyLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vbnRoU2VsZWN0ZWQgPSBzZWxlY3RlZE1vbnRoICsgdGhpcy5tb250aE9mZnNldDtcbiAgICAgICAgdGhpcy5tb250aENsaWNrZWQuZW1pdCh0aGlzLm1vbnRoU2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgZm9yIGhhbmRsaW5nIHRoZSBrZXlib2FyZCBldmVudHMgKGExMXkpICovXG4gICAgb25LZXlkb3duTW9udGhIYW5kbGVyKGV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25LZXlkb3duSGFuZGxlcihldmVudCwgaW5kZXgpXG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0aGF0IGFsbG93cyB0byBmb2N1cyBlbGVtZW50cyBpbnNpZGUgdGhpcyBjb21wb25lbnQgKi9cbiAgICBmb2N1c0VsZW1lbnQoZWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFRvRm9jdXM6IEhUTUxFbGVtZW50ID0gdGhpcy5lUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50U2VsZWN0b3IpO1xuICAgICAgICBpZiAoZWxlbWVudFRvRm9jdXMpIHtcbiAgICAgICAgICAgIGVsZW1lbnRUb0ZvY3VzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=