import { SurveyModel, Question, Event, EventBase } from "survey-core";
import { IPermission, QuestionLocation, ITableState, IColumn, IColumnData } from "./config";
import { Details } from "./extensions/detailsextensions";
import { ITableExtension, TableExtensions } from "./extensions/tableextensions";
export interface ITableOptions {
    [index: string]: any;
    /**
     * Specifies whether to use question names instead of question titles as column headings.
     *
     * Default value: `false`
     */
    useNamesAsTitles?: boolean;
    /**
     * Specifies the delimiter used to separate multiple choice items in a list.
     *
     * Default value: `", "`
     */
    itemsDelimiter?: string;
    /**
     * A callback function that allows you to customize a question's display value in the table.
     *
     * Parameters:
     *
     * - `options.question`: `Question`\
     * The question for which the callback is executed.
     * - `options.displayValue`: `any`\
     * The question's display value. You can modify this parameter to change the output.
     */
    onGetQuestionValue?: (options: {
        question: Question;
        displayValue: any;
    }) => void;
    /**
     * Specifies the number of data items to load and display per page. Applies only if `paginationEnabled` is `true`.
     *
     * Default value: 10
     * @see paginationEnabled
     */
    pageSize?: number;
    /**
     * Specifies whether the dataset is split into pages.
     *
     * Default value: `true`
     *
     * > Pagination cannot be disabled if the dataset is loaded from a server (that is, if the second parameter passed to the `Tabulator` constructor is a function).
     * @see pageSize
     */
    paginationEnabled?: boolean;
}
export type TabulatorFilter = {
    field: string;
    type: string;
    value: any;
};
export type TabulatorSortOrder = {
    field: string;
    direction: undefined | "asc" | "desc";
};
export type GetDataUsingCallbackFn = (params: {
    filter?: Array<TabulatorFilter>;
    sort?: Array<TabulatorSortOrder>;
    offset?: number;
    limit?: number;
    callback?: (response: {
        data: Array<Object>;
        totalCount: number;
        error?: any;
    }) => void;
}) => void;
export type GetDataUsingPromiseFn = (params: {
    filter?: Array<TabulatorFilter>;
    sort?: Array<TabulatorSortOrder>;
    offset?: number;
    limit?: number;
}) => Promise<{
    data: Array<Object>;
    totalCount: number;
    error?: any;
}>;
export type GetDataFn = GetDataUsingCallbackFn | GetDataUsingPromiseFn;
export declare class TableEvent extends EventBase<Table> {
}
export declare abstract class Table {
    protected _survey: SurveyModel;
    protected data: Array<Object> | GetDataFn;
    protected _options: ITableOptions;
    protected _columnsData: Array<IColumnData>;
    static showFilesAsImages: boolean;
    static haveCommercialLicense: boolean;
    protected tableData: any;
    protected extensions: TableExtensions;
    private haveCommercialLicense;
    protected _columns: Array<IColumn>;
    constructor(_survey: SurveyModel, data: Array<Object> | GetDataFn, _options?: ITableOptions, _columnsData?: Array<IColumnData>);
    protected renderResult: HTMLElement;
    protected currentPageSize: number;
    protected currentPageNumber: number;
    protected _rows: TableRow[];
    protected isColumnReorderEnabled: boolean;
    protected initialize(): void;
    getTableData(): Array<any>;
    /**
     * Sets pagination selector content.
     */
    paginationSizeSelector: number[];
    onColumnsVisibilityChanged: TableEvent;
    onColumnsLocationChanged: TableEvent;
    onRowRemoved: TableEvent;
    renderDetailActions: (container: HTMLElement, row: TableRow) => HTMLElement;
    getData(): Object[] | GetDataFn;
    get survey(): SurveyModel;
    get options(): ITableOptions;
    abstract applyFilter(value: string): void;
    abstract applyColumnFilter(columnName: string, value: string): void;
    abstract sortByColumn(columnName: string, direction: string): void;
    render(targetNode: HTMLElement | string): void;
    enableColumnReorder(): void;
    disableColumnReorder(): void;
    getPageNumber(): number;
    setPageNumber(value: number): void;
    /**
     * Returns current page size.
     */
    getPageSize(): number;
    /**
     * Sets current page size.
     */
    setPageSize(value: number): void;
    getCreatedRows(): TableRow[];
    clearCreatedRows(): void;
    get useNamesAsTitles(): boolean;
    get itemsDelimiter(): string;
    protected buildColumns: (survey: SurveyModel) => IColumn[];
    private isNonValueQuestion;
    isColumnVisible(column: IColumn): boolean;
    get columns(): Array<IColumn>;
    set columns(columns: Array<IColumn>);
    private isInitTableDataProcessingValue;
    get isInitTableDataProcessing(): boolean;
    protected initTableData(data: Object[] | GetDataFn): void;
    protected processLoadedDataItem(item: any): any;
    moveColumn(from: number, to: number): void;
    setColumnLocation(columnName: string, location: QuestionLocation): void;
    getColumnByName(columnName: string): IColumn;
    setColumnVisibility(columnName: string, isVisible: boolean): void;
    setColumnWidth(columnName: string, width: string | number): void;
    removeRow(row: TableRow): void;
    /**
     * Returns current locale of the table.
     * If locales more than one, the language selection dropdown will be added in the toolbar
     */
    get locale(): string;
    /**
     * Sets locale for table.
     */
    set locale(newLocale: string);
    getLocales(): Array<string>;
    protected supportSoftRefresh(): boolean;
    protected softRefresh(): void;
    protected hardRefresh(): void;
    refresh(hard?: boolean): void;
    destroy(): void;
    get isRendered(): boolean;
    /**
     * Table state getter.
     */
    get state(): ITableState;
    /**
     * Table state setter.
     */
    set state(newState: ITableState);
    /**
     * Resets table state.
     */
    resetState(): void;
    private updateColumnsFromData;
    /**
     * Fires when table state changed.
     */
    onStateChanged: TableEvent;
    /**
     * Gets table permissions.
     */
    get permissions(): IPermission[];
    /**
     * Sets table permissions.
     */
    set permissions(permissions: IPermission[]);
    /**
     * Fires when permissions changed
     */
    onPermissionsChangedCallback: any;
    protected get allowSorting(): boolean;
    allowExtension(extension: ITableExtension): boolean;
}
export declare abstract class TableRow {
    protected table: Table;
    protected extensionsContainer: HTMLElement;
    protected detailsContainer: HTMLElement;
    constructor(table: Table, extensionsContainer: HTMLElement, detailsContainer: HTMLElement);
    details: Details;
    extensions: TableExtensions;
    private detailedRowClass;
    private isDetailsExpanded;
    onToggleDetails: Event<(sender: TableRow, options: any) => any, TableRow, any>;
    /**
     * Returns row's html element
     */
    abstract getElement(): HTMLElement;
    /**
     * Returns data, which is displayed in the row.
     */
    abstract getRowData(): any;
    /**
     * Returns position of row in the table's data.
     */
    abstract getDataPosition(): number;
    protected isSelected: boolean;
    render(): void;
    openDetails(): void;
    closeDetails(): void;
    toggleDetails(): void;
    getIsSelected(): boolean;
    toggleSelect(): void;
    remove(): void;
    private onColumnLocationChangedCallback;
    destroy(): void;
}
