import { EventEmitter, OnChanges, OnDestroy, OnInit, QueryList, SimpleChanges } from '@angular/core';
import { Observable } from 'rxjs';
import { QdFilterCategoryComponent } from './category/filter-category.component';
import { QdFilterService } from './filter-service/filter.service';
import { QdFilterCategory, QdFilterConfigData } from './model/filter-config.interface';
import { QdFilterPostBodyData } from './model/filter-post-body.interface';
import { QdFilterRouterConnectorService } from './services/filter-router-connector.service';
import { QdDependentFiltersService } from './services/dependent-filters.service';
import * as i0 from "@angular/core";
/**
 * The **QdFilter** is responsible for the filtering of data.
 *
 * Hirarchical structure::
 * - **Filter**: Name of the component.
 * - **Categories**: A list of one or more different categories.
 * - **Items**: A list with one or more items belongs to a parent category.
 *
 * ### Filter selection ###
 *
 * To get the applied filters you can listen to the outputs `(queryStringOutput)` and `(postBodyOutput)`.
 * These outputs will be emitted when the filter is triggered. The `(queryStringOutput)` returns
 * the applied filters as an url string with an encoded *filter* parameter. The `(postBodyOutput)`
 * yields an object containing the categories and active items.
 *
 * In addition to the outputs, you also can query the current filter selection with the
 * filter component methods `getCurrentQueryString`, `getCurrentFilterUrlParameterString` and `getCurrentPostBody`.
 *
 * ### Preserve filter state ###
 *
 * To preserve the filter state when navigating, for example between detail and overview page, you just have to define
 * a uid in the filter data config.
 *
 * ### Multi Staging Filters
 *
 * To build a dependency chain of filters you can use the `dependsOn` property of a filter that depends on
 * other filters. In the `dependsOn` property you set the names of the filter categories the category depends on.
 * Always when one of these categories change the `itemsResolver` will be called with the list
 * of categories given in `dependsOn`. The `itemsResolver` can also be defined in the config where `dependsOn`
 * is also defined.
 *
 * If the items resolver has not been called yet or when it returns an empty array of items,
 * the corresponding filter stage won't be rendered.
 *
 * #### Support
 *
 * Multi Staging Filters only work for `singleSelect` and `multiSelect` filters.
 *
 */
export declare class QdFilterComponent implements OnInit, OnChanges, OnDestroy {
    readonly filterService: QdFilterService;
    readonly filterRouterConnectorService: QdFilterRouterConnectorService;
    readonly dependentFiltersService: QdDependentFiltersService;
    /**
     * The configuration of the filter
     */
    set filterData(filterData: QdFilterConfigData);
    get filterData(): QdFilterConfigData;
    /**
     * A static test ID for integration tests can be set. <br />
     * The value for the HTML attribute [data-test-id].
     */
    testId: string;
    /**
     * Emits event on click/tap of the filter/reset button of the filter or on deletion of an active item. <br />
     * Return value is the query string of the filter.
     */
    queryStringOutput: EventEmitter<string>;
    /**
     * Emits event on click/tap of the filter/reset button of the filter or on deletion of an active item. <br />
     * Return value is the result object of the filter.
     */
    postBodyOutput: EventEmitter<QdFilterPostBodyData>;
    /**
     * Emits event when the values of the filter change. Return value matches the current object of the filter.
     */
    valueChange: EventEmitter<QdFilterPostBodyData>;
    filterCategory: QueryList<QdFilterCategoryComponent>;
    get dataTestId(): string;
    disableFilterButton$: Observable<boolean>;
    disableResetButton$: Observable<boolean>;
    filterId: string;
    private _queryStringSubscription;
    private _postBodySubscription;
    private _emitOutputsSubscription;
    private _filterValueSubscription;
    private _filterDataSubject;
    private _hasPreselectionSubject;
    private _categoriesSubject;
    private _filterConnectedWithRouterSubject;
    private _filterConnectedWithRouter$;
    set hasPreselection(hasPreselection: boolean);
    get hasPreselection$(): Observable<boolean>;
    set categories(categories: QdFilterCategory['category'][]);
    get categories$(): Observable<QdFilterCategory['category'][]>;
    get isInstantFiltering(): boolean;
    constructor(filterService: QdFilterService, filterRouterConnectorService: QdFilterRouterConnectorService, dependentFiltersService: QdDependentFiltersService);
    ngOnInit(): Promise<void>;
    private waitForFilterData;
    ngOnChanges(changes: SimpleChanges): void;
    ngOnDestroy(): void;
    clickFilter(): void;
    resetFilter(): Promise<void>;
    emitOutputs(): void;
    getCurrentQueryString(): Observable<string>;
    getCurrentFilterUrlParameterString(): Observable<string>;
    getCurrentPostBody(): Observable<QdFilterPostBodyData>;
    hasFilterData(): boolean;
    setFilterConfig(filterData: QdFilterConfigData): void;
    updateFilterConfig(filterData: QdFilterConfigData): void;
    getFilterChanges$(): Observable<QdFilterPostBodyData>;
    private validateConfig;
    private init;
    private initializeDependentFiltersService;
    private initResetButtonActivation;
    private get hasPreselectionAfterRouterConnection$();
    private get allFiltersRemoved$();
    private hasChangesByKey;
    private hasChangesByCategoriesLength;
    private reInitFromStoreIfReMounted;
    static ɵfac: i0.ɵɵFactoryDeclaration<QdFilterComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<QdFilterComponent, "qd-filter", never, { "filterData": { "alias": "filterData"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; }, { "queryStringOutput": "queryStringOutput"; "postBodyOutput": "postBodyOutput"; "valueChange": "valueChange"; }, never, never, false, never>;
}
//# sourceMappingURL=filter.component.d.ts.map