diff --git a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableActionsDemo.tsx b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableActionsDemo.tsx index 8c220cf3e42..ebe9f1344ef 100644 --- a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableActionsDemo.tsx +++ b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableActionsDemo.tsx @@ -50,7 +50,7 @@ export class TableActionsDemo extends React.Component { actionResolver(rowData: IRowData, { rowIndex }: IExtra) { if (rowIndex === 1) { - return null; + return []; } const thirdAction: IActions = diff --git a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSelectableDemo.tsx b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSelectableDemo.tsx index 75770b5d114..4ea0f9a2e70 100644 --- a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSelectableDemo.tsx +++ b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSelectableDemo.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { Table, TableHeader, TableBody, TableProps, headerCol, ICell, IRow } from '@patternfly/react-table'; import { Checkbox } from '@patternfly/react-core'; +import '@patternfly/patternfly/utilities/Spacing/spacing.css'; interface TableState { columns: (ICell | string)[]; @@ -36,9 +37,10 @@ export class TableSelectableDemo extends React.Component canSelectAll: true }; this.onSelect = this.onSelect.bind(this); + this.toggleSelect = this.toggleSelect.bind(this); } - onSelect(event: React.MouseEvent, isSelected: boolean, rowId: number) { + onSelect(event: React.FormEvent, isSelected: boolean, rowId: number) { let rows: IRow[]; if (rowId === -1) { rows = this.state.rows.map(oneRow => { @@ -65,28 +67,29 @@ export class TableSelectableDemo extends React.Component } render() { - const { columns, rows } = this.state; + const { columns, rows, canSelectAll } = this.state; return (
+
-
); } diff --git a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleActionsDemo.tsx b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleActionsDemo.tsx index ddc09ca00ae..47371d67582 100644 --- a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleActionsDemo.tsx +++ b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleActionsDemo.tsx @@ -43,7 +43,7 @@ export class TableSimpleActionsDemo extends React.Component {} }, { title: 'Third action', diff --git a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleDemo.tsx b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleDemo.tsx index c048e209dc6..720994c2e2f 100644 --- a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleDemo.tsx +++ b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSimpleDemo.tsx @@ -1,7 +1,10 @@ import * as React from 'react'; import { Table, TableHeader, TableBody, TableProps, textCenter, ICell, IRow } from '@patternfly/react-table'; -export class TableSimpleDemo extends React.Component { +export class TableSimpleDemo extends React.Component< + TableProps, + { columns: (ICell | string)[]; rows: (IRow | string[])[] } +> { constructor(props: TableProps) { super(props); this.state = { @@ -17,25 +20,31 @@ export class TableSimpleDemo extends React.Componentone - 2, - props: { title: 'hover title', colSpan: 3 } - }, - 'four - 2', - 'five - 2' - ], - [ - 'one - 3', - 'two - 3', - 'three - 3', - 'four - 3', - { - title: 'five - 3 (not centered)', - props: { textCenter: false } - } - ] + { + cells: ['one', 'two', 'three', 'four', 'five'] + }, + { + cells: [ + { + title:
one - 2
, + props: { title: 'hover title', colSpan: 3 } + }, + 'four - 2', + 'five - 2' + ] + }, + { + cells: [ + 'one - 3', + 'two - 3', + 'three - 3', + 'four - 3', + { + title: 'five - 3 (not centered)', + props: { textCenter: false } + } + ] + } ] }; } diff --git a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSortableForCompoundExpandableDemo.tsx b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSortableForCompoundExpandableDemo.tsx index 918adf7b53f..086250ff564 100644 --- a/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSortableForCompoundExpandableDemo.tsx +++ b/packages/react-integration/demo-app-ts/src/components/demos/TableDemo/TableSortableForCompoundExpandableDemo.tsx @@ -9,7 +9,8 @@ import { SortByDirection, ICell, IRow, - ISortBy + ISortBy, + TableProps } from '@patternfly/react-table'; export interface DemoSortableTableProps { @@ -20,18 +21,27 @@ export interface DemoSortableTableProps { id?: string; } -export class DemoSortableTable extends React.Component { - state = { - columns: [ - { title: 'Repositories', transforms: [sortable] }, - 'Branches', - { title: 'Pull requests', transforms: [sortable] }, - 'Workspaces', - 'Last Commit' - ], - rows: [this.props.firstColumnRows, ['a', 'two', 'k', 'four', 'five'], ['p', 'two', 'b', 'four', 'five']], - sortBy: {} - }; +interface DemoSortableTableState { + rows: (IRow | string[])[]; + columns: (ICell | string)[]; + sortBy: ISortBy; +} + +export class DemoSortableTable extends React.Component { + constructor(props: TableProps) { + super(props); + this.state = { + columns: [ + { title: 'Repositories', transforms: [sortable] }, + 'Branches', + { title: 'Pull requests', transforms: [sortable] }, + 'Workspaces', + 'Last Commit' + ], + rows: [this.props.firstColumnRows, ['a', 'two', 'k', 'four', 'five'], ['p', 'two', 'b', 'four', 'five']], + sortBy: {} + }; + } onSort = (_event: React.MouseEvent, index: number, direction: SortByDirection) => { const sortedRows = this.state.rows.sort((a, b) => { diff --git a/packages/react-table/src/components/Table/SelectColumn.tsx b/packages/react-table/src/components/Table/SelectColumn.tsx index 2d86bd5fb0c..aad02fde8d5 100644 --- a/packages/react-table/src/components/Table/SelectColumn.tsx +++ b/packages/react-table/src/components/Table/SelectColumn.tsx @@ -4,14 +4,14 @@ export interface SelectColumnProps { name?: string; children?: React.ReactNode; className?: string; - onSelect?: (event: React.ChangeEvent) => void; + onSelect?: (event: React.FormEvent) => void; } export const SelectColumn: React.FunctionComponent = ({ children = null as React.ReactNode, - onSelect = null as (event: React.ChangeEvent) => void, // eslint-disable-next-line @typescript-eslint/no-unused-vars className, + onSelect = null as (event: React.FormEvent) => void, ...props }: SelectColumnProps) => ( diff --git a/packages/react-table/src/components/Table/Table.md b/packages/react-table/src/components/Table/Table.md index ed9e74d8536..9e6223767f5 100644 --- a/packages/react-table/src/components/Table/Table.md +++ b/packages/react-table/src/components/Table/Table.md @@ -430,22 +430,28 @@ class SelectableTable extends React.Component { } render() { - const { columns, rows } = this.state; + const { columns, rows, canSelectAll } = this.state; return (
- - - -
- + + + + +
); } diff --git a/packages/react-table/src/components/Table/Table.test.tsx b/packages/react-table/src/components/Table/Table.test.tsx index 09f9951d537..3c1a2be736d 100644 --- a/packages/react-table/src/components/Table/Table.test.tsx +++ b/packages/react-table/src/components/Table/Table.test.tsx @@ -244,7 +244,7 @@ test('Selectable table with selected expandable row', () => { parent: 0 } ], - onSelect: (e: React.MouseEvent) => e + onSelect: (e: React.FormEvent) => e }; const view = mount( diff --git a/packages/react-table/src/components/Table/Table.tsx b/packages/react-table/src/components/Table/Table.tsx index 8a5bcec2a30..0aae7d78695 100644 --- a/packages/react-table/src/components/Table/Table.tsx +++ b/packages/react-table/src/components/Table/Table.tsx @@ -60,7 +60,7 @@ export type OnExpand = ( extraData: IExtraData ) => void; export type OnSelect = ( - event: React.MouseEvent, + event: React.FormEvent, isSelected: boolean, rowIndex: number, rowData: IRowData, diff --git a/packages/react-table/src/components/Table/utils/decorators/selectable.tsx b/packages/react-table/src/components/Table/utils/decorators/selectable.tsx index 91c3eed354d..c929ead2b71 100644 --- a/packages/react-table/src/components/Table/utils/decorators/selectable.tsx +++ b/packages/react-table/src/components/Table/utils/decorators/selectable.tsx @@ -27,13 +27,12 @@ export const selectable: ITransform = ( const rowId = rowIndex !== undefined ? rowIndex : -1; /** - * @param {React.ChangeEvent} event - React change event + * @param {React.FormEvent} event - React form event */ - function selectClick(event: React.ChangeEvent) { - const selected = rowIndex === undefined ? event.target.checked : rowData && !rowData.selected; - // todo: change event type to React.FormEvent in the future, breaking change a.t.m. + function selectClick(event: React.FormEvent) { + const selected = rowIndex === undefined ? event.currentTarget.checked : rowData && !rowData.selected; // tslint:disable-next-line:no-unused-expression - onSelect && onSelect((event as unknown) as React.MouseEvent, selected, rowId, rowData, extraData); + onSelect && onSelect(event, selected, rowId, rowData, extraData); } const customProps = { ...(rowId !== -1 diff --git a/packages/react-table/src/components/Table/utils/headerUtils.tsx b/packages/react-table/src/components/Table/utils/headerUtils.tsx index 7dabcfeea05..6f4cf45cd25 100644 --- a/packages/react-table/src/components/Table/utils/headerUtils.tsx +++ b/packages/react-table/src/components/Table/utils/headerUtils.tsx @@ -55,6 +55,14 @@ const generateHeader = ( formatters: [...(origFormatters || []), ...(header && header.hasOwnProperty('formatters') ? header.formatters : [])] }); +// eslint-disable-next-line @typescript-eslint/interface-name-prefix +interface ICustomCell { + cellFormatters?: ICell['cellFormatters']; + cellTransforms?: ICell['cellTransforms']; + columnTransforms?: ICell['columnTransforms']; + cell?: ICell; +} + /** * Function to generate cell for header config to change look of each cell. * @@ -63,17 +71,7 @@ const generateHeader = ( * @returns {*} cell, transforms: Array, formatters: Array. */ const generateCell = ( - { - cellFormatters, - cellTransforms, - columnTransforms, - cell - }: { - cellFormatters?: ICell['cellFormatters']; - cellTransforms?: ICell['cellTransforms']; - columnTransforms?: ICell['columnTransforms']; - cell?: ICell; - }, + { cellFormatters, cellTransforms, columnTransforms, cell }: ICustomCell, // eslint-disable-next-line @typescript-eslint/no-unused-vars extra: any ) => ({ @@ -129,13 +127,19 @@ const mapHeader = (column: ICell, extra: any, key: number, ...props: any) => { }; }; +// eslint-disable-next-line @typescript-eslint/interface-name-prefix +export interface ISelectTransform { + onSelect: OnSelect; + canSelectAll: boolean; +} + /** * Function to define select cell in first column. * * @param {*} extraObject with onSelect callback. * @returns {*} object with empty title, tranforms - Array, cellTransforms - Array. */ -const selectableTransforms = ({ onSelect, canSelectAll }: { onSelect: OnSelect; canSelectAll: boolean }) => [ +const selectableTransforms = ({ onSelect, canSelectAll }: ISelectTransform) => [ ...(onSelect ? [ {