client/src/components/CreateSession.js
author ymh <ymh.work@gmail.com>
Wed, 05 Dec 2018 19:00:08 +0100
changeset 193 99e342f9fb0c
parent 191 3f71ad81a5a9
permissions -rw-r--r--
Display protocol graphically
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
     1
import React, { Component } from 'react';
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
     2
import Modal from 'react-modal';
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
     3
import PropTypes from 'prop-types';
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
     4
import uuidV1 from 'uuid/v1';
171
03334a31130a Add translation with react-i18next
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
     5
import { withNamespaces } from 'react-i18next';
193
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
     6
import ProtocolSummary from './ProtocolSummary';
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
     7
import { extractAnnotationCategories } from '../constants';
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
     8
171
03334a31130a Add translation with react-i18next
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
     9
class CreateSession extends Component {
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    10
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    11
  static propTypes = {
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    12
    history: PropTypes.object.isRequired,
168
ea92f4fe783d - move SlateEditor and dependencies to its own folder
ymh <ymh.work@gmail.com>
parents: 167
diff changeset
    13
    group: PropTypes.object,
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    14
    createSession: PropTypes.func.isRequired,
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    15
  };
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    16
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    17
  state = {
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    18
    createGroup: false,
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    19
    protocolOpen: false,
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    20
    title: "",
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    21
    description: ""
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    22
  }
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    23
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    24
  componentWillMount() {
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    25
    Modal.setAppElement('body');
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    26
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    27
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    28
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    29
  openSessionModal = () => {
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    30
    this.setState({modalIsOpen: true});
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    31
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    32
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    33
  createSession = () => {
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    34
    const sessionId = uuidV1();
168
ea92f4fe783d - move SlateEditor and dependencies to its own folder
ymh <ymh.work@gmail.com>
parents: 167
diff changeset
    35
    const groupName = this.props.group ? this.props.group.name : null;
ea92f4fe783d - move SlateEditor and dependencies to its own folder
ymh <ymh.work@gmail.com>
parents: 167
diff changeset
    36
    const protocol = this.props.group ? this.props.group.protocol : null;
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    37
    const {title, description} = this.state;
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    38
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    39
    this.props.createSession(sessionId, groupName, protocol, title, description);
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    40
    this.props.history.push('/sessions/' + sessionId);
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    41
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    42
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    43
  getGroupProtocol = () => {
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    44
    if (this.props.group) {
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    45
      return this.props.group.protocol;
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    46
    }
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    47
    return null;
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    48
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    49
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    50
  onChange = (e) => {
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    51
    const { name, value } = e.target;
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
    52
    this.setState({[name]: value});
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    53
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    54
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    55
  toggleProtocol = () => {
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    56
    this.setState({
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    57
      protocolOpen: !this.state.protocolOpen,
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    58
      show: false
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    59
    });
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    60
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    61
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    62
  closeModal = () => {
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    63
    this.setState({modalIsOpen: false});
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    64
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    65
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    66
  handleModalCloseRequest = (e) => {
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    67
    e.preventDefault();
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    68
    this.setState({modalIsOpen: false});
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    69
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    70
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    71
  render() {
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    72
171
03334a31130a Add translation with react-i18next
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
    73
    const t = this.props.t;
193
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
    74
    const protocol = this.getGroupProtocol();
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
    75
    const categories = extractAnnotationCategories(protocol);
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
    76
    const modalStyles = {overlay: {zIndex: 1021}};
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    77
    return (
167
1f340f3597a8 Adapt css for CreateSession and Navbar components
salimr <riwad.salim@yahoo.fr>
parents: 161
diff changeset
    78
      <div className="container-fluid">
172
4b780ebbedc6 - Upgrade libraries
ymh <ymh.work@gmail.com>
parents: 171
diff changeset
    79
      <span className="nav-link btn" onClick={this.openSessionModal}>{t('create_session.new_session')}</span>
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    80
      <Modal
167
1f340f3597a8 Adapt css for CreateSession and Navbar components
salimr <riwad.salim@yahoo.fr>
parents: 161
diff changeset
    81
      className="Modal__Bootstrap modal-dialog ml-5 mt-5 fixed-top w-100"
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    82
      isOpen={this.state.modalIsOpen}
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    83
      onRequestClose={this.handleModalCloseRequest}
193
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
    84
      style={modalStyles}
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    85
      >
167
1f340f3597a8 Adapt css for CreateSession and Navbar components
salimr <riwad.salim@yahoo.fr>
parents: 161
diff changeset
    86
        <div className="modal-content bg-primary w-75">
161
a642639dbc07 Split scss files and adapt session page design
salimr <riwad.salim@yahoo.fr>
parents: 155
diff changeset
    87
          <div className="modal-body mt-3">
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    88
            <form onSubmit={ e => { e.preventDefault() } }>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    89
              <div className="form-group">
193
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
    90
                <label className="col-form-label text-secondary font-weight-bold pt-2 text-capitalize">{t('common.title')}</label>
154
a28361bda28c Adapt all css classes with Bootstrap 4 Utilities
salimr <riwad.salim@yahoo.fr>
parents: 152
diff changeset
    91
                <input className="form-control text-primary w-100"
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    92
                  name="title"
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    93
                  onChange={ this.onChange }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    94
                  type="text"
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    95
                  placeholder="Entrez un titre"
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    96
                />
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    97
              </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
    98
              <div className="form-group">
193
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
    99
                <label className="col-form-label text-secondary font-weight-bold pt-2 mt-2 text-capitalize">{t('common.description')}</label>
154
a28361bda28c Adapt all css classes with Bootstrap 4 Utilities
salimr <riwad.salim@yahoo.fr>
parents: 152
diff changeset
   100
                <textarea className="form-control text-primary w-100"
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   101
                  type="textarea"
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   102
                  name="description"
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   103
                  onChange={ this.onChange }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   104
                  placeholder="Entrez une description"
155
e55ae84508bf Clean CreateSession component and remove trace of previous create session button
ymh <ymh.work@gmail.com>
parents: 154
diff changeset
   105
                  ></textarea>
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   106
              </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   107
              <div className="form-group">
193
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
   108
                <label className="col-form-label text-secondary font-weight-bold pt-2 mt-2" onClick={this.toggleProtocol}>{t('create_session.protocol')} {this.state.protocolOpen?<span className="material-icons protocol-toggle">&#xE313;</span>:<span className="material-icons protocol-toggle">&#xE315;</span>}</label>
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
   109
                <div className={ "protocol collapse" + (this.state.protocolOpen?'in':'') } >
99e342f9fb0c Display protocol graphically
ymh <ymh.work@gmail.com>
parents: 191
diff changeset
   110
                  <ProtocolSummary annotationCategories={categories} />
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   111
                </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   112
              </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   113
              <div className="text-center">
171
03334a31130a Add translation with react-i18next
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
   114
              <button id="create-button" type="submit" className="btn btn-secondary btn-lg text-primary font-weight-bold m-3 text-capitalize" onClick={this.createSession}>{t('common.begin')}</button>
152
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   115
              </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   116
            </form>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   117
          </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   118
        </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   119
      </Modal>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   120
      </div>
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   121
    );
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   122
  }
4e9e755cef51 Add CreateSession component
salimr <riwad.salim@yahoo.fr>
parents:
diff changeset
   123
}
171
03334a31130a Add translation with react-i18next
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
   124
03334a31130a Add translation with react-i18next
ymh <ymh.work@gmail.com>
parents: 168
diff changeset
   125
export default withNamespaces()(CreateSession);