import { IColumnDefinitionContainer } from '../../types/query';
import { IApiPayload, IDataFetcher, IDataTableQuery } from '../../services/api/api.models';
import { ITable, IAction, ITableOptions, IIsMultiSortEvent } from './models/table';
import { Column, IColumnOption } from './models/column';
import { ITenantAttributeScope } from '../../../_core/services/api/DataHub/Scopes';
import { ITenantAttributeLanguage } from '../../../_core/services/api/DataHub/Languages';
import { SORT_TYPE, ROW_SELECTION } from './constants';

/**
 * Actindo Data Table properties
 * @interface
 * @template T
 * @property {string | T[] | IDataFetcher<T>} data - Table data source
 * @property {object} [customQuery] - Additional query, will be sent on every request
 * @property {boolean} [isLoading] - Should not show table component
 * @property {boolean} [isRowClickable] - Should show cursor pointer on row
 * @property {ROW_SELECTION} [rowSelection] - Row selection type
 * @property {IColumnOption[]} columns - Column configuration array
 * @property {Partial<IColumnOption>} [defaultColumn] - Common column configuration, will be added to every column
 * @property {string[]} [columnsOrder] - Ordered list of columns IDs
 * @property {SORT_TYPE} [sortType] - Sorting type (blocked/by single column/by multi columns)
 * @property {IIsMultiSortEvent} [isMultiSortEvent='shift + click'] - Determines whether the current event trigger a multi-sorting (hold 'shift' key by default)
 * @property {string} [tableName] - Table title
 * @property {string} [gridId] - Name of table preset
 * @property {boolean} [hasSplitView] - Show split view control
 * @property {boolean} [hideGlobalSearch] - Don't show global search input
 * @property {boolean} [hideFilters] - Don't show column filters
 * @property {boolean} [hideColumnCustomization] - Don't show columns list, don't allow to change columns order
 * @property {IAction[]|boolean} [createActions] - Menu item for `Create new row` button
 * @property {boolean} [hidePagination] - Don't show pagination
 * @property {number} [pageSize] - Amount of rows per page
 * @property {boolean|number[]} [pageSizes] - Allow to change page size
 */
