import { DiacriticService } from '@deja-js/component/core';
import { BehaviorSubject, Observable, ReplaySubject } from 'rxjs';
import { Item } from './item';
import { ItemComponent } from './item.component';
import * as i0 from "@angular/core";
/** Service de gestion des listes (treelist et select).
 * Ce service permet la gestion du viewport et la gestion des caches des listes.
 * Il peut-être surchargé pour faire du lazy loading ou du paging.
 */
export declare class ItemService<T> {
    private diacriticService;
    items$: ReplaySubject<readonly Item<T>[]>;
    models$: ReplaySubject<readonly T[]>;
    options$: ReplaySubject<readonly ItemComponent[]>;
    childrenField$: BehaviorSubject<string>;
    textField$: BehaviorSubject<string>;
    valueField$: BehaviorSubject<string>;
    searchField$: BehaviorSubject<string>;
    query$: BehaviorSubject<string | RegExp>;
    minSearchLength$: BehaviorSubject<number>;
    itemList$: Observable<ReadonlyArray<Item<T>>>;
    flatItemList$: Observable<ReadonlyArray<Item<T>>>;
    refreshFlatItemList$: BehaviorSubject<void>;
    filteredItemList$: Observable<ReadonlyArray<Item<T>>>;
    refreshFilterItemList$: BehaviorSubject<void>;
    visibleItemList$: Observable<ReadonlyArray<Item<T>>>;
    refreshVisibleItemList$: BehaviorSubject<void>;
    selectedItems$: Observable<ReadonlyArray<Item<T>>>;
    selectingItems: (items: ReadonlyArray<Item<T>>) => Observable<ReadonlyArray<Item<T>>>;
    unSelectingItems: (items: ReadonlyArray<Item<T>>) => Observable<ReadonlyArray<Item<T>>>;
    private refreshSelection$;
    private previousQuery;
    constructor(diacriticService: DiacriticService);
    /** Map une structure de modèles en items
     * @param mods  Modèles à évaluer.
     * @param valueField (optional) Champs à traiter comme valeur.
     * @param textField (optional) Champs à traiter comme text.
     * @param childrenField (optional) Champs à traiter comme enfants.
     * @return Structure mapée
     */
    mapToItem(mods: ReadonlyArray<T>, valueField: string, textField: string, childrenField?: string): ReadonlyArray<Item<T>>;
    /** Désélectionne tous les éléments sélectionnés */
    unselectAll(): void;
    /** Sélectionne tous les éléments */
    selectAll(checkSelectable?: boolean): void;
    /** Déselectionne l'élément spécifié
     * @param item Elément à déselectionner.
     */
    unSelectItem(item: Item<T>): void;
    /** Sélectionne l'élément spécifié
     * @param item Elément à sélectionner.
     */
    selectItem(item: Item<T>): void;
    /** Déselectionne les éléments spécifiés
     * @param items Liste des éléments à désélectionner.
     */
    unSelectItems(items: ReadonlyArray<Item<T>>): void;
    /** Sélectionne les éléments spécifiés
     * @param items Liste des éléments à sélectionner.
     */
    selectItems(items: ReadonlyArray<Item<T>>): void;
    /** Set la selection sur les éléments spécifiés
     * @param items Liste des éléments à sélectionner.
     */
    setSelectedItems(items: ReadonlyArray<Item<T>>): void;
    /** Set la selection sur les éléments spécifiés
     * @param items Liste des modèles des éléments à sélectionner.
     */
    setSelectedModels(models: ReadonlyArray<T>): void;
    /** Set la selection sur les ids des éléments spécifiés
     * @param values Liste des ids des éléments à sélectionner.
     */
    setSelectedValues(values: ReadonlyArray<string>): void;
    /** Change l'état de sélection de l'élément spécifié.
     * @param items Liste des éléments à modifier.
     */
    toggleSelect(items: ReadonlyArray<Item<T>>): void;
    /** Renvoie l'index de l'élément sur la liste plate corespondant à l'élément HTML spécifié
     * @return Index sur la liste plate corespondant à l'élément HTML
     */
    getItemIndexFromHtmlElement(element: HTMLElement): number;
    /** Retourne une valeur indiquant si l'élément spécifié correspond aux critères de recherche spécifiés
     * @param item Elément à analyser.
     * @param searchField Nom du champ à utiliser pour la recherche. Le champ représenté peut-être une valeur ou une function.
     * @param regExp Expression de test sur le champs spécifié.
     * @return True si l'élément correspond aux critères de recherche.
     */
    protected itemMatch(item: Item<T>, searchField: string, regExp: RegExp): boolean;
    protected parentItemMatch(item: Item<T>, previousItem: Item<T>, _searchField: string, _regExp: RegExp): boolean;
    protected compareItems: (item1: Item<T>, item2: Item<T>) => boolean;
    protected compareModels: (model1: T, model2: T, valueField: string) => boolean;
    protected extractValueField(model: T, field: string): unknown;
    static ɵfac: i0.ɵɵFactoryDeclaration<ItemService<any>, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ItemService<any>>;
}
export interface IndexedItem<T> extends Item<T>, Record<string, unknown> {
}
