Merge pull request #4733 from keithjgrant/4612-lookup-param-bugs

Prevent Lookup search filters from affecting other Lookups on page

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
This commit is contained in:
softwarefactory-project-zuul[bot]
2019-09-13 17:01:18 +00:00
committed by GitHub
5 changed files with 46 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ class InstanceGroupsLookup extends React.Component {
value={value} value={value}
onLookupSave={onChange} onLookupSave={onChange}
getItems={getInstanceGroups} getItems={getInstanceGroups}
qsNamespace="instance-group"
multiple multiple
columns={[ columns={[
{ {

View File

@@ -38,6 +38,7 @@ class InventoriesLookup extends React.Component {
onLookupSave={onChange} onLookupSave={onChange}
getItems={getInventories} getItems={getInventories}
required={required} required={required}
qsNamespace="inventory"
columns={[ columns={[
{ name: i18n._(t`Name`), key: 'name', isSortable: true }, { name: i18n._(t`Name`), key: 'name', isSortable: true },
{ {

View File

@@ -64,7 +64,7 @@ class Lookup extends React.Component {
count: 0, count: 0,
error: null, error: null,
}; };
this.qsConfig = getQSConfig('lookup', { this.qsConfig = getQSConfig(props.qsNamespace, {
page: 1, page: 1,
page_size: 5, page_size: 5,
order_by: props.sortedColumnKey, order_by: props.sortedColumnKey,
@@ -73,6 +73,7 @@ class Lookup extends React.Component {
this.toggleSelected = this.toggleSelected.bind(this); this.toggleSelected = this.toggleSelected.bind(this);
this.saveModal = this.saveModal.bind(this); this.saveModal = this.saveModal.bind(this);
this.getData = this.getData.bind(this); this.getData = this.getData.bind(this);
this.clearQSParams = this.clearQSParams.bind(this);
} }
componentDidMount() { componentDidMount() {
@@ -163,6 +164,8 @@ class Lookup extends React.Component {
lookupSelectedItems = multiple ? [...value] : [value]; lookupSelectedItems = multiple ? [...value] : [value];
} }
this.setState({ lookupSelectedItems }); this.setState({ lookupSelectedItems });
} else {
this.clearQSParams();
} }
this.setState(prevState => ({ this.setState(prevState => ({
isModalOpen: !prevState.isModalOpen, isModalOpen: !prevState.isModalOpen,
@@ -179,6 +182,14 @@ class Lookup extends React.Component {
this.handleModalToggle(); this.handleModalToggle();
} }
clearQSParams() {
const { history } = this.props;
const parts = history.location.search.replace(/^\?/, '').split('&');
const ns = this.qsConfig.namespace;
const otherParts = parts.filter(param => !param.startsWith(`${ns}.`));
history.push(`${history.location.pathname}?${otherParts.join('&')}`);
}
render() { render() {
const { const {
isModalOpen, isModalOpen,
@@ -303,6 +314,7 @@ Lookup.propTypes = {
sortedColumnKey: string.isRequired, sortedColumnKey: string.isRequired,
multiple: bool, multiple: bool,
required: bool, required: bool,
qsNamespace: string,
}; };
Lookup.defaultProps = { Lookup.defaultProps = {
@@ -312,6 +324,7 @@ Lookup.defaultProps = {
value: null, value: null,
multiple: false, multiple: false,
required: false, required: false,
qsNamespace: 'lookup',
}; };
export { Lookup as _Lookup }; export { Lookup as _Lookup };

View File

@@ -359,4 +359,33 @@ describe('<Lookup />', () => {
expect(getItems).toHaveBeenCalledTimes(2); expect(getItems).toHaveBeenCalledTimes(2);
done(); done();
}); });
test('should clear its query params when closed', async () => {
mockData = [{ name: 'foo', id: 1, isChecked: false }];
const history = createMemoryHistory({
initialEntries: ['/organizations/add?inventory.name=foo&bar=baz'],
});
wrapper = mountWithContexts(
<_Lookup
multiple
name="foo"
lookupHeader="Foo Bar"
onLookupSave={() => {}}
value={mockData}
columns={mockColumns}
sortedColumnKey="name"
getItems={() => {}}
location={{ history }}
history={history}
qsNamespace="inventory"
i18n={{ _: val => val.toString() }}
/>
);
wrapper
.find('InputGroup Button')
.at(0)
.invoke('onClick')();
wrapper.find('Modal').invoke('onClose')();
expect(history.location.search).toEqual('?bar=baz');
});
}); });

View File

@@ -51,6 +51,7 @@ class ProjectLookup extends React.Component {
getItems={loadProjects} getItems={loadProjects}
required={required} required={required}
sortedColumnKey="name" sortedColumnKey="name"
qsNamespace="project"
/> />
</FormGroup> </FormGroup>
); );