Skip to content

Commit

Permalink
fix(MultiSelect): handle case of MultiSelect with initialSelectedItems (
Browse files Browse the repository at this point in the history
carbon-design-system#761)

* fix(MultiSelect): handle case of MultiSelect with initialSelectedItems, resolves carbon-design-system#707

* test(MultiSelect): add scenario of initialStelectedItems

* fix(MultiSelect): handle case of MultiSelect with initialSelectedItems, resolves carbon-design-system#707
  • Loading branch information
rezak-otmani authored and joshblack committed Apr 9, 2018
1 parent 61376a0 commit 63b22bc
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 13 deletions.
72 changes: 72 additions & 0 deletions src/components/MultiSelect/__tests__/MultiSelect-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,78 @@ describe('MultiSelect', () => {
});
});

describe('MultiSelect with InitialSelectedItems', () => {
let mockProps;
const items = generateItems(5, generateGenericItem);

beforeEach(() => {
mockProps = {
items: items,
initialSelectedItems: [items[0], items[1], items[2]],
itemToString: ({ label }) => label,
onChange: jest.fn(),
label: 'Label',
};
});

it('should allow a user to de-select an item by clicking on a initial selected items', () => {
const wrapper = mount(<MultiSelect {...mockProps} />);
expect(
wrapper.find('Selection').instance().state.selectedItems.length
).toBe(3);

wrapper.find('.bx--list-box__field').simulate('click');
wrapper
.find('.bx--list-box__menu-item')
.at(0)
.simulate('click');

expect(
wrapper.find('Selection').instance().state.selectedItems.length
).toBe(2);
});

it('should allow a user to de-select an initial selected item by hitting enter on ainitial selected item', () => {
const wrapper = mount(<MultiSelect {...mockProps} />);
const simulateArrowDown = wrapper =>
wrapper.find('.bx--list-box__field').simulate('keydown', {
key: 'ArrowDown',
});

expect(
wrapper.find('Selection').instance().state.selectedItems.length
).toBe(3);
openMenu(wrapper);
simulateArrowDown(wrapper);
wrapper
.find('.bx--list-box__field')
.at(0)
.simulate('keydown', {
key: 'Enter',
});
expect(
wrapper.find('Selection').instance().state.selectedItems.length
).toBe(2);
});

it('should select an item when a user clicks on an item', () => {
const wrapper = mount(<MultiSelect {...mockProps} />);
expect(
wrapper.find('Selection').instance().state.selectedItems.length
).toBe(3);

wrapper.find('.bx--list-box__field').simulate('click');
wrapper
.find('.bx--list-box__menu-item')
.at(4)
.simulate('click');

expect(
wrapper.find('Selection').instance().state.selectedItems.length
).toBe(4);
});
});

describe('e2e', () => {
let mockProps;

Expand Down
13 changes: 0 additions & 13 deletions src/internal/Selection.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,6 @@ export default class Selection extends React.Component {
};
}

componentWillReceiveProps(nextProps) {
const { selectedItems } = this.state;
const itemsToAdd = nextProps.initialSelectedItems.filter(item => {
return selectedItems.indexOf(item) === -1;
});

if (itemsToAdd.length > 0) {
this.setState(state => ({
selectedItems: state.selectedItems.concat(itemsToAdd),
}));
}
}

internalSetState = (stateToSet, callback) =>
this.setState(stateToSet, () => {
if (callback) {
Expand Down

0 comments on commit 63b22bc

Please sign in to comment.