Skip to content

Commit 8ba954f

Browse files
leSamokpatticha
authored andcommitted
feat: Add column management modal
1 parent c0b3ee8 commit 8ba954f

File tree

3 files changed

+124
-0
lines changed

3 files changed

+124
-0
lines changed

locales/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
"businessRiskModal.info": "Business risk can be used to identify, track, and address CVEs that have meaningful impact to your organization.",
1616
"businessRiskModal.title": "Edit business risk",
1717
"cancel": "Cancel",
18+
"columnManagementModal.description": "Selected categories will be displayed in the table.",
19+
"columnManagementModal.selectAll": "Select all",
20+
"columnManagementModal.title": "Manage columns",
1821
"configModalExportReport": "Export report",
1922
"configModalTitle": "Report by CVEs",
2023
"count": "Num. systems",
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import React, { useState } from 'react';
2+
import propTypes from 'prop-types';
3+
import {
4+
Modal,
5+
Button,
6+
TextContent,
7+
Text,
8+
TextVariants,
9+
DataListItem,
10+
DataList,
11+
DataListItemRow,
12+
DataListCheck,
13+
DataListCell,
14+
DataListItemCells
15+
} from '@patternfly/react-core';
16+
import messages from '../../../Messages';
17+
import { intl } from '../../../Utilities/IntlProvider';
18+
19+
const ColumnManagementModal = ({ appliedColumns, applyColumns, isModalOpen, setModalOpen }) => {
20+
const [currentColumns, setCurrentColumns] = useState(appliedColumns);
21+
22+
const handleChange = index => {
23+
let newColumns = [...currentColumns];
24+
let changedColumn = { ...newColumns[index] };
25+
26+
changedColumn.isShown = !changedColumn.isShown;
27+
newColumns[index] = changedColumn;
28+
29+
setCurrentColumns(newColumns);
30+
};
31+
32+
const selectAll = () => {
33+
let newColumns = [...currentColumns];
34+
newColumns = newColumns.map(column => ({ ...column, isShown: true }));
35+
36+
setCurrentColumns(newColumns);
37+
};
38+
39+
const handleSave = () => {
40+
setModalOpen(false);
41+
applyColumns(currentColumns);
42+
};
43+
44+
const handleCancel = () => {
45+
setModalOpen(false);
46+
setCurrentColumns(appliedColumns);
47+
};
48+
49+
return (
50+
<Modal
51+
title={intl.formatMessage(messages.columnManagementModalTitle)}
52+
onClose={() => setModalOpen(false)}
53+
isOpen={isModalOpen}
54+
variant="small"
55+
description={
56+
<TextContent>
57+
<Text component={TextVariants.p}>{intl.formatMessage(messages.columnManagementModalDescription)}</Text>
58+
<Button isInline onClick={selectAll} variant="link">
59+
{intl.formatMessage(messages.columnManagementModalSelectAll)}
60+
</Button>
61+
</TextContent>
62+
}
63+
actions={[
64+
<Button key="save" variant="primary" onClick={handleSave}>
65+
{intl.formatMessage(messages.save)}
66+
</Button>,
67+
<Button key="cancel" variant="secondary" onClick={handleCancel}>
68+
{intl.formatMessage(messages.cancel)}
69+
</Button>
70+
]}
71+
>
72+
<DataList aria-label="Table column management" id="table-column-management" isCompact>
73+
{currentColumns.map((column, index) =>
74+
<DataListItem key={column.key}>
75+
<DataListItemRow>
76+
<DataListCheck
77+
checked={column.isShown}
78+
id={'checkbox-' + index}
79+
onChange={() => handleChange(index)}
80+
/>
81+
<DataListItemCells
82+
dataListCells={[
83+
<DataListCell key={'table-column-management-item' + index}>
84+
<label htmlFor={'checkbox-' + index}>
85+
{column.title}
86+
</label>
87+
</DataListCell>
88+
]}
89+
/>
90+
</DataListItemRow>
91+
</DataListItem>
92+
)}
93+
</DataList>
94+
</Modal>
95+
);
96+
};
97+
98+
ColumnManagementModal.propTypes = {
99+
appliedColumns: propTypes.arrayOf(propTypes.object),
100+
applyColumns: propTypes.func,
101+
isModalOpen: propTypes.bool,
102+
setModalOpen: propTypes.func
103+
};
104+
105+
export default ColumnManagementModal;

src/Messages.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,5 +1542,21 @@ export default defineMessages({
15421542
id: 'notificationDetailIncludeFailureBody',
15431543
description: 'Notification body text when a system fails to get included into vulnerability analysis using kebab action in system detail page',
15441544
defaultMessage: 'Select the resume action to try again.'
1545+
},
1546+
1547+
columnManagementModalTitle: {
1548+
id: 'columnManagementModal.title',
1549+
description: 'Title text of the column management modal',
1550+
defaultMessage: 'Manage columns'
1551+
},
1552+
columnManagementModalDescription: {
1553+
id: 'columnManagementModal.description',
1554+
description: 'Description text of the column management modal',
1555+
defaultMessage: 'Selected categories will be displayed in the table.'
1556+
},
1557+
columnManagementModalSelectAll: {
1558+
id: 'columnManagementModal.selectAll',
1559+
description: 'Button inside the column management modal, which will select all items',
1560+
defaultMessage: 'Select all'
15451561
}
15461562
});

0 commit comments

Comments
 (0)