add unit test coverage for DataListToolbar.jsx

This commit is contained in:
Jake McDermott
2019-01-07 07:38:12 -05:00
parent 8756da59fa
commit a83e5e5675
2 changed files with 58 additions and 39 deletions

View File

@@ -29,6 +29,7 @@ describe('<DataListToolbar />', () => {
<I18nProvider> <I18nProvider>
<DataListToolbar <DataListToolbar
isAllSelected={false} isAllSelected={false}
showExpandCollapse={true}
sortedColumnKey="name" sortedColumnKey="name"
sortOrder="ascending" sortOrder="ascending"
columns={columns} columns={columns}

View File

@@ -47,9 +47,10 @@ class DataListToolbar extends React.Component {
this.handleSearchInputChange = this.handleSearchInputChange.bind(this); this.handleSearchInputChange = this.handleSearchInputChange.bind(this);
this.onSortDropdownToggle = this.onSortDropdownToggle.bind(this); this.onSortDropdownToggle = this.onSortDropdownToggle.bind(this);
this.onSortDropdownSelect = this.onSortDropdownSelect.bind(this); this.onSortDropdownSelect = this.onSortDropdownSelect.bind(this);
this.onSearch = this.onSearch.bind(this);
this.onSearchDropdownToggle = this.onSearchDropdownToggle.bind(this); this.onSearchDropdownToggle = this.onSearchDropdownToggle.bind(this);
this.onSearchDropdownSelect = this.onSearchDropdownSelect.bind(this); this.onSearchDropdownSelect = this.onSearchDropdownSelect.bind(this);
this.onSearch = this.onSearch.bind(this);
this.onSort = this.onSort.bind(this);
} }
handleSearchInputChange (searchValue) { handleSearchInputChange (searchValue) {
@@ -62,12 +63,12 @@ class DataListToolbar extends React.Component {
onSortDropdownSelect ({ target }) { onSortDropdownSelect ({ target }) {
const { columns, onSort, sortOrder } = this.props; const { columns, onSort, sortOrder } = this.props;
const { innerText } = target;
const [{ key }] = columns.filter(({ name }) => name === target.innerText); const [{ key: searchKey }] = columns.filter(({ name }) => name === innerText);
this.setState({ isSortDropdownOpen: false }); this.setState({ isSortDropdownOpen: false });
onSort(searchKey, sortOrder);
onSort(key, sortOrder);
} }
onSearchDropdownToggle (isSearchDropdownOpen) { onSearchDropdownToggle (isSearchDropdownOpen) {
@@ -76,11 +77,10 @@ class DataListToolbar extends React.Component {
onSearchDropdownSelect ({ target }) { onSearchDropdownSelect ({ target }) {
const { columns } = this.props; const { columns } = this.props;
const { innerText } = target;
const targetName = target.innerText; const [{ key: searchKey }] = columns.filter(({ name }) => name === innerText);
const [{ key }] = columns.filter(({ name }) => name === targetName); this.setState({ isSearchDropdownOpen: false, searchKey });
this.setState({ isSearchDropdownOpen: false, searchKey: key });
} }
onSearch () { onSearch () {
@@ -90,13 +90,19 @@ class DataListToolbar extends React.Component {
onSearch(searchValue); onSearch(searchValue);
} }
onSort () {
const { onSort, sortedColumnKey, sortOrder } = this.props;
const newSortOrder = sortOrder === 'ascending' ? 'descending' : 'ascending';
onSort(sortedColumnKey, newSortOrder);
}
render () { render () {
const { up } = DropdownPosition; const { up } = DropdownPosition;
const { const {
columns, columns,
isAllSelected, isAllSelected,
onSelectAll, onSelectAll,
onSort,
sortedColumnKey, sortedColumnKey,
sortOrder, sortOrder,
addUrl, addUrl,
@@ -110,29 +116,15 @@ class DataListToolbar extends React.Component {
searchValue, searchValue,
} = this.state; } = this.state;
const [searchColumn] = columns const [{ name: searchColumnName }] = columns.filter(({ key }) => key === searchKey);
.filter(({ key }) => key === searchKey); const [{ name: sortedColumnName, isNumeric }] = columns
const searchColumnName = searchColumn.name;
const [sortedColumn] = columns
.filter(({ key }) => key === sortedColumnKey); .filter(({ key }) => key === sortedColumnKey);
const sortedColumnName = sortedColumn.name;
const isSortNumeric = sortedColumn.isNumeric;
const displayedSortIcon = () => {
let icon;
if (sortOrder === 'ascending') {
icon = isSortNumeric ? (<SortNumericUpIcon />) : (<SortAlphaUpIcon />);
} else {
icon = isSortNumeric ? (<SortNumericDownIcon />) : (<SortAlphaDownIcon />);
}
return icon;
};
const searchDropdownItems = columns const searchDropdownItems = columns
.filter(({ key }) => key !== searchKey) .filter(({ key }) => key !== searchKey)
.map(({ key, name }) => ( .map(({ key, name }) => (
<DropdownItem key={key} component="button"> <DropdownItem key={key} component="button">
{ name } {name}
</DropdownItem> </DropdownItem>
)); ));
@@ -140,17 +132,26 @@ class DataListToolbar extends React.Component {
.filter(({ key, isSortable }) => isSortable && key !== sortedColumnKey) .filter(({ key, isSortable }) => isSortable && key !== sortedColumnKey)
.map(({ key, name }) => ( .map(({ key, name }) => (
<DropdownItem key={key} component="button"> <DropdownItem key={key} component="button">
{ name } {name}
</DropdownItem> </DropdownItem>
)); ));
let SortIcon;
if (isNumeric) {
SortIcon = sortOrder === 'ascending' ? SortNumericUpIcon : SortNumericDownIcon;
} else {
SortIcon = sortOrder === 'ascending' ? SortAlphaUpIcon : SortAlphaDownIcon;
}
return ( return (
<I18n> <I18n>
{({ i18n }) => ( {({ i18n }) => (
<div className="awx-toolbar"> <div className="awx-toolbar">
<Level> <Level>
<LevelItem> <LevelItem>
<Toolbar style={{ marginLeft: '20px' }}> <Toolbar
style={{ marginLeft: '20px' }}
>
<ToolbarGroup> <ToolbarGroup>
<ToolbarItem> <ToolbarItem>
<Checkbox <Checkbox
@@ -174,7 +175,7 @@ class DataListToolbar extends React.Component {
<DropdownToggle <DropdownToggle
onToggle={this.onSearchDropdownToggle} onToggle={this.onSearchDropdownToggle}
> >
{ searchColumnName } {searchColumnName}
</DropdownToggle> </DropdownToggle>
)} )}
dropdownItems={searchDropdownItems} dropdownItems={searchDropdownItems}
@@ -195,7 +196,9 @@ class DataListToolbar extends React.Component {
</div> </div>
</ToolbarItem> </ToolbarItem>
</ToolbarGroup> </ToolbarGroup>
<ToolbarGroup className="sortDropdownGroup"> <ToolbarGroup
className="sortDropdownGroup"
>
<ToolbarItem> <ToolbarItem>
<Dropdown <Dropdown
onToggle={this.onSortDropdownToggle} onToggle={this.onSortDropdownToggle}
@@ -206,7 +209,7 @@ class DataListToolbar extends React.Component {
<DropdownToggle <DropdownToggle
onToggle={this.onSortDropdownToggle} onToggle={this.onSortDropdownToggle}
> >
{ sortedColumnName } {sortedColumnName}
</DropdownToggle> </DropdownToggle>
)} )}
dropdownItems={sortDropdownItems} dropdownItems={sortDropdownItems}
@@ -214,23 +217,29 @@ class DataListToolbar extends React.Component {
</ToolbarItem> </ToolbarItem>
<ToolbarItem> <ToolbarItem>
<Button <Button
onClick={() => onSort(sortedColumnKey, sortOrder === 'ascending' ? 'descending' : 'ascending')} onClick={this.onSort}
variant="plain" variant="plain"
aria-label={i18n._(t`Sort`)} aria-label={i18n._(t`Sort`)}
> >
{displayedSortIcon()} <SortIcon/>
</Button> </Button>
</ToolbarItem> </ToolbarItem>
</ToolbarGroup> </ToolbarGroup>
{ showExpandCollapse && ( {showExpandCollapse && (
<ToolbarGroup> <ToolbarGroup>
<ToolbarItem> <ToolbarItem>
<Button variant="plain" aria-label={i18n._(t`Expand`)}> <Button
variant="plain"
aria-label={i18n._(t`Expand`)}
>
<BarsIcon /> <BarsIcon />
</Button> </Button>
</ToolbarItem> </ToolbarItem>
<ToolbarItem> <ToolbarItem>
<Button variant="plain" aria-label={i18n._(t`Collapse`)}> <Button
variant="plain"
aria-label={i18n._(t`Collapse`)}
>
<EqualsIcon /> <EqualsIcon />
</Button> </Button>
</ToolbarItem> </ToolbarItem>
@@ -239,14 +248,23 @@ class DataListToolbar extends React.Component {
</Toolbar> </Toolbar>
</LevelItem> </LevelItem>
<LevelItem> <LevelItem>
<Tooltip message={i18n._(t`Delete`)} position="top"> <Tooltip
<Button variant="plain" aria-label={i18n._(t`Delete`)}> message={i18n._(t`Delete`)}
position="top"
>
<Button
variant="plain"
aria-label={i18n._(t`Delete`)}
>
<TrashAltIcon /> <TrashAltIcon />
</Button> </Button>
</Tooltip> </Tooltip>
{addUrl && ( {addUrl && (
<Link to={addUrl}> <Link to={addUrl}>
<Button variant="primary" aria-label={i18n._(t`Add`)}> <Button
variant="primary"
aria-label={i18n._(t`Add`)}
>
<PlusIcon /> <PlusIcon />
</Button> </Button>
</Link> </Link>