import {Component, Injectable, OnInit} from '@angular/core'; import {FieldType} from '@ngx-formly/core'; import {NgbDateAdapter, NgbDateParserFormatter, NgbDateStruct} from '@ng-bootstrap/ng-bootstrap'; import {faCalendar} from '@fortawesome/free-solid-svg-icons'; import {FulldatefrValidator} from '../../../validators/fulldatefr.validator'; import {BirthdayLimitValidator} from '../../../validators/birthday-limit.validator'; import {formatDate} from '@angular/common'; /** * This Service handles how the date is represented in scripts i.e. ngModel. */ @Injectable() export class CustomAdapter extends NgbDateAdapter { readonly DELIMITER = '-'; fromModel(value: string | null): NgbDateStruct | null { if (value && value.length > 0) { const date = value.split(this.DELIMITER); return { day: parseInt(date[2], 10), month: parseInt(date[1], 10), year: parseInt(date[0], 10) }; } return null; } toModel(date: NgbDateStruct | null): string | null { return date ? date.year + this.DELIMITER + this.formatedNumber(date.month) + this.DELIMITER + this.formatedNumber(date.day) : null; } formatedNumber(date: any): string { return date < 10 ? '0' + date : date; } } @Injectable() export class CustomDateParserFormatter extends NgbDateParserFormatter { readonly DELIMITER = '/'; parse(value: string): NgbDateStruct | null { if (value && value.length > 0) { const date = value.split(this.DELIMITER); return { day: parseInt(date[0], 10), month: parseInt(date[1], 10), year: parseInt(date[2], 10) }; } return null; } format(date: NgbDateStruct | null): string { return date ? this.formatedNumber(date.day) + this.DELIMITER + this.formatedNumber(date.month) + this.DELIMITER + date.year : ''; } formatedNumber(date: any): string { return date < 10 ? '0' + date : date; } } @Component({ selector: 'jhi-bdatepicker', templateUrl: './datepicker.component.html', styleUrls: ['./datepicker.component.scss'], providers: [ {provide: NgbDateAdapter, useClass: CustomAdapter}, {provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter} ] }) export class DatepickerComponent extends FieldType implements OnInit { faCalendar = faCalendar; maxDate = null; minDate = null; monthOnly = false; showBg = false; constructor() { super(); } ngOnInit(): void { this.maxDate = this.field.templateOptions.maxDate ? this.getDateObject(this.field.templateOptions.maxDate) : this.maxDateDefault(); this.minDate = this.field.templateOptions.minDate ? this.getDateObject(this.field.templateOptions.minDate) : this.minDateDefault(); this.monthOnly = this.field.templateOptions.monthOnly ? this.field.templateOptions.monthOnly : false; this.initValidators(); } isNotFirstDay(date: NgbDateStruct): boolean { return date.day !== 1; } activateAllDays(date: NgbDateStruct): boolean { return false; } getDateObject(date): NgbDateStruct { const dateFr = this.getFormatedDateFr(date); if (dateFr.length === 3) { return { day: parseInt(dateFr[0], 10), month: parseInt(dateFr[1], 10), year: parseInt(dateFr[2], 10) }; } else { return null; } } getFormatedDateFr(date): Array { const dateEn = date.split('-'); let dateFormated = null; if (dateEn.length === 3) { dateFormated = [dateEn[0], dateEn[1], dateEn[2]]; } else if (date.split('/').length === 3) { dateFormated = date.split('/'); } return dateFormated; } initValidators(): void { const validators = [FulldatefrValidator.format]; const dateMin = this.field.templateOptions.minDate; const dateMax = this.field.templateOptions.maxDate; if (dateMin && dateMax) { validators.push(FulldatefrValidator.interval(dateMin, dateMax)); } else { if (dateMin) { validators.push(FulldatefrValidator.dateMin(dateMin)); } if (dateMax) { validators.push(FulldatefrValidator.dateMax(dateMax)); } } if (this.field.validators && this.field.validators.validation.includes('birthdayLimit')) { validators.push(BirthdayLimitValidator.format); } this.field.formControl.clearValidators(); this.field.formControl.setValidators(validators); this.field.formControl.updateValueAndValidity(); } setFormFieldValue() { this.field.formControl.setValue(this.model[this.key]); this.field.templateOptions.change(this.field); } maxDateDefault(): any { let date = new Date(); date = new Date(date.setFullYear(date.getFullYear() + 50)); return {year: date.getFullYear(), month: 1, day: 1}; } minDateDefault(): any { let date = new Date(); date = new Date(date.setFullYear(date.getFullYear() - 150)); return {year: date.getFullYear(), month: 1, day: 1}; } formatDateFr(e: any): void { const keyCode = e.keyCode; const isShift = keyCode === 16; let currentValue = e.target.value; if (((keyCode >= 48 && keyCode <= 57) || keyCode === 8 || keyCode <= 37 || keyCode <= 39 || (keyCode >= 96 && keyCode <= 105)) && isShift === false) { if ((currentValue.length === 2 || currentValue.length === 5) && keyCode !== 8) { currentValue += '/'; e.target.value = currentValue; } } } }