import { CdkDrag, CdkDragDrop } from '@angular/cdk/drag-drop';
import { AfterViewInit, EventEmitter, OnChanges, OnInit, SimpleChanges, TemplateRef } from '@angular/core';
import { LoadingStateIndicators } from '@seniorsistemas/angular-components/loading-state';
import { PickListItem, PicklistItemMove, PicklistLoader } from './types';
import * as i0 from "@angular/core";
interface InternalPicklistItem<T = any> extends PickListItem<T> {
    invisible?: boolean;
    selected?: boolean;
}
type CdkDragEvent<T> = {
    source: CdkDrag<InternalPicklistItem<T>>;
};
/**
 * @description Componente de lista de dupla seleção (picklist) com suporte a
 * arrastar e soltar, filtro, checkboxes e template customizável para cada item.
 * Emite eventos ao mover itens entre as listas.
 *
 * @example
 * ```html
 * <s-picklist
 *   [itensToSelect]="itensDisponiveis"
 *   [selectedItens]="itensSelecionados"
 *   (selectedItensChange)="onSelecaoMudou($event)" />
 * ```
 *
 * @category Data
 */
export declare class PicklistComponent<T> implements AfterViewInit, OnChanges, OnInit {
    private cdr;
    /** @description Lista de itens disponíveis para seleção (coluna esquerda). @default [] */
    itensToSelect: PickListItem<T>[];
    /** @description Lista de itens já selecionados (coluna direita). @default [] */
    selectedItens: PickListItem<T>[];
    /** @description Rótulo do título da lista de disponíveis. */
    availableItensLabel?: string;
    /** @description Placeholder da busca na lista de disponíveis. */
    availableItensPlaceholder?: string;
    /** @description Rótulo do botão de adicionar itens selecionados. */
    addSelectedItensLabel?: string;
    /** @description Rótulo do botão de adicionar todos os itens. */
    addAllItensLabel?: string;
    /** @description Rótulo do título da lista de selecionados. */
    selectedItensLabel?: string;
    /** @description Placeholder da busca na lista de selecionados. */
    selectedItensPlaceholder?: string;
    /** @description Rótulo do botão de remover itens selecionados. */
    removeSelectedItemsLabel?: string;
    /** @description Rótulo do botão de remover todos os itens. */
    removeAllItemsLabel?: string;
    /** @description Exibe checkbox nos itens das listas. @default false */
    showCheckbox: boolean;
    /** @description Propriedade usada para filtrar os itens das listas. @default '' */
    filterBy: string;
    /** @description Habilita o carregamento preguiçoso (lazy load) para as listas. @default false */
    lazyLoad: import("@angular/core").InputSignal<boolean>;
    /** @description Número de linhas a serem exibidas por página caso o lazyLoad esteja habilitado. @default 10 */
    rows: import("@angular/core").InputSignal<number>;
    /** @description Função loader para a lista de disponíveis (to-select). Quando fornecida, o componente gerencia internamente paginação, loading e race conditions. */
    sourceLoader: import("@angular/core").InputSignal<PicklistLoader<T> | undefined>;
    /** @description Função loader para a lista de selecionados (selected). Quando fornecida, o componente gerencia internamente paginação, loading e race conditions. */
    targetLoader: import("@angular/core").InputSignal<PicklistLoader<T> | undefined>;
    protected readonly _loadingTarget: import("@angular/core").WritableSignal<boolean>;
    protected readonly _loadingSource: import("@angular/core").WritableSignal<boolean>;
    /** @description Emitido quando um item é movido entre as listas e o lazy load está habilitado. */
    nodeMoved: import("@angular/core").OutputEmitterRef<PicklistItemMove<T>>;
    /** @description Emitido quando a lista de selecionados muda. */
    selectedItensChange: EventEmitter<any[]>;
    /** @description Emitido quando a lista de disponíveis muda. */
    itensToSelectChange: EventEmitter<any[]>;
    availableItensFilter: string;
    selectedItensFilter: string;
    itemToSelectTemplate: TemplateRef<T> | null;
    itemSelectedTemplate: TemplateRef<T> | null;
    protected logoIndicator: LoadingStateIndicators;
    protected itensToSelectFilterUtil: {
        allItensSelected: boolean;
        rawItensToSelect: InternalPicklistItem[];
        filteredItensToSelect: InternalPicklistItem[];
    };
    protected selectedItensFilterUtil: {
        allItensSelected: boolean;
        rawSelectedItens: InternalPicklistItem[];
        filteredSelectedItens: InternalPicklistItem[];
    };
    selectedItensMap: Set<InternalPicklistItem>;
    itensToSelectId: string;
    selectedItensId: string;
    private readonly destroyRef;
    private readonly sourceFilterSubject;
    private readonly targetFilterSubject;
    private readonly sourceLoadSubject;
    private readonly targetLoadSubject;
    private _internalTotalSource;
    private _internalTotalTarget;
    private sourceCurrentPage;
    private targetCurrentPage;
    private _logErrorTemplate;
    private templates;
    ngAfterViewInit(): void;
    ngOnInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    toggleSelected(internalPicklistItem: InternalPicklistItem, containerListId: string): void;
    remove(all?: boolean): void;
    add(all?: boolean): void;
    filterItensToSelect(): void;
    filterSelectedItens(): void;
    drop(event: CdkDragDrop<InternalPicklistItem[]>): void;
    onDragStart(event: CdkDragEvent<T>, dragListId: string): void;
    onDragRelease(): void;
    checkAllAvailableItensChange(checked: boolean): void;
    checkAllSelectedItensChange(checked: boolean): void;
    onScroll(event: Event, listId: string): void;
    get disableSelectedItensCheckbox(): boolean;
    get disableItensToSelectCheckbox(): boolean;
    get itensToSelectAllSelected(): boolean;
    get selectedItensAllSelected(): boolean;
    get hasSelectedItens(): boolean;
    /**
     * @description Recarrega as listas após a confirmação de uma movimentação pelo backend.
     *
     * **Por que usar?**
     * Ao mover itens, o componente atualiza a UI de forma otimista — os itens são movidos
     * imediatamente antes da confirmação do servidor. Após o backend confirmar a operação,
     * chame `resetList` para limpar e recarregar as listas afetadas do zero, garantindo que
     * o estado da UI reflita os dados reais persistidos.
     *
     * **O que espera?**
     * Recebe o objeto `PicklistItemMove<T>` emitido pelo output `(nodeMoved)`. O componente
     * utiliza `node.direction` para determinar qual lista recarregar (a lista de destino da
     * movimentação) e `node.moveAll` para verificar se a origem também deve ser recarregada
     * (por exemplo, ao mover todos os itens de uma lista para outra, ambas ficam com estado
     * alterado no backend).
     *
     * **O que faz?**
     * - Reseta o contador de página da lista de destino para `0` (primeira página).
     * - Limpa todos os itens carregados na lista de destino.
     * - Dispara imediatamente o carregamento da primeira página via `sourceLoader`/`targetLoader`.
     * - Se `node.moveAll === true`, repete o processo para a lista de origem.
     *
     * **Exemplo de uso:**
     * ```typescript
     * nodeMoved(node: PicklistItemMove<MyItem>): void {
     *     this.service.moveItems(node).subscribe({
     *         next: () => this.myPicklist().resetList(node),
     *         error: () => node.revertAction(),
     *     });
     * }
     * ```
     *
     * @param node - O objeto de movimentação emitido pelo output `(nodeMoved)`.
     */
    resetList(node: PicklistItemMove<T>): void;
    private _resetListByTarget;
    private _checkAllSelectedByList;
    private setupLoaderPipelines;
    private setupFilterDebounce;
    private setupLazyLoadEvents;
    private loadNextPage;
    private emitCurrentPage;
    private _checkAllSelectedItensChange;
    private unselectedItensByListId;
    private getAllElementsByListId;
    private getOppositiveId;
    private emitData;
    static ɵfac: i0.ɵɵFactoryDeclaration<PicklistComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PicklistComponent<any>, "s-picklist", never, { "itensToSelect": { "alias": "itensToSelect"; "required": false; }; "selectedItens": { "alias": "selectedItens"; "required": false; }; "availableItensLabel": { "alias": "availableItensLabel"; "required": false; }; "availableItensPlaceholder": { "alias": "availableItensPlaceholder"; "required": false; }; "addSelectedItensLabel": { "alias": "addSelectedItensLabel"; "required": false; }; "addAllItensLabel": { "alias": "addAllItensLabel"; "required": false; }; "selectedItensLabel": { "alias": "selectedItensLabel"; "required": false; }; "selectedItensPlaceholder": { "alias": "selectedItensPlaceholder"; "required": false; }; "removeSelectedItemsLabel": { "alias": "removeSelectedItemsLabel"; "required": false; }; "removeAllItemsLabel": { "alias": "removeAllItemsLabel"; "required": false; }; "showCheckbox": { "alias": "showCheckbox"; "required": false; }; "filterBy": { "alias": "filterBy"; "required": false; }; "lazyLoad": { "alias": "lazyLoad"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "sourceLoader": { "alias": "sourceLoader"; "required": false; "isSignal": true; }; "targetLoader": { "alias": "targetLoader"; "required": false; "isSignal": true; }; }, { "nodeMoved": "nodeMoved"; "selectedItensChange": "selectedItensChange"; "itensToSelectChange": "itensToSelectChange"; }, ["templates"], never, true, never>;
}
export declare const parseItensPickList: <T>(array: T[], disabledFn?: (item: T) => boolean, idKey?: keyof T) => PickListItem<T>[];
export {};
