@acrool/react-table
Version:
Table library based for Reactjs
142 lines (141 loc) • 4.34 kB
TypeScript
import { ReactNode, MouseEvent, MouseEventHandler } from 'react';
import CSS from 'csstype';
import { IPaginateVisibleProps } from './Paginate/types';
export interface IConfig {
colSpan?: number;
rowSpan?: number;
dataAlign?: 'left' | 'center' | 'right';
dataVertical?: 'top' | 'center' | 'bottom';
className?: string;
}
export type TLineHeight = `${number}${TSizeUnit}` | 'auto';
export declare enum ETableMode {
table = "table",
cell = "cell"
}
/** -------------------------------
* Title
* ------------------------------ */
export type TSizeUnit = 'px' | '%' | 'em' | 'fr' | 'rem';
export type TSizeUnitOrNumber = number | `${number}${TSizeUnit}`;
export type TTitleCol = true | 'auto' | TSizeUnitOrNumber;
export interface ITitleField extends IConfig {
className?: string;
col: TTitleCol;
text?: string | number | ReactNode;
titleAlign?: 'left' | 'center' | 'right';
isEnableSort?: boolean;
sticky?: 'left' | 'right';
isHidden?: boolean;
}
export type TTableTitle<K extends string> = {
[P in K]: ITitleField;
};
export type TOnChangeSortField = (meta: IOrder) => void;
export interface IOrderByType {
asc: string;
desc: string;
}
/** -------------------------------
* Body
* ------------------------------ */
export type TBodyDataFieldKey = string;
export type TFieldValue = string | number | boolean | JSX.Element;
interface TFieldFuncArgs {
isActive: boolean;
collapse: MouseEventHandler;
}
type TFieldFunc = (args: TFieldFuncArgs) => TFieldValue;
export type TBodyDataField<K extends TBodyDataFieldKey> = {
[P in K]?: TFieldValue | TFieldFunc | {
value: TFieldValue;
} & IConfig;
};
export type TBodyDataDetail<K extends TBodyDataFieldKey> = {
[P in K]?: TFieldValue | {
value: TFieldValue;
} & IConfig;
};
export type TBodyDataID = string | number;
export type TOnClickRow = <I extends TBodyDataID>(id: I, collapse: () => void) => void;
export interface ITableBody<K extends TBodyDataFieldKey, I extends TBodyDataID> {
id: I;
detail?: ReactNode | TBodyDataDetail<K>[];
disabled?: boolean;
onClickRow?: TOnClickRow;
field: TBodyDataField<K>;
}
/** -------------------------------
* Footer
* ------------------------------ */
export type TFooter<K extends TBodyDataFieldKey> = {
[P in K]?: TFieldValue | {
value: TFieldValue;
} & IConfig;
};
/** -------------------------------
* Paginate
* ------------------------------ */
export interface IPaginateInfo {
totalItems: number;
totalPages: number;
}
export interface IPage {
currentPage: number;
pageLimit?: number;
}
export interface IOrder {
orderField: string;
orderBy: string;
}
export interface IPaginateMeta extends Required<IPage> {
order?: IOrder;
}
export interface ISortableData {
items: string[];
active: {
index: number;
id: string;
};
over: {
index: number;
id: string;
};
}
export type TOnChangePage = (meta: IPaginateMeta, isUsePreMeta?: boolean) => void;
export type TCollapseEvent = (e: MouseEvent) => void;
export type TOnChangeSortable = (sortableData: ISortableData) => void;
/** -------------------------------
* Table
* ------------------------------ */
export interface ITableProps<I extends TBodyDataID, K extends TBodyDataFieldKey> extends IPaginateVisibleProps {
className?: string;
style?: CSS.Properties;
isDark?: boolean;
locale?: string;
isFetching?: boolean;
title: TTableTitle<K>;
data?: ITableBody<K, I>[];
onChangeSortable?: TOnChangeSortable;
footer?: TFooter<K>[];
headerLineHeight?: TLineHeight;
bodyLineHeight?: TLineHeight;
footerLineHeight?: TLineHeight;
cellLineHeight?: TLineHeight;
gap?: string;
paginateInfo?: IPaginateInfo;
paginateMeta?: IPaginateMeta;
isVisibleHeader?: boolean;
isVisiblePaginate?: boolean;
isEnableChangePageScrollTop?: boolean;
isEnableDragSortable?: boolean;
isEnableHover?: boolean;
isStickyHeader?: boolean;
tableCellMediaSize?: number;
onChangePage?: TOnChangePage;
pageLimitOptions?: number[];
orderByType?: IOrderByType;
renderNoData?: JSX.Element | string;
renderFetching?: JSX.Element | string;
}
export {};