client/src/components/NavbarGroup.js
author ymh <ymh.work@gmail.com>
Tue, 28 Aug 2018 16:57:31 +0200
changeset 148 fcce52a159bc
child 149 298d0373812e
permissions -rw-r--r--
remove react-bootstrap - add a login dropdown component - add a group login component - remove reference to react-bootstrap
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) => {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    if(!ReactDOM.findDOMNode(this).contains(e.target)) {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
      this.hideDropDown();
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    }
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
  toggleShowDropdown = () => {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    this.setState({showDropdown: !this.state.showDropdown});
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  }
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
  hideDropDown = () => {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    this.setState({showDropdown: false});
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
  }
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
  render() {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    const {currentGroup, groups, onSelect} = this.props;
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    const onClickGroup = (e) => {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
      onSelect(e.target.dataset.groupname);
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
      this.hideDropDown();
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    if (currentGroup) {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
      const currentGroupName = currentGroup.get('name');
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
      return (
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        <li className={`nav-item dropdown navs ${this.state.showDropdown?'show':''}`}>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
          <a className="nav-link dropdown-toggle" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded={this.state.showDropdown} onClick={this.toggleShowDropdown} onBlur={this.hideDropDown}>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
          { currentGroupName }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
          &nbsp;<span className="caret"></span>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
          </a>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
          <ul className={`dropdown-menu ${this.state.showDropdown?'show':''}`} aria-labelledby="navbarDropdown">
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
          { groups && groups.map((group, key) => {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
            const groupName = group.get('name');
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
            const className = (groupName === currentGroupName)?'active':null;
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
              return <li key={key} className={className} onClick={onClickGroup}><a data-groupname={groupName}>{ groupName }</a></li>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
            })
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
          }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
          <li onClick={onClickGroup} key="-1"><a data-groupname="__create_group__">Créer un groupe...</a></li>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
          </ul>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        </li>
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
      );
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    } else {
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
      return null;
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
  }
fcce52a159bc remove react-bootstrap
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
}