import { Component, ElementRef, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { FormlyFieldConfig } from '@ngx-formly/core';
import { TranslateService } from '@ngx-translate/core';
import { NgxSpinnerService } from 'ngx-spinner';
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
import { ApiService } from '../../api/api.service';
import { Error } from '../../error/error';
import { ActionStatus } from '../action-status';
import { JSONSchema7 } from '../editor/editor.component';
import { Aggregation, SearchField, SearchFilter, SearchFilterSection, SearchResult } from '../record';
import { RecordUiService } from '../record-ui.service';
import { RecordService } from '../record.service';
import { AggregationsFilter, RecordSearchService } from './record-search.service';
import { ChangeEvent } from './paginator/paginator.component';
import { IChecked } from './search-filters/search-filters.component';
import { SelectChangeEvent } from 'primeng/select';
import { MenuItem } from 'primeng/api';
import * as i0 from "@angular/core";
export interface SearchParams {
    currentType: string;
    index: string;
    q: string;
    page: number;
    size: number;
    aggregationsFilters: Array<AggregationsFilter>;
    sort: string;
    searchFields: Array<SearchField>;
    searchFilters: Array<SearchFilter | SearchFilterSection>;
}
export interface SortOption {
    value: string;
    label: string;
    defaultQuery?: boolean;
    defaultNoQuery?: boolean;
    icon?: string;
}
export declare class RecordSearchComponent implements OnInit, OnChanges, OnDestroy {
    protected recordService: RecordService;
    protected recordUiService: RecordUiService;
    protected recordSearchService: RecordSearchService;
    protected translateService: TranslateService;
    protected spinner: NgxSpinnerService;
    protected apiService: ApiService;
    protected activatedRoute: ActivatedRoute;
    /** Page anchor to scroll on the top */
    topScroll: ElementRef;
    /** Current selected resource type */
    currentType: string;
    /** Search query */
    q: string;
    /** Define the current record's page */
    page: number;
    /** Define the number of records per page */
    size: number;
    /** Defined the sort order */
    sort: string;
    /** If admin mode is disabled, no action can be performed on a record (as add, update or remove) */
    adminMode: ActionStatus;
    /** Custom URL to notice detail */
    detailUrl: string;
    /** Resources types available */
    types: {
        key: string;
        label: string;
        index?: string;
        component?: Component;
        total?: number;
        canAdd?: any;
        canUpdate?: any;
        canDelete?: any;
        canRead?: any;
        permissions?: any;
        aggregations?: any;
        preFilters?: any;
        defaultSearchInputFilters?: Array<AggregationsFilter>;
        listHeaders?: any;
        itemHeaders?: any;
        aggregationsName?: any;
        aggregationsOrder?: Array<string>;
        aggregationsExpand?: Array<string> | (() => Array<string>);
        aggregationsHide?: Array<string> | (() => Array<string>);
        aggregationsBucketSize?: number;
        showSearchInput?: boolean;
        pagination?: {
            boundaryLinks?: boolean;
            maxSize?: number;
            pageReport?: boolean;
            rowsPerPageOptions?: number[];
        };
        formFieldMap?: (field: FormlyFieldConfig, jsonSchema: JSONSchema7) => FormlyFieldConfig;
        hideInTabs?: boolean;
    }[];
    /** Output current state when parameters change. */
    parametersChanged: EventEmitter<any>;
    /** Output current result of records by type. */
    recordsSearched: EventEmitter<SearchResult>;
    /** Current aggregations filters applied */
    aggregationsFilters: Array<AggregationsFilter>;
    /** Contain result row data */
    hits: any;
    /** Facets retrieved from requested result */
    aggregations: Array<Aggregation>;
    /** Aggregation keys to always hide (defined into the config) */
    aggregationsToHide: Array<string>;
    /** Error message when something wrong happens during a search */
    error: Error;
    /** Check if record can be added */
    addStatus: ActionStatus;
    /** List of fields on which we can do a specific search. */
    searchFields: Array<SearchField>;
    /** List of fields on which we can filter. */
    searchFilters: Array<SearchFilter | SearchFilterSection>;
    /** If we need to show the empty search message info. */
    showEmptySearchMessage: boolean;
    /** Export formats configuration. */
    exportOptions: {
        label: string;
        url: string;
        disabled?: boolean;
        disabled_message?: string;
    }[];
    /** JSON dumping of last search parameters (used for checking if we have to do a search or not).*/
    protected _searchParameters: BehaviorSubject<SearchParams>;
    /** Define if search input have to be displayed or not. */
    protected _showSearchInput: boolean;
    /** Define if title have to be displayed or not. */
    protected _showLabel: boolean;
    /** Subscriptions to observables. */
    protected _subscriptions: Subscription;
    /** Store configuration for type. */
    protected config: any;
    availableTypes: any[];
    loaded: boolean;
    /** Check if pagination have to be displayed or not. */
    get showPagination(): boolean;
    /** Does it require to activate the first and last button on pagination. */
    get paginationBoundaryLinks(): boolean;
    /** Get the number of pages showed on pagination. */
    get paginationMaxSize(): number;
    /** Request result record hits. */
    get records(): Array<any>;
    /** Total records number corresponding to the request. */
    get total(): number;
    /** Get the text for displaying results text. */
    get resultsText$(): Observable<string>;
    /** Get showSearchInput value, given either by config or by local value. */
    get showSearchInput(): boolean;
    /** Setter for `showSearchInput`. */
    set showSearchInput(showSearchInput: boolean);
    /** Get showLabel value, given either by config or by local value. */
    get showLabel(): boolean;
    /** Setter for `showLabel`. */
    set showLabel(showLabel: boolean);
    /** Return the current page (used in pagination, has we cannot use `page` property directly) */
    get currentPage(): number;
    /**
     * Used only for binding with pagination.
     * Avoid side effect if "page" property is bound to pagination
     * (infinite calls to get records).
     * @param page - number, new page
     */
    set currentPage(page: number);
    /**
     * Return the list of search fields that are selected.
     * @return List of selected search fields.
     */
    get selectedSearchFields(): Array<SearchField>;
    /**
     * Get the message if there's no record for the type.
     * The message can be customized with the `noRecordMessage` property in route configuration.
     * @returns A message indicating there's no record.
     */
    get emptyRecordMessage(): string;
    /**
     * Check if the current type has no record.
     * @returns True if no record is found and no search query is done.
     */
    get hasNoRecord(): boolean;
    /** Return a message containing the reasons why record list cannot be exported. */
    get exportInfoMessage(): string;
    get selectedSortValue(): MenuItem;
    /**
     * OnInit hook.
     *   Subscribes to the observable emitting the aggregations filters.
     *   Loads total count of records for each resource.
     */
    ngOnInit(): void;
    /**
     * Methods called each time an input property is modified.
     *
     * If current type is changed, the configuration for the new type is loaded.
     *
     * The first time current type is changed, the types property is set in the
     * RecordUiServices. A better way to do that is to detect route change in the
     * service, but at this time it is done like that.
     *
     * This method does a search at the end but only if the search parameters have
     * changed. We want to avoid a double search when the following process is
     * done:
     *
     * 1. A parameter is changed in the search interface.
     * 2. Local property is updated.
     * 3. A search is done.
     * 4. The component outputs the search parameters.
     * 5. The parent component (RecordSearchPage) updates the URL
     * 6. The parent component detects route parameters changes.
     * 7. The parent component update the input value of the component.
     * 8. This method is triggered.
     *
     * @param changes Object containing all the changed properties.
     */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * OnDestroy hook
     *  Unsubscribes from the observable of the aggregations filters.
     */
    ngOnDestroy(): void;
    /**
     * Internal notification that notify the search parameters has changed.
     * @param resetPage reset the pager to the first page
     */
    protected _searchParamsHasChanged(resetPage?: boolean): void;
    /** Move to the top of the page if you change page */
    pageChanged(): void;
    /**
     * Change number of items per page value.
     * @param event - Event, dom event triggered
     * @param size - number, new page size
     */
    changeSize(event: Event, size: number): void;
    /**
     * Change sorting.
     * @param sort sort name.
     */
    changeSorting(sort: string): void;
    /**
     * Change query text.
     * @param event - string, new query text
     */
    searchByQuery(event: string): void;
    /**
     * Change type of records.
     * @param type - resource type name.
     */
    changeType(type: string): void;
    /**
     * Delete a record by its PID.
     * @param event - object
     */
    deleteRecord(event: {
        pid: string;
        type?: string;
    }): void;
    /**
     * Show a modal containing message given in parameter.
     * @param message - message to display into modal
     */
    showDeleteMessage(message: string): void;
    /**
     * Get component view for the current resource type.
     * @return A component for displaying result item.
     */
    getResultItemComponentView(): any;
    /**
     * Get Export formats for the current resource given by configuration.
     * @return Array of export format to generate an `export as` button or an empty array.
     */
    protected _exportFormats(): Array<any>;
    /**
     * Get export format url.
     * @param format - export format object
     * @return formatted url for an export format.
     */
    getExportFormatUrl(format: any): string;
    /**
     * Check if a record list can be exported
     * @param format - export format object
     * @return Boolean
     */
    canExport(format: any): boolean;
    /**
     * Check if a record can be updated
     * @param record - object, record to check
     * @return Observable
     */
    canUpdateRecord$(record: object): Observable<ActionStatus>;
    /**
     * Check if a record can be deleted
     * @param record - object, record to check
     * @return Observable
     */
    canDeleteRecord$(record: object): Observable<ActionStatus>;
    /**
     * Check if a record can be used
     * @param record - object, record to check
     * @return Observable
     */
    canUseRecord$(record: object): Observable<ActionStatus>;
    /**
     * Filter the aggregations with given configuration function.
     * If no configuration is given, return the original aggregations.
     * @param records - Result records
     * @return Observable containing aggregations corresponding to actual records.
     */
    aggregations$(aggregations: object): Observable<any>;
    /**
     * Returns an observable which emits the URL value for given record.
     * In case record cannot be read, returns null.
     * @param record - Generate detail URL for this record.
     * @return Observable emitting detail URL object
     */
    resolveDetailUrl$(record: any): Observable<any>;
    searchInField(event: SelectChangeEvent): void;
    onChangeSearchFilter(event: IChecked): void;
    /**
     * Check if a filter is selected.
     *
     * @param filter SearchFilter
     * @returns true if the given filter is selected.
     */
    isFilterActive(filter: SearchFilter): boolean;
    /**
     * Load buckets for the given aggregation.
     * @param event - Object outputted when an aggregation is clicked.
     */
    loadAggregationBuckets(event: {
        key: string;
        expanded: boolean;
    }): void;
    /**
     * Search for records.
     * @param size - number : force the number of records to return. If `null` the default component `size` attribute will be used.
     */
    protected _getRecords(size?: number): Observable<any>;
    /**
     * Emit new parameters when a search is done.
     */
    protected _emitNewParameters(): void;
    /**
     * Get configuration for the current resource type.
     * @param type Type of resource
     */
    protected _loadConfigurationForType(type: string): void;
    /**
     * Get Resource config
     * @param paramName - Name of parameter
     * @param defaultValue - Default value is returned if the parameter is not defined
     * @return A config value or the given default value instead
     */
    protected _getResourceConfig(paramName: string, defaultValue: any): any;
    /**
     * Serialize all the search parameters with JSON.stringify method.
     * @return The serialized string.
     */
    protected _serializeSearchParameters(): SearchParams;
    /**
     * Load search fields stored in configuration and assign to them the
     * `selected` property.
     *
     * @returns void
     */
    protected _loadSearchFields(): void;
    /**
     * Build query string with possibly search fields.
     *
     * @return Final query string.
     */
    protected _buildQueryString(): string;
    /**
     * Return the name of the index defined either by the index key or key.
     *
     * @return string, current index defined by keys index or key
     */
    protected _currentIndex(): any;
    /**
     * Get personalized name for current aggregation
     * @param key - string, aggregation key
     * @return string or null
     */
    protected _aggregationName(key: string): string | null;
    /**
     * Extract persistent search filters on current url
     * @return Array of aggregations filter
     */
    protected _extractPersistentAggregationsFilters(): Array<AggregationsFilter>;
    /**
     * Make all search filters on same array level
     * @returns - A filters array
     */
    protected _flatSearchFilters(): SearchFilter[];
    /**
     * Map aggregation records data to corresponding aggregation.
     *
     * @param aggregation Aggregation object.
     * @param recordsAggregation Aggregation retrieved from record.
     */
    protected _mapAggregation(aggregation: Aggregation, recordsAggregation: any): void;
    /**
     * Enrich the bucket with several properties: indeterminate, parent, aggregationKey.
     *
     * @param bucket elastic bucket to process
     * @param aggregationKey bucket parent key
     * @returns the indeterminate state of the bucket
     */
    processBuckets(bucket: any, aggregationKey: any): boolean;
    /**
     * Compile facets keys to get only 'included' facets or having a filter selected.
     * @returns List of facets.
     */
    protected _getFacetsParameter(): Array<string>;
    /** Set the default sort. */
    protected _setDefaultSort(): void;
    /**
     * Show the filter's section
     * @param searchFilterSection - Collection of filter
     * @returns true if the filter's section is show
     */
    showFilterSection(searchFilterSection: SearchFilterSection): boolean;
    /**
     * Show the filter
     * @param searchFilter - search Filter
     * @returns true if the filter is show
     */
    showFilter(searchFilter: SearchFilter): boolean;
    paginatorChange(event: ChangeEvent): void;
    /**
     * Remove filter.
     *
     * @param filter - the filter to remove
     */
    removeFilter(filter: any): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<RecordSearchComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RecordSearchComponent, "ng-core-record-search", never, { "currentType": { "alias": "currentType"; "required": false; }; "q": { "alias": "q"; "required": false; }; "page": { "alias": "page"; "required": false; }; "size": { "alias": "size"; "required": false; }; "sort": { "alias": "sort"; "required": false; }; "adminMode": { "alias": "adminMode"; "required": false; }; "detailUrl": { "alias": "detailUrl"; "required": false; }; "types": { "alias": "types"; "required": false; }; "showSearchInput": { "alias": "showSearchInput"; "required": false; }; "showLabel": { "alias": "showLabel"; "required": false; }; }, { "parametersChanged": "parametersChanged"; "recordsSearched": "recordsSearched"; }, never, ["[header]", "[afterInputSearch]", "[beforeResult]", "[top-search-result]", "[top-facets]", "[top-result]", "[footer-result]", "*", "[footer-search-result]"], false, never>;
}
