diff --git a/types/react-table/index.d.ts b/types/react-table/index.d.ts new file mode 100644 index 0000000000..b62315459e --- /dev/null +++ b/types/react-table/index.d.ts @@ -0,0 +1,509 @@ +// Type definitions for react-table 6.5 +// Project: https://github.com/react-tools/react-table +// Definitions by: Roy Xue +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 +import * as React from 'react'; + +export type ReactTableFunction = () => void; +export type AccessorFunction = (row: object) => any; +export type Accessor = string | string[] | object | AccessorFunction; +export type Aggregator = (values: any, rows: any) => any; +export type TableCellRenderer = ((data: any, column: any) => React.ReactNode) | React.ReactNode; +export type FilterRender = (params: { column: Column, filter: any, onFilterChange: ReactTableFunction, key?: string }) => React.ReactElement; + +export type ComponentPropsGetter0 = (finalState: any, rowInfo: undefined, column: undefined, instance?: any) => object | undefined; +export type ComponentPropsGetterR = (finalState: any, rowInfo?: RowInfo, column?: undefined, instance?: any) => object | undefined; +export type ComponentPropsGetterC = (finalState: any, rowInfo?: undefined, column?: Column, instance?: any) => object | undefined; +export type ComponentPropsGetterRC = (finalState: any, rowInfo?: RowInfo, column?: Column, instance?: any) => object | undefined; + +export type FilterFunction = (filter: any, row: any, column: any) => boolean; +export type SubComponentFunction = (rowInfo: RowInfo) => React.ReactNode; +export type PageChangeFunction = (page: number) => void; +export type PageSizeChangeFunction = (newPageSize: number, newPage: number) => void; +export type SortedChangeFunction = (column: any, additive: boolean) => void; +export type FilteredChangeFunction = (column: any, value: any, pivotColumn: any) => void; +export type ExpandedChangeFunction = (column: any, event: any, isTouch: boolean) => void; + +/** NOTE: to many configuration ways (only true values are confusing) */ +export interface SortingRule { + id: string; + sort?: 'desc' | 'asc'; + asc?: true; + desc?: true; +} + +export interface TableProps extends + Partial, + Partial, + Partial, + Partial, + Partial, + Partial { + /** Default: [] */ + data: any[]; + + /** Default: false */ + loading: boolean; + + /** Default: false */ + showPagination: boolean; + + /** Default: false */ + manual: boolean; + + /** Default: false */ + showPageSizeOptions: boolean; + + /** Default: [5, 10, 20, 25, 50, 100] */ + pageSizeOptions: number[]; + + /** Default: 20 */ + defaultPageSize: number; + + /** + * Default: undefined + * Otherwise take value from 'pageSize' if defined + * @TODO: add minRows to react-table defaultProps even if undefined + */ + minRows: number; + + /** Default: true */ + showPageJump: boolean; + + /** Default: true */ + collapseOnSortingChange: boolean; + + /** Default: true */ + collapseOnPageChange: boolean; + + /** Default: true */ + collapseOnDataChange: boolean; + + /** Default: false */ + freezeWhenExpanded: boolean; + + /** Default: [] */ + defaultSorting: SortingRule[]; + + /** Default: false */ + showFilters: boolean; + + /** Default: [] */ + defaultFiltering: any[]; + + /** Default: ... */ + defaultFilterMethod: FilterFunction; + + /** Default: true */ + resizable: boolean; + + /** Default: false */ + filterable: boolean; + + /** Default: [] */ + defaultResizing: any[]; + + /** On change. */ + onChange: ReactTableFunction; + + /** + * Default: string + * Adding a -striped className to ReactTable will slightly color odd numbered rows for legibility + * Adding a -highlight className to ReactTable will highlight any row as you hover over it + */ + className: string; + + /** Default: {} */ + style: object; + + /** Global Column Defaults */ + column: Partial; + + /** Array of all Available Columns */ + columns?: Column[]; + + /** Expander defaults. */ + expanderDefaults: Partial; + + /** Privot defaults. */ + pivotDefaults: Partial; +} + +export interface ControlledStateOverrideProps { + /** Default: undefined */ + page: number; + + /** Default: undefined */ + pageSize: number; + + /** Default: undefined */ + sorting: number; + + /** Sub component */ + SubComponent: SubComponentFunction; +} + +export interface PivotingProps { + /** Default: undefined */ + pivotBy: string[]; + + /** Default: 200 */ + pivotColumnWidth: number; + + /** Default: _pivotVal */ + pivotValKey: string; + + /** Default: _pivotID */ + pivotIDKey: string; + + /** Default: _subRows */ + subRowsKey: string; + + /** + * Default: {} - Pivoting State Overrides (see Fully Controlled Component section) + * @example { 4: true } + * @example { 5: { 9: true }, 10: true } + */ + expandedRows: ExpandedRows; + + /** Default: ??? - Pivoting State Callbacks */ + onExpandRow: ReactTableFunction; +} + +export interface ExpandedRows { + [idx: number]: boolean | ExpandedRows; +} + +export interface ControlledStateCallbackProps { + onPageChange: PageChangeFunction; + onPageSizeChange: PageSizeChangeFunction; + onSortedChange: SortedChangeFunction; + onFilteredChange: FilteredChangeFunction; + onExpandedChange: ExpandedChangeFunction; +} + +export interface ComponentDecoratorProps { + getProps: ComponentPropsGetterRC | ComponentPropsGetterC | ComponentPropsGetter0; + getTableProps: ComponentPropsGetter0; + getTheadGroupProps: ComponentPropsGetter0; + getTheadGroupTrProps: ComponentPropsGetter0; + getTheadGroupThProps: ComponentPropsGetterC; + getTheadProps: ComponentPropsGetter0; + getTheadTrProps: ComponentPropsGetter0; + getTheadThProps: ComponentPropsGetterC; + getTheadFilterProps: ComponentPropsGetter0; + getTheadFilterTrProps: ComponentPropsGetter0; + getTheadFilterThProps: ComponentPropsGetterC; + getTbodyProps: ComponentPropsGetter0; + getTrGroupProps: ComponentPropsGetterR | ComponentPropsGetter0; + getTrProps: ComponentPropsGetterR | ComponentPropsGetter0; + + /** + * @TODO not exists in react-table but in the docs + */ + // getThProps: ComponentPropsGetter + getTdProps: ComponentPropsGetterRC | ComponentPropsGetterR; + getTfootProps: ComponentPropsGetter0; + getTfootTrProps: ComponentPropsGetter0; + + /** + * @TODO not exists in react-table but in the docs + */ + // getTfootThProps: ComponentPropsGetter + getPaginationProps: ComponentPropsGetter0; + getLoadingProps: ComponentPropsGetter0; + getNoDataProps: ComponentPropsGetter0; + getResizerProps: ComponentPropsGetter0; +} + +export interface ComponentProps { + TableComponent: React.ReactType; + TheadComponent: React.ReactType; + TbodyComponent: React.ReactType; + TrGroupComponent: React.ReactType; + TrComponent: React.ReactType; + ThComponent: React.ReactType; + TdComponent: React.ReactType; + TfootComponent: React.ReactType; + ExpanderComponent: React.ReactType; + PaginationComponent: React.ReactType; + PreviousComponent: React.ReactType; + NextComponent: React.ReactType; + LoadingComponent: React.ReactType; + NoDataComponent: React.ReactType; + ResizerComponent: React.ReactType; +} + +export interface TextProps { + /** Default: 'Previous' */ + previousText: string; + + /** Default: 'Next' */ + nextText: string; + + /** Default: 'Loading...' */ + loadingText: string; + + /** Default: 'No rows found' */ + noDataText: string; + + /** Default: 'Page' */ + pageText: string; + + /** Default: 'of' */ + ofText: string; + + /** Default: 'rows' */ + rowsText: string; +} + +export interface GlobalColumn extends + Column.Basics, + Column.CellProps, + Column.FilterProps, + Column.FooterProps, + Column.HeaderProps { +} + +export namespace Column { + /** Basic column props */ + interface Basics { + /** Default: true */ + sortable: boolean; + + /** Default: true */ + show: boolean; + + /** Default: 100 */ + minWidth: number; + } + + /** Configuration of a columns cell section */ + interface CellProps { + /** + * Default: undefined + * A function that returns a primitive, or JSX / React Component + * + * @example 'Cell Value' + * @example ({data, column}) =>
Cell Value
, + */ + render: TableCellRenderer; + + /** + * Set the classname of the `td` element of the column + * @default string + */ + className: string; + + /** + * Set the style of the `td` element of the column + * @default {} + */ + style: object; + + /** + * @default () => ({}) + */ + getProps: ReactTableFunction; + } + + /** Configuration of a columns header section */ + interface HeaderProps { + /** + * Default: undefined + * A function that returns a primitive, or JSX / React Component + * + * @example 'Header Name' + * @example ({data, column}) =>
Header Name
, + */ + header: TableCellRenderer; + + /** + * Set the classname of the `th` element of the column + * @default string + */ + headerClassName: string; + + /** + * Default: {} + * Set the style of the `th` element of the column + */ + headerStyle: object; + + /** + * Default: (state, rowInfo, column, instance) => ({}) + * A function that returns props to decorate the `th` element of the column + */ + getHeaderProps: ReactTableFunction; + } + + /** Configuration of a columns footer section */ + interface FooterProps { + /** + * Default: undefined + * A function that returns a primitive, or JSX / React Component + * + * @example 'Footer Name' + * @example ({data, column}) =>
Footer Name
, + */ + footer: TableCellRenderer; + + /** + * Default: string + * Set the classname of the `td` element of the column's footer + */ + footerClassName: string; + + /** + * Default: {} + * Set the style of the `td` element of the column's footer + */ + footerStyle: object; + + /** + * Default: (state, rowInfo, column, instance) => ({}) + * A function that returns props to decorate the `th` element of the column + */ + getFooterProps: ReactTableFunction; + } + + /** Filtering related column props */ + interface FilterProps { + /** Default: undefined */ + filterMethod: ReactTableFunction; + + /** Default: false */ + hideFilter: boolean; + + /** Default: ... */ + filterRender: FilterRender; + } +} + +export interface ExpanderDefaults { + /** Default: false */ + sortable: boolean; + + /** Default: 35 */ + width: number; + + /** Default: true */ + hideFilter: boolean; + + /** Will be overriden in methods.js to display ExpanderComponent */ + render: TableCellRenderer; +} + +export interface PivotDefaults { + /** Will be overriden in methods.js to display ExpanderComponent */ + render: TableCellRenderer; +} + +export interface Column extends + Partial, + Partial, + Partial, + Partial, + Partial { + /** + * Property name as string or Accessor + * @example: 'myProperty' + * @example ["a.b", "c"] + * @example ["a", "b", "c"] + * @example {"a": {"b": {"c": $}}} + * @example (row) => row.propertyName + */ + accessor?: Accessor; + + /** + * Conditional - A unique ID is required if the accessor is not a string or if you would like to override the column name used in server-side calls + * @example 'myProperty' + */ + id?: string; + + /** + * No description + * @example (values, rows) => _.round(_.mean(values)) + * @example (values, rows) => _.sum(values) + */ + aggregate?: Aggregator; + + /** + * Default: undefined - A hardcoded width for the column. This overrides both min and max width options + */ + width?: number; + + /** + * Default: undefined - A maximum width for this column. + * @default undefined + */ + maxWidth?: number; + + /** + * Turns this column into a special column for specifying expander and pivot column options. + * If this option is true and there is NOT a pivot column, the `expanderDefaults` options will be applied on top of the column options. + * If this option is true and there IS a pivot column, the `pivotDefaults` options will be applied on top of the column options. + * Adding a column with the `expander` option set will allow you to rearrange expander and pivot column orderings in the table. + * It will also let you specify rendering of the header (and header group if this special column is placed in the `columns` option of another column) and the rendering of the expander itself. + */ + expander?: boolean; + + /** Header Groups only */ + columns?: any[]; +} + +export interface ColumnRenderProps { + /** Sorted data. */ + data: any[]; + + /** The column. */ + column: Column; +} + +export interface RowRenderProps extends Partial { + /** Whenever the current row is expanded */ + isExpanded?: boolean; + + /** The current cell value */ + value?: any; +} + +export interface RowInfo { + /** Original row from your data */ + row: any; + + /** The post-accessed values from the original row */ + rowValues: any; + + /** The index of the row */ + index: number; + + /** The index of the row relative to the current page */ + viewIndex: number; + + /** The nesting depth (zero-indexed) */ + level: number; + + /** The nesting path of the row */ + nestingPath: number[]; + + /** A boolean stating if the row is an aggregation row */ + aggregated: boolean; + + /** An array of any expandable sub-rows contained in this row */ + subRows: any[]; +} + +export interface FinalState extends TableProps { + startRow: number; + endRow: number; + pageRows: number; + padRows: number; + hasColumnFooter: boolean; + canPrevious: boolean; + canNext: boolean; + rowMinWidth: number; +} + +export class ReactTable extends React.Component> {} diff --git a/types/react-table/react-table-tests.tsx b/types/react-table/react-table-tests.tsx new file mode 100644 index 0000000000..3069785b6e --- /dev/null +++ b/types/react-table/react-table-tests.tsx @@ -0,0 +1,57 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; + +// Import React Table +import { ReactTable } from "react-table"; +import "react-table/react-table.css"; + +const columns = [ + { + Header: "Name", + columns: [ + {Header: "First Name", accessor: "firstName"}, + {Header: "Last Name", id: "lastName"} + ] + }, + { + Header: "Info", + columns: [ + {Header: "Age", accessor: "age"}, + {Header: "Status", accessor: "status"} + ] + }, + { + Header: 'Stats', + columns: [ + {Header: "Visits", accessor: "visits"} + ] + } +]; + +const Component = (props: {}) => { + const data = [ + {firstName: "plastic", lastName: "leather", age: 1, visits: 87, progress: 53}, + {firstName: "eggs", lastName: "quartz", age: 13, visits: 78, progress: 82}, + {firstName: "wash", lastName: "wrench", age: 29, visits: 75, progress: 49}, + {firstName: "introduction", lastName: "impression", age: 2, visits: 35, progress: 51}, + {firstName: "steel", lastName: "difference", age: 9, visits: 64, progress: 94}, + {firstName: "snakes", lastName: "corn", age: 17, visits: 55, progress: 47}, + {firstName: "ocean", lastName: "definition", age: 26, visits: 17, progress: 22}, + {firstName: "drawing", lastName: "fifth", age: 15, visits: 84, progress: 12}, + {firstName: "silver", lastName: "riddle", age: 15, visits: 59, progress: 24}, + {firstName: "surprise", lastName: "zinc", age: 23, visits: 7, progress: 48}, + {firstName: "riddle", lastName: "information", age: 2, visits: 63, progress: 3} + ]; + return ( +
+ +
+
+ ); +}; + +ReactDOM.render(, document.getElementById("root")); diff --git a/types/react-table/tsconfig.json b/types/react-table/tsconfig.json new file mode 100644 index 0000000000..d137af14a2 --- /dev/null +++ b/types/react-table/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6", + "dom" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "baseUrl": "../", + "jsx": "react", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "react-table-tests.tsx" + ] +} diff --git a/types/react-table/tslint.json b/types/react-table/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/react-table/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }