UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

220 lines (219 loc) 18.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { DefaultControlValueAccessor } from './../common/default-control-value-accessor'; import { Component, forwardRef, Input, Inject, PLATFORM_ID, Injector, Renderer2, ElementRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as dmyConstants from './asi-dmypicker-constants'; import * as nh from '../../native-helper'; import { isPlatformBrowser } from '@angular/common'; export class AsiDmyPickerComponent extends DefaultControlValueAccessor { /** * @param {?} platformId * @param {?} injector * @param {?} renderer * @param {?} elementRef */ constructor(platformId, injector, renderer, elementRef) { super(); this.platformId = platformId; this.injector = injector; this.renderer = renderer; this.elementRef = elementRef; /** * Label position */ this.labelPosition = 'top'; /** * hide day list */ this.dayHidden = false; this.days = []; this.months = []; this.years = []; } /** * @return {?} */ ngOnInit() { this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition); if (this.isFr()) { this.months = dmyConstants.months_fr; this.dayLabel = 'Jour'; this.monthLabel = 'Mois'; this.yearLabel = 'Annee'; } else { this.months = dmyConstants.months_en; this.dayLabel = 'Day'; this.monthLabel = 'Month'; this.yearLabel = 'Year'; } this.initDays(); this.initYears(); } /** * @return {?} */ isFr() { if (isPlatformBrowser(this.platformId)) { return navigator.language === 'fr' || navigator.language === 'fr-FR'; } else { /** @type {?} */ const request = this.injector.get('request'); if (request && request.asiNgtools) { /** @type {?} */ const language = request.asiNgtools.language; if (language) { return language.substring(0, 2) === 'fr'; } } return false; } } /** * @return {?} */ initDays() { nh.times(31, (time) => { this.days.push(time + 1); }); } /** * @return {?} */ initYears() { /** @type {?} */ let results = new Array(); /** @type {?} */ let currentYear = new Date().getFullYear(); for (let year = currentYear; year >= 1900; year--) { results.push(year); } this.years = results; } /** * @param {?} month * @return {?} */ onMonthChange(month) { this.value = { day: this.day, month: month != null ? month.num : null, year: this.year }; } /** * @param {?} year * @return {?} */ onYearChange(year) { this.value = { day: this.day, month: this.month != null ? this.month.num : null, year: year }; } /** * @param {?} day * @return {?} */ onDayChange(day) { this.value = { day: day, month: this.month != null ? this.month.num : null, year: this.year }; } /** * @param {?} value * @return {?} */ writeValue(value) { if (value != null) { this.day = value.day; this.month = this.getMontFromNum(value.month); this.year = value.year; } else { this.day = null; this.month = null; this.year = null; } this._value = { day: this.day, month: this.month, year: this.year }; } /** * @param {?} monthNum * @return {?} */ getMontFromNum(monthNum) { if (monthNum == null) { return null; } return nh.find(this.months, (month) => { return month.num === monthNum; }); } } AsiDmyPickerComponent.decorators = [ { type: Component, args: [{ selector: 'asi-dmypicker', host: { 'class': 'asi-component asi-dmypicker' }, template: "<label class=\"input-label\" [translate]=\"label\"></label>\r\n<div class=\"asi-dmypicker-container\">\r\n <asi-select class=\"asi-dmy-days\" [disabled]=\"disabled\" [withEmptyValue]=\"true\" [hidden]=\"dayHidden\" [data]=\"days\" [(ngModel)]=\"day\"\r\n (ngModelChange)=\"onDayChange($event)\">\r\n <asi-empty *asiEmptyDef>{{dayLabel}}</asi-empty>\r\n <asi-selected *asiSelectedDef=\"let data\">{{data}}</asi-selected>\r\n <asi-option *asiOptionDef=\"let data\">{{data}}</asi-option>\r\n </asi-select>\r\n <asi-select class=\"asi-dmy-months\" [disabled]=\"disabled\" [withEmptyValue]=\"true\" [data]=\"months\" [(ngModel)]=\"month\" (ngModelChange)=\"onMonthChange($event)\">\r\n <asi-empty *asiEmptyDef>{{monthLabel}}</asi-empty>\r\n <asi-selected *asiSelectedDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-selected>\r\n <asi-option *asiOptionDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-option>\r\n </asi-select>\r\n <asi-select class=\"asi-dmy-years\" [disabled]=\"disabled\" [withEmptyValue]=\"true\" [data]=\"years\" [(ngModel)]=\"year\" (ngModelChange)=\"onYearChange($event)\">\r\n <asi-empty *asiEmptyDef>{{yearLabel}}</asi-empty>\r\n <asi-selected *asiSelectedDef=\"let data\">{{data}}</asi-selected>\r\n <asi-option *asiOptionDef=\"let data\">{{data}}</asi-option>\r\n </asi-select>\r\n</div>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AsiDmyPickerComponent), multi: true } ] }] } ]; /** @nocollapse */ AsiDmyPickerComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: Injector }, { type: Renderer2 }, { type: ElementRef } ]; AsiDmyPickerComponent.propDecorators = { label: [{ type: Input }], labelPosition: [{ type: Input }], dayHidden: [{ type: Input }] }; if (false) { /** * Label to display (is translated) * @type {?} */ AsiDmyPickerComponent.prototype.label; /** * Label position * @type {?} */ AsiDmyPickerComponent.prototype.labelPosition; /** * hide day list * @type {?} */ AsiDmyPickerComponent.prototype.dayHidden; /** @type {?} */ AsiDmyPickerComponent.prototype.day; /** @type {?} */ AsiDmyPickerComponent.prototype.month; /** @type {?} */ AsiDmyPickerComponent.prototype.year; /** @type {?} */ AsiDmyPickerComponent.prototype.dayLabel; /** @type {?} */ AsiDmyPickerComponent.prototype.monthLabel; /** @type {?} */ AsiDmyPickerComponent.prototype.yearLabel; /** @type {?} */ AsiDmyPickerComponent.prototype.days; /** @type {?} */ AsiDmyPickerComponent.prototype.months; /** @type {?} */ AsiDmyPickerComponent.prototype.years; /** @type {?} */ AsiDmyPickerComponent.prototype.language; /** @type {?} */ AsiDmyPickerComponent.prototype.platformId; /** @type {?} */ AsiDmyPickerComponent.prototype.injector; /** @type {?} */ AsiDmyPickerComponent.prototype.renderer; /** @type {?} */ AsiDmyPickerComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWRteXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWRteXBpY2tlci9hc2ktZG15cGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBY3BELE1BQU0sNEJBQTZCLFNBQVEsMkJBQTJCOzs7Ozs7O0lBeUJwRSxZQUF5QyxVQUFlLEVBQVUsUUFBa0IsRUFDMUUsVUFBNkIsVUFBc0I7UUFDM0QsS0FBSyxFQUFFLENBQUM7UUFGK0IsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDMUUsYUFBUSxHQUFSLFFBQVE7UUFBcUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTs7Ozs2QkFwQmtDLEtBQUs7Ozs7eUJBRy9FLEtBQUs7b0JBVUosRUFBRTtzQkFDWSxFQUFFO3FCQUNmLEVBQUU7S0FPeEI7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRixFQUFF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LENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDO1NBQy9CLENBQUMsQ0FBQzs7OztZQTFITixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRTtnQkFDaEQsbTJDQUE2QztnQkFDN0MsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7d0JBQ3BELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7NENBMEJjLE1BQU0sU0FBQyxXQUFXO1lBN0MyQixRQUFRO1lBQVUsU0FBUztZQUFFLFVBQVU7OztvQkF1QmhHLEtBQUs7NEJBR0wsS0FBSzt3QkFHTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9udGggfSBmcm9tICcuL2FzaS1kbXlwaWNrZXItY29uc3RhbnRzJztcbmltcG9ydCB7IERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vLi4vY29tbW9uL2RlZmF1bHQtY29udHJvbC12YWx1ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBJbmplY3QsIFBMQVRGT1JNX0lELCBJbmplY3RvciwgT25Jbml0LCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgKiBhcyBkbXlDb25zdGFudHMgZnJvbSAnLi9hc2ktZG15cGlja2VyLWNvbnN0YW50cyc7XG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi9uYXRpdmUtaGVscGVyJztcblxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhc2ktZG15cGlja2VyJyxcbiAgaG9zdDogeyAnY2xhc3MnOiAnYXNpLWNvbXBvbmVudCBhc2ktZG15cGlja2VyJyB9LFxuICB0ZW1wbGF0ZVVybDogJy4vYXNpLWRteXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpRG15UGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFzaURteVBpY2tlckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqIExhYmVsIHRvIGRpc3BsYXkgKGlzIHRyYW5zbGF0ZWQpICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIExhYmVsIHBvc2l0aW9uICovXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICd0b3AnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2JvdHRvbS1jZW50ZXInIHwgJ3RvcC1jZW50ZXInID0gJ3RvcCc7XG5cbiAgLyoqIGhpZGUgZGF5IGxpc3QgKi9cbiAgQElucHV0KCkgZGF5SGlkZGVuID0gZmFsc2U7XG5cbiAgZGF5OiBudW1iZXI7XG4gIG1vbnRoOiBNb250aDtcbiAgeWVhcjogbnVtYmVyO1xuXG4gIGRheUxhYmVsOiBzdHJpbmc7XG4gIG1vbnRoTGFiZWw6IHN0cmluZztcbiAgeWVhckxhYmVsOiBzdHJpbmc7XG5cbiAgZGF5czogQXJyYXk8TnVtYmVyPiA9IFtdO1xuICBtb250aHM6IEFycmF5PGRteUNvbnN0YW50cy5Nb250aD4gPSBbXTtcbiAgeWVhcnM6IEFycmF5PE51bWJlcj4gPSBbXTtcblxuICBsYW5ndWFnZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55LCBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbGFiZWwtJyArIHRoaXMubGFiZWxQb3NpdGlvbik7XG4gICAgaWYgKHRoaXMuaXNGcigpKSB7XG4gICAgICB0aGlzLm1vbnRocyA9IGRteUNvbnN0YW50cy5tb250aHNfZnI7XG4gICAgICB0aGlzLmRheUxhYmVsID0gJ0pvdXInO1xuICAgICAgdGhpcy5tb250aExhYmVsID0gJ01vaXMnO1xuICAgICAgdGhpcy55ZWFyTGFiZWwgPSAnQW5uZWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vbnRocyA9IGRteUNvbnN0YW50cy5tb250aHNfZW47XG4gICAgICB0aGlzLmRheUxhYmVsID0gJ0RheSc7XG4gICAgICB0aGlzLm1vbnRoTGFiZWwgPSAnTW9udGgnO1xuICAgICAgdGhpcy55ZWFyTGFiZWwgPSAnWWVhcic7XG4gICAgfVxuICAgIHRoaXMuaW5pdERheXMoKTtcbiAgICB0aGlzLmluaXRZZWFycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ZyKCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm4gbmF2aWdhdG9yLmxhbmd1YWdlID09PSAnZnInIHx8IG5hdmlnYXRvci5sYW5ndWFnZSA9PT0gJ2ZyLUZSJztcbiAgICB9IGVsc2Uge1xuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5pbmplY3Rvci5nZXQoJ3JlcXVlc3QnKTtcbiAgICAgIGlmIChyZXF1ZXN0ICYmIHJlcXVlc3QuYXNpTmd0b29scykge1xuICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHJlcXVlc3QuYXNpTmd0b29scy5sYW5ndWFnZTtcbiAgICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgICAgcmV0dXJuIGxhbmd1YWdlLnN1YnN0cmluZygwLCAyKSA9PT0gJ2ZyJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGluaXREYXlzKCkge1xuICAgIG5oLnRpbWVzKDMxLCAodGltZSkgPT4ge1xuICAgICAgdGhpcy5kYXlzLnB1c2godGltZSArIDEpO1xuICAgIH0pO1xuICB9XG5cbiAgaW5pdFllYXJzKCkge1xuICAgIGxldCByZXN1bHRzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgICBsZXQgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgZm9yIChsZXQgeWVhciA9IGN1cnJlbnRZZWFyOyB5ZWFyID49IDE5MDA7IHllYXItLSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHllYXIpO1xuICAgIH1cbiAgICB0aGlzLnllYXJzID0gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBvbk1vbnRoQ2hhbmdlKG1vbnRoOiBNb250aCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB7IGRheTogdGhpcy5kYXksIG1vbnRoOiBtb250aCAhPSBudWxsID8gbW9udGgubnVtIDogbnVsbCwgeWVhcjogdGhpcy55ZWFyIH07XG4gIH1cblxuICBwdWJsaWMgb25ZZWFyQ2hhbmdlKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB7IGRheTogdGhpcy5kYXksIG1vbnRoOiB0aGlzLm1vbnRoICE9IG51bGwgPyB0aGlzLm1vbnRoLm51bSA6IG51bGwsIHllYXI6IHllYXIgfTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRheUNoYW5nZShkYXk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB7IGRheTogZGF5LCBtb250aDogdGhpcy5tb250aCAhPSBudWxsID8gdGhpcy5tb250aC5udW0gOiBudWxsLCB5ZWFyOiB0aGlzLnllYXIgfTtcbiAgfVxuXG4gIC8vIENvbnRyb2xlIHZhbHVlIGFjY2Vzc29yXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRheSA9IHZhbHVlLmRheTtcbiAgICAgIHRoaXMubW9udGggPSB0aGlzLmdldE1vbnRGcm9tTnVtKHZhbHVlLm1vbnRoKTtcbiAgICAgIHRoaXMueWVhciA9IHZhbHVlLnllYXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF5ID0gbnVsbDtcbiAgICAgIHRoaXMubW9udGggPSBudWxsO1xuICAgICAgdGhpcy55ZWFyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB7IGRheTogdGhpcy5kYXksIG1vbnRoOiB0aGlzLm1vbnRoLCB5ZWFyOiB0aGlzLnllYXIgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9udEZyb21OdW0obW9udGhOdW06IG51bWJlcik6IE1vbnRoIHtcbiAgICBpZiAobW9udGhOdW0gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IG1vbnRoTnVtO1xuICAgIH0pO1xuICB9XG59XG4iXX0=