export interface IActindoDataTableProps<T extends object = object> extends ITableOptions<T> {
    /**
     * Table data source
     * @example { data: "Actindo.CoreModules.Auth.User.listKeys" } - use HttpApi.getDataTable to fetch data
     * @example { data: [{}, ...] } - offline data
     * @example { data: <T>(query: IDataTableQuery) => Promise<IDataFetcherResponse<T>> } - use this function to fetch data
     * @required
     */
    data: string | T[] | IDataFetcher<T>;
    /** Additional query, will be sent on every request */
    customQuery?: Record<string, any>;
    /** Expect exact number of rows in response */
    exactRowCount?: boolean;
    /** External flag - should not show table component */
    isLoading?: boolean;
    /** will be passed to actions panel */
    disableActions?: boolean;
    /** External flag - don't fetch new data */
    freeze?: boolean;
    /** Should show cursor pointer on row */
    isRowClickable?: boolean;
    /**
     * Row selection type:
     * ROW_SELECTION.NONE - hide row checkboxes
     * ROW_SELECTION.SINGLE - select only single row at once
     * ROW_SELECTION.MULTI - select any amount of rows at once
     *  */
    rowSelection?: ROW_SELECTION;
    /** Selection persist across multi pages */
    persistentSelection?: boolean;
    /** Disable selection of the row it that field contains true  */
    lockedProperty?: string;
    rowHeight?: string;
    minRowHeight?: string;
    /**
     * Column configuration array
     * @required
     * */
    columns: IColumnOption<any, T>[];
    /** Entity type for dynamic columns */
    entityTypeClassName?: string;
    /** Method to fetch dynamic columns list */
    dynamicColumnsEndpoint?: string | ((query?: unknown) => Promise<IApiPayload<IColumnDefinitionContainer[]>>);
    /** Common column configuration, will be added to every column */
    defaultColumn?: Partial<IColumnOption>;
    /** Ordered list of columns IDs */
    columnsOrder?: string[];
    /** Sorting type (blocked/by single column/by multi columns) */
    sortType?: SORT_TYPE;
    /** Determines whether the current event should trigger a multi-sorting */
    isMultiSortEvent?: IIsMultiSortEvent;
    /**
     * Menu items for `Actions Bar`
     * @example { tableActions: [{}, ...] } - show actions buttons/menus and emit selected event
     */
    tableActions?: IAction<T>[];
    /** Table title */
    tableName?: string;
    /** Preset ID */
    gridId?: string;
    /** Hide Channel and Language controls */
    channels?: ITenantAttributeScope[] | boolean;
    languages?: ITenantAttributeLanguage[] | boolean;
    /** Show split view control */
    hasSplitView?: boolean;
    /** Don't show global search input */
    hideGlobalSearch?: boolean;
    /** Don't show column filters */
    hideFilters?: boolean;
    /** Don't show columns list, don't allow to change columns order */
    hideColumnCustomization?: boolean;
    /**
     * Menu items for `Create new row` button
     * @example { createActions: false } - hide `Create new row` button
     * @example { createActions: undefined } - hide `Create new row` button
     * @example { createActions: [] } - hide `Create new row` button
     * @example { createActions: [{}] } - show only `Create new row` button and emit this event immediately on button click
     * @example { createActions: [{}, ...] } - show actions menu and emit selected event
     */
    createActions?: IAction<T>[] | boolean;
    /** Don't show pagination */
    hidePagination?: boolean;
    /** Amount of rows per page */
    pageSize?: number;
    /**
     * Allow to choose page size
     * @example { pageSizes: true } - show default page size list (PAGE_SIZES)
     * @example { pageSizes: [10, ...] } - show specified page sizes list
     *  */
    pageSizes?: boolean | number[];
    /** should use router for details navigation */
    routable?: string | boolean;
    /** name of the ID field in the route.params (rowId by default) */
    routableId?: string;
    /** selector for details teleport */
    detailsTarget?: string;
    /** name of the field with id for routing */
    rowIdName?: keyof T | string;
    /** should not hide table in detail view */
    modalDetails?: boolean;
    hideRemove?: boolean;
    canReorderHeaders?: boolean;
    refreshText?: string;
    hideNoData?: boolean;
    hideNoDataTitle?: boolean;
    hideNoDataDescription?: boolean;
    hideNoDataComment?: boolean;
    transparent?: boolean;
    virtualScroll?: boolean;
    getDetailsApi?: boolean | string | ((query: {
        id: number | string;
    }) => Promise<T>);
    forceDetailsFetch?: boolean;
}
declare const _default: <T extends object>(__VLS_props: Awaited<typeof __VLS_setup>["props"], __VLS_ctx?: __VLS_Prettify<Pick<Awaited<typeof __VLS_setup>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
    props: __VLS_Prettify<__VLS_OmitKeepDiscriminatedUnion<(Partial<{}> & Omit<{
        readonly onAction?: (eventName: string, selectedRows: T[]) => any;
        readonly onCreate?: (eventName: string) => any;
        readonly "onClicked-row"?: (selectedRow: T) => any;
        readonly "onDbl-clicked-row"?: (selectedRow: T) => any;
        readonly "onUpdate:data"?: (newRows: T[]) => any;
        readonly onRefresh?: () => any;
        readonly onRecalculate?: (query: IDataTableQuery) => any;
        readonly onDetail?: (isVisible: boolean) => any;
        readonly "onUpdate-width"?: (width: number, header: Column<Record<string, any>>) => any;
    } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>) & IActindoDataTableProps<T>, keyof import('vue').VNodeProps | keyof import('vue').AllowedComponentProps>> & {} & (import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps);
    expose(exposed: import('vue').ShallowUnwrapRef<{
        table: ITable<T>;
        reloadTable: () => void;
        clearSelection: () => void;
        prepareDataRequestPayload: () => T;
    }>): void;
    attrs: any;
    slots: ReturnType<() => Readonly<{
        [slotName: `header-${string}`]: (props: {
            name: string;
            column: Column;
            headerValue: string;
        }) => void;
        [slotName: `cell-${string}`]: (props: {
            row: T;
            rowIndex: number;
            cell: Column;
            cellValue: string;
        }) => void;
        "split-details"?: (props: {
            rowId: number | string;
            row: T;
        }) => void;
        "split-row"?: (props: {
            rowIndex: number;
            row: T;
            isSelected: boolean;
        }) => void;
        "split-title"?: (props: {
            rowId: number | string;
            row: T;
        }) => void;
        "split-actions"?: (props: {
            table: ITable;
            disabled: boolean;
            row: T;
        }) => void;
        filters?: (props: {
            table: ITable;
            disabled: boolean;
        }) => void;
        actionButtons?: (props: {
            table: ITable;
            disabled: boolean;
        }) => void;
        globalActions?: (props: {
            table: ITable;
            disabled: boolean;
        }) => void;
        extraActions?: () => void;
        rowDisabled?: () => void;
        details?: (props: {
            rowId: number | string;
            row: T;
            close: (reload?: boolean) => void;
            loading: boolean;
        }) => void;
        modals?: () => void;
        "no-data-title"?: () => void;
        "no-data-description"?: () => void;
        "no-data-comment"?: () => void;
        row?: (props: {
            colspan: number;
            headers: Column[];
            rowIndex: number;
            row: T;
            rowSelection: ROW_SELECTION;
            isAllSelected: boolean;
            isSelected: boolean;
            singleSelection: (value: unknown) => void;
            changeSelection: (value: unknown) => void;
        }) => void;
    }> & {
        [slotName: `header-${string}`]: (props: {
            name: string;
            column: Column;
            headerValue: string;
        }) => void;
        [slotName: `cell-${string}`]: (props: {
            row: T;
            rowIndex: number;
            cell: Column;
            cellValue: string;
        }) => void;
        "split-details"?: (props: {
            rowId: number | string;
            row: T;
        }) => void;
        "split-row"?: (props: {
            rowIndex: number;
            row: T;
            isSelected: boolean;
        }) => void;
        "split-title"?: (props: {
            rowId: number | string;
            row: T;
        }) => void;
        "split-actions"?: (props: {
            table: ITable;
            disabled: boolean;
            row: T;
        }) => void;
        filters?: (props: {
            table: ITable;
            disabled: boolean;
        }) => void;
        actionButtons?: (props: {
            table: ITable;
            disabled: boolean;
        }) => void;
        globalActions?: (props: {
            table: ITable;
            disabled: boolean;
        }) => void;
        extraActions?: () => void;
        rowDisabled?: () => void;
        details?: (props: {
            rowId: number | string;
            row: T;
            close: (reload?: boolean) => void;
            loading: boolean;
        }) => void;
        modals?: () => void;
        "no-data-title"?: () => void;
        "no-data-description"?: () => void;
        "no-data-comment"?: () => void;
        row?: (props: {
            colspan: number;
            headers: Column[];
            rowIndex: number;
            row: T;
            rowSelection: ROW_SELECTION;
            isAllSelected: boolean;
            isSelected: boolean;
            singleSelection: (value: unknown) => void;
            changeSelection: (value: unknown) => void;
        }) => void;
    }>;
    emit: {
        (event: "create", eventName: string): void;
        (event: "action", eventName: string | undefined, selectedRows: T[]): void;
        (event: "clicked-row", selectedRow: T): void;
        (event: "dbl-clicked-row", selectedRow: T): void;
        (event: "detail", isVisible: boolean): void;
        (event: "update-width", width: number, header: Column): void;
        (event: "update:data", newRows: T[]): void;
        (event: "refresh"): void;
        (event: "recalculate", query: IDataTableQuery): void;
    };
}>) => import('vue').VNode<import('vue').RendererNode, import('vue').RendererElement, {
    [key: string]: any;
}> & {
    __ctx?: Awaited<typeof __VLS_setup>;
};
export default _default;
type __VLS_Prettify<T> = {
    [K in keyof T]: T[K];
} & {};
