UNPKG

@edugouvfr/ngx-dsfr-ext

Version:

NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)

490 lines 73.2 kB
import { A11yModule } from '@angular/cdk/a11y'; import { CommonModule } from '@angular/common'; import { Component, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core'; import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms'; import { DefaultControlComponent, DsfrFormInputModule, DsfrFormSelectModule, DsfrI18nPipe, DsfrSeverityConst, Language, newUniqueId, } from '@edugouvfr/ngx-dsfr'; import { DsfrCalendarComponent } from '../calendar/calendar.component'; import { MESSAGES_EN as CALENDAR_MESSAGES_EN } from '../calendar/i18n/messages.en'; import { MESSAGES_FR as CALENDAR_MESSAGES_FR } from '../calendar/i18n/messages.fr'; import { DropdownContainerComponent } from '../shared/components'; import { DateUtils } from '../shared/utils/date/date-utils'; import { MESSAGES_EN } from './i18n/messages.en'; import { MESSAGES_FR } from './i18n/messages.fr'; import { DateFormatDirective } from './mask/date-format.directive'; import { DateMaskDirective } from './mask/date-mask.directive'; import * as i0 from "@angular/core"; import * as i1 from "@edugouvfr/ngx-dsfr"; import * as i2 from "@angular/forms"; import * as i3 from "@angular/cdk/a11y"; /** * Implémente la saisie d'une date via un input ou via un calendrier affichant les jours et les mois. * Validator est implémenté uniquement par rapport à min et max * @since 0.10 * @author pfontanet */ export class DsfrDatePickerComponent extends DefaultControlComponent { /** @internal */ constructor(elementRef, i18n, langService, logger) { super(); this.elementRef = elementRef; this.i18n = i18n; this.langService = langService; this.logger = logger; /** Message d'information lié au composant */ this.message = undefined; /** * Indique si la date est obligatoire. */ this.required = false; /** * Indique si le masque de saisie doit être affiché ou non. */ this.showMask = false; /** * Cache le label visuellement en le laissant disponible aux lecteurs d'écran. */ this.labelSrOnly = false; /** * Indique la valeur de la propriété css z-index de la modale du composant. */ this.zIndex = undefined; /** Emission de la date.*/ this.dateChange = new EventEmitter(); this.currentMonthIndex = new Date().getMonth(); this.currentYear = new Date().getFullYear(); this.translatedMonthAbbreviations = []; this.translatedMonths = []; this.dialogTitle = ''; this.modalLabel = ''; /** * Id aléatoire, unique, de la modale (le calendrier) */ this.modalId = newUniqueId(); this.isOpen = false; this._min = undefined; this._max = undefined; this.i18n.extendsLabelsBundle(Language.EN, CALENDAR_MESSAGES_EN); this.i18n.extendsLabelsBundle(Language.FR, CALENDAR_MESSAGES_FR); this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN); this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR); this.prevCodeLang = langService.lang; this.i18n.completeLangChange$.subscribe((code) => this.onLangChange(code)); } /** * Compatibilité ascendante avec l'ancien `datepicker`. * @deprecated since 0.10 Utiliser `message` et `severity` à la place. */ get error() { return (this.severity = DsfrSeverityConst.ERROR) ? this.message : undefined; } /** * Compatibilité ascendante avec l'ancien `datepicker`. * @deprecated since 0.10 Utiliser `message` et `severity` à la place. */ get valid() { return (this.severity = DsfrSeverityConst.SUCCESS) ? this.message : undefined; } /** * @return Le code de la langue en cours */ get codeLang() { return this.langService.lang; } /** * @internal */ get min() { return this._min; } /** * @internal */ get max() { return this._max; } get isEnglishLocale() { return this.langService.lang === 'en'; } /** * Compatibilité ascendante avec l'ancien `datepicker`. * @deprecated since 0.10 Utiliser `message` et `severity` à la place. */ set error(message) { this.message = message; this.severity = DsfrSeverityConst.ERROR; } /** * Compatibilité ascendante avec l'ancien `datepicker`. * @deprecated since 0.10 Utiliser `message` et `severity` à la place. */ set valid(message) { this.message = message; this.severity = DsfrSeverityConst.SUCCESS; } /** * Date minimale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ. * Ce paramètre peut être utilisé seul ou avec la propriété max. */ set min(value) { if (value && !this.isValidIso(value)) { this.logger.warn(`dsfr-date-picker: La propriété min a un format incorrecte. Attendu: 'YYYY-MM-DD'. Reçu: ${value}`); this._min = undefined; } else { this._min = value; } } /** * Date maximale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ. * Ce paramètre peut être utilisé seul ou avec la propriété min. */ set max(value) { if (value && !this.isValidIso(value)) { this.logger.warn(`dsfr-date-picker: La propriété max a un format incorrecte. Attendu: 'YYYY-MM-DD'. Reçu: ${value}`); this._max = undefined; } else { this._max = value; } } ngOnChanges(simpleChanges) { if (simpleChanges['value'] && simpleChanges['value'].previousValue !== simpleChanges['value'].currentValue) { this.reformatValue(this.value); } } /** @internal */ ngOnDestroy() { this.dialogTriggerBtnNode?.removeEventListener('keydown', this.handleTriggerButtonKeydown); } /** @internal */ ngAfterViewInit() { this.dialogTriggerBtnNode = this.elementRef.nativeElement.querySelector('dsfr-form-input .fr-btn'); // Listener ne pouvant pas être remplacé, car on ne reçoit pas cet événement depuis form-input this.dialogTriggerBtnNode?.addEventListener('keydown', this.handleTriggerButtonKeydown.bind(this)); this.setDateForTriggerButtonLabel(); this.close(false); } /** * @internal * Interface Validator */ validate(control) { const errors = []; const date = DateUtils.parse(this.codeLang, control.value); const minDate = this.min ? DateUtils.parseDateIso(this.min) : undefined; const maxDate = this.max ? DateUtils.parseDateIso(this.max) : undefined; if (minDate && date && date < minDate) { errors.push({ err_min_date: this.i18n.t('datepicker.validationMin') }); } else if (maxDate && date && maxDate < date) { errors.push({ err_max_date: this.i18n.t('datepicker.validationMax') }); } return errors.length === 0 ? null : errors; } /** * Mise a jour du titre lors de la navigation dans le calendrier * @internal */ onUpdateCalendarView(date) { this.currentMonthIndex = date ? new Date(date).getMonth() : new Date().getMonth(); this.currentYear = date ? new Date(date).getFullYear() : new Date().getFullYear(); this.dialogTitle = `${this.i18n.t('calendar.modal.title')}${this.translatedMonths[this.currentMonthIndex]} ${this.currentYear}`; } writeValue(value) { this.reformatValue(value); super.writeValue(this.value); } /** * Gère le clic en dehors de la modale */ onCalendarOutside() { if (this.isOpen) { this.close(false); } } /** * Gère le changement de valeur de l'input */ onInputChange() { this.handleInternalValidation(); this.setNewValue(this.value); this.setDateForTriggerButtonLabel(); } /********************** * Event Handlers **********************/ handleTriggerButtonClick(event) { if (this.isOpen) { this.close(); } else { this.open(); } event.stopPropagation(); event.preventDefault(); } handleTriggerButtonKeydown(event) { if (event.key === 'Enter' || event.key === ' ') { this.handleTriggerButtonClick(event); } } handleCancelButton(event) { let flagToPreventDefault = false; switch (event.type) { case 'keydown': const keyEvent = event; switch (keyEvent.key) { case 'Esc': case 'Escape': this.close(); flagToPreventDefault = true; break; default: break; } break; case 'click': this.close(); flagToPreventDefault = true; break; default: break; } if (flagToPreventDefault) { event.stopPropagation(); event.preventDefault(); } } handleModalKeydown(keyEvent) { if (keyEvent.key === 'Escape') { keyEvent.stopPropagation(); keyEvent.preventDefault(); this.close(); } } onCalendarVisible() { if (this.calendar) { this.calendar.focusDate(); } } handleDataChange(dateEvent) { this.setNewValue(dateEvent.value); this.handleInternalValidation(); this.close(true); } /** * Met à jour le titre de la dialog (visuellement caché) pour les besoins d'accessibilité. */ updateDialogTitle() { this.updateMonthIndexAndYear(); this.dialogTitle = `${this.i18n.t('calendar.modal.title')}${this.translatedMonths[this.currentMonthIndex]} ${this.currentYear}`; } /** * Gère la validation interne de la date pour les critères de date min et date max. * Retourne `true` en cas d'erreur. */ handleInternalValidation() { const date = DateUtils.parse(this.codeLang, this.value); const minDate = this.min ? DateUtils.parseDateIso(this.min) : undefined; const maxDate = this.max ? DateUtils.parseDateIso(this.max) : undefined; if (minDate && date && date < minDate) { this.message = this.i18n.t('datepicker.validationMin'); this.severity = DsfrSeverityConst.ERROR; return true; } else if (maxDate && date && maxDate < date) { this.message = this.i18n.t('datepicker.validationMax'); this.severity = DsfrSeverityConst.ERROR; return true; } else { this.message = ''; return false; } } /** * Changement de la valeur de l'input et formatage dans la langue courante * @param value Valeur au format ISO ou dans la langue courante */ reformatValue(value) { if (value === undefined) { return; } const parsedIsoDate = DateUtils.parseDateIso(value); if (parsedIsoDate === undefined) { this.value = value; return; } this.value = DateUtils.format(this.codeLang, parsedIsoDate); } /** * Gestion du changement de langue dans le composant. * * @param code Code de la locale à prendre en compte */ onLangChange(code) { this.placeholder = this.i18n.t('datepicker.placeholder'); this.buttonLabelChoose = this.i18n.t('datepicker.button.choose.label'); this.buttonLabelChange = this.i18n.t('datepicker.button.change.label'); this.dayLabels = DateUtils.arr(this.i18n, this.logger, 'calendar.days'); this.monthLabels = DateUtils.arr(this.i18n, this.logger, 'calendar.months'); this.modalLabel = this.i18n.t('calendar.modal.ariaLabel'); this.updateMonthTranslations(); this.updateDialogTitle(); // Reformatage de l'input const date = DateUtils.parse(this.prevCodeLang, this.value); const newValue = DateUtils.format(code, date); this.setNewValue(newValue); this.prevCodeLang = code; } /** * Ouvre la modale. */ open() { this.updateDialogTitle(); this.isOpen = true; } /** * Ferme la modale. * * Positionne le focus sur le bouton d'ouverture de la modale si besoin. * * @param focusTriggerBtn Permet de savoir si le focus doit être donné au bouton d'ouverture de la modale */ close(focusTriggerBtn = true) { if (!this.modal) { return; } this.isOpen = false; if (focusTriggerBtn) { this.dialogTriggerBtnNode.focus(); } } // Textbox methods /** * Mets à jour la valeur du composant (donc normalement textboxNode.value) et émets un événement * @param value * @private */ setNewValue(value) { this.value = value; const date = DateUtils.parse(this.codeLang, this.value); if (value && DateUtils.isValidDefaultString(value)) { this.dateChange.emit({ value: this.value, date: date }); this.updateDialogTitle(); } } /** * Méthode invoquée à la sortie de l'input text. Formate l'input et affecte la propriété 'aria-label' du bouton de * sélection du calendrier. A noter que, si la date est exacte, 'aria-label' contient la date, ex : * "Changer la date, Lundi Mai 27, 2024" ou ="Change Date, Monday July 1, 2024" * - i18n : le code de parsing est remplacé par un appel à DateUtils */ setDateForTriggerButtonLabel() { const day = DateUtils.parse(this.codeLang, this.value); if (day) { let label = this.buttonLabelChange; label += ', ' + this.dayLabels[day.getDay()]; label += ' ' + this.monthLabels[day.getMonth()]; label += ' ' + day.getDate(); label += ', ' + day.getFullYear(); this.dialogTriggerBtnNode.setAttribute('aria-label', label); } else { // If not a valid date, initialize with "Choose Date" this.dialogTriggerBtnNode.setAttribute('aria-label', this.buttonLabelChoose); } } updateMonthTranslations() { this.translatedMonths = DateUtils.arr(this.i18n, this.logger, 'calendar.months'); this.translatedMonthAbbreviations = DateUtils.arr(this.i18n, this.logger, 'calendar.monthsAbbr'); } isValidIso(boundaryString) { const dateRegex = /^\d{4}-\d{2}-\d{2}$/; return dateRegex.test(boundaryString); } /** * Mise à jour du mois et de l'année pour le titre de la modale. */ updateMonthIndexAndYear() { const date = DateUtils.parse(this.codeLang, this.value); this.currentMonthIndex = date ? new Date(date).getMonth() : new Date().getMonth(); this.currentYear = date ? new Date(date).getFullYear() : new Date().getFullYear(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.DsfrI18nService }, { token: i1.LangService }, { token: i1.LoggerService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrDatePickerComponent, isStandalone: true, selector: "dsfr-ext-datepicker, dsfrx-datepicker", inputs: { message: "message", severity: "severity", required: "required", showMask: "showMask", labelSrOnly: "labelSrOnly", zIndex: "zIndex", appendTo: "appendTo", error: "error", valid: "valid", min: "min", max: "max" }, outputs: { dateChange: "dateChange" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrDatePickerComponent), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => DsfrDatePickerComponent), multi: true, }, ], viewQueries: [{ propertyName: "calendar", first: true, predicate: DsfrCalendarComponent, descendants: true }, { propertyName: "comboBox", first: true, predicate: ["combobox"], descendants: true }, { propertyName: "modal", first: true, predicate: ["modal"], descendants: true }, { propertyName: "cancelBtn", first: true, predicate: ["cancelBtn"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<edu-dropdown-container\n #comboboxBox\n [displayDropdown]=\"isOpen\"\n [autoWidthDropdown]=\"true\"\n [hasToolBar]=\"false\"\n [classToWrap]=\"'dsfrx-datepicker'\"\n (dropdownAttached)=\"onCalendarVisible()\"\n (hideList)=\"onCalendarOutside()\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\">\n <dsfr-form-input\n ngProjectAs=\"control\"\n [dsfrDateMask]=\"showMask ? codeLang : ''\"\n [dsfrDateFormat]=\"showMask ? '' : codeLang\"\n [(ngModel)]=\"value\"\n (change)=\"onInputChange()\"\n [label]=\"label\"\n [hint]=\"hint\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [message]=\"message\"\n [severity]=\"severity\"\n [buttonIcon]=\"'fr-icon-calendar-2-line'\"\n [buttonDisabled]=\"disabled\"\n [labelSrOnly]=\"labelSrOnly\"\n [buttonAriaLabel]=\"buttonLabelChoose\"\n (buttonSelect)=\"handleTriggerButtonClick($event)\"\n [maxLength]=\"10\"\n data-testid=\"datepicker-input\">\n <!-- N\u00E9cessaire pour projeter le slot label optionnel dans le composant enfant dsfr-form-input -->\n <ng-container label> <ng-content select=\"[label]\"> </ng-content></ng-container>\n </dsfr-form-input>\n\n <!-- Modale -->\n @if (isOpen) {\n <div\n class=\"dsfrx-datepicker-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n cdkTrapFocus\n data-expanded=\"true\"\n (keydown)=\"handleModalKeydown($event)\"\n [id]=\"modalId\"\n [attr.aria-label]=\"modalLabel\"\n #modal>\n <h2 id=\"id-grid-label\" class=\"fr-sr-only\" aria-live=\"polite\">{{ dialogTitle }}</h2>\n <dsfr-ext-calendar\n [value]=\"value\"\n [max]=\"max\"\n [min]=\"min\"\n [autofocus]=\"true\"\n ariaLabelledBy=\"id-grid-label\"\n (calendarChange)=\"onUpdateCalendarView($event)\"\n (dateChange)=\"handleDataChange($event)\"\n #calendar></dsfr-ext-calendar>\n <div class=\"dialog-ok-cancel-group\">\n <button\n type=\"button\"\n class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n value=\"cancel\"\n (click)=\"handleCancelButton($event)\"\n (keydown)=\"handleCancelButton($event)\"\n #cancelBtn\n data-testid=\"datepicker-cancel-btn\">\n {{ 'calendar.cancel' | dsfrI18n }}\n </button>\n </div>\n </div>\n }\n</edu-dropdown-container>\n", styles: [".dsfrx-datepicker{display:block;position:relative}.dsfrx-datepicker .fr-input-wrap--addon:has(input:focus-visible){outline-style:solid;outline-width:2px;outline-color:#0a76f6;outline-offset:2px}.dsfrx-datepicker .fr-input-wrap--addon input:focus{outline-style:none}.dsfrx-datepicker .fr-btn.fr-icon-calendar-2-line{background-color:var(--background-contrast-grey);color:var(--text-default-grey);border-radius:0 .25rem 0 0;box-shadow:inset 0 -2px 0 0 var(--border-plain-grey)}.dsfrx-datepicker .fr-btn.fr-icon-calendar-2-line:hover{background-color:var(--background-alt-grey-hover)}.dsfrx-datepicker .fr-input-group--disabled .fr-btn.fr-icon-calendar-2-line{color:var(--text-disabled-grey)}.dsfrx-datepicker .fr-input-group--error .fr-btn.fr-icon-calendar-2-line{box-shadow:inset 0 -2px 0 0 var(--border-plain-error)}.dsfrx-datepicker .fr-input-group--valid .fr-btn.fr-icon-calendar-2-line{box-shadow:inset 0 -2px 0 0 var(--border-plain-success)}.dsfrx-datepicker-dialog{width:320px}.dsfrx-datepicker-dialog h2{margin:0;padding:0;display:inline-block;font-size:1em;text-transform:none;font-weight:700;border:none}.dsfrx-datepicker-dialog .dialog-ok-cancel-group{text-align:right;margin-top:1em;margin-bottom:1em;margin-right:1em}.dsfrx-datepicker__wrapper{max-width:320px}.fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 var(--border-plain-grey)}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => DsfrFormInputModule) }, { kind: "component", type: i0.forwardRef(() => i1.DsfrFormInputComponent), selector: "dsfr-form-input", inputs: ["rows", "labelSrOnly", "width", "textarea"] }, { kind: "ngmodule", type: i0.forwardRef(() => FormsModule) }, { kind: "directive", type: i0.forwardRef(() => i2.NgControlStatus), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(() => i2.RequiredValidator), selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i0.forwardRef(() => i2.NgModel), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i0.forwardRef(() => DateFormatDirective), selector: "[dsfrDateFormat]", inputs: ["dsfrDateFormat"] }, { kind: "ngmodule", type: i0.forwardRef(() => DsfrFormSelectModule) }, { kind: "ngmodule", type: i0.forwardRef(() => A11yModule) }, { kind: "directive", type: i0.forwardRef(() => i3.CdkTrapFocus), selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i0.forwardRef(() => DsfrCalendarComponent), selector: "dsfr-ext-calendar, dsfrx-calendar", inputs: ["value", "autofocus", "ariaLabelledBy", "min", "max"], outputs: ["dateChange", "calendarChange"] }, { kind: "pipe", type: i0.forwardRef(() => DsfrI18nPipe), name: "dsfrI18n" }, { kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "component", type: i0.forwardRef(() => DropdownContainerComponent), selector: "edu-dropdown-container", inputs: ["virtualScroll", "virtualScrollItemHeight", "appendTo", "hasOptions", "zIndex", "scrollHeight", "classToWrap", "hasToolBar", "indexFirstSelected", "autofocus", "autoWidthDropdown", "displayDropdown"], outputs: ["hideList", "focusOnList", "dropdownAttached"] }, { kind: "directive", type: i0.forwardRef(() => DateMaskDirective), selector: "[dsfrDateMask]", inputs: ["dsfrDateMask"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDatePickerComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-ext-datepicker, dsfrx-datepicker', encapsulation: ViewEncapsulation.None, standalone: true, imports: [ DsfrFormInputModule, FormsModule, DateFormatDirective, DsfrFormSelectModule, A11yModule, DsfrCalendarComponent, DsfrI18nPipe, CommonModule, DropdownContainerComponent, forwardRef(() => DateMaskDirective), ], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrDatePickerComponent), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => DsfrDatePickerComponent), multi: true, }, ], template: "<edu-dropdown-container\n #comboboxBox\n [displayDropdown]=\"isOpen\"\n [autoWidthDropdown]=\"true\"\n [hasToolBar]=\"false\"\n [classToWrap]=\"'dsfrx-datepicker'\"\n (dropdownAttached)=\"onCalendarVisible()\"\n (hideList)=\"onCalendarOutside()\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\">\n <dsfr-form-input\n ngProjectAs=\"control\"\n [dsfrDateMask]=\"showMask ? codeLang : ''\"\n [dsfrDateFormat]=\"showMask ? '' : codeLang\"\n [(ngModel)]=\"value\"\n (change)=\"onInputChange()\"\n [label]=\"label\"\n [hint]=\"hint\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [message]=\"message\"\n [severity]=\"severity\"\n [buttonIcon]=\"'fr-icon-calendar-2-line'\"\n [buttonDisabled]=\"disabled\"\n [labelSrOnly]=\"labelSrOnly\"\n [buttonAriaLabel]=\"buttonLabelChoose\"\n (buttonSelect)=\"handleTriggerButtonClick($event)\"\n [maxLength]=\"10\"\n data-testid=\"datepicker-input\">\n <!-- N\u00E9cessaire pour projeter le slot label optionnel dans le composant enfant dsfr-form-input -->\n <ng-container label> <ng-content select=\"[label]\"> </ng-content></ng-container>\n </dsfr-form-input>\n\n <!-- Modale -->\n @if (isOpen) {\n <div\n class=\"dsfrx-datepicker-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n cdkTrapFocus\n data-expanded=\"true\"\n (keydown)=\"handleModalKeydown($event)\"\n [id]=\"modalId\"\n [attr.aria-label]=\"modalLabel\"\n #modal>\n <h2 id=\"id-grid-label\" class=\"fr-sr-only\" aria-live=\"polite\">{{ dialogTitle }}</h2>\n <dsfr-ext-calendar\n [value]=\"value\"\n [max]=\"max\"\n [min]=\"min\"\n [autofocus]=\"true\"\n ariaLabelledBy=\"id-grid-label\"\n (calendarChange)=\"onUpdateCalendarView($event)\"\n (dateChange)=\"handleDataChange($event)\"\n #calendar></dsfr-ext-calendar>\n <div class=\"dialog-ok-cancel-group\">\n <button\n type=\"button\"\n class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n value=\"cancel\"\n (click)=\"handleCancelButton($event)\"\n (keydown)=\"handleCancelButton($event)\"\n #cancelBtn\n data-testid=\"datepicker-cancel-btn\">\n {{ 'calendar.cancel' | dsfrI18n }}\n </button>\n </div>\n </div>\n }\n</edu-dropdown-container>\n", styles: [".dsfrx-datepicker{display:block;position:relative}.dsfrx-datepicker .fr-input-wrap--addon:has(input:focus-visible){outline-style:solid;outline-width:2px;outline-color:#0a76f6;outline-offset:2px}.dsfrx-datepicker .fr-input-wrap--addon input:focus{outline-style:none}.dsfrx-datepicker .fr-btn.fr-icon-calendar-2-line{background-color:var(--background-contrast-grey);color:var(--text-default-grey);border-radius:0 .25rem 0 0;box-shadow:inset 0 -2px 0 0 var(--border-plain-grey)}.dsfrx-datepicker .fr-btn.fr-icon-calendar-2-line:hover{background-color:var(--background-alt-grey-hover)}.dsfrx-datepicker .fr-input-group--disabled .fr-btn.fr-icon-calendar-2-line{color:var(--text-disabled-grey)}.dsfrx-datepicker .fr-input-group--error .fr-btn.fr-icon-calendar-2-line{box-shadow:inset 0 -2px 0 0 var(--border-plain-error)}.dsfrx-datepicker .fr-input-group--valid .fr-btn.fr-icon-calendar-2-line{box-shadow:inset 0 -2px 0 0 var(--border-plain-success)}.dsfrx-datepicker-dialog{width:320px}.dsfrx-datepicker-dialog h2{margin:0;padding:0;display:inline-block;font-size:1em;text-transform:none;font-weight:700;border:none}.dsfrx-datepicker-dialog .dialog-ok-cancel-group{text-align:right;margin-top:1em;margin-bottom:1em;margin-right:1em}.dsfrx-datepicker__wrapper{max-width:320px}.fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 var(--border-plain-grey)}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DsfrI18nService }, { type: i1.LangService }, { type: i1.LoggerService }], propDecorators: { message: [{ type: Input }], severity: [{ type: Input }], required: [{ type: Input }], showMask: [{ type: Input }], labelSrOnly: [{ type: Input }], zIndex: [{ type: Input }], appendTo: [{ type: Input }], dateChange: [{ type: Output }], calendar: [{ type: ViewChild, args: [DsfrCalendarComponent] }], comboBox: [{ type: ViewChild, args: ['combobox'] }], modal: [{ type: ViewChild, args: ['modal'] }], cancelBtn: [{ type: ViewChild, args: ['cancelBtn'] }], error: [{ type: Input }], valid: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1leHQvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsR0FHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsWUFBWSxFQUdaLGlCQUFpQixFQUVqQixRQUFRLEVBRVIsV0FBVyxHQUNaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsSUFBSSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxXQUFXLElBQUksb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFB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d0IsQ0FBQzs0QkFDdEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7bUtBT1EsT0FBTztzQkFBZixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDMkIsUUFBUTtzQkFBekMsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBRVQsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUNTLEtBQUs7c0JBQWxDLFNBQVM7dUJBQUMsT0FBTztnQkFDZ0IsU0FBUztzQkFBMUMsU0FBUzt1QkFBQyxXQUFXO2dCQWdHVCxLQUFLO3NCQUFqQixLQUFLO2dCQVNPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBVUYsR0FBRztzQkFETixLQUFLO2dCQWtCRixHQUFHO3NCQUROLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBMTF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIERlZmF1bHRDb250cm9sQ29tcG9uZW50LFxuICBEc2ZyRm9ybUlucHV0TW9kdWxlLFxuICBEc2ZyRm9ybVNlbGVjdE1vZHVsZSxcbiAgRHNmckkxOG5QaXBlLFxuICBEc2ZySTE4blNlcnZpY2UsXG4gIERzZnJTZXZlcml0eSxcbiAgRHNmclNldmVyaXR5Q29uc3QsXG4gIExhbmdTZXJ2aWNlLFxuICBMYW5ndWFnZSxcbiAgTG9nZ2VyU2VydmljZSxcbiAgbmV3VW5pcXVlSWQsXG59IGZyb20gJ0BlZHVnb3V2ZnIvbmd4LWRzZnInO1xuaW1wb3J0IHsgRHNmckNhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1FU1NBR0VTX0VOIGFzIENBTEVOREFSX01FU1NBR0VTX0VOIH0gZnJvbSAnLi4vY2FsZW5kYXIvaTE4bi9tZXNzYWdlcy5lbic7XG5pbXBvcnQgeyBNRVNTQUdFU19GUiBhcyBDQUxFTkRBUl9NRVNTQUdFU19GUiB9IGZyb20gJy4uL2NhbGVuZGFyL2kxOG4vbWVzc2FnZXMuZnInO1xuaW1wb3J0IHsgRHJvcGRvd25Db250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvY29tcG9uZW50cyc7XG5pbXBvcnQgeyBEc2ZyRGF0ZUV2ZW50IH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9kYXRlLWV2ZW50JztcbmltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gJy4uL3NoYXJlZC91dGlscy9kYXRlL2RhdGUtdXRpbHMnO1xuaW1wb3J0IHsgTUVTU0FHRVNfRU4gfSBmcm9tICcuL2kxOG4vbWVzc2FnZXMuZW4nO1xuaW1wb3J0IHsgTUVTU0FHRVNfRlIgfSBmcm9tICcuL2kxOG4vbWVzc2FnZXMuZnInO1xuaW1wb3J0IHsgRGF0ZUZvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vbWFzay9kYXRlLWZvcm1hdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0ZU1hc2tEaXJlY3RpdmUgfSBmcm9tICcuL21hc2svZGF0ZS1tYXNrLmRpcmVjdGl2ZSc7XG5cbi8qKlxuICogSW1wbMOpbWVudGUgbGEgc2Fpc2llIGQndW5lIGRhdGUgdmlhIHVuIGlucHV0IG91IHZpYSB1biBjYWxlbmRyaWVyIGFmZmljaGFudCBsZXMgam91cnMgZXQgbGVzIG1vaXMuXG4gKiBWYWxpZGF0b3IgZXN0IGltcGzDqW1lbnTDqSB1bmlxdWVtZW50IHBhciByYXBwb3J0IMOgIG1pbiBldCBtYXhcbiAqIEBzaW5jZSAwLjEwXG4gKiBAYXV0aG9yIHBmb250YW5ldFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWV4dC1kYXRlcGlja2VyLCBkc2ZyeC1kYXRlcGlja2VyJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBEc2ZyRm9ybUlucHV0TW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIERhdGVGb3JtYXREaXJlY3RpdmUsXG4gICAgRHNmckZvcm1TZWxlY3RNb2R1bGUsXG4gICAgQTExeU1vZHVsZSxcbiAgICBEc2ZyQ2FsZW5kYXJDb21wb25lbnQsXG4gICAgRHNmckkxOG5QaXBlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBEcm9wZG93bkNvbnRhaW5lckNvbXBvbmVudCxcbiAgICBmb3J3YXJkUmVmKCgpID0+IERhdGVNYXNrRGlyZWN0aXZlKSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyRGF0ZVBpY2tlckNvbXBv