Skip to content

Commit 8913004

Browse files
antnascimentofragsalat
authored andcommitted
feat(dropdown): Add select all button to multiple option (#144)
* add select all button to multiple option dropdown * reformat code and remove package.json packages * reformat code and add spacing class to select all button * fix code style * reduce number of lines * fix(dropdown): Fixed some formatting
1 parent 87ca796 commit 8913004

File tree

4 files changed

+60
-11
lines changed

4 files changed

+60
-11
lines changed

demo/demo_app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ render(
4949
<br />
5050
<br />
5151
<WSDropdown
52-
text="Multiple" type="button" width="500px" placeholder="Filter values.." filterable multiple items={[
52+
text="Multiple" type="button" width="500px" placeholder="Filter values.." selectAll filterable multiple items={[
5353
'New',
5454
'New From Template',
5555
'Open',

doc/api/ws-dropdown.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,9 @@ additional wrapping markup and functionality, you SHOULD NOT use this component
196196
- `props.value` **([Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) \| [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)>)** Selected dropdown item(s)
197197
- `props.filterable` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Flag if the dropdown menu is filterable
198198
- `props.filter` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Default filter value
199-
- `props.limit` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** Limit visible dropdown items. Use together with filterable flag.
200199
- `props.placeholder` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Placeholder for text inputs (Filter input or Input only version)
200+
- `props.limit` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** Limit visible dropdown items. Use together with filterable flag.
201+
- `props.selectAll` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Show button to select all items
201202
- `props.handle` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** Function used to propagate data
202203

203204
### constructor
@@ -278,6 +279,12 @@ Handles submit action on multi select drop downs
278279

279280
Returns **void**
280281

282+
### onClickSelectAll
283+
284+
Handles select all action on multi select drop downs
285+
286+
Returns **void**
287+
281288
### getHeight
282289

283290
Gets the current height of the menu
@@ -421,6 +428,7 @@ As trigger type you can choose between an anchor, button or a select like lookin
421428
- `props.limit` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** Limit visible dropdown items. Use together with filterable flag.
422429
- `props.orientation` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Dropdown orientation. Can be either left or right
423430
- `props.placeholder` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Placeholder for text inputs (Filter input or Input only version)
431+
- `props.selectAll` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Show button to select all items
424432
- `props.onChange` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Callback for react components to propagate value changes
425433

426434
### constructor

src/ws-dropdown/dropdown-menu.js

+44-7
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ const ANIMATION_END_EVENTS = ['oAnimationEnd', 'MSAnimationEnd', 'animationend']
1313
* @property {Object|Array<Object>} props.value Selected dropdown item(s)
1414
* @property {Boolean} props.filterable Flag if the dropdown menu is filterable
1515
* @property {string} props.filter Default filter value
16-
* @property {number} props.limit Limit visible dropdown items. Use together with filterable flag.
1716
* @property {string} props.placeholder Placeholder for text inputs (Filter input or Input only version)
17+
* @property {number} props.limit Limit visible dropdown items. Use together with filterable flag.
18+
* @property {Boolean} props.selectAll Show button to select all items
1819
* @property {Function} props.handle Function used to propagate data
1920
*/
2021
export class DropdownMenu extends Component {
@@ -30,6 +31,7 @@ export class DropdownMenu extends Component {
3031
filter: null,
3132
placeholder: '',
3233
limit: 10,
34+
selectAll: false,
3335
handle: () => {}
3436
};
3537

@@ -42,7 +44,8 @@ export class DropdownMenu extends Component {
4244
filterable: PropTypes.bool,
4345
filter: PropTypes.string,
4446
placeholder: PropTypes.string,
45-
limit: PropTypes.number
47+
limit: PropTypes.number,
48+
selectAll: PropTypes.bool
4649
};
4750

4851
/**
@@ -64,7 +67,8 @@ export class DropdownMenu extends Component {
6467
this.state = {
6568
filter: props.filter,
6669
items: props.items,
67-
value: props.value
70+
value: props.value,
71+
selectAllActive: false
6872
};
6973
}
7074

@@ -81,6 +85,9 @@ export class DropdownMenu extends Component {
8185
this.button.addEventListener('click', this.onClickSubmit);
8286
this.button.addEventListener('keydown', event => event.stopPropagation());
8387
}
88+
if (this.selectAllButton) {
89+
this.selectAllButton.addEventListener('click', this.onClickSelectAll);
90+
}
8491
}
8592

8693
/**
@@ -92,7 +99,8 @@ export class DropdownMenu extends Component {
9299
this.setState({
93100
filter: props.filter,
94101
items: props.items,
95-
value: props.value
102+
value: props.value,
103+
selectAllActive: props.selectAllActive
96104
});
97105
}
98106

@@ -118,6 +126,9 @@ export class DropdownMenu extends Component {
118126
this.button.removeEventListener('click', this.onClickSubmit);
119127
this.button.removeEventListener('keydown', event => event.stopPropagation());
120128
}
129+
if (this.selectAllButton) {
130+
this.selectAllButton.removeEventListener('click', this.onClickSelectAll);
131+
}
121132
}
122133

123134
/**
@@ -131,7 +142,6 @@ export class DropdownMenu extends Component {
131142
window.addEventListener('keydown', this.onGlobalKeyDown);
132143
};
133144

134-
135145
/**
136146
* Unbind keyboard listener when dropdown closes
137147
* @returns {void}
@@ -190,6 +200,22 @@ export class DropdownMenu extends Component {
190200
this.setState({value});
191201
};
192202

203+
/**
204+
* Handles select all action on multi select drop downs
205+
* @returns {void}
206+
*/
207+
onClickSelectAll = () => {
208+
if (this.state.items) {
209+
this.state.items.forEach(item => {
210+
item.selected = !this.state.selectAllActive;
211+
});
212+
this.setState({
213+
items: this.state.items,
214+
selectAllActive: !this.state.selectAllActive
215+
});
216+
}
217+
};
218+
193219
/**
194220
* Gets the current height of the menu
195221
* @returns {Number}
@@ -258,7 +284,9 @@ export class DropdownMenu extends Component {
258284
*/
259285
focusNextItem(direction) {
260286
// Update focus state of items
261-
this.state.items.forEach(item => { item.focused = false; });
287+
this.state.items.forEach(item => {
288+
item.focused = false;
289+
});
262290
const result = this.getItemAtIndex(this.selectedIndex + direction);
263291
result.item.focused = true;
264292

@@ -474,7 +502,16 @@ export class DropdownMenu extends Component {
474502
{this.context.multiple && [
475503
<li className="dropdown-item-separator" key="submit-separator" />,
476504
<li className="dropdown-submit" key="submit">
477-
<button className="mod-small" ref={element => { this.button = element; }}>OK</button>
505+
{this.props.selectAll && [
506+
<button
507+
key="selectAll"
508+
className={`mod-secondary mr-s mod-small ${this.state.selectAllActive ? 'mod-toggle is-active' : ''}`}
509+
ref={element => { this.selectAllButton = element; }}
510+
>
511+
ALL
512+
</button>
513+
]}
514+
<button className="mod-small dropdown-submit-button" ref={element => { this.button = element; }}>OK</button>
478515
</li>
479516
]}
480517
</ul>

src/ws-dropdown/ws-dropdown.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const ANIMATION_END_EVENTS = ['oAnimationEnd', 'MSAnimationEnd', 'animationend']
2121
* @property {number} props.limit Limit visible dropdown items. Use together with filterable flag.
2222
* @property {string} props.orientation Dropdown orientation. Can be either left or right
2323
* @property {string} props.placeholder Placeholder for text inputs (Filter input or Input only version)
24+
* @property {Boolean} props.selectAll Show button to select all items
2425
* @property {string} props.onChange Callback for react components to propagate value changes
2526
*/
2627
export class WSDropdown extends Component {
@@ -43,7 +44,8 @@ export class WSDropdown extends Component {
4344
width: '',
4445
value: null,
4546
onChange: () => {},
46-
disabled: false
47+
disabled: false,
48+
selectAll: false
4749
};
4850

4951
/**
@@ -64,7 +66,8 @@ export class WSDropdown extends Component {
6466
width: PropTypes.string,
6567
value: PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.array]),
6668
onChange: PropTypes.func,
67-
disabled: PropTypes.bool
69+
disabled: PropTypes.bool,
70+
selectAll: PropTypes.bool
6871
};
6972

7073
/**
@@ -445,6 +448,7 @@ export class WSDropdown extends Component {
445448
filterable={this.props.filterable}
446449
filter={this.props.filter}
447450
placeholder={this.props.placeholder}
451+
selectAll={this.props.selectAll}
448452
handle={this.handlePropagation}
449453
ref={element => { this.dropdownMenu = element; }}
450454
/>

0 commit comments

Comments
 (0)