Skip to content

Commit e8d4a98

Browse files
committed
Add empty view for table without results
1 parent ec70945 commit e8d4a98

File tree

1 file changed

+60
-23
lines changed

1 file changed

+60
-23
lines changed

src/app/components/ImageTable.tsx

+60-23
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,13 @@ import {
1010
Drawer,
1111
DrawerContent,
1212
DrawerContentBody,
13-
Button
13+
Button,
14+
EmptyState,
15+
EmptyStateIcon,
16+
EmptyStatePrimary,
17+
EmptyStateBody,
1418
} from '@patternfly/react-core';
19+
import { SearchIcon } from '@patternfly/react-icons';
1520
import { Table, Thead, Tr, Th, ThProps, Tbody, Td } from '@patternfly/react-table';
1621
import { fetch } from 'cross-fetch'
1722
import { DetailsDrawer } from './DetailsDrawer';
@@ -38,7 +43,6 @@ export const ImageTable: React.FunctionComponent = () => {
3843
const [perPage, setPerPage] = React.useState(20);
3944
const [isDrawerExpanded, setIsExpanded] = React.useState(false);
4045
const [selectedImage, setSelectedImage] = React.useState({});
41-
4246
const [providerSelections, setProviderSelections] = React.useState<string[]>([]);
4347
const [regionSelections, setRegionSelections] = React.useState<string[]>([]);
4448
const [architectureSelections, setArchitectureSelections] = React.useState<string[]>([]);
@@ -197,23 +201,23 @@ export const ImageTable: React.FunctionComponent = () => {
197201
setFilterConfig([
198202
{
199203
category: 'provider',
200-
data: [...new Set(data.map(item => item['provider']))]
204+
data: [...new Set(data.map((item: string) => item['provider']))]
201205
},
202206
{
203207
category: 'region',
204-
data: [...new Set(data.map(item => item['region']))]
208+
data: [...new Set(data.map((item: string) => item['region']))]
205209
},
206210
{
207211
category: 'architecture',
208-
data: [...new Set(data.map(item => item['arch'].toLowerCase()))]
212+
data: [...new Set(data.map((item: string) => item['arch'].toLowerCase()))]
209213
}
210214
]);
211215
})
212216
};
213217

214-
const handleSearch = (event) => {
218+
const handleSearch = (event: React.FormEvent<HTMLInputElement>) => {
215219
setIsExpanded(false);
216-
setSearch(event.target.value);
220+
setSearch(event.currentTarget.value);
217221
setPage(1);
218222
};
219223

@@ -284,6 +288,30 @@ export const ImageTable: React.FunctionComponent = () => {
284288
details={selectedImage} />
285289
);
286290

291+
const emptyState = (
292+
<EmptyState>
293+
<EmptyStateIcon icon={SearchIcon} />
294+
<Title size="lg" headingLevel="h4">
295+
No results found
296+
</Title>
297+
<EmptyStateBody>No results match the filter criteria. Clear all filters and try again.</EmptyStateBody>
298+
<EmptyStatePrimary>
299+
<Button
300+
variant="link"
301+
onClick={() => {
302+
setIsExpanded(false);
303+
setSearch('');
304+
setPage(1);
305+
onFilterDelete('', '');
306+
}}
307+
>
308+
Clear all filters
309+
</Button>
310+
</EmptyStatePrimary>
311+
</EmptyState>
312+
);
313+
//add searchinput that clears once the setSearch is called
314+
287315
return (
288316
<React.Fragment>
289317
<Title headingLevel='h1'>Browse Images</Title>
@@ -294,6 +322,7 @@ export const ImageTable: React.FunctionComponent = () => {
294322
<ToolbarItem variant="search-filter">
295323
<SearchInput
296324
onChange={handleSearch}
325+
value={search}
297326
id='search'
298327
placeholder='Search by name'
299328
/>
@@ -356,24 +385,32 @@ export const ImageTable: React.FunctionComponent = () => {
356385
</Tr>
357386
</Thead>
358387
<Tbody>
359-
{sortedImageData.map((image: ImageData) => (
360-
<Tr key={image.name}>
361-
<Td dataLabel={columnNames.name}>{image.name}</Td>
362-
<Td dataLabel={columnNames.provider}>{image.provider}</Td>
363-
<Td dataLabel={columnNames.region}>{image.region}</Td>
364-
<Td dataLabel={columnNames.arch}>{image.arch}</Td>
365-
<Td dataLabel={columnNames.date}><p>{new Date(image.date).toDateString()}</p></Td>
366-
<Td>
367-
<Button
368-
aria-expanded={isDrawerExpanded}
369-
onClick={e => onDrawerOpenClick(image)}
370-
variant='link'
371-
isInline>
372-
Launch now
373-
</Button>
388+
{sortedImageData.length > 0 &&
389+
sortedImageData.map((image: ImageData) => (
390+
<Tr key={image.name}>
391+
<Td dataLabel={columnNames.name}>{image.name}</Td>
392+
<Td dataLabel={columnNames.provider}>{image.provider}</Td>
393+
<Td dataLabel={columnNames.region}>{image.region}</Td>
394+
<Td dataLabel={columnNames.arch}>{image.arch}</Td>
395+
<Td dataLabel={columnNames.date}><p>{new Date(image.date).toDateString()}</p></Td>
396+
<Td>
397+
<Button
398+
aria-expanded={isDrawerExpanded}
399+
onClick={e => onDrawerOpenClick(image)}
400+
variant='link'
401+
isInline>
402+
Launch now
403+
</Button>
404+
</Td>
405+
</Tr>
406+
))}
407+
{sortedImageData.length === 0 && (
408+
<Tr>
409+
<Td colSpan={8}>
410+
{emptyState}
374411
</Td>
375412
</Tr>
376-
))}
413+
)}
377414
</Tbody>
378415
</Table>
379416
</DrawerContentBody>

0 commit comments

Comments
 (0)