import * as React from "react"; import { IconProps } from "@material-ui/core/Icon"; import SvgIcon from "@material-ui/core/SvgIcon"; import { string } from "prop-types"; type SvgIconComponent = typeof SvgIcon; export interface MaterialTableProps { actions?: (Action | ((rowData: RowData) => Action))[]; columns: Column[]; components?: Components; data: RowData[] | ((query: Query) => Promise>); detailPanel?: | ((rowData: RowData) => React.ReactNode) | (DetailPanel | ((rowData: RowData) => DetailPanel))[]; editable?: { isEditable?: (rowData: RowData) => boolean; isDeletable?: (rowData: RowData) => boolean; onRowAdd?: (newData: RowData) => Promise; onRowUpdate?: (newData: RowData, oldData?: RowData) => Promise; onRowDelete?: (oldData: RowData) => Promise; editTooltip?: (rowData: RowData) => string; deleteTooltip?: (rowData: RowData) => string; onRowAddCancelled?: (rowData: RowData) => void; onRowUpdateCancelled?: (rowData: RowData) => void; isEditHidden?: (rowData: RowData) => boolean; isDeleteHidden?: (rowData: RowData) => boolean; }; icons?: Icons; isLoading?: boolean; title?: string | React.ReactElement; options?: Options; parentChildData?: (row: RowData, rows: RowData[]) => RowData | undefined; localization?: Localization; onChangeRowsPerPage?: (pageSize: number) => void; onChangePage?: (page: number, pageSize: number) => void; onChangeColumnHidden?: (column: Column, hidden: boolean) => void; onColumnDragged?: (sourceIndex: number, destinationIndex: number) => void; onOrderChange?: (orderBy: number, orderDirection: "asc" | "desc") => void; onGroupRemoved?: (column: Column, index: boolean) => void; onRowClick?: ( event?: React.MouseEvent, rowData?: RowData, toggleDetailPanel?: (panelIndex?: number) => void ) => void; onRowSelected?: (rowData: RowData) => void; onSearchChange?: (searchText: string) => void; /** An event fired when the table has finished filtering data * @param {Filter[]} filters All the filters that are applied to the table */ onFilterChange?: (filters: Filter[]) => void; onSelectionChange?: (data: RowData[], rowData?: RowData) => void; onTreeExpandChange?: (data: any, isExpanded: boolean) => void; onQueryChange?: (query: Query) => void; style?: React.CSSProperties; tableRef?: any; page?: number; totalCount?: number; } export interface Filter { column: Column; operator: "="; value: any; } export interface ErrorState { message: string; errorCause: "query" | "add" | "update" | "delete"; } export interface Query { filters: Filter[]; page: number; pageSize: number; totalCount: number; search: string; orderBy: Column; orderDirection: "asc" | "desc"; error?: ErrorState; } export interface QueryResult { data: RowData[]; page: number; totalCount: number; } export interface DetailPanel { disabled?: boolean; icon?: string | React.ComponentType; openIcon?: string | React.ComponentType; tooltip?: string; render: (rowData: RowData) => string | React.ReactNode; } export interface Action { disabled?: boolean; icon: string | (() => React.ReactElement) | SvgIconComponent; isFreeAction?: boolean; position?: "auto" | "toolbar" | "toolbarOnSelect" | "row"; tooltip?: string; onClick: (event: any, data: RowData | RowData[]) => void; iconProps?: IconProps; hidden?: boolean; } export interface EditComponentProps { rowData: RowData; value: any; onChange: (newValue: any) => void; onRowDataChange: (newValue: RowData) => void; columnDef: EditCellColumnDef; errorState?: ErrorState; } export interface EditCellColumnDef { field: string; title: string; tableData: { filterValue: any; groupOrder: any; groupSort: string; id: number; }; } export interface Column { align?: "center" | "inherit" | "justify" | "left" | "right"; cellStyle?: | React.CSSProperties | ((data: RowData[], rowData: RowData) => React.CSSProperties); currencySetting?: { locale?: string; currencyCode?: string; minimumFractionDigits?: number; maximumFractionDigits?: number; }; dateSetting?: { locale?: string }; customFilterAndSearch?: ( filter: any, rowData: RowData, columnDef: Column ) => boolean; customSort?: ( data1: RowData, data2: RowData, type: "row" | "group" ) => number; defaultFilter?: any; defaultGroupOrder?: number; defaultGroupSort?: "asc" | "desc"; defaultSort?: "asc" | "desc"; disableClick?: boolean; editComponent?: ( props: EditComponentProps ) => React.ReactElement; emptyValue?: | string | React.ReactElement | ((data: any) => React.ReactElement | string); export?: boolean; field?: keyof RowData | string; filtering?: boolean; filterComponent?: (props: { columnDef: Column; onFilterChanged: (rowId: string, value: any) => void; }) => React.ReactElement; filterPlaceholder?: string; filterCellStyle?: React.CSSProperties; grouping?: boolean; groupTitle?: string | ((groupData: any) => any) | React.ReactNode; headerStyle?: React.CSSProperties; hidden?: boolean; hideFilterIcon?: boolean; initialEditValue?: any; lookup?: object; editPlaceholder?: string; editable?: | "always" | "onUpdate" | "onAdd" | "never" | ((columnDef: Column, rowData: RowData) => boolean); removable?: boolean; validate?: ( rowData: RowData ) => { isValid: boolean; helperText?: string } | string | boolean; render?: (data: RowData, type: "row" | "group") => any; searchable?: boolean; sorting?: boolean; title?: string | React.ReactElement; tooltip?: string; type?: | "string" | "boolean" | "numeric" | "date" | "datetime" | "time" | "currency"; width?: string | number; } export interface Components { Action?: React.ComponentType; Actions?: React.ComponentType; Body?: React.ComponentType; Cell?: React.ComponentType; Container?: React.ComponentType; EditField?: React.ComponentType; EditRow?: React.ComponentType; FilterRow?: React.ComponentType; Groupbar?: React.ComponentType; GroupRow?: React.ComponentType; Header?: React.ComponentType; Pagination?: React.ComponentType; OverlayLoading?: React.ComponentType; OverlayError?: React.ComponentType; Row?: React.ComponentType; Toolbar?: React.ComponentType; } export const MTableAction: (props: any) => React.ReactElement; export const MTableActions: (props: any) => React.ReactElement; export const MTableBody: (props: any) => React.ReactElement; export const MTableBodyRow: (props: any) => React.ReactElement; export const MTableCell: (props: any) => React.ReactElement; export const MTableEditField: (props: any) => React.ReactElement; export const MTableEditRow: (props: any) => React.ReactElement; export const MTableFilterRow: (props: any) => React.ReactElement; export const MTableGroupbar: (props: any) => React.ReactElement; export const MTableGroupRow: (props: any) => React.ReactElement; export const MTableHeader: (props: any) => React.ReactElement; export const MTablePagination: (props: any) => React.ReactElement; export const MTableToolbar: (props: any) => React.ReactElement; export const MTable: (props: any) => React.ReactElement; export interface Icons { Add?: React.ForwardRefExoticComponent>; Check?: React.ForwardRefExoticComponent>; Clear?: React.ForwardRefExoticComponent>; Delete?: React.ForwardRefExoticComponent>; DetailPanel?: React.ForwardRefExoticComponent< React.RefAttributes >; Edit?: React.ForwardRefExoticComponent>; Export?: React.ForwardRefExoticComponent>; Filter?: React.ForwardRefExoticComponent>; FirstPage?: React.ForwardRefExoticComponent< React.RefAttributes >; SortArrow?: React.ForwardRefExoticComponent< React.RefAttributes >; LastPage?: React.ForwardRefExoticComponent< React.RefAttributes >; NextPage?: React.ForwardRefExoticComponent< React.RefAttributes >; PreviousPage?: React.ForwardRefExoticComponent< React.RefAttributes >; ResetSearch?: React.ForwardRefExoticComponent< React.RefAttributes >; Search?: React.ForwardRefExoticComponent>; ThirdStateCheck?: React.ForwardRefExoticComponent< React.RefAttributes >; ViewColumn?: React.ForwardRefExoticComponent< React.RefAttributes >; Retry?: React.ForwardRefExoticComponent>; } export interface Options { actionsCellStyle?: React.CSSProperties; detailPanelColumnStyle?: React.CSSProperties; editCellStyle?: React.CSSProperties; actionsColumnIndex?: number; addRowPosition?: "first" | "last"; columnsButton?: boolean; defaultExpanded?: boolean | ((rowData: any) => boolean); debounceInterval?: number; detailPanelType?: "single" | "multiple"; doubleHorizontalScroll?: boolean; draggable?: boolean; emptyRowsWhenPaging?: boolean; exportAllData?: boolean; exportButton?: boolean; exportDelimiter?: string; exportFileName?: | string | ((columns: Column, data: string[][]) => string); exportCsv?: (columns: any[], renderData: any[]) => void; filtering?: boolean; filterCellStyle?: React.CSSProperties; filterRowStyle?: React.CSSProperties; fixedColumns?: { left?: number; right?: number }; groupRowSeparator?: string; header?: boolean; headerSelectionProps?: object; headerStyle?: React.CSSProperties; hideFilterIcons?: boolean; initialPage?: number; loadingType?: "overlay" | "linear"; maxBodyHeight?: number | string; minBodyHeight?: number | string; padding?: "default" | "dense"; paging?: boolean; grouping?: boolean; groupTitle?: (groupData: any) => any; overflowY?: "visible" | "hidden" | "scroll" | "auto" | "initial" | "inherit"; pageSize?: number; pageSizeOptions?: number[]; paginationType?: "normal" | "stepped"; rowStyle?: | React.CSSProperties | ((data: any, index: number, level: number) => React.CSSProperties); showEmptyDataSourceMessage?: boolean; showFirstLastPageButtons?: boolean; showSelectAllCheckbox?: boolean; showTitle?: boolean; showTextRowsSelected?: boolean; search?: boolean; searchText?: string; searchFieldAlignment?: "left" | "right"; searchFieldStyle?: React.CSSProperties; searchFieldVariant?: "standard" | "filled" | "outlined"; searchAutoFocus?: boolean; selection?: boolean; selectionProps?: any | ((data: any) => any); sorting?: boolean; tableLayout?: "auto" | "fixed"; thirdSortClick?: boolean; toolbar?: boolean; toolbarButtonAlignment?: "left" | "right"; detailPanelColumnAlignment?: "left" | "right"; cspNonce?: string; } export interface Localization { error?: React.ReactNode; body?: { dateTimePickerLocalization?: object; // The date-fns locale object applied to the datepickers emptyDataSourceMessage?: React.ReactNode; filterRow?: { filterTooltip?: React.ReactNode; }; editRow?: { saveTooltip?: React.ReactNode; cancelTooltip?: React.ReactNode; deleteText?: React.ReactNode; }; addTooltip?: React.ReactNode; deleteTooltip?: React.ReactNode; editTooltip?: React.ReactNode; }; header?: { actions?: React.ReactNode; }; grouping?: { groupedBy?: React.ReactNode; placeholder?: React.ReactNode; }; pagination?: { firstTooltip?: React.ReactNode; firstAriaLabel?: string; previousTooltip?: React.ReactNode; previousAriaLabel?: string; nextTooltip?: React.ReactNode; nextAriaLabel?: string; labelDisplayedRows?: React.ReactNode; labelRowsPerPage?: React.ReactNode; lastTooltip?: React.ReactNode; lastAriaLabel?: string; labelRowsSelect?: React.ReactNode; }; toolbar?: { addRemoveColumns?: React.ReactNode; nRowsSelected?: React.ReactNode | ((rowCount: number) => React.ReactNode); showColumnsTitle?: React.ReactNode; showColumnsAriaLabel?: string; exportTitle?: React.ReactNode; exportAriaLabel?: string; exportName?: React.ReactNode; searchTooltip?: React.ReactNode; searchPlaceholder?: React.ReactNode; }; } export default class MaterialTable< RowData extends object > extends React.Component> {}