UNPKG

@edugouvfr/ngx-dsfr-ext

Version:

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

1,063 lines (1,053 loc) 145 kB
import * as _angular_core from '@angular/core'; import { OnInit, AfterViewInit, OnDestroy, TemplateRef, ElementRef, EventEmitter, OnChanges, Signal, AfterContentInit, WritableSignal, ChangeDetectorRef, ViewContainerRef, Renderer2, DestroyRef } from '@angular/core'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { DefaultControlComponent, DsfrButtonType, DsfrButtonVariant, DsfrSelectOption, DsfrLink, DsfrSeverity, DsfrButtonComponent, DsfrLinkComponent, DsfrSize, DsfrButton, DsfrOption, DefaultValueAccessorComponent, DsfrSeverityConst, DsfrI18nService, DsfrModalAction, DsfrButtonVariantConst, DsfrHeadingLevel as DsfrHeadingLevel$1, DsfrBadge, DsfrTableOptions, DsfrColumn, DsfrSegmentedControl, DsfrTableState, DsfrTablePaginationEvent, DsfrSortColumn, DsfrTableComponent, DsfrFileSizeUnit } from '@edugouvfr/ngx-dsfr'; export { DsfrUserMenuComponent as DsfrProfileMenuComponent, DsfrToolLinkMenuComponent as DsfrToolsMenuComponent } from '@edugouvfr/ngx-dsfr'; import { Validator, AbstractControl, ValidationErrors } from '@angular/forms'; import { Observable } from 'rxjs'; import { BreakpointObserver } from '@angular/cdk/layout'; interface DsfrCompleteEvent { /** Browser event. */ originalEvent: Event; /** Selected option value. */ query: string; } type DsfrSuggestions = any[]; /** * Interface utilisée pour le contexte du template suggestionTemplate */ interface DsfrSuggestionContext { $implicit: any; index: number; } declare class DsfrAutocompleteComponent extends DefaultControlComponent<any> implements OnInit, AfterViewInit, OnDestroy { /** Template des suggestions, option en paramètre */ suggestionTemplate?: TemplateRef<DsfrSuggestionContext>; /** @internal viewport pour le virtualScroll */ viewport?: CdkVirtualScrollViewport; /** @internal le composant de saisie (<input>) */ inputComponent?: ElementRef; /** (form-input) type de l'input, 'text' ou 'search'. 'text' par défaut */ type: 'text' | 'search'; /** (form-input) champ obligatoire ou non, faux par défaut. */ required: boolean; /** (form-input) placeholder de l'input. */ placeholder?: string; /*** (form-input) Attribut maxLength de l'input. */ maxLength?: number; /** (form-input) ajoute un icone à droite dans le champ de saisie. */ icon?: string; /** (form-input) pattern de l'input.*/ pattern?: string; /** (form-input) ajout d'un style spécifique, permet par exemple de la limiter la largeur d'un input. */ customClass?: string; /** Emission de l'événement si le type du bouton est différent de `submit`. */ buttonSelect: EventEmitter<Event>; /*** (form-input) permet de désactiver le bouton d'action. 'false' par défaut. */ buttonDisabled: boolean; /*** (form-input) crée un combo champ + bouton si buttonIcon est renseigné */ buttonIcon?: string; /** (form-input) crée un combo champ + bouton si buttonLabel est renseigné */ buttonLabel?: string; /*** (form-input) tooltip message sur le bouton s'il y a lieu. */ buttonTooltipMessage?: string; /*** (form-input) type du button,'button' par défaut. */ buttonType: DsfrButtonType; /** (form-input) style du bouton, 'primary' par défaut. */ buttonVariant: DsfrButtonVariant; /** (form-input) [accessibilité] Spécifie le libellé qui sera retranscrit par les narrateurs d'écran. */ buttonAriaLabel?: string; /** (form-input) Change la mise en page d'un input accompagné d'un bouton. */ inputWrapMode: 'addon' | 'action'; /** * [accessibilité] Permet de masquer visuellement le libellé du bouton en le laissant accessible aux dispositifs d'assistance. * * A utiliser pour le bouton si icône seule. */ buttonLabelSrOnly: boolean; /** L'utilisateur doit traiter cet événement pour déclencher une méthode de recherche qui met à jour la propriété suggestions. */ filterChange: EventEmitter<DsfrCompleteEvent>; /** Emet la suggestion à la sélection de celle-ci */ suggestionSelect: EventEmitter<any>; /** Fermeture de la liste de suggestions */ listClose: EventEmitter<void>; /** Mode multiple : à la suppression d'une suggestion (tag) */ clearOptionSelect: EventEmitter<{ nativeEvent: Event; option: any; }>; /** Attacher l'élément de liste déroulante au 'body' ou a un container (réf. vers un élément #div ou nom de la classe du parent) */ appendTo: _angular_core.InputSignal<string | HTMLElement | undefined>; /** Propriété CSS z-index de la liste, par défaut supérieur aux composants 'lifted' DSFR */ zIndex: _angular_core.InputSignal<number | undefined>; /** Activer le filtre automatique sur l'autocomplete. Faux par défaut */ autoFilter: _angular_core.InputSignal<boolean>; /** Supprime la valeur de l'input si elle ne provient pas directement de la liste de suggestion. */ requireSelection: _angular_core.InputSignal<boolean>; /** Mode sélection multiple de valeurs */ multiple: _angular_core.InputSignal<boolean>; /** Mode multiple: Nombre max. d'options sélectionnables */ maxSelectedOptions: _angular_core.InputSignal<number | undefined>; /** Activer le virtual scroll */ virtualScroll: _angular_core.InputSignal<boolean>; /** Hauteur maximale avec unité avant le scroll sur la liste déroulante (correspond à la propriété css max-height) */ scrollHeight: _angular_core.InputSignal<string>; /** Surcharger la hauteur en px d'un item dans le cas du virtual scroll. Par défaut 24 (px). */ virtualScrollItemHeight: _angular_core.InputSignal<number>; /** Nom de la propriété correspondant à la valeur (string) affichée dans l'objet suggestion */ suggestionValueKey: _angular_core.InputSignal<string | undefined>; /** Optionnel : nom de la propriété correspond à la valeur de sélection dans l'objet suggestion. * Sans définition la sélection concerne tout l'objet suggestion */ selectedValueKey: _angular_core.InputSignal<string | undefined>; /** Afficher le spinner indiquant le chargement des suggestions */ loading: _angular_core.InputSignal<boolean>; /** Cache le label visuellement en le laissant disponible aux lecteurs d'écran. */ labelSrOnly: _angular_core.InputSignal<boolean>; /** 👓 Correspond à l'attribut `aria-label` */ ariaLabel: _angular_core.InputSignal<string | undefined>; /** 👓 Correspond à l'attribut `aria-invalid` */ ariaInvalid: _angular_core.InputSignal<string | undefined>; /** 👓 Correspond à l'attribut `aria-describedby` */ ariaDescribedby: _angular_core.InputSignal<string | undefined>; /** * Le délai (en millisecondes) pour déclencher l'événement de changement de saisie et de filtrage. * Par défaut la valeur est 0 */ delay: _angular_core.InputSignal<number>; /** Minimum de caractères nécessaires au déclenchement des suggestions. 1 par défaut */ minLength: _angular_core.InputSignal<number>; /** Liste des suggestions */ suggestions: _angular_core.InputSignal<any[]>; /** @internal value interne du dsfr-form-input */ valueInput: _angular_core.WritableSignal<string>; /** @internal */ readonly combinedAriaDescribedBy: _angular_core.Signal<string | null>; protected isExpanded: _angular_core.WritableSignal<boolean>; protected currentOptionIndex: _angular_core.WritableSignal<number>; protected statusMessageMultiple: string; protected listSelectedOptions: any[]; /** Nombre de résultats après une recherche (pas de valeur initiale = a11y) */ protected nbSuggestions: _angular_core.Signal<number>; /** Les suggestions filtrées en cas de autoFilter, égales aux suggestions sinon */ protected filteredSuggestions: _angular_core.WritableSignal<any[]>; private inputChange$; private notifyOnDestroy; /** Container HTML <ul> de la liste des suggestions */ private containerListElement; private readonly _cd; private readonly _i18n; private readonly _renderer; constructor(); /** Fonction de formatage de la valeur affichée dans l'input à la sélection d'une suggestion */ formatOnSelect: (selectedSuggestion: any) => string; ngOnInit(): void; ngAfterViewInit(): void; ngOnDestroy(): void; /** * Override writeValue pour setter la valeur de l'input programmatiquement à l'initialisation * @internal */ writeValue(value: any): void; /** @internal */ setDisabledState(isDisabled: boolean): void; /** * Le blur qui ajoute le statut touched ne doit se déclencher que si la liste est fermée * Pour éviter l'affichage d'erreurs de validation lorsque le clic est appuyé sur la selection d'une option * (touched et donc validation déclenchés trop tot) */ protected onFocusOut(): void; protected onToogleDisplayList(display: boolean): void; protected onInput(event: Event): void; /** Ouverture de la liste des suggestions au focus si le minLength est de 0, ou si l'input comporte déjà une valeur */ protected onFocusInput(): void; /** Gestion des touches de navigation. */ protected doKeyEvent(event: KeyboardEvent, options: any[]): void; protected onClickOption(suggestion: any, i: number): void; /** * Fermeture de la liste des suggestions à la sortie du champ * Mise a jour de la valeur dans le cas de requireSelection ou multiple * @param hasSelectOption l'utilisateur a cliqué ou sélectionné au clavier une option * */ protected updateValueAndCloseList(hasSelectOption?: boolean): void; /** * Gestion de l'attribut aria-selected * true: en mode multiple l'option est sélectionnée, en mode simple l'option est en focus */ protected isOptionSelected(i: number, option?: any): boolean; /** Méthode c/c de la même méthode qui existe du côté du composant form-input */ protected getWrapClasses(): string[]; /** * Gestion du focus à l'ouverture de la liste (evenement du dropdown-container) * @param el element ul de liste ou li courant */ protected handleListFocusOnOpen(listElement: HTMLElement): void; /** Emission de buttonSelect au niveau de form-input, seulement si le type du bouton n'est pas `submit` */ protected onInputButtonSelect(e: Event): void; /** Suppression d'une suggestion sélectionnée en mode multiple */ protected removeSuggestion(e: Event, optToRemove: any): void; /** Sélection d'une suggestion (clavier ou souris) */ private onOptionSelect; /** Filtrage apres input change+debounce */ private handleInputChange; /** * Filtre la liste avec la valeur * * La recherche se fait toujours à partir de : originalSuggestions * On valorise directement la propriété privée _suggestions sans passer par le setter (réservé à l'utilisateur) * afin de garder intact originalSuggestions */ private doAutoFilter; /** * Affichage visuel de l'option active (class selected, aria-activedescendant) a la nav. clavier ou selection souris * Scroll jusqu'a l'option en cas de navigation clavier * @param index index courant option active * @param hasClickOnOption selection a la souris */ private activateFocusOption; private addSelectedSuggestion; private handleNoSelectedSuggestion; /** * Ajoute la suggestion dans la liste si elle n'est pas déja présente et si le nombre d'options sélectionnées est inférieur à maxSelectedOptions * @param suggestion */ private addSuggestionMultiple; /** Initialisation de la liste des options programmatiquement sélectionné depuis suggestions */ private initSelectedOptionsList; /** Initialisation de l'option sélectionnée programmatiquement depuis suggestions */ private initSelectedOption; private resetValueAndIndex; /** * En mode virtualScroll le scroll doit se faire par la methode scrollToIndex de CDK virtualscroll * @param index index de l'option dans la liste gérée par cdkVirtualFor */ private manageScrollForVirtualScroll; /** Effacement de aria-activedescendant lorsque la liste est cachée ou l'input vide */ private resetAriaActiveDescendant; /** Get option dans la liste des options selon attribut HTML [data-index] */ private queryOptionFromDataIndex; private getSelectedValue; static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsfrAutocompleteComponent, never>; static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsfrAutocompleteComponent, "dsfr-ext-autocomplete, dsfrx-autocomplete", never, { "type": { "alias": "type"; "required": false; }; "required": { "alias": "required"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "maxLength": { "alias": "maxLength"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "pattern": { "alias": "pattern"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; "buttonDisabled": { "alias": "buttonDisabled"; "required": false; }; "buttonIcon": { "alias": "buttonIcon"; "required": false; }; "buttonLabel": { "alias": "buttonLabel"; "required": false; }; "buttonTooltipMessage": { "alias": "buttonTooltipMessage"; "required": false; }; "buttonType": { "alias": "buttonType"; "required": false; }; "buttonVariant": { "alias": "buttonVariant"; "required": false; }; "buttonAriaLabel": { "alias": "buttonAriaLabel"; "required": false; }; "inputWrapMode": { "alias": "inputWrapMode"; "required": false; }; "buttonLabelSrOnly": { "alias": "buttonLabelSrOnly"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "autoFilter": { "alias": "autoFilter"; "required": false; "isSignal": true; }; "requireSelection": { "alias": "requireSelection"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSelectedOptions": { "alias": "maxSelectedOptions"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; "isSignal": true; }; "virtualScrollItemHeight": { "alias": "virtualScrollItemHeight"; "required": false; "isSignal": true; }; "suggestionValueKey": { "alias": "suggestionValueKey"; "required": false; "isSignal": true; }; "selectedValueKey": { "alias": "selectedValueKey"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "labelSrOnly": { "alias": "labelSrOnly"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaInvalid": { "alias": "ariaInvalid"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "formatOnSelect": { "alias": "formatOnSelect"; "required": false; }; }, { "buttonSelect": "buttonSelect"; "filterChange": "filterChange"; "suggestionSelect": "suggestionSelect"; "listClose": "listClose"; "clearOptionSelect": "clearOptionSelect"; }, ["suggestionTemplate"], ["[label]"], true, never>; static ngAcceptInputType_maxLength: unknown; static ngAcceptInputType_buttonLabelSrOnly: unknown; } interface DsfrDateEvent { value?: string | DsfrRangeModel; date?: Date; } /** * 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 */ declare class DsfrCalendarComponent implements AfterViewInit, OnDestroy, OnInit, OnChanges { /** * Valeur initial de la date. * La valeur doit prendre la forme dd/mm/yyyy pour la locale fr et mm/dd/yyyy pour la locale en. */ value?: string | DsfrRangeModel; /** Force le focus sur la date courante à l'initialisation du composant */ autofocus: boolean; /** Id de l'élément correspondant au label de la grille de dates */ ariaLabelledBy: string; /** Modifie le mode de sélection du calendrier, entre `single` et `range` */ mode: DsfrCalendarMode; /** * Permet d'ignorer la valeur initiale de l'input `value` si celle ci est erronée. * (ex: date de début postérieure à date de fin) */ ignoreInitialValue: boolean; /** Emission de la date au format DsfrDateEvent */ dateChange: EventEmitter<DsfrDateEvent>; /** Evènement au changement d'affichage du calendrier (changement mois ou année) */ calendarChange: EventEmitter<Date>; protected previousMonth?: ElementRef<HTMLButtonElement>; protected nextMonth?: ElementRef<HTMLButtonElement>; protected monthSelect?: ElementRef<HTMLElement>; protected yearSelect?: ElementRef<HTMLElement>; protected tbody?: ElementRef<HTMLTableElement>; protected monthSelectOptions: DsfrSelectOption[]; protected yearSelectOptions: DsfrSelectOption[]; protected currentMonthIndex: number; protected currentYear: number; protected translatedMonthAbbreviations: string[]; protected translatedMonths: string[]; protected prevMonthLabel: string; protected nextMonthLabel: string; protected monthSelectLabel: string; protected yearSelectLabel: string; protected isMonoYear: boolean; protected isMonoMonth: boolean; protected readonly rows: any[]; protected readonly columns: any[]; private dayCells; private prevCodeLang; private focusDay; private selectedDay; private lastDate; private _min; private _max; private subscription; private firstDayOffset; private daysInMonth; private rangeStart; private rangeEnd; /** * Date de fin potentielle du range en cours de sélection, utilisée uniquement pour gérer la prévisualisation du range. */ private rangeEndPreview; private readonly i18n; private readonly langService; private readonly loggerService; constructor(); /** * @return Le code de la langue en cours */ get codeLang(): string; get min(): string | undefined; get max(): string | undefined; protected get isEnglishLocale(): boolean; /** * 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: string | undefined); /** * 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: string | undefined); /** @internal */ ngOnInit(): void; /** @internal */ ngOnDestroy(): void; /** @internal */ ngAfterViewInit(): void; /** @internal */ ngOnChanges(): void; /** * Permet de forcer le focus sur la date active, la dernière date focusée ou la date du jour par défaut. * * Cette méthode est notamment utilisée dans la gestion du calendrier embarqué dans une modale. */ focusDate(): void; /********************** * Event Handlers **********************/ protected handleCancelButton(event: Event): void; protected handleNextMonthButton(event: Event): void; protected handlePreviousMonthButton(event: Event): void; protected handleMonthSelectKeydown(event: KeyboardEvent): void; protected handleYearSelectKeydown(event: KeyboardEvent): void; protected handleDayClick(event: MouseEvent): void; protected handleDayMouseEnter(event: MouseEvent): void; /** * Permet d'éviter que la prévisualisation du range ne persiste lorsque le curseur de lasoursi est déplacé hors de * la table */ protected handleCalendarMouseLeave(): void; protected handleDayKeyDown(event: KeyboardEvent): void; /** * Gestion de la sélection dans la liste déroulante des mois * * @param selectedMonthIndex Index du mois sélectionné (indexage commençant à 1) */ protected handleMonthSelect(selectedMonthIndex: number): void; /** * Gestion de la sélection dans la liste déroulante des années * * @param selectedYear Année sélectionnée */ protected handleYearSelect(selectedYear: number): void; /** * Détermine si le jour correspondant à la cellule appartient au range en cours de sélection. */ protected isInRangePreview(row: number, col: number): boolean; private getDateFromCell; /** * Permet de calculer si le jour a focus est bien disponible dans le mois et l'année de destination après sélection * dans la liste déroulante. * * Dans le cas où l'on se trouve le 29 Février 2024 et où l'on change d'année grâce à la liste déroulante à 2023, * le jour a focus devrait être le 28 Février 2023. * * @param currentYear Année cible * @param selectedMonthIndex Mois cible * @param currentDay Jour courant dans le calendrier * @returns Le numéro du jour à focus */ private computeDayToFocus; /** * Formatage de la valeur dans la langue courante * @param value Valeur au format ISO ou dans la langue courante */ private reformatValue; /** * Gestion du changement de langue dans le composant. * * @param code Code de la locale à prendre en compte */ private onLangChange; /** * Mets à jour l'ensemble du Date Picker */ private updateCalendar; /** * Détermine la colonne à partir de laquelle le mois commence dans le calendrier. * * Cette colonne est dépendante du jour de la semaine mais également de la locale : le calendrier anglais a comme * première colonne le dimanche, contrairement au calendrier français pour lequel la première colonne est le lundi. * * @param firstDayOfMonth Index du premier jour de la semaine * @returns Index de la colonne où commence le mois */ private getCurrentMonthStartingColumn; /** * Mise à jour des valeurs des deux listes déroulantes, mois et année. */ private updateMonthAndYearSelects; /** * Mise à jour de l'état d'une cellule de la table en fonction de : * - si elle se trouve dans le mois, * - si elle se trouve en dehors des dates limites, * - si elle est sélectionnée. * * @param tdElement Une cellule td du tableau * @param outsideOfCurrentMonth boolean true si le jour fait partie du mois ou non * @param cellDate jour correspondant à la cellule */ private updateCell; private setCellAsFocusable; private setCellAsSelected; private setCellAsInsideRangeBoundary; private setCellDataDate; private setCellText; private setCellAsOutOfBounds; private setCellAsDisabled; /** * Suppression des éléments ayant pu être attribués durant le rendu de la grille * * @param tdElement */ private resetCellAttributes; /** * Initie le changement de focus de la date. * * @param targetDate Date cible attendue */ private moveFocusToDay; /** * Met à jour le tabindex de toutes les cellules de la grille. * * Nécessaire pour rendre un élement de la table focusable. * * @param autofocus Permet de forcer le focus sur l'élément défini comme étant à tabindex 0. Valeur par défaut à true. */ private updateTableCellsTabIndex; /** * Force le focus sur la limite min ou max d'un mois pour éviter que le focus soit indisponible. * * Exemple: L'utilisateur sélectionne le 17 Juillet 2024. Il décide ensuite de changer de mois via la liste * déroulante et cible Octobre. Cependant, la date max donnée au date picker est le 10 Octobre 2024. Etant incapable * de focus cette date au retour du focus dans la grille, la nouvelle date de focus bascule alors à la date max déterminée, * cad. le 10 Octobre 2024. * * @param boundary type du boundary à prendre en compte, entre le min et le max */ private autoFocusBoundaryDate; private initializeCalendar; private getNumberOfDaysInMonth; /** * Calcule la date cible en fonction de la date actuelle et du nombre de mois à ajouter ou enlever à cette dernière. * * @param currentDate Date actuelle * @param monthsOffset Nombre de mois à ajouter ou enlever à la date actuelle * @returns La date cible */ private computeTargetDateWithMonthOffset; private moveToNextYear; private moveToPreviousYear; private moveToNextMonth; private moveToPreviousMonth; private moveFocusToNextDay; private moveFocusToNextWeek; private moveFocusToPreviousDay; private moveFocusToPreviousWeek; private moveFocusToFirstDayOfWeek; private moveFocusToLastDayOfWeek; /** * Vérifie que le jour cliqué est sélectionnable en fonction de si il est disabled et de si le jour cliqué est * le même que celui en cours de sélection en mode "range". * * @param domNode La date cliquée * @returns Un booléen confirmant que la date cliquée est sélectionnable */ private isDaySelectable; private getDayFromDataDateAttribute; /** * Mets à jour la valeur du composant et émets un événement de type DsfrDateEvent. * Cette emission peut être omise via le paramètre booléen skipEmission, notamment à l'initialisation du composant. * @param value * @private */ private setSingleModeNewValue; /** * Mets à jour la valeur de période du composant en fonction de la nouvelle date donnée, et émets un événement de type DsfrDateEvent. * Cette emission peut être omise via le paramètre booléen skipEmission, notamment à l'initialisation du composant. * @private */ private setRangeModeNewIndividualValue; /** * Mets entièrement à jour la valeur de période du composant et émets un événement de type DsfrDateEvent. * Cette emission peut être omise via le paramètre booléen skipEmission, notamment à l'initialisation du composant. * @param value * @private */ private setNewRangeValue; /** * Valorise la date de l'input suite à la sélection d'une date dans le calendrier * @param domNode cellule td du calendrier telle que 'data-date' contienne la date ISO, ex : data-date="2024-05-28". * - i18n : le code de formatage fait appel à DateUtils */ private updateCalendarValue; /** * Positionne la date du calendrier à partir de * - i18n : la date est obtenue à partir de DateUtils */ private computeInitialDate; private initializeFocusAndSelectedDay; /** * @param date date * @returns true si la data 'd' est dans l'intervalle [min, max] du cou */ private inMinMaxRange; private computeMonthSelectOptions; private computeYearSelectOptions; private updateMonthTranslations; private isValidIso; /** * Dans le cas d'un changement de mois ou d'année dans le calendrier, cette fonction détermine le type de butée atteinte * dans le cas ou le nouveau focusDay se trouverait en dehors des dates min ou max, uniquement dans un mois contenant lesdits min ou max. * * Exemple: Le focusDay est le 20 Juin 2024 et la date max le 15 Juillet 2024. Si l'utilisateur navigue vers le mois de Juillet via la * liste déroulante ou la flèche de "Mois suivant", getReachedBoundary retourne 'max', qui est le type de butée atteinte. * * @returns Retourne le type de butée atteinte (min ou max) ou undefined si aucune butée n'est atteinte ou qu'aucun focusDay n'est valide pour * cette date. */ private getReachedBoundary; private computeMonoYearAndMonoMonth; /** * Vérifie si la date active du composant se trouve dans les limites données du composant. * * @param date * @returns Un booléen indiquant si la date se trouve bien entre les limites minimum et maximum données. */ private isInBounds; /** * Attribue la valeur sélectionnée à l'index correspondant dans `value`, en fonction de si il doit être remis * à jour, et de si l'une des deux valeurs est déjà prise en compte. * * @param newValue * @param reset * @returns Un booléen indiquant si la plage de date est complètement formée. */ private setIndividualRangeValue; static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsfrCalendarComponent, never>; static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsfrCalendarComponent, "dsfr-ext-calendar, dsfrx-calendar", never, { "value": { "alias": "value"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "ignoreInitialValue": { "alias": "ignoreInitialValue"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; }, { "dateChange": "dateChange"; "calendarChange": "calendarChange"; }, never, never, true, never>; static ngAcceptInputType_autofocus: unknown; static ngAcceptInputType_ignoreInitialValue: unknown; } type DsfrRangeModel = [string | undefined, string | undefined]; type DsfrDefinedRangeModel = [string, string]; type DsfrCalendarMode = 'single' | 'range'; declare class DsfrCalendarModalComponent implements AfterViewInit, OnDestroy { /** * 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. */ min: string; /** * 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. */ max: string; /** * Valeur de l'attribut aria-label du bouton d'ouverture de la modale. */ ariaLabel: string; /** * Message du `tooltip` (attribut `title` du bouton) ou ajout d'un `span` en `sr-only` si pas de label. */ tooltipMessage: string; /** * Valeur de l'attribut disabled du bouton d'ouverture de la modale. */ disabled: boolean; /** Modifie le mode de sélection du calendrier, entre `single` et `range` */ mode: DsfrCalendarMode; /** * Permet d'ignorer la valeur initiale de l'input `value`si celle ci est erronée * (ex: date de début postérieure à date de fin) */ ignoreInitialValue: boolean; /** * Emission de la date au format DsfrDateEvent */ dateChange: EventEmitter<DsfrDateEvent>; protected modal: ElementRef<HTMLDivElement>; protected calendar: DsfrCalendarComponent; /** * Id aléatoire, unique, de la modale (le calendrier) */ protected modalId: string; protected ariaLabelTitleModal: string; protected isOpen: boolean; protected dialogTitle: string; protected translatedMonths: string[]; protected dialogTriggerBtnNode: HTMLButtonElement | undefined; private _value; private currentMonthIndex; private currentYear; private subscription; private readonly elementRef; private readonly i18n; private readonly logger; constructor(); get value(): string | DsfrRangeModel | undefined; /** * Valeur initial de la date. * La valeur doit prendre la forme dd/mm/yyyy pour la locale fr et mm/dd/yyyy pour la locale en. */ set value(value: string | DsfrRangeModel | undefined); ngAfterViewInit(): void; ngOnDestroy(): void; /** * Gère le clic en dehors de la modale */ protected onCalendarOutside(): void; protected handleTriggerBtnClick(): void; protected handleDataChange(dateEvent: DsfrDateEvent): void; protected handleModalKeydown(keyEvent: KeyboardEvent): void; protected handleCancelButton(): void; /** * Met à jour le titre de la dialog (visuellement caché) pour les besoins d'accessibilité. */ private updateDialogTitle; /** * 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 */ private close; private updateMonthTranslations; /** * Gestion du changement de langue dans le composant. * * @param code Code de la locale à prendre en compte */ private onLangChange; /** * Mise à jour des valeurs des deux listes déroulantes, mois et année. */ private updateMonthIndexAndYear; static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsfrCalendarModalComponent, never>; static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsfrCalendarModalComponent, "dsfr-ext-calendar-modal, dsfrx-calendar-modal", never, { "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": true; }; "tooltipMessage": { "alias": "tooltipMessage"; "required": true; }; "disabled": { "alias": "disabled"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "ignoreInitialValue": { "alias": "ignoreInitialValue"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "dateChange": "dateChange"; }, never, never, true, never>; } interface DsfrSlide { /** Url de l'image de l'entête. */ imagePath?: string; /** Texte alternatif de l'image, obligatoire si image renseigné. */ alt?: string; /** Titre associé à l'image, optionnel */ caption?: string; /** Description associée à l'image, optionnel */ content?: string; /** Lien associé, optionnel */ link?: DsfrLink; /** Données supplémentaires associées, optionnel */ data?: DsfrLink; } /** * Interface utilisée pour le contexte du template templateSlide */ interface DsfrSlideContext { $implicit: DsfrSlide; index: number; } declare const DEFAULT_INTERVAL: number; declare class DsfrCarouselComponent implements OnInit, OnDestroy, AfterViewInit { /** @internal */ slidesContainer?: ElementRef; /** @internal */ templateSlide?: TemplateRef<DsfrSlideContext>; /** Identifiant du champ, généré automatiquement par défaut. */ carouselId?: string; /** Attribut aria-label du composant */ ariaLabel?: string; /** Défilement automatique, faux par défaut */ autoplay: boolean; /** Indique si le carrousel boucle ou non, vrai par défaut. */ circular: boolean; interval: number; /** Indique si le carrousel doit réagir aux événements du clavier, vrai par défaut. */ keyboard: boolean; /** Tableau de slides. */ slides: DsfrSlide[]; /** Taille maximale du container de slides (optionnel) */ maxWidth?: string; /** Indique si le carrousel doit prendre en charge les interactions par balayage gauche/droite sur les appareils à écran tactile, vrai par défaut. */ touch: boolean; /** Avec les contrôles de chaque côté des slides. */ withControls: boolean; /** Avec des indicateurs d'avancement. */ withIndicators: boolean; /** Avec des indicateurs d'avancement. */ inverse: boolean; /** Afficher les indicateur et contrôles à l'intérieur de l'image */ withControlsInside: boolean; /** Dans le cas de controlsInside à l'interieur, place les indicateur sur un fond noir en couleurs inversées */ reverseColorsIndicators: boolean; /** Avec des labels. */ withCaptions: boolean; /** Désactiver l'animation de transition */ disableTransition: boolean; /** Au changement de slide, emission de l'index du slide actif */ carouselChange: EventEmitter<number>; /** @internal Le carousel est en pause et ne restart que si l'utilisateur clique explicitement sur play */ onPause: boolean; /** @internal */ transition: boolean; private i18n; /** Slide courant. */ private _current; /** Id du timer */ private timeoutId; /** Evénements touch */ private startPoint; private renderer; private transitionListener; constructor(); /** * @internal * Duplique le premier et dernier slide pour l'effet de transition circulaire */ get visibleSlides(): DsfrSlide[]; get current(): number; private set current(value); ngOnInit(): void; ngOnDestroy(): void; ngAfterViewInit(): void; /** * Spécifique mobile * @internal */ onTouchStart(event: TouchEvent): void; /** * Spécifique mobile * @internal */ onTouchEnd(event: TouchEvent): void; /** @internal */ onKeydown(event: KeyboardEvent): void; /** * Transition vers le slide précédent * @internal */ previous(origin?: 'user' | 'timer'): void; /** * Transition vers le slide suivant * @internal */ next(origin?: 'user' | 'timer'): void; /** @internal */ togglePlayPause(): void; /** * @internal * Lance le carousel si en autoplay et non explicitement sur pause */ startSlideshow(): void; /** * @internal * Stoppe le carousel */ stopSlideshow(): void; /** Effet de transition des slides */ private getTransform; private toggleSlideshow; /** * Gestion de l'affichage avant le premier et apres le dernier slide en mode circulaire */ private handleFirstLastTransition; static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsfrCarouselComponent, never>; static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsfrCarouselComponent, "dsfrx-carousel, dsfr-ext-carousel", never, { "carouselId": { "alias": "carouselId"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "autoplay": { "alias": "autoplay"; "required": false; }; "circular": { "alias": "circular"; "required": false; }; "interval": { "alias": "interval"; "required": false; }; "keyboard": { "alias": "keyboard"; "required": false; }; "slides": { "alias": "slides"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "touch": { "alias": "touch"; "required": false; }; "withControls": { "alias": "withControls"; "required": false; }; "withIndicators": { "alias": "withIndicators"; "required": false; }; "inverse": { "alias": "inverse"; "required": false; }; "withControlsInside": { "alias": "withControlsInside"; "required": false; }; "reverseColorsIndicators": { "alias": "reverseColorsIndicators"; "required": false; }; "withCaptions": { "alias": "withCaptions"; "required": false; }; "disableTransition": { "alias": "disableTransition"; "required": false; }; }, { "carouselChange": "carouselChange"; }, ["templateSlide"], never, true, never>; static ngAcceptInputType_autoplay: unknown; static ngAcceptInputType_withControls: unknown; static ngAcceptInputType_withIndicators: unknown; static ngAcceptInputType_inverse: unknown; static ngAcceptInputType_withControlsInside: unknown; static ngAcceptInputType_reverseColorsIndicators: unknown; static ngAcceptInputType_withCaptions: unknown; static ngAcceptInputType_disableTransition: unknown; } /** * Réprésente un message + sévérité. */ interface MessageViewModel { text?: string | string[]; severity?: DsfrSeverity; } /** * 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 */ declare class DsfrDatePickerComponent extends DefaultControlComponent<string | DsfrRangeModel> implements OnInit, AfterViewInit, Validator, OnDestroy { /** * Indique si la date est obligatoire. */ required: boolean; /** * Indique si le masque de saisie doit être affiché ou non. */ showMask: boolean; /** * Cache le Label visuellement en le laissant disponible aux lecteurs d'écran. */ labelSrOnly: boolean; /** * Indique la valeur de la propriété css z-index de la modale du composant. */ zIndex?: number; /** Attacher l'élément de liste déroulante au 'body' ou a un container (réf. vers un élément #div ou nom de la classe du parent) */ appendTo?: 'body' | HTMLElement | string; /** Modifie le mode de sélection du datepicker, entre `single` et `range` */ mode: DsfrCalendarMode; /** Force l'utilisation du mode regular pour la légende du fieldset en mode range */ rangeLegendRegular: boolean; /** Emission de la date.*/ dateChange: EventEmitter<DsfrDateEvent>; protected calendar?: DsfrCalendarComponent; protected controlSingle?: ElementRef; protected controlRange?: ElementRef; protected modal?: ElementRef<HTMLDivElement>; /** * Presentation Model pour la priorisation des messages. */ protected readonly messageDateViewModel: Signal<MessageViewModel>; protected currentMonthIndex: number; protected currentYear: number; protected translatedMonthAbbreviations: string[]; protected translatedMonths: string[]; protected calendarHeading: string; protected modalLabel: string; protected startDate: string | undefined; protected endDate: string | undefined; /** Permet d'ignorer la valeur passée en input à l'ouverture de la modale, notamment si cette valeur est invalide */ protected ignoreCalendarInitialValue: boolean; /** Gère l'annonce de la date/période sélectionnée à la fermeture de la modale (si sélection effective) */ protected statusMessage: string | undefined; /** * Placeholder par défaut de l'input. Dépend de la langue 'jj/mm/aaaa' ou 'mm/dd/yyyy' */ protected placeholder: string | undefined; /** * Id aléatoire, unique, de la modale (le calendrier) */ protected modalId: string; protected isOpen: boolean; protected buttonLabelChoose: string; protected buttonLabelRangeChoose: string; protected dropdownContainerControlElement: HTMLElement | undefined; private dialogTriggerBtnNode; private prevCodeLang; private dayLabels; private monthLabels; private _min; private _max; /** * Message d'information lié au composant. */ private readonly _message; /** * Représente la sévérité du message. */ private readonly _messageSeverity; /** * Messages d'erreurs relatifs à une validation interne spécifique au composant. */ private readonly _internalError; private readonly cdr; private readonly elementRef; private readonly i18n; private readonly langService; private readonly logger; /** @internal */ constructor(); get value(): string | DsfrRangeModel | undefined; /** * @return Le code de la langue en cours */ get codeLang(): string; /** * @internal */ get min(): string | undefined; /** * @internal */ get max(): string | undefined; protected get isEnglishLocale(): boolean; set value(value: string | DsfrRangeModel | undefined); /** * 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: string | undefined); /** * 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: string | undefined); ngOnInit(): void; ngOnDestroy(): void; ngAfterViewInit(): void; /** * From Validator interface. * * @internal */ validate(control: AbstractControl): ValidationErrors | null; /** * Surcharge de ControlValueAccessor#writeValue permettant potentiellement de corriger le format de la valeur saisie * avant enregistrement dans le modèle. * @internal */ writeValue(value: string | DsfrRangeModel | undefined): void; /** * Il faut écouter focusout et non blur car ce dernier ne bubble pas donc le composant parent ne le capte pas. */ protected onInputSingleFocusout(): void; /** * Il faut écouter focusout et non blur car ce dernier ne bubble pas donc le composant parent ne le capte pas. */ protected onInputRangeFocusout(): void; /** * La date de début ou de fin du range vient d'être modifiée. Il faut appeler la fonction enregistrée via * registerOnChange pour indiquer à Angular que la value a changé et qu'il doit revalider le modèle. */ protected onRangeModelChange(): void; /** * Mise a jour du titre lors de la navigation dans le calendrier. */ protected onUpdateCalendarView(date: Date): void; /** * Gère le clic en dehors de la modale */ protected onCalendarOutside(): void; protected handleTriggerButtonClick(event: Event): void; protected handleTriggerButtonKeydown(event: KeyboardEvent): void; protected handleCancelButton(event: Event): void; protected handleModalKeydown(keyEvent: KeyboardEvent): void; protected onCalendarVisible(): void; protected onCalendarDateChange(dateEvent: DsfrDateEvent): void; private formatValue; private containsMaskLiteral; /** * Met à jour l'étiquette accessible du calendrier (visuellement cachée). */ private updateCalendarHeading; /** * Gère la validation interne de la date pour les critères de date min et date max. * * @param showMessage * * @returns `true` en cas d'erreur, false sinon. */ private handleInternalValidation; private handleSingleModeInternalValidation; private handleRangeModeInternalValidation; private processError; private parseAsDateObject; /** * Changement de la valeur de l'input et formatage dans la langue courante * @param value Valeur au format ISO ou dans la langue courante */ private reformatSingleModeValue; /** * Changement de la valeur de l'input et formatage dans la langue courante * @param value Valeur au format ISO ou dans la langue courante */ private reformatRangeModeValue; /** * Gestion du changement de langue dans le composant. * * @param code Code de la locale à prendre en compte */ private onLangChange; private reformatForNewCodeLang; /** * Ouvre la modale. */ private open; /** * 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 */ private close; /** * 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 */ private announceNewValue; private announceNewValueInSingleMode; private announceNewValueInRangeMode; private updateMonthTranslations; private isValidIso; /** * Mise à jour du mois et de l'année pour le titre de la modale. */ private updateMonthIndexAndYear; static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsfrDatePickerComponent, never>; static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsfrDatePickerComponent, "dsfr-ext-datepicker, dsfrx-datepicker", never, { "required": { "alias": "required"; "required": false; }; "showMask": { "alias": "showMask"; "required": false; }; "labelSrOnly": { "alias": "labelSrOnly"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "rangeLegendRegular": { "alias": "rangeLegendRegular"; "required": false; }; "value": { "alias": "value"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; }, { "dateChange": "dateChange"; }, never, ["[label]", "[label]", "[label]"], true, never>; static ngAcceptInputType_rangeLegendRegular: unknown; } /** * Composant affichage d'un groupe de menu dropdown */ declare class DsfrDropdownMenuGroupComponent implements AfterViewInit { showSeparator: boolean; protected element: ElementRef<any>; /** * Ajout d'un wrapper <li> avec role presentation * si showSeparator, ajout d'un separateur apres ce li */ ngAfterViewInit(): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsfrDropdownMenuGroupComponent, never>; static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsfrDropdownMenuGroupComponent, "dsfrx-dropdownmenu-group, dsfr-ext-dropdownmenu-group", never, { "showSeparator": { "alias": "showSeparator"; "required": false; }; }, {}, never, ["*"], true, never>; static ngAcceptInputType_showSeparator: unknown; } /** * Composant affichage d'un menuitem ou d'un menuitemcheckbox du composant dropdown-menu */ declare class DsfrDropdownMenuItemComponent implements AfterViewInit, AfterContentInit, OnDestroy { type: undefined | 'checkbox' | 'radio'; selectItem: EventEmitter<Event>; button: DsfrButtonComponent | undefined; link: DsfrLinkComponent | undefined; _anchorElement: HTMLElement | undefined; _checked: boolean; private readonly elementRef; private readonly renderer; private _unlistenFn; get checked(): boolean; set checked(value: boolean); /** * Positionner les classes CSS si dsfr-button ou dsfr-link */ ngAfterContentInit(): void; /** * Positionnement des éléments dans le DOM pour l'accessi