Skip to content

Commit b515381

Browse files
authored
Merge pull request #3 from darianstlex/bug/fix-click-propagation
Fix Click Propagation
2 parents ae98c39 + 0982994 commit b515381

7 files changed

Lines changed: 30 additions & 18 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ $SM-dropDownZIndex: 1;
145145

146146
- **`shouldToggleOnHover: boolean: false`** Toggle drop-down on hover
147147

148+
- **`stopClickPropagation: boolean: false`** Stop Header click event propagation
149+
148150

149151

150152
#### Labels / Placeholders

catalog/props.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ lang: js
4343

4444
- **`shouldToggleOnHover: boolean: false`** Toggle drop-down on hover
4545

46+
- **`stopClickPropagation: boolean: false`** Stop Header click event propagation
47+
4648

4749

4850
#### Labels / Placeholders

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-sm-select",
3-
"version": "1.0.7",
3+
"version": "1.0.8",
44
"description": "React Multi/Single Select Component",
55
"main": "./dist/index.js",
66
"module": "./es/index.js",

src/index.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export class MultiSelect extends React.Component {
4747
resetable: T.bool,
4848
enableSearch: T.bool,
4949
hasSelectAll: T.bool,
50+
stopClickPropagation: T.bool,
5051
};
5152
static defaultProps = {
5253
mode: MODE.LIST,
@@ -65,6 +66,7 @@ export class MultiSelect extends React.Component {
6566
resetable: false,
6667
enableSearch: false,
6768
hasSelectAll: false,
69+
stopClickPropagation: false,
6870
};
6971

7072
constructor(p) {
@@ -166,9 +168,10 @@ export class MultiSelect extends React.Component {
166168

167169
/**
168170
* Toggle MultiSelect DropDown
171+
* @param event
169172
* @param value Boolean
170173
*/
171-
toggleDropDown = value => {
174+
toggleDropDown = (event, value) => {
172175
const { props: p } = this;
173176
if (p.disabled || p.isLoading) return;
174177

@@ -179,14 +182,16 @@ export class MultiSelect extends React.Component {
179182
searchText: '',
180183
} : {}),
181184
}));
185+
186+
if (event && p.stopClickPropagation) u.stopPreventPropagation(event);
182187
};
183188

184189
/**
185190
* Handle hover to trigger DropDown list
186191
* @param expanded Boolean
187192
*/
188193
handleHover = expanded => {
189-
if (this.props.shouldToggleOnHover) this.toggleDropDown(expanded);
194+
if (this.props.shouldToggleOnHover) this.toggleDropDown(null, expanded);
190195
};
191196

192197
/**
@@ -215,7 +220,7 @@ export class MultiSelect extends React.Component {
215220
keyDown = event => {
216221
const { props: p, state: s } = this;
217222

218-
if (!s.expanded) this.toggleDropDown(true);
223+
if (!s.expanded) this.toggleDropDown(null, true);
219224
else this.setState(({focusIndex}) => {
220225
let nextIndex = focusIndex + 1;
221226

@@ -238,7 +243,7 @@ export class MultiSelect extends React.Component {
238243
const { props: p, state: s } = this;
239244

240245
if (s.expanded) {
241-
if (s.focusIndex === -2) this.toggleDropDown(false);
246+
if (s.focusIndex === -2) this.toggleDropDown(null, false);
242247
else this.setState(({focusIndex}) => {
243248
let nextIndex = focusIndex - 1;
244249

@@ -269,9 +274,9 @@ export class MultiSelect extends React.Component {
269274
({
270275
[event.which]: () => {},
271276
8: () => this.clearValue(event), // BackSpace
272-
9: () => this.toggleDropDown(false), // Tab
277+
9: () => this.toggleDropDown(null, false), // Tab
273278
27: () => { // Esc
274-
this.toggleDropDown(false);
279+
this.toggleDropDown(null, false);
275280
this.handleFocusControl(-2);
276281
u.stopPreventPropagation(event);
277282
},
@@ -288,7 +293,7 @@ export class MultiSelect extends React.Component {
288293
* @param optionValue value string
289294
*/
290295
select = optionValue => {
291-
if (this.isSingle()) this.setState({ value: [optionValue] }, () => this.toggleDropDown(false));
296+
if (this.isSingle()) this.setState({ value: [optionValue] }, () => this.toggleDropDown(null,false));
292297
else this.setState({ value: [...this.state.value, optionValue] });
293298
};
294299

