import { QueryPagingData, QueryPagingOrder } from "@etsoo/appscript";
import { DataTypes } from "@etsoo/shared";
/**
 * Grid size
 */
export type GridSize = number | ((input: number) => number);
/**
 * Grid size calculation
 * @param size Size
 * @param input Input
 */
export declare const GridSizeGet: (size: GridSize, input: number) => number;
/**
 * Grid data type
 */
export type GridData = FormData | DataTypes.StringRecord;
/**
 * Grid template type
 */
export type GridTemplateType<T> = DataTypes.BasicTemplateType<{
    [k in keyof T]: T[k] extends "date" ? "date" | "string" : T[k] extends DataTypes.BasicNames ? T[k] : never;
}>;
/**
 * Grid data get with format
 * @param data Data
 * @param template Template
 * @param keepSource Keep source data
 * @returns Json data
 */
export declare function GridDataGet<const T>(props: GridLoadDataProps, template?: T, keepSource?: boolean): GridJsonData & GridTemplateType<T>;
/**
 * Grid data get with format
 * @param data Data
 * @param template Template
 * @param keepSource Keep source data
 * @returns Json data
 */
export declare function GridDataGetData<const T>(data?: GridData, template?: T, keepSource?: boolean): GridTemplateType<T>;
/**
 * Grid Json data
 */
export type GridJsonData = {
    /**
     * Query paging data
     */
    queryPaging: QueryPagingData;
};
/**
 * Grid data load props
 */
export type GridLoadDataProps = GridJsonData & {
    /**
     * Data related
     */
    data?: GridData;
};
/**
 * Grid data load partial props
 */
export type GridLoadDataPartialProps = {
    /**
     * Query paging data
     */
    queryPaging?: Partial<QueryPagingData>;
    /**
     * Data related
     */
    data?: GridData;
};
/**
 * Grid data loader
 */
export type GridLoader<T extends object, P extends GridJsonData = GridLoadDataProps> = {
    /**
     * Auto load data, otherwise call reset
     * @default true
     */
    autoLoad?: boolean;
    /**
     * Default order by
     */
    defaultOrderBy?: QueryPagingOrder[];
    /**
     * Batch size when load data, default will be calcuated with height and itemSize
     */
    loadBatchSize?: GridSize;
    /**
     * Load data
     */
    loadData: (props: P, lastItem?: T) => PromiseLike<T[] | null | undefined>;
    /**
     * Handler for init load
     * @param ref Ref
     * @returns Result
     */
    onInitLoad?: (ref: any) => [T[], GridLoaderPartialStates<T>?] | null | undefined;
    /**
     * Handler for updating rows
     * @param rows Rows
     * @param state State
     */
    onUpdateRows?: (rows: T[], state: GridLoaderStates<T>) => void;
    /**
     * Threshold at which to pre-fetch data; default is half of loadBatchSize
     */
    threshold?: number | undefined;
};
type GridLoaderProps<T> = {
    /**
     * Auto load data, otherwise call reset
     * @default true
     */
    autoLoad: boolean;
    /**
     * Last loaded item
     */
    lastItem?: T;
    /**
     * Last loaded items
     */
    lastLoadedItems?: number;
    /**
     * All loaded items count
     */
    loadedItems: number;
    /**
     * Has next page?
     */
    hasNextPage: boolean;
    /**
     * Is next page loading?
     */
    isNextPageLoading: boolean;
    /**
     * Is mounted
     */
    isMounted?: boolean;
    /**
     * Selected items of id
     */
    selectedItems: T[];
    /**
     * Id cache
     */
    idCache: Record<any, null>;
};
/**
 * Grid loader states
 */
export type GridLoaderStates<T> = GridLoadDataProps & GridLoaderProps<T>;
/**
 * Grid loader states
 */
export type GridLoaderPartialStates<T> = GridLoadDataPartialProps & Partial<GridLoaderProps<T>>;
export {};
