client/src/components/NavbarGroup.js
author ymh <ymh.work@gmail.com>
Wed, 28 Nov 2018 18:25:11 +0100
changeset 181 cda96c025330
parent 172 4b780ebbedc6
permissions -rw-r--r--
Improve error management
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
148
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import React, { Component } from 'react';
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
import ReactDOM from 'react-dom';
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
export default class NavbarGroup extends Component {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
  state = {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
    showDropdown: false
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
  componentWillMount() {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    document.addEventListener('click', this.handleClickOutside, false);
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  componentWillUnmount() {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    document.removeEventListener('click', this.handleClickOutside, false);
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    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
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
      this.hideDropDown();
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
  toggleShowDropdown = () => {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    this.setState({showDropdown: !this.state.showDropdown});
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  hideDropDown = () => {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    this.setState({showDropdown: false});
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  render() {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    const {currentGroup, groups, onSelect} = this.props;
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    const onClickGroup = (e) => {
151
57d63a248f0d Update to Bootstrap 4
salimr <riwad.salim@yahoo.fr>
parents: 149
diff changeset
    38
      e.preventDefault();
148
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
      onSelect(e.target.dataset.groupname);
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
      this.hideDropDown();
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    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
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
      return (
151
57d63a248f0d Update to Bootstrap 4
salimr <riwad.salim@yahoo.fr>
parents: 149
diff changeset
    46
        <li className={`nav-item dropdown ${this.state.showDropdown?'show':''}`}>
172
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    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}>
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    48
            { currentGroupName }
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    49
            &nbsp;<span className="caret"></span>
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    50
          </span>
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    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
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    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
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
            const className = (groupName === currentGroupName)?'active':null;
172
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    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
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
            })
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
          }
172
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    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
57d63a248f0d Update to Bootstrap 4
salimr <riwad.salim@yahoo.fr>
parents: 149
diff changeset
    59
          </div>
148
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        </li>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
      );
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    } else {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
      return null;
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
}