import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
import { AfterViewInit, ElementRef, OnInit } from '@angular/core';
import { AbstractSelectComponent } from '../shared/components';
import { DsfrSelectionMode } from '../shared/models/selection-mode.type';
import { TreeFocusable } from '../shared/utils/tree/tree-focus-manager';
import { TreeSelectable } from '../shared/utils/tree/tree-select-manager';
import { DsfrNode, DsfrViewNode } from '../shared/utils/tree/tree.model';
import * as i0 from "@angular/core";
export declare class DsfrTreeselectComponent extends AbstractSelectComponent<DsfrViewNode> implements OnInit, AfterViewInit, TreeFocusable, TreeSelectable {
    /** Stratégie de sélection, uniquement en mode single. Par défaut seules les feuilles sont sélectionnables.*/
    selectionStrategy: 'leaf' | 'all';
    /** @internal */
    viewport: CdkVirtualScrollViewport;
    /** @internal*/
    listbox: ElementRef;
    /** @internal*/
    isAllSelected: boolean;
    protected visibleNodes: DsfrViewNode[];
    protected countFilteredOptions: number;
    protected countLeaves: number;
    protected countFilteredLeaves: number;
    private treeFocusManager;
    private treeSelectManager;
    private firstNodeElt;
    /** @internal Equivalent a options */
    get nodes(): DsfrNode[];
    /** @internal Synonyme de value, mais plus explicite. */
    get options(): any[] | undefined;
    /** @internal */
    get selectionMode(): DsfrSelectionMode;
    /** Personnalisation de la fonction de recherche pour filtrer les options. Fonction à 2 arguments : node (DsfrNode) et texte cherché (string) */
    set searchFn(fn: (n: DsfrNode, text: string) => boolean);
    /** Liste des options (DsfrNode[]) disponibles. */
    set options(val: any[] | undefined);
    /** Mode de sélection. Checkbox par défaut. */
    set selectionMode(mode: DsfrSelectionMode);
    ngOnInit(): void;
    /** Positionne un tabindex de 0 sur le premier élément de la liste si aucun n'est sélectionné */
    ngAfterViewInit(): void;
    /**
     * Mise a jour de la valeur de selectedOptions et value programmatiquement (ex. à l'init reactive form)
     * @param value
     * @internal
     */
    writeValue(value: any): void;
    /** @internal */
    notifySelectEvent(node: DsfrNode): void;
    /** Mise a jour de l'état des checkbox selon leur id, nécessaire avec le tri en virtualScroll (perte du binding)
     * @internal */
    updateIndeterminate(node: DsfrNode): void;
    /**
     * Selection/Deselection du noeud
     * Mise a jour de la liste des noeuds sélectionnés
     * @internal */
    doNodeDefaultAction(node: DsfrNode, event: Event): void;
    /** @internal */
    findFocusElement(): HTMLElement;
    /** @internal */
    findFirstSelectedNode(): HTMLElement;
    /**
     * Clic sur une option en mode tag supprimable.
     * Déselection option et mise a jour des parents.
     * @internal */
    clearOption(event: {
        nativeEvent: Event;
        option: DsfrNode;
    }): void;
    /**
     * Trouver tous les noeuds <li> visibles
     *  @internal */
    findVisibleNodesElt(): HTMLElement[];
    /** @internal */
    selectAll(): void;
    /** @internal */
    clearAllOptions(): void;
    /** @internal */
    expandAll(): void;
    /** @internal */
    collapseAll(): void;
    /** @internal */
    handleListFocus(): void;
    /**
     * Au clic sur le label ou la checkbox
     * Sélection ou déselection des noeuds
     * @internal */
    onOptionClick(event: Event, node: DsfrNode): void;
    /**
     * Filtrer les options selon la fonction de recherche
     * @internal */
    onSearch(): void;
    /**
     * Au clic sur les boutons flèches plier/déplier les noeuds
     *  @internal */
    onNodeButton(node: DsfrNode): void;
    /**
     * Interaction clavier avec un des noeuds
     * @internal */
    onNodeKeydown(node: DsfrNode, event: KeyboardEvent): void;
    /** @internal */
    trackById(index: number, item: DsfrNode): string | undefined;
    /** @internal */
    isCheckboxMode(): boolean;
    /** @internal */
    isSelectable(): boolean;
    /** @internal */
    isSelected(n: DsfrNode): boolean;
    /** Surcharge de compareWith par défaut pour utiliser les id */
    protected _compareWith: (o1: any, o2: any) => boolean;
    /** Mise a jour selectedOptions puis value */
    private updateValueSelected;
    /** Fonction de recherche par défaut */
    private _searchFn;
    /**
     * Filtre visuellement les nœuds en appliquant `hidden` en fonction du résultat de la recherche.
     * - nœud parent visible : correspond à la recherche ou au moins un de ses enfants est visible.
     * - nœud enfant visible : correspond à la recherche ou un de ses ancêtres correspond à la recherche.
     * @param node Le nœud à filtrer de manière récursive.
     * @returns `true` si le nœud est visible, sinon `false`.
     */
    private updateNodeVisibility;
    /**
     * Filtrer physiquement les noeuds dans le cadre du virtualScroll
     * /!\ Le virtualScroll ne permet pas d'utiliser la propriété hidden
     * Identique à updateNodeVisibility mais supprime au lieu d'utiliser la propriété hidden
     * @param node Le nœud à filtrer de manière récursive.
     * @returns le noeud si match, null sinon
     */
    private filterNodes;
    /**
     * Parcours d'arbre pour mettre a jour la valeur selected des nodes à l'init,
     * selon les valeurs sélectionnées programmatiquement
     * @param nodes arbre complet
     * @param value tableau non-vide des noeuds sélectionnés
     */
    private setSelectedNodes;
    /**
     * Calcule si toutes les options visibles et non-disabled sont sélectionnées
     */
    private areAllOptionsSelected;
    static ɵfac: i0.ɵɵFactoryDeclaration<DsfrTreeselectComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DsfrTreeselectComponent, "dsfr-ext-treeselect, dsfrx-treeselect", never, { "selectionStrategy": { "alias": "selectionStrategy"; "required": false; }; "searchFn": { "alias": "searchFn"; "required": false; }; "options": { "alias": "options"; "required": false; }; "selectionMode": { "alias": "selectionMode"; "required": false; }; }, {}, never, ["[label]"], true, never>;
}
