@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
JavaScript
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