- {selected
- .slice(0, showOverflow ? selected.length : showOverflowAfter)
- .map(selectedItem => (
-
onRemove(selectedItem)}
- >
- {selectedItem.name}
-
- ))}
+ {isReadOnly ? (
+
+ {visibleItems
+ .map(selectedItem => (
+
+ {selectedItem[displayKey]}
+
+ ))
+ }
+
+ ) : (
+
+ {visibleItems
+ .map(selectedItem => (
+ onRemove(selectedItem)}
+ >
+ {selectedItem[displayKey]}
+
+ ))
+ }
+
+ )}
{(
!showOverflow
&& selected.length > showOverflowAfter
@@ -76,15 +101,20 @@ class SelectedList extends Component {
}
SelectedList.propTypes = {
+ displayKey: PropTypes.string,
label: PropTypes.string,
- onRemove: PropTypes.func.isRequired,
+ onRemove: PropTypes.func,
selected: PropTypes.arrayOf(PropTypes.object).isRequired,
showOverflowAfter: PropTypes.number,
+ isReadOnly: PropTypes.bool
};
SelectedList.defaultProps = {
+ displayKey: 'name',
label: 'Selected',
+ onRemove: () => null,
showOverflowAfter: 5,
+ isReadOnly: false
};
export default SelectedList;
diff --git a/src/index.jsx b/src/index.jsx
index 099ab7a584..4654c25ed2 100644
--- a/src/index.jsx
+++ b/src/index.jsx
@@ -15,6 +15,7 @@ import './app.scss';
import './components/Pagination/styles.scss';
import './components/DataListToolbar/styles.scss';
import './components/SelectedList/styles.scss';
+import './components/AddRole/styles.scss';
import { Config } from './contexts/Config';
diff --git a/src/pages/Organizations/components/OrganizationAccessList.jsx b/src/pages/Organizations/components/OrganizationAccessList.jsx
index 5aecddd279..3897cae617 100644
--- a/src/pages/Organizations/components/OrganizationAccessList.jsx
+++ b/src/pages/Organizations/components/OrganizationAccessList.jsx
@@ -6,6 +6,10 @@ import {
TextContent, TextVariants, Chip, Button
} from '@patternfly/react-core';
+import {
+ PlusIcon,
+} from '@patternfly/react-icons';
+
import { I18n, i18nMark } from '@lingui/react';
import { t, Trans } from '@lingui/macro';
@@ -19,6 +23,7 @@ import { withNetwork } from '../../../contexts/Network';
import AlertModal from '../../../components/AlertModal';
import Pagination from '../../../components/Pagination';
import DataListToolbar from '../../../components/DataListToolbar';
+import AddResourceRole from '../../../components/AddRole/AddResourceRole';
import {
parseQueryString,
@@ -109,6 +114,7 @@ class OrganizationAccessList extends React.Component {
deleteRoleId: null,
deleteResourceId: null,
results: [],
+ isModalOpen: false
};
this.fetchOrgAccessList = this.fetchOrgAccessList.bind(this);
@@ -119,6 +125,8 @@ class OrganizationAccessList extends React.Component {
this.handleWarning = this.handleWarning.bind(this);
this.hideWarning = this.hideWarning.bind(this);
this.confirmDelete = this.confirmDelete.bind(this);
+ this.handleModalToggle = this.handleModalToggle.bind(this);
+ this.handleSuccessfulRoleAdd = this.handleSuccessfulRoleAdd.bind(this);
}
componentDidMount () {
@@ -282,6 +290,22 @@ class OrganizationAccessList extends React.Component {
});
}
+ handleSuccessfulRoleAdd () {
+ this.handleModalToggle();
+ const queryParams = this.getQueryParams();
+ try {
+ this.fetchOrgAccessList(queryParams);
+ } catch (error) {
+ this.setState({ error });
+ }
+ }
+
+ handleModalToggle () {
+ this.setState((prevState) => ({
+ isModalOpen: !prevState.isModalOpen,
+ }));
+ }
+
hideWarning () {
this.setState({ showWarning: false });
}
@@ -303,8 +327,13 @@ class OrganizationAccessList extends React.Component {
sortOrder,
warningMsg,
warningTitle,
- showWarning
+ showWarning,
+ isModalOpen
} = this.state;
+ const {
+ api,
+ organization
+ } = this.props;
return (
{({ i18n }) => (
@@ -328,6 +357,25 @@ class OrganizationAccessList extends React.Component {
columns={this.columns}
onSearch={() => { }}
onSort={this.onSort}
+ add={(
+
+
+ {isModalOpen && (
+
+ )}
+
+ )}
/>
{showWarning && (
(
-
+
)}
/>
);
}