import { FocusMonitor } from '@angular/cdk/a11y';
import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
import { AfterContentInit, AfterViewInit, ChangeDetectorRef, DoCheck, ElementRef, EventEmitter, OnDestroy, TemplateRef } from '@angular/core';
import { ControlValueAccessor, FormGroupDirective, NgControl, NgForm } from '@angular/forms';
import { CanDisable, CanUpdateErrorState, ErrorStateMatcher } from '@angular/material/core';
import { MatFormFieldControl } from '@angular/material/form-field';
import { MatInput } from '@angular/material/input';
import { IDejaChipsComponentCloseEvent } from '@deja-js/component/chips';
import { DejaChildValidatorDirective, DejaConnectionPositionPair, MediaService } from '@deja-js/component/core';
import { DejaItemComponent, DejaItemEvent, DejaItemsEvent, GroupingService, IItemBase, IItemTree, ItemListBase, ItemListService, IViewListResult, IViewPort, SortingService, ViewPortService } from '@deja-js/component/core/item-list';
import { Observable, Subject } from 'rxjs';
import * as i0 from "@angular/core";
export declare type SelectType = 'autocomplete' | 'multiselect' | 'select';
/** Combo box avec une liste basée sur la treelist */
export declare class DejaSelectComponent extends ItemListBase<unknown> implements CanUpdateErrorState, CanDisable, DoCheck, MatFormFieldControl<unknown>, ControlValueAccessor, OnDestroy, AfterViewInit, AfterContentInit {
    viewPort: ViewPortService;
    private fm;
    private elementRef;
    ngControl: NgControl;
    private parentForm;
    private parentFormGroup;
    private defaultErrorStateMatcher;
    static nextId: number;
    id: string;
    describedBy: string;
    _waiter: boolean;
    inputElement: ElementRef;
    _disabled: boolean;
    _readonly: boolean;
    /** Texte à afficher par default dans la zone de recherche */
    /** Texte affiché si aucune donnée n'est présente dans le tableau */
    nodataholder: string;
    /** Offset de position horizontal de la zone de dropdown */
    overlayOffsetX: number;
    /** Offset de position vertical de la zone de dropdown */
    overlayOffsetY: number;
    /** Nom de classe du backdrop */
    overlayBackdropClass: string;
    /** Nom de classe du container de la liste */
    overlayContainerClass: string;
    /** Permet de définir un template de ligne par binding */
    itemTemplateExternal: TemplateRef<unknown>;
    /** Permet de définir un template de ligne parente par binding. */
    parentItemTemplateExternal: TemplateRef<unknown>;
    /** Permet de définir un template pour le loader par binding. */
    loaderTemplateExternal: TemplateRef<unknown>;
    /** Exécuté lorsque le calcul du viewPort est terminé. */
    readonly viewPortChanged: EventEmitter<IViewPort>;
    /** Exécuté lorsque l'utilisateur sélectionne ou désélectionne une ligne. */
    readonly selectedChange: EventEmitter<DejaItemsEvent<unknown> | DejaItemEvent<unknown>>;
    /** For test only. */
    readonly dropDownVisibleChange: EventEmitter<boolean>;
    itemTemplateInternal: TemplateRef<unknown>;
    parentItemTemplateInternal: TemplateRef<unknown>;
    selectedTemplate: TemplateRef<unknown>;
    protected input: MatInput;
    /** Overlay pane containing the options. */
    private overlay;
    private loaderTemplateInternal;
    get shouldLabelFloat(): boolean;
    controlType: string;
    errorState: boolean;
    errorStateMatcher: ErrorStateMatcher;
    stateChanges: Subject<void>;
    /** Internal use */
    overlayOwnerElement: HTMLElement;
    dropDownMaxHeight: number;
    protected _keyboardNavigation: boolean;
    protected isMobile: boolean;
    private mouseUp$sub;
    private _type;
    private selectingItemIndex;
    private dropDownQuery;
    private filterExpression;
    private _dropdownVisible;
    private lastScrollPosition;
    private _selectionClearable;
    private _dropDownWidth;
    private _query;
    private _required;
    private _placeholder;
    private _focused;
    private clearFilterExpression$;
    private filterListComplete$;
    private storeScrollPosition$;
    private hideDropDown$;
    private showDropDown$;
    private filter$;
    private query$;
    private writeValue$;
    private contentInitialized$;
    private keyboardNavigation$;
    private delaySearchTrigger$;
    private _modelIsValue;
    /** Définit une valeur indiquant si en reactive form le model renvoyé doit être un object ou une valeur */
    set modelIsValue(value: BooleanInput);
    get modelIsValue(): BooleanInput;
    private _positions;
    set positions(value: DejaConnectionPositionPair[] | string);
    get positions(): DejaConnectionPositionPair[] | string;
    set dropDownWidth(value: NumberInput);
    get dropDownWidth(): NumberInput;
    get keyboardNavigation(): boolean;
    get required(): boolean;
    set required(req: boolean);
    /**
     * Placeholder of the input
     */
    get placeholder(): string;
    set placeholder(plh: string);
    get empty(): boolean;
    get focused(): boolean;
    set options(options: DejaItemComponent[]);
    constructor(changeDetectorRef: ChangeDetectorRef, viewPort: ViewPortService, fm: FocusMonitor, elementRef: ElementRef<HTMLElement>, ngControl: NgControl, parentForm: NgForm, parentFormGroup: FormGroupDirective, mediaService: MediaService, defaultErrorStateMatcher: ErrorStateMatcher);
    /** Correspond au model du champ de filtrage ou recherche */
    set query(value: string);
    get query(): string;
    /** Temps d'attente en ms avant que la recherche dans la liste soit lancée lorsque l'utilisateur tape dans le select */
    set delaySearchTrigger(value: number);
    /** Définit la longueur minimale de caractères dans le champ de recherche avant que la recherche ou le filtrage soient effectués */
    set minSearchlength(value: NumberInput);
    get minSearchlength(): NumberInput;
    /** Permet de désactiver le select */
    set disabled(value: boolean);
    get disabled(): boolean;
    /** Indique ou détermine si le bouton pour effacer la selection doit être affiché */
    set selectionClearable(value: BooleanInput);
    get selectionClearable(): BooleanInput;
    set hideSelected(value: BooleanInput);
    /** Renvoie une valeur indiquant si les éléments selectionés doivent être masqué de la liste déroulante. */
    get hideSelected(): BooleanInput;
    /** Définit la ligne courant ou ligne active */
    set currentItem(item: IItemBase<unknown>);
    /** Définit le nombre de lignes à sauter en cas de pression sur les touches PageUp ou PageDown */
    set pageSize(value: NumberInput);
    /** Retourne le nombre de lignes à sauter en cas de pression sur les touches PageUp ou PageDown */
    get pageSize(): NumberInput;
    /** Définit un texte de conseil en cas d'erreur de validation ou autre */
    set hintLabel(value: string);
    /** Retourne un texte de conseil en cas d'erreur de validation ou autre */
    get hintLabel(): string;
    /** Définit la hauteur d'une ligne pour le calcul du viewport en pixels (la valeur par défaut sera utilisée si aucune valeur n'est définie). */
    set viewPortRowHeight(value: NumberInput);
    /**
     * Les trois valeurs acceptés en paramètre se trouvent dans l'enum ViewportMode (disabled, fixed, variable, auto)
     * Attention, une désactivation du viewport dégrade considérablement les performances de la liste et ne doit pas être activée si la liste
     * est suceptible de contenir beaucoup d'éléments.
     */
    set viewportMode(mode: string);
    /** Retourne le champ utilisé pour la liste des enfants d'un parent */
    set childrenField(value: string);
    /** Définit le champ utilisé pour la liste des enfants d'un parent */
    get childrenField(): string;
    /** Définit le champ à utiliser comme valeur d'affichage. */
    set textField(value: string);
    /** Retourne le champ à utiliser comme valeur d'affichage. */
    get textField(): string;
    /** Définit le champ à utiliser comme valeur de comparaison. */
    set valueField(value: string);
    /** Retourne le champ à utiliser comme valeur de comparaison. */
    get valueField(): string;
    /** Définit le champ à utiliser comme champ de recherche.
     * Ce champ peut indiquer, un champ contenant une valeur, un texte indexé, ou une fonction.
     */
    set searchField(value: string);
    /** Retourne le champ à utiliser comme champ de recherche.
     * Ce champ peut indiquer, un champ contenant une valeur, un texte indexé, ou une fonction.
     */
    get searchField(): string;
    set type(type: SelectType);
    get type(): SelectType;
    /**
     * Set an observable called before the list will be displayed
     */
    set loadingItems(fn: (query: string | RegExp, selectedItems: IItemBase<unknown>[]) => Observable<IItemBase<unknown>[]>);
    /**
     * Set a promise or an observable called before an item selection
     */
    set selectingItem(fn: (item: IItemBase<unknown>) => Promise<IItemBase<unknown>> | Observable<IItemBase<unknown>>);
    /**
     * Set a promise or an observable called before an item deselection
     */
    set unselectingItem(fn: (item: IItemBase<unknown>) => Promise<IItemBase<unknown>> | Observable<IItemBase<unknown>>);
    /**
     * Set a promise or an observable called before an item expand
     */
    set expandingItem(fn: (item: IItemTree<unknown>) => Promise<IItemTree<unknown>> | Observable<IItemTree<unknown>>);
    /**
     * Set a promise or an observable called before an item collapse
     */
    set collapsingItem(fn: (item: IItemTree<unknown>) => Promise<IItemTree<unknown>> | Observable<IItemTree<unknown>>);
    /** Retourne si le select est en mode select, donc en lecture seule. */
    get isModeSelect(): boolean;
    /** Retourne si le select est en mode autocomplete */
    get isModeAutocomplete(): boolean;
    /** Définit la liste des éléments selectionés en mode multiselect */
    set selectedItems(value: IItemBase<unknown>[]);
    /** Retourne la liste des éléments selectionés en mode multiselect */
    get selectedItems(): IItemBase<unknown>[];
    /** Définit l'éléments selectioné en mode single select */
    set selectedItem(value: IItemBase<unknown>);
    /** Retourne l'élément selectioné en mode single select */
    get selectedItem(): IItemBase<unknown>;
    /** Définit le model selectioné en mode single select */
    set selectedModel(value: unknown[] | unknown);
    /** Retourne le model selectioné en mode single select */
    get selectedModel(): unknown;
    /** Définit la liste des models selectionés en mode multiselect */
    set selectedModels(value: unknown[]);
    /** Retourne la liste des models selectionés en mode multiselect */
    get selectedModels(): unknown[];
    /** Definit le service de liste utilisé par ce composant. Ce service permet de controller dynamiquement la liste, ou de faire du lazyloading. */
    set itemListService(itemListService: ItemListService<unknown>);
    /** Retourne le service de liste utilisé par ce composant. Ce service permet de controller dynamiquement la liste, ou de faire du lazyloading. */
    get itemListService(): ItemListService<unknown>;
    /** Definit le service utilisé pour le tri de la liste */
    set sortingService(value: SortingService);
    /** Definit le service utilisé pour le regroupement de la liste */
    set groupingService(value: GroupingService);
    /** Definit si le waiter doit être affiché dans le select. */
    set waiter(value: boolean);
    /** Retourne si le waiter doit être affiché dans le select. */
    get waiter(): boolean;
    /** Définit la liste des éléments au format IItemBase */
    set items(items: IItemBase<unknown>[] | Promise<IItemBase<unknown>[]> | Observable<IItemBase<unknown>[]>);
    /** Définit la liste des éléments (tout type d'objet métier) */
    set models(items: unknown[] | Observable<unknown[]>);
    /** Retourne le nombre de niveau pour une liste hierarchique */
    get depthMax(): number;
    /** Définit la hauteur maximum avant que le composant affiche une scrollbar
     * spécifier une grande valeur pour ne jamais afficher de scrollbar
     * Spécifier 0 pour que le composant determine sa hauteur à partir du container
     */
    set maxHeight(value: number);
    /** Retourne la hauteur maximum avant que le composant affiche une scrollbar
     * spécifier une grande valeur pour ne jamais afficher de scrollbar
     * Spécifier 0 pour que le composant determine sa hauteur à partir du container
     */
    get maxHeight(): number;
    set readonly(value: boolean);
    /** Retourne une valeur indiquant si le composant est en lecture seule */
    get readonly(): boolean;
    protected set inputValidatorDirective(value: DejaChildValidatorDirective);
    private set currentItemIndex(value);
    private get currentItemIndex();
    get itemTemplate(): TemplateRef<unknown>;
    get parentItemTemplate(): TemplateRef<unknown>;
    private get htmlInputElement();
    get loaderTemplate(): TemplateRef<unknown>;
    get dropdownVisible(): boolean;
    get value(): IItemBase<unknown> | IItemBase<unknown>[];
    set value(val: IItemBase<unknown> | IItemBase<unknown>[]);
    writeValue(value: IItemBase<unknown> | IItemBase<unknown>[]): void;
    registerOnChange(fn: (_a: unknown) => void): void;
    registerOnTouched(fn: () => void): void;
    setDisabledState(isDisabled: boolean): void;
    ngDoCheck(): void;
    ngOnDestroy(): void;
    ngAfterContentInit(): void;
    ngAfterViewInit(): void;
    setDescribedByIds(ids: string[]): void;
    onContainerClick(event: MouseEvent): void;
    /** Change l'état d'expansion de toute les lignes parentes */
    toggleAll$(collapsed?: boolean): Observable<IItemTree<unknown>[]>;
    /** Change l'état d'expansion de toute les lignes parentes */
    toggleAll(collapsed?: boolean): void;
    /** Change l'état d'expansion de la ligne spécifiée
     * @param index  Index sur la liste des éléments visibles de l'élément à changer.
     * @param collapsed  Etat de l'élément. True pour réduire l'élément.
     * @return Observable résolu par la fonction.
     */
    toggleCollapse$(index: number, collapsed: boolean): Observable<IItemTree<unknown>>;
    /** Change l'état d'expansion de la ligne spécifiée
     * @param index  Index sur la liste des éléments visibles de l'élément à changer.
     * @param collapsed  Etat de l'élément. True pour réduire l'élément.
     */
    toggleCollapse(index: number, collapsed: boolean): void;
    queryChanged(value: string): void;
    hideDropDown(): void;
    scroll(event: Event): void;
    mousedown(e: MouseEvent): void;
    getItemClass(item: IItemTree<unknown>): string;
    updateErrorState(): void;
    clearSelection(): void;
    onClearQuery(clickEvent: Event): boolean;
    onRemoveSelection(closeEvent?: IDejaChipsComponentCloseEvent): void;
    onOpenClicked(event: Event): void;
    toggleDropDown(): void;
    showDropDown(): void;
    onTouchedCallback: () => void;
    onChangeCallback: (_a?: unknown) => void;
    onValidatorChangeCallback: (_a?: unknown) => void;
    protected removeSelection(item?: IItemBase<unknown>): void;
    protected calcViewList$(): Observable<IViewListResult<unknown>>;
    protected ensureItemVisible(item: IItemBase<unknown> | number): void;
    private onModelChange;
    private select;
    private reshowDropDown;
    private ensureSelection;
    static ɵfac: i0.ɵɵFactoryDeclaration<DejaSelectComponent, [null, null, null, null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, null, null]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DejaSelectComponent, "deja-select", never, { "nodataholder": "nodataholder"; "overlayOffsetX": "overlayOffsetX"; "overlayOffsetY": "overlayOffsetY"; "overlayBackdropClass": "overlayBackdropClass"; "overlayContainerClass": "overlayContainerClass"; "itemTemplateExternal": "itemTemplateExternal"; "parentItemTemplateExternal": "parentItemTemplateExternal"; "loaderTemplateExternal": "loaderTemplateExternal"; "modelIsValue": "modelIsValue"; "positions": "positions"; "dropDownWidth": "dropDownWidth"; "required": "required"; "placeholder": "placeholder"; "query": "query"; "delaySearchTrigger": "delay-search-trigger"; "minSearchlength": "min-search-length"; "disabled": "disabled"; "selectionClearable": "selectionClearable"; "hideSelected": "hideSelected"; "currentItem": "currentItem"; "pageSize": "pageSize"; "hintLabel": "hintLabel"; "viewPortRowHeight": "viewPortRowHeight"; "viewportMode": "viewportMode"; "childrenField": "childrenField"; "textField": "textField"; "valueField": "valueField"; "searchField": "searchField"; "type": "type"; "loadingItems": "loadingItems"; "selectingItem": "selectingItem"; "unselectingItem": "unselectingItem"; "expandingItem": "expandingItem"; "collapsingItem": "collapsingItem"; "selectedItems": "selectedItems"; "selectedItem": "selectedItem"; "selectedModel": "selectedModel"; "selectedModels": "selectedModels"; "itemListService": "itemListService"; "sortingService": "sortingService"; "groupingService": "groupingService"; "waiter": "waiter"; "items": "items"; "models": "models"; "maxHeight": "maxHeight"; "readonly": "readonly"; }, { "viewPortChanged": "viewPortChanged"; "selectedChange": "selectedChange"; "dropDownVisibleChange": "dropDownVisibleChange"; }, ["itemTemplateInternal", "parentItemTemplateInternal", "selectedTemplate", "loaderTemplateInternal", "options"], never, false>;
}
