fundamental-ngx
Version:
SAP Fundamentals, implemented in Angular
210 lines • 15.9 kB
JavaScript
/**
* @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=