Convert WorkflowApprovalList to table

This commit is contained in:
Keith Grant
2021-01-07 11:54:21 -08:00
parent 953fa3fe0d
commit eb2a9baadd
4 changed files with 137 additions and 132 deletions

View File

@@ -55,7 +55,7 @@ function ScheduleListItem({ i18n, isSelected, onSelect, schedule, rowIndex }) {
onSelect, onSelect,
disable: false, disable: false,
}} }}
dataLabel={i18n._(`Selected`)} dataLabel={i18n._(t`Selected`)}
/> />
<Td id={labelId} dataLabel={i18n._(t`Name`)}> <Td id={labelId} dataLabel={i18n._(t`Name`)}>
<Link to={`${scheduleBaseUrl}/details`}> <Link to={`${scheduleBaseUrl}/details`}>

View File

@@ -4,9 +4,11 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { Card, PageSection } from '@patternfly/react-core'; import { Card, PageSection } from '@patternfly/react-core';
import { WorkflowApprovalsAPI } from '../../../api'; import { WorkflowApprovalsAPI } from '../../../api';
import PaginatedDataList, { import PaginatedTable, {
ToolbarDeleteButton, HeaderRow,
} from '../../../components/PaginatedDataList'; HeaderCell,
} from '../../../components/PaginatedTable';
import { ToolbarDeleteButton } from '../../../components/PaginatedDataList';
import AlertModal from '../../../components/AlertModal'; import AlertModal from '../../../components/AlertModal';
import ErrorDetail from '../../../components/ErrorDetail'; import ErrorDetail from '../../../components/ErrorDetail';
import DataListToolbar from '../../../components/DataListToolbar'; import DataListToolbar from '../../../components/DataListToolbar';
@@ -155,7 +157,7 @@ function WorkflowApprovalsList({ i18n }) {
<> <>
<PageSection> <PageSection>
<Card> <Card>
<PaginatedDataList <PaginatedTable
contentError={contentError} contentError={contentError}
hasContentLoading={ hasContentLoading={
isWorkflowApprovalsLoading || isWorkflowApprovalsLoading ||
@@ -181,16 +183,6 @@ function WorkflowApprovalsList({ i18n }) {
]} ]}
toolbarSearchableKeys={searchableKeys} toolbarSearchableKeys={searchableKeys}
toolbarRelatedSearchableKeys={relatedSearchableKeys} toolbarRelatedSearchableKeys={relatedSearchableKeys}
toolbarSortColumns={[
{
name: i18n._(t`Name`),
key: 'name',
},
{
name: i18n._(t`Started`),
key: 'started',
},
]}
renderToolbar={props => ( renderToolbar={props => (
<DataListToolbar <DataListToolbar
{...props} {...props}
@@ -227,7 +219,15 @@ function WorkflowApprovalsList({ i18n }) {
]} ]}
/> />
)} )}
renderItem={workflowApproval => ( headerRow={
<HeaderRow qsConfig={QS_CONFIG}>
<HeaderCell sortKey="name">{i18n._(t`Name`)}</HeaderCell>
<HeaderCell>{i18n._(t`Job`)}</HeaderCell>
<HeaderCell sortKey="started">{i18n._(t`Started`)}</HeaderCell>
<HeaderCell>{i18n._(t`Status`)}</HeaderCell>
</HeaderRow>
}
renderRow={(workflowApproval, index) => (
<WorkflowApprovalListItem <WorkflowApprovalListItem
key={workflowApproval.id} key={workflowApproval.id}
workflowApproval={workflowApproval} workflowApproval={workflowApproval}
@@ -237,6 +237,7 @@ function WorkflowApprovalsList({ i18n }) {
)} )}
onSelect={() => handleSelect(workflowApproval)} onSelect={() => handleSelect(workflowApproval)}
onSuccessfulAction={fetchWorkflowApprovals} onSuccessfulAction={fetchWorkflowApprovals}
rowIndex={index}
/> />
)} )}
/> />

View File

