| author | ymh <ymh.work@gmail.com> |
| Fri, 16 Nov 2018 11:19:13 +0100 | |
| changeset 173 | 0e6703cd0968 |
| parent 172 | 4b780ebbedc6 |
| permissions | -rw-r--r-- |
| 148 | 1 |
import React, { Component } from 'react'; |
2 |
import ReactDOM from 'react-dom'; |
|
3 |
||
4 |
export default class NavbarGroup extends Component { |
|
5 |
||
6 |
state = { |
|
7 |
showDropdown: false |
|
8 |
} |
|
9 |
||
10 |
componentWillMount() { |
|
11 |
document.addEventListener('click', this.handleClickOutside, false); |
|
12 |
} |
|
13 |
||
14 |
componentWillUnmount() { |
|
15 |
document.removeEventListener('click', this.handleClickOutside, false); |
|
16 |
} |
|
17 |
||
18 |
handleClickOutside = (e) => { |
|
|
149
298d0373812e
Correct problem with "findDOMNode" is null
ymh <ymh.work@gmail.com>
parents:
148
diff
changeset
|
19 |
const currentNode = ReactDOM.findDOMNode(this); |
|
298d0373812e
Correct problem with "findDOMNode" is null
ymh <ymh.work@gmail.com>
parents:
148
diff
changeset
|
20 |
if(currentNode && !currentNode.contains(e.target)) { |
| 148 | 21 |
this.hideDropDown(); |
22 |
} |
|
23 |
} |
|
24 |
||
25 |
toggleShowDropdown = () => { |
|
26 |
this.setState({showDropdown: !this.state.showDropdown}); |
|
27 |
} |
|
28 |
||
29 |
hideDropDown = () => { |
|
30 |
this.setState({showDropdown: false}); |
|
31 |
} |
|
32 |
||
33 |
render() { |
|
34 |
||
35 |
const {currentGroup, groups, onSelect} = this.props; |
|
36 |
||
37 |
const onClickGroup = (e) => { |
|
| 151 | 38 |
e.preventDefault(); |
| 148 | 39 |
onSelect(e.target.dataset.groupname); |
40 |
this.hideDropDown(); |
|
41 |
} |
|
42 |
||
43 |
if (currentGroup) { |
|
|
168
ea92f4fe783d
- move SlateEditor and dependencies to its own folder
ymh <ymh.work@gmail.com>
parents:
154
diff
changeset
|
44 |
const currentGroupName = currentGroup.name; |
| 148 | 45 |
return ( |
| 151 | 46 |
<li className={`nav-item dropdown ${this.state.showDropdown?'show':''}`}> |
| 172 | 47 |
<span className="nav-link dropdown-toggle" id="navbarDropdown" role="button" aria-haspopup="true" aria-expanded={this.state.showDropdown} onClick={this.toggleShowDropdown} onBlur={this.hideDropDown}> |
48 |
{ currentGroupName } |
|
49 |
<span className="caret"></span> |
|
50 |
</span> |
|
51 |
<div id="group-menu-scroll-down" className={`dropdown-menu dropdown-menu-right shadow py-1 pt-3 mb-5 mt-2 bg-primary border border-primary ${this.state.showDropdown?'show':''}`} aria-labelledby="navbarDropdown"> |
|
| 148 | 52 |
{ groups && groups.map((group, key) => { |
|
168
ea92f4fe783d
- move SlateEditor and dependencies to its own folder
ymh <ymh.work@gmail.com>
parents:
154
diff
changeset
|
53 |
const groupName = group.name; |
| 148 | 54 |
const className = (groupName === currentGroupName)?'active':null; |
| 172 | 55 |
return <button key={key} onClick={onClickGroup} className={`dropdown-item btn btn-primary bg-primary text-secondary font-weight-bold ${className}`} data-groupname={groupName}>{ groupName }</button> |
| 148 | 56 |
}) |
57 |
} |
|
| 172 | 58 |
<button type="button "onClick={onClickGroup} key="-1" className="dropdown-item btn btn-primary bg-primary text-center text-secondary create-group" data-groupname="__create_group__">Créer un groupe</button> |
| 151 | 59 |
</div> |
| 148 | 60 |
</li> |
61 |
); |
|
62 |
} else { |
|
63 |
return null; |
|
64 |
} |
|
65 |
} |
|
66 |
} |