@@ -406,7 +411,7 @@ export class MultiSelect extends React.Component {
406411
expanded={s.expanded}
407412
disabled={p.disabled}
408413
selected={s.focusIndex === -2}
409-
onClick={() => this.toggleDropDown()}
414+
onClick={this.toggleDropDown}
410415
>
411416
<div className={u.classes('Header__value', {
412417
'Header__value--resetable': p.resetable && (!!s.value.length || !!p.resetTo.length),

src/index.test.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ describe('MultiSelect', () => {
276276
wrapper.setProps({ shouldToggleOnHover: true });
277277
wrapper.instance().handleHover(true);
278278

279-
expect(toggleDropDown).toHaveBeenCalledWith(true);
279+
expect(toggleDropDown).toHaveBeenCalledWith(null, true);
280280
});
281281

282282
it('should not call toggleDropDown if not shouldToggleOnHover', () => {
@@ -348,7 +348,7 @@ describe('MultiSelect', () => {
348348
it('should toggle DropDown and call stopPreventPropagation', () => {
349349
wrapper.instance().keyDown(event);
350350

351-
expect(toggleDropDown).toHaveBeenCalledWith(true);
351+
expect(toggleDropDown).toHaveBeenCalledWith(null, true);
352352
expect(utils.stopPreventPropagation).toHaveBeenCalledWith(event);
353353
});
354354

@@ -368,7 +368,7 @@ describe('MultiSelect', () => {
368368
wrapper.setState({ expanded: true, focusIndex: -2 });
369369
wrapper.instance().keyUp(event);
370370

371-
expect(toggleDropDown).toHaveBeenCalledWith(false);
371+
expect(toggleDropDown).toHaveBeenCalledWith(null, false);
372372
expect(utils.stopPreventPropagation).toHaveBeenCalledWith(event);
373373
});
374374

@@ -412,10 +412,10 @@ describe('MultiSelect', () => {
412412
expect(clearValue).toHaveBeenCalledWith({ ...event, which: 8 });
413413

414414
wrapper.instance().handleKeyPress({ ...event, which: 9 });
415-
expect(toggleDropDown).toHaveBeenCalledWith(false);
415+
expect(toggleDropDown).toHaveBeenCalledWith(null, false);
416416

417417
wrapper.instance().handleKeyPress({ ...event, which: 27 });
418-
expect(toggleDropDown).toHaveBeenCalledWith(false);
418+
expect(toggleDropDown).toHaveBeenCalledWith(null, false);
419419
expect(wrapper.instance().headerRef.current.focus).toHaveBeenCalled();
420420
expect(utils.stopPreventPropagation).toHaveBeenCalledWith({ ...event, which: 27 });
421421

@@ -441,7 +441,7 @@ describe('MultiSelect', () => {
441441
setState.mock.calls[0][1]();
442442

443443
expect(setState.mock.calls[0][0]).toEqual({ value: ['two'] });
444-
expect(toggleDropDown).toHaveBeenCalledWith(false);
444+
expect(toggleDropDown).toHaveBeenCalledWith(null, false);
445445
});
446446
});
447447

src/scss/main.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
box-sizing: border-box;
9999
display: flex;
100100
flex-direction: row;
101-
justify-content: start;
101+
justify-content: flex-start;
102102
align-items: center;
103103
overflow-x: auto;
104104
padding-right: 20px;

src/styles.css

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)