import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
import { ChangeDetectorRef, ElementRef, EventEmitter, TemplateRef } from '@angular/core';
import { ControlValueAccessor, NgControl } from '@angular/forms';
import { DejaChildValidatorDirective, Destroy } from '@deja-js/component/core';
import { Item, ItemComponent, ItemEvent, ItemService } from '@deja-js/component/v2/item-list';
import { ViewPort, ViewPortComponent, ViewPortMode } from '@deja-js/component/v2/viewport';
import { Observable } from 'rxjs';
import * as i0 from "@angular/core";
export declare type NgModelType = 'item' | 'model' | 'value';
export declare type NgControlType<T> = Item<T> | ReadonlyArray<Item<T>> | T | ReadonlyArray<T> | string | ReadonlyArray<string>;
/** Composant de liste évoluée avec gestion de viewport et templating */
export declare class TreeListComponent<T> extends Destroy implements ControlValueAccessor {
    elementRef: ElementRef;
    control: NgControl;
    changeDetectorRef: ChangeDetectorRef;
    /** Texte à afficher par default dans la zone de recherche */
    placeholder: string;
    /**
     * Les valeurs acceptées en paramètre se trouvent dans l'enum ViewPortMode (disabled, constant, variable ou 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.
     */
    viewPortMode: ViewPortMode;
    /** Texte affiché si aucune donnée n'est présente dans le tableau */
    nodataholder: 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 d'entête de colonne par binding. */
    headerTemplateExternal: TemplateRef<unknown>;
    /** Permet de définir un template comme prefixe de la zone de recherche par binding. */
    searchPrefixTemplateExternal: TemplateRef<unknown>;
    /** Permet de définir un template comme suffixe de la zone de recherche par binding. */
    searchSuffixTemplateExternal: TemplateRef<unknown>;
    /** Exécuté lorsque l'utilisateur sélectionne ou désélectionne une ligne. */
    readonly selectedChange: EventEmitter<ItemEvent<T>>;
    /** Exécuté lorsque l'utilisateur collapse une ligne. */
    readonly itemCollapse: EventEmitter<ItemEvent<T>>;
    /** Exécuté lorsque l'utilisateur étend une ligne. */
    readonly itemExpand: EventEmitter<ItemEvent<T>>;
    /** Exécuté lorsque l'utilisateur tape enter sur une ligne. */
    readonly itemEnter: EventEmitter<ItemEvent<T>>;
    /** Exécuté lorsque l'utilisateur a modifié le filtrage de la liste. */
    readonly queryChange: EventEmitter<string>;
    expandingItem: (items: Item<T>) => Observable<Item<T>>;
    collapsingItem: (items: Item<T>) => Observable<Item<T>>;
    debugMode: boolean;
    _disabled: boolean;
    private itemTemplateInternal;
    private parentItemTemplateInternal;
    private headerTemplateInternal;
    private searchPrefixTemplateInternal;
    private searchSuffixTemplateInternal;
    viewPort$: Observable<ViewPort<T>>;
    listElementId: string;
    itemService: ItemService<T>;
    private _selectedItems;
    private ngModelType$;
    private _ngModelType;
    private writeValue$;
    private multiSelect$;
    private _multiSelect;
    private listElement$;
    private inputElement$;
    private raiseChangeCallback;
    private _currentItem;
    private _pageSize;
    private filterExpression;
    private _maxHeight;
    private viewPortComponent$;
    private _viewPortComponent;
    private _viewPortRowHeight;
    private keyboardStartIndex;
    private collapseItem$;
    private _hintLabel;
    private _searchArea;
    private lastClickedItem;
    private reloadViewPort$;
    private _query;
    set viewPortComponent(viewPortComponent: ViewPortComponent<T>);
    get viewPortComponent(): ViewPortComponent<T>;
    set options(value: ReadonlyArray<ItemComponent>);
    /** Définit la hauteur d'une ligne pour le calcul du viewport. Le Viewport ne fonctionne qu'avec des hauteurs de lignes fixe.
     * Pour désactiver le viewport, mettre la hauteur de ligne à 0.
     * 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.
     * @param value Hauteur de ligne à utiliser pour le calcul du viewport.
     */
    set viewPortRowHeight(value: NumberInput);
    get viewPortRowHeight(): NumberInput;
    /** Définit la liste des éléments */
    set items(items: ReadonlyArray<Item<T>>);
    /** Définit la liste des éléments (tout type d'objet métier) */
    set models(models: ReadonlyArray<T>);
    /** Définit la liste des éléments sélectionnés en mode multiselect */
    set selectedItems(value: ReadonlyArray<Item<T>>);
    /** Retourne la liste des éléments sélectionnés en mode multiselect */
    get selectedItems(): ReadonlyArray<Item<T>>;
    /** Définit l'élément sélectionné en mode single select */
    set selectedItem(value: Item<T> | undefined);
    /** Retourne l'éléments sélectionné en mode single select */
    get selectedItem(): Item<T> | undefined;
    /** Définit le model sélectionné en mode single select */
    set selectedModel(value: T | undefined);
    /** Retourne le model sélectionné en mode single select */
    get selectedModel(): T | undefined;
    /** Définit la liste des models sélectionnés en mode multiselect */
    set selectedModels(value: ReadonlyArray<T>);
    /** Retourne la liste des models sélectionnés en mode multiselect */
    get selectedModels(): ReadonlyArray<T>;
    /** Définit le model sélectionné en mode single select */
    set selectedValue(value: string | undefined);
    /** Retourne le model sélectionné en mode single select */
    get selectedValue(): string | undefined;
    /** Définit la liste des models sélectionnés en mode multiselect */
    set selectedValues(value: ReadonlyArray<string>);
    /** Retourne la liste des models sélectionnés en mode multiselect */
    get selectedValues(): ReadonlyArray<string>;
    /** Définit une valeur indiquant si en reactive form le model renvoyé doit être un obeject oue une valeur */
    set ngModelType(value: NgModelType);
    /** Définit une valeur indiquant si plusieurs lignes peuvent être sélectionnées. */
    set multiSelect(value: BooleanInput);
    get multiSelect(): BooleanInput;
    /** Correspond au ngModel du champ de filtrage ou recherche */
    set query(value: string);
    get query(): string;
    set selectingItems(value: (items: ReadonlyArray<Item<T>>) => Observable<ReadonlyArray<Item<T>>>);
    set unSelectingItems(value: (items: ReadonlyArray<Item<T>>) => Observable<ReadonlyArray<Item<T>>>);
    set listElememtRef(elem: ElementRef<HTMLElement>);
    set inputElememtRef(elem: ElementRef<HTMLInputElement>);
    /** Permet de désactiver la liste */
    set disabled(value: BooleanInput);
    get disabled(): BooleanInput;
    /** Définit le champ utilisé pour la liste des enfants d'un parent */
    set childrenField(value: string);
    /** Définit le champ à utiliser comme valeur d'affichage. */
    set textField(value: string);
    /** Définit le champ à utiliser comme valeur de comparaison. */
    set valueField(value: string);
    /** Définit la ligne courant ou ligne active */
    set currentItem(item: Item<T> | undefined);
    /** Retourne la ligne courant ou ligne active */
    get currentItem(): Item<T> | undefined;
    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 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: NumberInput);
    /** 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(): NumberInput;
    /** Affiche un barre de recherche au dessus de la liste. */
    set searchArea(value: BooleanInput);
    get searchArea(): BooleanInput;
    constructor(elementRef: ElementRef, control: NgControl, localItemService: ItemService<T>, extendedItemService: ItemService<T>, changeDetectorRef: ChangeDetectorRef);
    /** 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);
    /** 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 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);
    set inputValidatorDirective(value: DejaChildValidatorDirective);
    get itemTemplate(): TemplateRef<unknown>;
    get parentItemTemplate(): TemplateRef<unknown>;
    get headerTemplate(): TemplateRef<unknown>;
    get searchPrefixTemplate(): TemplateRef<unknown>;
    get searchSuffixTemplate(): TemplateRef<unknown>;
    get value(): NgControlType<T>;
    set value(val: NgControlType<T>);
    writeValue(value: NgControlType<T>): void;
    registerOnChange(fn: (_a: unknown) => void): void;
    registerOnTouched(fn: () => void): void;
    setDisabledState(isDisabled: boolean): void;
    /** Positionne a scrollbar pour assurer que l'élément spécifié soit visible */
    ensureItemVisible(item: Item<T> | number): void;
    /** Rebind le viewport */
    reloadViewPort(): void;
    /** Recalcule le viewport. */
    refreshViewPort(clearMeasuredSize?: boolean): void;
    /** Efface le viewport */
    clearViewPort(): void;
    onTouchedCallback: () => void;
    onChangeCallback: (_a?: unknown) => void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TreeListComponent<any>, [null, { optional: true; self: true; }, null, { optional: true; skipSelf: true; }, null]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TreeListComponent<any>, "tree-list", never, { "placeholder": "placeholder"; "viewPortMode": "viewPortMode"; "nodataholder": "nodataholder"; "itemTemplateExternal": "itemTemplateExternal"; "parentItemTemplateExternal": "parentItemTemplateExternal"; "headerTemplateExternal": "headerTemplateExternal"; "searchPrefixTemplateExternal": "searchPrefixTemplateExternal"; "searchSuffixTemplateExternal": "searchSuffixTemplateExternal"; "expandingItem": "expandingItem"; "collapsingItem": "collapsingItem"; "debugMode": "debugMode"; "viewPortRowHeight": "viewPortRowHeight"; "items": "items"; "models": "models"; "selectedItems": "selectedItems"; "selectedItem": "selectedItem"; "selectedModel": "selectedModel"; "selectedModels": "selectedModels"; "selectedValue": "selectedValue"; "selectedValues": "selectedValues"; "ngModelType": "ngModelType"; "multiSelect": "multiSelect"; "query": "query"; "selectingItems": "selectingItems"; "unSelectingItems": "unSelectingItems"; "disabled": "disabled"; "childrenField": "childrenField"; "textField": "textField"; "valueField": "valueField"; "currentItem": "currentItem"; "pageSize": "pageSize"; "maxHeight": "maxHeight"; "searchArea": "searchArea"; "minSearchlength": "min-search-length"; "hintLabel": "hintLabel"; "searchField": "searchField"; }, { "selectedChange": "selectedChange"; "itemCollapse": "itemCollapse"; "itemExpand": "itemExpand"; "itemEnter": "itemEnter"; "queryChange": "queryChange"; }, ["itemTemplateInternal", "parentItemTemplateInternal", "headerTemplateInternal", "searchPrefixTemplateInternal", "searchSuffixTemplateInternal", "options"], never, false>;
}
