import React, { ReactNode } from 'react';
import PropTypes from 'prop-types';
import Store from '@douyinfe/semi-foundation/lib/cjs/utils/Store';
import TableFoundation, { TableAdapter, BasePageData, BaseRowKeyType, BaseHeadWidth } from '@douyinfe/semi-foundation/lib/cjs/table/foundation';
import { TableSelectionCellEvent } from '@douyinfe/semi-foundation/lib/cjs/table/tableSelectionCellFoundation';
import { strings } from '@douyinfe/semi-foundation/lib/cjs/table/constants';
import '@douyinfe/semi-foundation/lib/cjs/table/table.css';
import BaseComponent from '../_base/baseComponent';
import { TableContextProps } from './table-context';
import { HeadTableProps } from './HeadTable';
import { BodyProps } from './Body';
import { ColumnProps, TablePaginationProps, BodyScrollEvent, BodyScrollPosition, ExpandIcon, Pagination, RenderPagination, TableProps, TableComponents, RowSelectionProps, Data } from './interface';
import { ArrayElement } from '../_base/base';
export type NormalTableProps<RecordType extends Record<string, any> = Data> = Omit<TableProps<RecordType>, 'resizable'>;
export interface NormalTableState<RecordType extends Record<string, any> = Data> {
    cachedColumns?: ColumnProps<RecordType>[];
    cachedChildren?: React.ReactNode;
    flattenColumns?: ColumnProps<RecordType>[];
    components?: TableComponents;
    queries?: ColumnProps<RecordType>[];
    dataSource?: RecordType[];
    flattenData?: RecordType[];
    expandedRowKeys?: (string | number)[];
    rowSelection?: TableStateRowSelection<RecordType>;
    pagination?: Pagination;
    groups?: Map<string, RecordType[]>;
    allRowKeys?: (string | number)[];
    disabledRowKeys?: (string | number)[];
    disabledRowKeysSet?: Set<string | number>;
    headWidths?: Array<Array<BaseHeadWidth>>;
    bodyHasScrollBar?: boolean;
    prePropRowSelection?: TableStateRowSelection<RecordType>;
    tableWidth?: number;
    prePagination?: Pagination;
    /**
    * Disabled row keys in sorted and filtered data
    */
    allDisabledRowKeys?: BaseRowKeyType[];
    /**
     * Disabled row keys set in sorted and filtered data
     */
    allDisabledRowKeysSet?: Set<BaseRowKeyType>;
}
export type TableStateRowSelection<RecordType extends Record<string, any> = Data> = (RowSelectionProps<RecordType> & {
    selectedRowKeysSet?: Set<(string | number)>;
}) | boolean;
export interface RenderTableProps<RecordType> extends HeadTableProps, BodyProps {
    filteredColumns: ColumnProps<RecordType>[];
    useFixedHeader: boolean;
    bodyRef: React.MutableRefObject<HTMLDivElement> | ((instance: any) => void);
    rowSelection: TableStateRowSelection<RecordType>;
    bodyHasScrollBar: boolean;
}
declare class Table<RecordType extends Record<string, any>> extends BaseComponent<NormalTableProps<RecordType>, NormalTableState<RecordType>> {
    static contextType: React.Context<TableContextProps>;
    static propTypes: {
        className: PropTypes.Requireable<string>;
        style: PropTypes.Requireable<object>;
        prefixCls: PropTypes.Requireable<string>;
        components: PropTypes.Requireable<any>;
        bordered: PropTypes.Requireable<boolean>;
        loading: PropTypes.Requireable<boolean>;
        size: PropTypes.Requireable<"default" | "small" | "middle">;
        tableLayout: PropTypes.Requireable<"" | "fixed" | "auto">;
        columns: PropTypes.Requireable<PropTypes.InferProps<{
            align: PropTypes.Requireable<"center" | "left" | "right">;
            className: PropTypes.Requireable<string>;
            colSpan: PropTypes.Requireable<number>;
            dataIndex: PropTypes.Requireable<string>;
            defaultSortOrder: PropTypes.Requireable<"ascend" | "descend">;
            filterChildrenRecord: PropTypes.Requireable<boolean>;
            filterDropdownProps: PropTypes.Requireable<object>;
            filterDropdown: PropTypes.Requireable<PropTypes.ReactNodeLike>;
            filterDropdownVisible: PropTypes.Requireable<boolean>;
            filterIcon: PropTypes.Requireable<(...args: any[]) => any>;
            filterMultiple: PropTypes.Requireable<boolean>;
            filteredValue: PropTypes.Requireable<any[]>;
            filters: PropTypes.Requireable<any[]>;
            fixed: PropTypes.Requireable<boolean | "left" | "right">;
            onCell: PropTypes.Requireable<(...args: any[]) => any>;
            onFilter: PropTypes.Requireable<(...args: any[]) => any>;
            onFilterDropdownVisibleChange: PropTypes.Requireable<(...args: any[]) => any>;
            onHeaderCell: PropTypes.Requireable<(...args: any[]) => any>;
            onSorterChange: PropTypes.Requireable<(...args: any[]) => any>;
            render: PropTypes.Requireable<(...args: any[]) => any>;
            renderFilterDropdownItem: PropTypes.Requireable<(...args: any[]) => any>;
            sortChildrenRecord: PropTypes.Requireable<boolean>;
            sortDirections: PropTypes.Requireable<string[]>;
            sortOrder: PropTypes.Requireable<NonNullable<string | boolean>>;
            sorter: PropTypes.Requireable<NonNullable<boolean | ((...args: any[]) => any)>>;
            title: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike | ((...args: any[]) => any)>>;
            useFullRender: PropTypes.Requireable<boolean>;
            width: PropTypes.Requireable<NonNullable<string | number>>;
        }>[]>;
        hideExpandedColumn: PropTypes.Requireable<boolean>;
        id: PropTypes.Requireable<string>;
        expandIcon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike | ((...args: any[]) => any)>>;
        expandCellFixed: PropTypes.Requireable<boolean | "left" | "right">;
        title: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike | ((...args: any[]) => any)>>;
        onHeaderRow: PropTypes.Requireable<(...args: any[]) => any>;
        showHeader: PropTypes.Requireable<boolean>;
        indentSize: PropTypes.Requireable<number>;
        rowKey: PropTypes.Requireable<NonNullable<string | number | ((...args: any[]) => any)>>;
        onRow: PropTypes.Requireable<(...args: any[]) => any>;
        onExpandedRowsChange: PropTypes.Requireable<(...args: any[]) => any>;
        onExpand: PropTypes.Requireable<(...args: any[]) => any>;
        rowExpandable: PropTypes.Requireable<(...args: any[]) => any>;
        expandedRowRender: PropTypes.Requireable<(...args: any[]) => any>;
        expandedRowKeys: PropTypes.Requireable<any[]>;
        defaultExpandAllRows: PropTypes.Requireable<boolean>;
        expandAllRows: PropTypes.Requireable<boolean>;
        defaultExpandAllGroupRows: PropTypes.Requireable<boolean>;
        expandAllGroupRows: PropTypes.Requireable<boolean>;
        defaultExpandedRowKeys: PropTypes.Requireable<any[]>;
        pagination: PropTypes.Requireable<NonNullable<boolean | object>>;
        renderPagination: PropTypes.Requireable<(...args: any[]) => any>;
        footer: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike | ((...args: any[]) => any)>>;
        empty: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        dataSource: PropTypes.Requireable<any[]>;
        childrenRecordName: PropTypes.Requireable<string>;
        rowSelection: PropTypes.Requireable<NonNullable<boolean | object>>;
        onChange: PropTypes.Requireable<(...args: any[]) => any>;
        scroll: PropTypes.Requireable<PropTypes.InferProps<{
            x: PropTypes.Requireable<NonNullable<string | number | boolean>>;
            y: PropTypes.Requireable<NonNullable<string | number>>;
        }>>;
        groupBy: PropTypes.Requireable<NonNullable<string | number | ((...args: any[]) => any)>>;
        renderGroupSection: PropTypes.Requireable<(...args: any[]) => any>;
        onGroupedRow: PropTypes.Requireable<(...args: any[]) => any>;
        clickGroupedRowToExpand: PropTypes.Requireable<boolean>;
        virtualized: PropTypes.Requireable<NonNullable<boolean | object>>;
        dropdownPrefixCls: PropTypes.Requireable<string>;
        expandRowByClick: PropTypes.Requireable<boolean>;
        getVirtualizedListRef: PropTypes.Requireable<(...args: any[]) => any>;
    };
    static defaultProps: {
        tableLayout: string;
        dataSource: [];
        prefixCls: "semi-table";
        rowSelection: null;
        className: string;
        childrenRecordName: string;
        size: string;
        loading: boolean;
        bordered: boolean;
        expandCellFixed: boolean;
        hideExpandedColumn: boolean;
        showHeader: boolean;
        indentSize: 20;
        onChange: (...args: any[]) => void;
        pagination: boolean;
        rowKey: string;
        defaultExpandedRowKeys: [];
        defaultExpandAllRows: boolean;
        defaultExpandAllGroupRows: boolean;
        expandAllRows: boolean;
        expandAllGroupRows: boolean;
        onFilterDropdownVisibleChange: (...args: any[]) => void;
        onExpand: (...args: any[]) => void;
        onExpandedRowsChange: (...args: any[]) => void;
        expandRowByClick: boolean;
    };
    get adapter(): TableAdapter<RecordType>;
    bodyWrapRef: React.MutableRefObject<HTMLDivElement>;
    rootWrapRef: React.MutableRefObject<HTMLDivElement>;
    wrapRef: React.MutableRefObject<HTMLDivElement>;
    headerWrapRef: React.MutableRefObject<HTMLDivElement>;
    debouncedWindowResize: () => void;
    cachedFilteredSortedDataSource: RecordType[];
    cachedFilteredSortedRowKeys: BaseRowKeyType[];
    cachedFilteredSortedRowKeysSet: Set<string | number>;
    store: Store;
    lastScrollTop: number;
    lastScrollLeft: number;
    scrollPosition: BodyScrollPosition;
    position: BodyScrollPosition;
    foundation: TableFoundation<RecordType>;
    context: TableContextProps;
    constructor(props: NormalTableProps<RecordType>, context: TableContextProps);
    static getDerivedStateFromProps(props: NormalTableProps, state: NormalTableState): Partial<NormalTableState<Data>>;
    componentDidMount(): void;
    componentDidUpdate(prevProps: NormalTableProps<RecordType>, prevState: NormalTableState<RecordType>): void;
    componentWillUnmount(): void;
    _warnIfNoKey: () => void;
    _invokeRowSelection: (funcName: string, ...args: any[]) => void;
    _invokeColumnFn: (key: string, funcName: string, ...args: any[]) => void;
    _cacheHeaderRef: (node: HTMLDivElement) => void;
    getCurrentPageData: () => Pick<BasePageData<RecordType>, "dataSource" | "groups">;
    getColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) => ColumnProps<RecordType>[];
    getCellWidths: (...args: any[]) => number[];
    setHeadWidths: (...args: any[]) => void;
    getHeadWidths: (...args: any[]) => number[];
    mergedRowExpandable: (...args: any[]) => boolean;
    setBodyHasScrollbar: (...args: any[]) => void;
    handleWheel: (event: React.WheelEvent<HTMLDivElement>) => void;
    handleBodyScrollLeft: (e: BodyScrollEvent) => void;
    handleWindowResize: () => void;
    handleBodyScrollTop: (e: BodyScrollEvent) => void;
    handleBodyScroll: (e: BodyScrollEvent) => void;
    setScrollPosition: (position: BodyScrollPosition) => void;
    setScrollPositionClassName: () => void;
    syncTableWidth: () => void;
    renderSelection: (record?: any, inHeader?: boolean, index?: number) => React.ReactNode;
    renderRowSelectionCallback: (text: string, record: RecordType, index: number) => React.ReactNode;
    renderTitleSelectionCallback: () => React.ReactNode;
    normalizeSelectionColumn: (props?: {
        rowSelection?: TableStateRowSelection<RecordType>;
        prefixCls?: string;
    }) => ColumnProps<any>;
    normalizeScrollbarColumn: (props?: {
        scrollbarWidth?: number;
    }) => {
        key: 'column-scrollbar';
        width: number;
        fixed: 'right';
    };
    /**
     * render expand icon
     * @param {Object} record
     * @param {Boolean} isNested
     * @param {String} groupKey
     * @returns {ReactNode}
     */
    renderExpandIcon: (record?: {}, isNested?: boolean, groupKey?: string | number) => React.JSX.Element;
    handleRowExpanded: (...args: any[]) => void;
    normalizeExpandColumn: (props?: {
        prefixCls?: string;
        expandCellFixed?: ArrayElement<typeof strings.FIXED_SET>;
        expandIcon?: ExpandIcon;
    }) => ColumnProps<any>;
    /**
      * Add sorting, filtering, and rendering functions to columns, and add column event handling
      * Title support function, passing parameters as {filter: node, sorter: node, selection: node}
      * @param {*} column
      */
    addFnsInColumn: (column?: ColumnProps) => ColumnProps<any>;
    toggleSelectRow: (selected: boolean, realKey: string | number, e: TableSelectionCellEvent) => void;
    toggleSelectAllRow: (selected: boolean, e: TableSelectionCellEvent) => void;
    /**
     * render pagination
     * @param {object} pagination
     * @param {object} propRenderPagination
     */
    renderPagination: (pagination: TablePaginationProps, propRenderPagination: RenderPagination) => React.JSX.Element;
    renderTitle: (props?: {
        title?: React.ReactNode | ((dataSource?: RecordType[]) => ReactNode);
        prefixCls?: string;
        dataSource?: any[];
    }) => React.JSX.Element;
    renderEmpty: (props?: {
        prefixCls?: string;
        empty?: ReactNode;
        dataSource?: RecordType[];
    }) => React.JSX.Element;
    renderFooter: (props?: {
        footer?: React.ReactNode | ((dataSource?: RecordType[]) => ReactNode);
        prefixCls?: string;
        dataSource?: RecordType[];
    }) => React.JSX.Element;
    renderMainTable: (props: any) => (React.JSX.Element | React.JSX.Element[])[];
    renderTable: (props: RenderTableProps<RecordType>) => React.JSX.Element[];
    /**
     * When columns change, call this function to get the latest withFnsColumns
     * In addition to changes in columns, these props changes must be recalculated
     *  - hideExpandedColumn
     *  -rowSelection changes from trusy to falsy or rowSelection.hidden changes
     *  -isAnyFixedRight(columns) || get(scroll,'y') changes
     *
     * columns变化时，调用此函数获取最新的withFnsColumns
     * 除了 columns 变化，这些 props 变化也要重新计算
     *  - hideExpandedColumn
     *  - rowSelection 从 trusy 变为 falsy 或 rowSelection.hidden 发生变化
     *  - isAnyFixedRight(columns) || get(scroll, 'y') 发生变化
     *
     * @param {Array} queries
     * @param {Array} cachedColumns
     * @returns columns after adding extended functions
     */
    handleColumns: (queries: ColumnProps<RecordType>[], cachedColumns: ColumnProps<RecordType>[]) => ColumnProps<RecordType>[];
    /**
     * Convert children to columns object
     * @param {Array} columns
     * @param {ReactNode} children
     * @returns {Array}
     */
    normalizeColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) => ColumnProps<RecordType>[];
    /**
     * Combine pagination and table paging processing functions
     */
    mergePagination: (pagination: TablePaginationProps) => {
        position?: "both" | "top" | "bottom";
        formatPageText?: import("./interface").FormatPageText;
        style?: React.CSSProperties;
        className?: string;
        children?: any;
        total?: number;
        showTotal?: boolean;
        pageSize?: number;
        pageSizeOpts?: number[];
        size?: "default" | "small";
        currentPage?: number;
        defaultCurrentPage?: number;
        onPageChange?: (currentPage: number) => void;
        onPageSizeChange?: (newPageSize: number) => void;
        onChange: (currentPage: number, pageSize: number) => void;
        prevText?: React.ReactNode;
        nextText?: React.ReactNode;
        showSizeChanger?: boolean;
        showQuickJumper?: boolean;
        popoverZIndex?: number;
        popoverPosition?: "left" | "top" | "right" | "bottom" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver";
        hideOnSinglePage?: boolean;
        hoverShowPageSelect?: boolean;
        disabled?: boolean;
    };
    render(): React.JSX.Element;
}
export default Table;
