diff --git a/packages/react-core/src/components/DataList/DataList.tsx b/packages/react-core/src/components/DataList/DataList.tsx index 788cd14a695..aebf6758fe6 100644 --- a/packages/react-core/src/components/DataList/DataList.tsx +++ b/packages/react-core/src/components/DataList/DataList.tsx @@ -15,6 +15,8 @@ export interface DataListProps extends React.HTMLProps { onSelectDataListItem?: (id: string) => void; /* Id of DataList item currently selected */ selectedDataListItemId?: string; + /** Flag indicating if DataList should have compact styling */ + isCompact?: boolean; } interface DataListContextProps { @@ -33,6 +35,7 @@ export const DataList: React.FunctionComponent = ({ 'aria-label': ariaLabel, selectedDataListItemId = '', onSelectDataListItem, + isCompact = false, ...props }: DataListProps) => { const isSelectable = !isUndefined(onSelectDataListItem); @@ -49,7 +52,11 @@ export const DataList: React.FunctionComponent = ({ updateSelectedDataListItem }} > -
    +
      {children}
    diff --git a/packages/react-core/src/components/DataList/__tests__/DataList.test.tsx b/packages/react-core/src/components/DataList/__tests__/DataList.test.tsx index fef16bad9aa..6ebb33d023f 100644 --- a/packages/react-core/src/components/DataList/__tests__/DataList.test.tsx +++ b/packages/react-core/src/components/DataList/__tests__/DataList.test.tsx @@ -18,6 +18,11 @@ describe('DataList', () => { expect(view).toMatchSnapshot(); }); + test('List compact', () => { + const view = shallow(); + expect(view).toMatchSnapshot(); + }); + test('List', () => { const view = shallow(); expect(view).toMatchSnapshot(); diff --git a/packages/react-core/src/components/DataList/__tests__/__snapshots__/DataList.test.tsx.snap b/packages/react-core/src/components/DataList/__tests__/__snapshots__/DataList.test.tsx.snap index d509507f326..a1458165bf7 100644 --- a/packages/react-core/src/components/DataList/__tests__/__snapshots__/DataList.test.tsx.snap +++ b/packages/react-core/src/components/DataList/__tests__/__snapshots__/DataList.test.tsx.snap @@ -128,6 +128,23 @@ exports[`DataList List 1`] = ` `; +exports[`DataList List compact 1`] = ` + +
      + +`; + exports[`DataList List default 1`] = ` ( + + + + + Primary content + , + Secondary content + ]} + /> + + + + + + Secondary content (pf-m-no-fill) + , + + Secondary content (pf-m-align-right pf-m-no-fill) + + ]} + /> + + + +); +``` + +```js title=Compact import React from 'react'; import { Button, @@ -45,7 +108,7 @@ import { } from '@patternfly/react-core'; SimpleDataList = () => ( - + } dropdownItems={[ - Primary, - Secondary, + + Primary + , + + Secondary + ]} /> @@ -249,10 +316,18 @@ class CheckboxActionDataList extends React.Component { onSelect={this.onSelect3} toggle={} dropdownItems={[ - Primary, - Secondary, - Secondary, - Secondary, + + Primary + , + + Secondary + , + + Secondary + , + + Secondary + ]} /> @@ -825,6 +900,7 @@ class ModifiersDataList extends React.Component { } } ``` + ```js title=Selectable-rows import React from 'react'; import { @@ -845,17 +921,17 @@ import { class SelectableDataList extends React.Component { constructor(props) { super(props); - this.state = { + this.state = { isOpen1: false, isOpen2: false, selectedDataListItemId: '' }; - this.onToggle1 = isOpen1 => { + this.onToggle1 = isOpen1 => { this.setState({ isOpen1 }); }; - - this.onToggle2 = isOpen2 => { + + this.onToggle2 = isOpen2 => { this.setState({ isOpen2 }); }; @@ -864,22 +940,26 @@ class SelectableDataList extends React.Component { isOpen1: !prevState.isOpen1 })); }; - + this.onSelect2 = event => { this.setState(prevState => ({ isOpen2: !prevState.isOpen2 })); }; - - this.onSelectDataListItem = (id) => { + + this.onSelectDataListItem = id => { this.setState({ selectedDataListItemId: id }); - } + }; } render() { return ( - + {!this.state.isDeleted && ( diff --git a/packages/react-integration/cypress/integration/datalist.spec.ts b/packages/react-integration/cypress/integration/datalist.spec.ts index 75a5120abff..3c398bfbd14 100644 --- a/packages/react-integration/cypress/integration/datalist.spec.ts +++ b/packages/react-integration/cypress/integration/datalist.spec.ts @@ -31,3 +31,37 @@ describe('Data List Demo Test', () => { cy.get('#row2.pf-m-selected').should('be.visible'); }); }); + +describe('Data List Compact Demo Test', () => { + it('Navigate to demo section', () => { + cy.visit('http://localhost:3000/'); + cy.get('#data-list-compact-demo-nav-item-link').click(); + cy.url().should('eq', 'http://localhost:3000/data-list-compact-demo-nav-link'); + }); + + it('Verify header', () => { + cy.get('#simple-item1').contains('Primary content'); + cy.get('#simple-item2').contains('Secondary content'); + }); + + it('Verify body content', () => { + cy.get('#simple-item3').contains('Secondary content (pf-m-no-fill)'); + cy.get('#simple-item4').contains('Secondary content (pf-m-align-right pf-m-no-fill)'); + }); + + it('Verify rows selectable', () => { + cy.get('#row1.pf-m-selectable').should('be.visible'); + cy.get('#row2.pf-m-selectable').should('be.visible'); + + cy.get('#row1.pf-m-selected').should('not.be.visible'); + cy.get('#row2.pf-m-selected').should('not.be.visible'); + + cy.get('#row1').click(); + cy.get('#row1.pf-m-selected').should('be.visible'); + cy.get('#row2.pf-m-selected').should('not.be.visible'); + + cy.get('#row2').click(); + cy.get('#row1.pf-m-selected').should('not.be.visible'); + cy.get('#row2.pf-m-selected').should('be.visible'); + }); +}); diff --git a/packages/react-integration/demo-app-ts/src/Demos.ts b/packages/react-integration/demo-app-ts/src/Demos.ts index 6434212fb3d..fa4512cd961 100644 --- a/packages/react-integration/demo-app-ts/src/Demos.ts +++ b/packages/react-integration/demo-app-ts/src/Demos.ts @@ -160,6 +160,11 @@ export const Demos: DemoInterface[] = [ name: 'Data List Demo', componentType: Examples.DataListDemo }, + { + id: 'data-list-compact-demo', + name: 'Data List Compact Demo', + componentType: Examples.DataListCompactDemo + }, { id: 'data-toolbar-demo', name: 'Data Toolbar Demo', diff --git a/packages/react-integration/demo-app-ts/src/components/demos/DataListDemo/DataListCompactDemo.tsx b/packages/react-integration/demo-app-ts/src/components/demos/DataListDemo/DataListCompactDemo.tsx new file mode 100644 index 00000000000..02159612d03 --- /dev/null +++ b/packages/react-integration/demo-app-ts/src/components/demos/DataListDemo/DataListCompactDemo.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { + DataList, + DataListProps, + DataListItem, + DataListItemRow, + DataListItemCells, + DataListCell +} from '@patternfly/react-core'; + +interface DataListState { + selectedDataListItemId: string; +} + +export class DataListCompactDemo extends React.Component { + constructor(props) { + super(props); + this.state = { + selectedDataListItemId: '' + }; + } + + onSelectDataListItem = id => { + this.setState({ selectedDataListItemId: id }); + }; + + render() { + return ( + + + + + Primary content + , + + Secondary content + + ]} + /> + + + + + + Secondary content (pf-m-no-fill) + , + + Secondary content (pf-m-align-right pf-m-no-fill) + + ]} + /> + + + + ); + } +} diff --git a/packages/react-integration/demo-app-ts/src/components/demos/index.ts b/packages/react-integration/demo-app-ts/src/components/demos/index.ts index 657195f5efc..5e36aa3d9d3 100644 --- a/packages/react-integration/demo-app-ts/src/components/demos/index.ts +++ b/packages/react-integration/demo-app-ts/src/components/demos/index.ts @@ -27,6 +27,7 @@ export * from './ContextSelectorDemo/ContextSelectorDemo'; export * from './ClipboardCopyDemo/ClipboardCopyDemo'; export * from './ClipboardCopyDemo/ClipboardCopyExpandedDemo'; export * from './DataListDemo/DataListDemo'; +export * from './DataListDemo/DataListCompactDemo'; export * from './DataToolbarDemo/DataToolbarDemo'; export * from './DividerDemo/DividerDemo'; export * from './DonutChartDemo/DonutBottomAlignedLegendDemo';