diff --git a/releasenotes/notes/select_roles-e4aed7695f9ba45d.yaml b/releasenotes/notes/select_roles-e4aed7695f9ba45d.yaml new file mode 100644 index 00000000..3ee35227 --- /dev/null +++ b/releasenotes/notes/select_roles-e4aed7695f9ba45d.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Custom deployment roles selection. Roles section of Deployment plan page now + includes 'Manage Roles'. Clicking the link provides a list of all available + roles and lets user select roles intended for deployment. diff --git a/src/js/actions/ZaqarActions.js b/src/js/actions/ZaqarActions.js index feeafd82..25b2302a 100644 --- a/src/js/actions/ZaqarActions.js +++ b/src/js/actions/ZaqarActions.js @@ -95,6 +95,12 @@ export default { dispatch(RolesActions.fetchAvailableRolesFinished(payload, history)); break; } + // TODO(jtomasek): change this back once underlining tripleo-common patch is fixed + case MistralConstants.SELECT_ROLES: { + // case 'tripleo.roles.v1.select_roles': { + dispatch(RolesActions.selectRolesFinished(payload, history)); + break; + } default: break; diff --git a/src/js/components/roles/AvailableRoleInput.js b/src/js/components/roles/AvailableRoleInput.js index 9796224e..b75e3f6e 100644 --- a/src/js/components/roles/AvailableRoleInput.js +++ b/src/js/components/roles/AvailableRoleInput.js @@ -26,7 +26,7 @@ const AvailableRoleInput = ({ input: { value, name, onChange }, style }) => ( - +
{ + const roleNames = Object.keys(pickBy(values)); + this.props.selectRoles(this.props.currentPlanName, roleNames); + }; + render() { const { availableRoles, availableRolesLoaded, + fetchingAvailableRoles, intl: { formatMessage }, currentPlanName, roles @@ -62,28 +69,31 @@ class SelectRolesDialog extends React.Component { - roles.includes(r)).toJS()} - currentPlanName={currentPlanName} + - roles.keySeq().includes(key)) + .toJS()} + availableRoles={availableRoles} + currentPlanName={currentPlanName} > -
- {availableRoles - .toList() - .map(role => ( - - ))} -
-
-
+ {availableRoles + .toList() + .map(role => ( + + ))} + + ); } @@ -93,20 +103,25 @@ SelectRolesDialog.propTypes = { availableRolesLoaded: PropTypes.bool.isRequired, currentPlanName: PropTypes.string.isRequired, fetchAvailableRoles: PropTypes.func.isRequired, + fetchingAvailableRoles: PropTypes.bool.isRequired, intl: PropTypes.object.isRequired, - roles: ImmutablePropTypes.map.isRequired + roles: ImmutablePropTypes.map.isRequired, + selectRoles: PropTypes.func.isRequired }; const mapStateToProps = state => ({ availableRoles: getMergedRoles(state), availableRolesLoaded: state.availableRoles.loaded, + fetchingAvailableRoles: state.availableRoles.isFetching, currentPlanName: getCurrentPlanName(state), roles: getRoles(state) }); const mapDispatchToProps = dispatch => ({ fetchAvailableRoles: planName => - dispatch(RolesActions.fetchAvailableRoles(planName)) + dispatch(RolesActions.fetchAvailableRoles(planName)), + selectRoles: (planName, roleNames) => + dispatch(RolesActions.selectRoles(planName, roleNames)) }); export default injectIntl( diff --git a/src/js/components/roles/SelectRolesForm.js b/src/js/components/roles/SelectRolesForm.js index 27e0c071..593fd621 100644 --- a/src/js/components/roles/SelectRolesForm.js +++ b/src/js/components/roles/SelectRolesForm.js @@ -16,37 +16,61 @@ import { Button } from 'react-bootstrap'; import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; -import { ModalBody, ModalFooter } from 'react-bootstrap'; +import { ModalFooter } from 'react-bootstrap'; +import { pickBy } from 'lodash'; +import { OverlayLoader } from '../ui/Loader'; import PropTypes from 'prop-types'; import React from 'react'; import { reduxForm } from 'redux-form'; import { CloseModalButton } from '../ui/Modals'; -import FormErrorList from '../ui/forms/FormErrorList'; +import ModalFormErrorList from '../ui/forms/ModalFormErrorList'; const messages = defineMessages({ saveChanges: { - id: 'SelectRolesDialog.saveChanges', + id: 'SelectRolesForm.saveChanges', defaultMessage: 'Save Changes' }, cancel: { - id: 'SelectRolesDialog.cancel', + id: 'SelectRolesForm.cancel', defaultMessage: 'Cancel' + }, + updatingRoles: { + id: 'SelectRolesForm.updatingRoles', + defaultMessage: 'Updating Roles...' + }, + primaryRoleValidationError: { + id: 'SelectRolesForm.primaryRoleValidationError', + defaultMessage: + 'Please select one role tagged as "primary" and "controller"' } }); class SelectRolesForm extends React.Component { render() { - const { children, error, handleSubmit, invalid, pristine } = this.props; + const { + children, + error, + handleSubmit, + invalid, + intl: { formatMessage }, + pristine, + submitting + } = this.props; return (
- - - {children} - + + +
+
{children}
+
+