@@ -2,27 +2,14 @@ import React from 'react';
import { withI18n } from '@lingui/react'; import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { string, bool, func } from 'prop-types'; import { string, bool, func } from 'prop-types';
import { import { Label } from '@patternfly/react-core';
DataListCheck, import { Tr, Td } from '@patternfly/react-table';
DataListItem,
DataListItemCells,
DataListItemRow,
Label,
} from '@patternfly/react-core';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import styled from 'styled-components'; import styled from 'styled-components';
import DataListCell from '../../../components/DataListCell';
import { WorkflowApproval } from '../../../types'; import { WorkflowApproval } from '../../../types';
import { formatDateString } from '../../../util/dates'; import { formatDateString } from '../../../util/dates';
import WorkflowApprovalStatus from '../shared/WorkflowApprovalStatus'; import WorkflowApprovalStatus from '../shared/WorkflowApprovalStatus';
const StatusCell = styled(DataListCell)`
@media screen and (min-width: 768px) {
display: flex;
justify-content: flex-end;
}
`;
const JobLabel = styled.b` const JobLabel = styled.b`
margin-right: 24px; margin-right: 24px;
`; `;
@@ -32,6 +19,7 @@ function WorkflowApprovalListItem({
isSelected, isSelected,
onSelect, onSelect,
detailUrl, detailUrl,
rowIndex,
i18n, i18n,
}) { }) {
const labelId = `check-action-${workflowApproval.id}`; const labelId = `check-action-${workflowApproval.id}`;
@@ -62,26 +50,21 @@ function WorkflowApprovalListItem({
}; };
return ( return (
<DataListItem <Tr id={`workflow-approval-row-${workflowApproval.id}`}>
key={workflowApproval.id} <Td
aria-labelledby={labelId} select={{
id={`${workflowApproval.id}`} rowIndex,
> isSelected,
<DataListItemRow> onSelect,
<DataListCheck }}
id={`select-workflowApproval-${workflowApproval.id}`} dataLabel={i18n._(t`Selected`)}
checked={isSelected}
onChange={onSelect}
aria-labelledby={labelId}
/> />
<DataListItemCells <Td id={labelId} dataLabel={i18n._(t`Name`)}>
dataListCells={[
<DataListCell key="title">
<Link to={`${detailUrl}`}> <Link to={`${detailUrl}`}>
<b>{workflowApproval.name}</b> <b>{workflowApproval.name}</b>
</Link> </Link>
</DataListCell>, </Td>
<DataListCell key="job"> <Td>
<> <>
<JobLabel>{i18n._(t`Job`)}</JobLabel> <JobLabel>{i18n._(t`Job`)}</JobLabel>
{workflowJob && workflowJob?.id ? ( {workflowJob && workflowJob?.id ? (
@@ -92,14 +75,14 @@ function WorkflowApprovalListItem({
i18n._(t`Deleted`) i18n._(t`Deleted`)
)} )}
</> </>
</DataListCell>, </Td>
<StatusCell key="status"> <Td dataLabel={i18n._(t`Started`)}>
{formatDateString(workflowApproval.started)}
</Td>
<Td dataLabel={i18n._(t`Status`)}>
<div>{getStatus()}</div> <div>{getStatus()}</div>
</StatusCell>, </Td>
]} </Tr>
/>
</DataListItemRow>
</DataListItem>
); );
} }

View File

@@ -12,19 +12,26 @@ describe('<WorkflowApprovalListItem />', () => {
afterEach(() => { afterEach(() => {
wrapper.unmount(); wrapper.unmount();
}); });
test('should display never expires status', () => { test('should display never expires status', () => {
wrapper = mountWithContexts( wrapper = mountWithContexts(
<table>
<tbody>
<WorkflowApprovalListItem <WorkflowApprovalListItem
isSelected={false} isSelected={false}
detailUrl={`/workflow_approvals/${workflowApproval.id}`} detailUrl={`/workflow_approvals/${workflowApproval.id}`}
onSelect={() => {}} onSelect={() => {}}
workflowApproval={workflowApproval} workflowApproval={workflowApproval}
/> />
</tbody>
</table>
); );
expect(wrapper.find('Label[children="Never expires"]').length).toBe(1); expect(wrapper.find('Label[children="Never expires"]').length).toBe(1);
}); });
test('should display timed out status', () => { test('should display timed out status', () => {
wrapper = mountWithContexts( wrapper = mountWithContexts(
<table>
<tbody>
<WorkflowApprovalListItem <WorkflowApprovalListItem
isSelected={false} isSelected={false}
detailUrl={`/workflow_approvals/${workflowApproval.id}`} detailUrl={`/workflow_approvals/${workflowApproval.id}`}
@@ -35,11 +42,15 @@ describe('<WorkflowApprovalListItem />', () => {
timed_out: true, timed_out: true,
}} }}
/> />
</tbody>
</table>
); );
expect(wrapper.find('Label[children="Timed out"]').length).toBe(1); expect(wrapper.find('Label[children="Timed out"]').length).toBe(1);
}); });
test('should display canceled status', () => { test('should display canceled status', () => {
wrapper = mountWithContexts( wrapper = mountWithContexts(
<table>
<tbody>
<WorkflowApprovalListItem <WorkflowApprovalListItem
isSelected={false} isSelected={false}
detailUrl={`/workflow_approvals/${workflowApproval.id}`} detailUrl={`/workflow_approvals/${workflowApproval.id}`}
@@ -50,11 +61,15 @@ describe('<WorkflowApprovalListItem />', () => {
status: 'canceled', status: 'canceled',
}} }}
/> />
</tbody>
</table>
); );
expect(wrapper.find('Label[children="Canceled"]').length).toBe(1); expect(wrapper.find('Label[children="Canceled"]').length).toBe(1);
}); });
test('should display approved status', () => { test('should display approved status', () => {
wrapper = mountWithContexts( wrapper = mountWithContexts(
<table>
<tbody>
<WorkflowApprovalListItem <WorkflowApprovalListItem
isSelected={false} isSelected={false}
detailUrl={`/workflow_approvals/${workflowApproval.id}`} detailUrl={`/workflow_approvals/${workflowApproval.id}`}
@@ -73,11 +88,15 @@ describe('<WorkflowApprovalListItem />', () => {
}, },
}} }}
/> />
</tbody>
</table>
); );
expect(wrapper.find('Label[children="Approved"]').length).toBe(1); expect(wrapper.find('Label[children="Approved"]').length).toBe(1);
}); });
test('should display denied status', () => { test('should display denied status', () => {
wrapper = mountWithContexts( wrapper = mountWithContexts(
<table>
<tbody>
<WorkflowApprovalListItem <WorkflowApprovalListItem
isSelected={false} isSelected={false}
detailUrl={`/workflow_approvals/${workflowApproval.id}`} detailUrl={`/workflow_approvals/${workflowApproval.id}`}
@@ -97,6 +116,8 @@ describe('<WorkflowApprovalListItem />', () => {
}, },
}} }}
/> />
</tbody>
</table>
); );
expect(wrapper.find('Label[children="Denied"]').length).toBe(1); expect(wrapper.find('Label[children="Denied"]').length).toBe(1);
}); });