create InstanceGroupsLookup for org add/edit forms

This commit is contained in:
Keith Grant
2019-03-25 11:59:14 -04:00
parent f0c94c7e9c
commit f3a6da20f6
4 changed files with 89 additions and 68 deletions

View File

@@ -3,7 +3,6 @@ import { mount } from 'enzyme';
import { MemoryRouter } from 'react-router-dom'; import { MemoryRouter } from 'react-router-dom';
import { I18nProvider } from '@lingui/react'; import { I18nProvider } from '@lingui/react';
import { ConfigContext } from '../../../../../src/context'; import { ConfigContext } from '../../../../../src/context';
import APIClient from '../../../../../src/api';
import OrganizationEdit from '../../../../../src/pages/Organizations/screens/Organization/OrganizationEdit'; import OrganizationEdit from '../../../../../src/pages/Organizations/screens/Organization/OrganizationEdit';
describe('<OrganizationEdit />', () => { describe('<OrganizationEdit />', () => {

View File

@@ -0,0 +1,74 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { I18n, i18nMark } from '@lingui/react';
import { FormGroup, Tooltip } from '@patternfly/react-core';
import { QuestionCircleIcon } from '@patternfly/react-icons';
import { t } from '@lingui/macro';
import Lookup from '../../../components/Lookup';
const INSTANCE_GROUPS_LOOKUP_COLUMNS = [
{ name: i18nMark('Name'), key: 'name', isSortable: true },
{ name: i18nMark('Modified'), key: 'modified', isSortable: false, isNumeric: true },
{ name: i18nMark('Created'), key: 'created', isSortable: false, isNumeric: true }
];
class InstanceGroupsLookup extends React.Component {
constructor (props) {
super(props);
this.getInstanceGroups = this.getInstanceGroups.bind(this);
}
async getInstanceGroups (params) {
const { api } = this.props;
const data = await api.getInstanceGroups(params);
return data;
}
render () {
const { value, onChange } = this.props;
return (
<I18n>
{({ i18n }) => (
<FormGroup
label={(
<Fragment>
{i18n._(t`Instance Groups`)}
{' '}
<Tooltip
position="right"
content={i18n._(t`Select the Instance Groups for this Organization to run on.`)}
>
<QuestionCircleIcon />
</Tooltip>
</Fragment>
)}
fieldId="add-org-form-instance-groups"
>
<Lookup
lookupHeader={i18n._(t`Instance Groups`)}
name="instanceGroups"
value={value}
onLookupSave={onChange}
getItems={this.getInstanceGroups}
columns={INSTANCE_GROUPS_LOOKUP_COLUMNS}
sortedColumnKey="name"
/>
</FormGroup>
)}
</I18n>
);
}
}
InstanceGroupsLookup.propTypes = {
api: PropTypes.shape({
getInstanceGroups: PropTypes.func,
}).isRequired,
value: PropTypes.arrayOf(PropTypes.object).isRequired,
onChange: PropTypes.func.isRequired,
};
export default InstanceGroupsLookup;

View File

@@ -11,15 +11,14 @@ import {
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import { ConfigContext } from '../../../../context'; import { ConfigContext } from '../../../../context';
import Lookup from '../../../../components/Lookup';
import FormActionGroup from '../../../../components/FormActionGroup'; import FormActionGroup from '../../../../components/FormActionGroup';
import AnsibleSelect from '../../../../components/AnsibleSelect'; import AnsibleSelect from '../../../../components/AnsibleSelect';
import InstanceGroupsLookup from '../../components/InstanceGroupsLookup';
class OrganizationEdit extends Component { class OrganizationEdit extends Component {
constructor (props) { constructor (props) {
super(props); super(props);
this.getInstanceGroups = this.getInstanceGroups.bind(this);
this.getRelatedInstanceGroups = this.getRelatedInstanceGroups.bind(this); this.getRelatedInstanceGroups = this.getRelatedInstanceGroups.bind(this);
this.checkValidity = this.checkValidity.bind(this); this.checkValidity = this.checkValidity.bind(this);
this.onFieldChange = this.onFieldChange.bind(this); this.onFieldChange = this.onFieldChange.bind(this);
@@ -130,12 +129,6 @@ class OrganizationEdit extends Component {
history.push(`/organizations/${id}`); history.push(`/organizations/${id}`);
} }
async getInstanceGroups (params) {
const { api } = this.props;
const data = await api.getInstanceGroups(params);
return data;
}
async getRelatedInstanceGroups () { async getRelatedInstanceGroups () {
const { const {
api, api,
@@ -179,6 +172,7 @@ class OrganizationEdit extends Component {
} }
render () { render () {
const { api } = this.props;
const { const {
form: { form: {
name, name,
@@ -190,12 +184,6 @@ class OrganizationEdit extends Component {
error error
} = this.state; } = this.state;
const instanceGroupsLookupColumns = [
{ name: i18nMark('Name'), key: 'name', isSortable: true },
{ name: i18nMark('Modified'), key: 'modified', isSortable: false, isNumeric: true },
{ name: i18nMark('Created'), key: 'created', isSortable: false, isNumeric: true }
];
return ( return (
<CardBody> <CardBody>
<I18n> <I18n>
@@ -249,20 +237,11 @@ class OrganizationEdit extends Component {
)} )}
</ConfigContext.Consumer> </ConfigContext.Consumer>
</div> </div>
<FormGroup <InstanceGroupsLookup
fieldId="edit-org-form-instance-groups" api={api}
label={i18n._(t`Instance Groups`)} value={instanceGroups.value}
> onChange={this.onLookupSave}
<Lookup />
columns={instanceGroupsLookupColumns}
getItems={this.getInstanceGroups}
lookupHeader={i18n._(t`Instance Groups`)}
name="instanceGroups"
onLookupSave={this.onLookupSave}
sortedColumnKey="name"
value={instanceGroups.value}
/>
</FormGroup>
<FormActionGroup <FormActionGroup
onCancel={this.onCancel} onCancel={this.onCancel}
onSubmit={this.onSubmit} onSubmit={this.onSubmit}

View File

@@ -1,7 +1,7 @@
import React, { Fragment } from 'react'; import React, { Fragment } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import { I18n, i18nMark } from '@lingui/react'; import { I18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { import {
PageSection, PageSection,
@@ -18,15 +18,14 @@ import {
import { QuestionCircleIcon, TimesIcon } from '@patternfly/react-icons'; import { QuestionCircleIcon, TimesIcon } from '@patternfly/react-icons';
import { ConfigContext } from '../../../context'; import { ConfigContext } from '../../../context';
import Lookup from '../../../components/Lookup';
import AnsibleSelect from '../../../components/AnsibleSelect'; import AnsibleSelect from '../../../components/AnsibleSelect';
import FormActionGroup from '../../../components/FormActionGroup'; import FormActionGroup from '../../../components/FormActionGroup';
import InstanceGroupsLookup from '../components/InstanceGroupsLookup';
class OrganizationAdd extends React.Component { class OrganizationAdd extends React.Component {
constructor (props) { constructor (props) {
super(props); super(props);
this.getInstanceGroups = this.getInstanceGroups.bind(this);
this.onFieldChange = this.onFieldChange.bind(this); this.onFieldChange = this.onFieldChange.bind(this);
this.onLookupSave = this.onLookupSave.bind(this); this.onLookupSave = this.onLookupSave.bind(this);
this.onSubmit = this.onSubmit.bind(this); this.onSubmit = this.onSubmit.bind(this);
@@ -88,13 +87,8 @@ class OrganizationAdd extends React.Component {
history.push(`/organizations/${id}`); history.push(`/organizations/${id}`);
} }
async getInstanceGroups (params) {
const { api } = this.props;
const data = await api.getInstanceGroups(params);
return data;
}
render () { render () {
const { api } = this.props;
const { const {
name, name,
description, description,
@@ -104,11 +98,6 @@ class OrganizationAdd extends React.Component {
error error
} = this.state; } = this.state;
const enabled = name.length > 0; // TODO: add better form validation const enabled = name.length > 0; // TODO: add better form validation
const instanceGroupsLookupColumns = [
{ name: i18nMark('Name'), key: 'name', isSortable: true },
{ name: i18nMark('Modified'), key: 'modified', isSortable: false, isNumeric: true },
{ name: i18nMark('Created'), key: 'created', isSortable: false, isNumeric: true }
];
return ( return (
<PageSection> <PageSection>
@@ -153,31 +142,11 @@ class OrganizationAdd extends React.Component {
onChange={this.onFieldChange} onChange={this.onFieldChange}
/> />
</FormGroup> </FormGroup>
<FormGroup <InstanceGroupsLookup
label={( api={api}
<Fragment> value={instanceGroups}
{i18n._(t`Instance Groups`)} onChange={this.onLookupSave}
{' '} />
<Tooltip
position="right"
content={i18n._(t`Select the Instance Groups for this Organization to run on.`)}
>
<QuestionCircleIcon />
</Tooltip>
</Fragment>
)}
fieldId="add-org-form-instance-groups"
>
<Lookup
lookupHeader={i18n._(t`Instance Groups`)}
name="instanceGroups"
value={instanceGroups}
onLookupSave={this.onLookupSave}
getItems={this.getInstanceGroups}
columns={instanceGroupsLookupColumns}
sortedColumnKey="name"
/>
</FormGroup>
<ConfigContext.Consumer> <ConfigContext.Consumer>
{({ custom_virtualenvs }) => ( {({ custom_virtualenvs }) => (
custom_virtualenvs && custom_virtualenvs.length > 1 && ( custom_virtualenvs && custom_virtualenvs.length > 1 && (