import * as _angular_core from '@angular/core';
import { Subject } from 'rxjs';

type SortOrder = 'asc' | 'desc';
type SortByFunction<T = any> = (data: T) => any;
type SortBy<T = any> = string | SortByFunction<T> | (string | SortByFunction<T>)[];
interface SortEvent {
    sortBy: SortBy;
    sortOrder: string;
}
interface PageEvent {
    activePage: number;
    rowsOnPage: number;
    dataLength: number;
}
interface DataEvent {
    length: number;
}
declare class DataTable<T = any> {
    /** Array of data to display in table */
    readonly inputData: _angular_core.InputSignalWithTransform<readonly T[], readonly T[] | null | undefined>;
    /** Sort by parameter */
    readonly sortBy: _angular_core.ModelSignal<SortBy<T>>;
    /** Sort order parameter (either `asc` or `desc`, default: `asc`) */
    readonly sortOrder: _angular_core.ModelSignal<SortOrder>;
    /** Number of rows should be displayed on page (default: `1000`) */
    readonly rowsOnPage: _angular_core.ModelSignal<number>;
    /** Page number (default: `1`) */
    readonly activePage: _angular_core.ModelSignal<number>;
    readonly inputDataLength: _angular_core.Signal<number>;
    readonly data: _angular_core.Signal<readonly T[]>;
    readonly onSortChange: Subject<SortEvent>;
    readonly onPageChange: Subject<PageEvent>;
    constructor();
    getSort(): SortEvent;
    setSort(sortBy: SortBy<T>, sortOrder: SortOrder): void;
    getPage(): PageEvent;
    setPage(activePage: number, rowsOnPage: number): void;
    private calculateNewActivePage;
    private caseInsensitiveIteratee;
    private compare;
    private sorter;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataTable<any>, never>;
    static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DataTable<any>, "table[mfData]", ["mfDataTable"], { "inputData": { "alias": "mfData"; "required": true; "isSignal": true; }; "sortBy": { "alias": "mfSortBy"; "required": false; "isSignal": true; }; "sortOrder": { "alias": "mfSortOrder"; "required": false; "isSignal": true; }; "rowsOnPage": { "alias": "mfRowsOnPage"; "required": false; "isSignal": true; }; "activePage": { "alias": "mfActivePage"; "required": false; "isSignal": true; }; }, { "sortBy": "mfSortByChange"; "sortOrder": "mfSortOrderChange"; "rowsOnPage": "mfRowsOnPageChange"; "activePage": "mfActivePageChange"; }, never, never, true, never>;
}

declare class BootstrapPaginator {
    /** Specify values for buttons to change number of diplayed rows, e.g. [5, 10, 15] */
    rowsOnPageSet: _angular_core.InputSignal<readonly number[]>;
    /** explicitly specify reference data table, by default the parent `mfData` is injected */
    mfTable: _angular_core.InputSignal<DataTable<any> | undefined>;
    minRowsOnPage: _angular_core.Signal<number>;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<BootstrapPaginator, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<BootstrapPaginator, "mfBootstrapPaginator", never, { "rowsOnPageSet": { "alias": "rowsOnPageSet"; "required": true; "isSignal": true; }; "mfTable": { "alias": "mfTable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
}

declare class Paginator {
    private injectMfTable;
    /** explicitly specify reference data table, by default the parent `mfData` is injected */
    readonly inputMfTable: _angular_core.InputSignal<DataTable<any> | undefined>;
    private readonly mfTable;
    readonly activePage: _angular_core.WritableSignal<number>;
    readonly rowsOnPage: _angular_core.WritableSignal<number>;
    readonly dataLength: _angular_core.WritableSignal<number>;
    readonly lastPage: _angular_core.Signal<number>;
    constructor();
    setPage(pageNumber: number): void;
    setRowsOnPage(rowsOnPage: number): void;
    private onPageChangeSubscriber;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<Paginator, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<Paginator, "mfPaginator", never, { "inputMfTable": { "alias": "mfTable"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
}

declare class DefaultSorter<T = any> {
    private readonly mfTable;
    /** Specify how to sort data (argument for lodash function [\_.sortBy ](https://lodash.com/docs#sortBy)) */
    readonly sortBy: _angular_core.InputSignal<SortBy<T>>;
    readonly isSortedByMeAsc: _angular_core.Signal<boolean>;
    readonly isSortedByMeDesc: _angular_core.Signal<boolean>;
    sort(): boolean;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<DefaultSorter<any>, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<DefaultSorter<any>, "mfDefaultSorter", never, { "sortBy": { "alias": "by"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
}

/**
 * Optional module which exports all components
 * @deprecated Should be replaced with component imports (DataTable, DefaultSorter, Paginator, BootstrapPaginator)
 */
declare class DataTableModule {
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataTableModule, never>;
    static ɵmod: _angular_core.ɵɵNgModuleDeclaration<DataTableModule, never, [typeof DataTable, typeof DefaultSorter, typeof Paginator, typeof BootstrapPaginator], [typeof DataTable, typeof DefaultSorter, typeof Paginator, typeof BootstrapPaginator]>;
    static ɵinj: _angular_core.ɵɵInjectorDeclaration<DataTableModule>;
}

export { BootstrapPaginator, DataTable, DataTableModule, DefaultSorter, Paginator };
export type { DataEvent, PageEvent, SortBy, SortByFunction, SortEvent, SortOrder };
