diff --git a/backend/models/user.js b/backend/models/user.js index febb413608b05318774edd92c9529e63e36c7b5d..af22d667544bcc5a144013ff890e9101a3774b3a 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -56,6 +56,10 @@ const UserSchema = new mongoose.Schema({ select: false, default: null, }, + url_photo: { + type:String, + required: false, + } }); UserSchema.set('toJSON', { diff --git a/frontend/src/containers/Login.container.js b/frontend/src/containers/Login.container.js index 50527bfae09a20bcbc72c474621799013030a3a8..de341ac655acf9af4ace4c30d9a97096faaab25a 100644 --- a/frontend/src/containers/Login.container.js +++ b/frontend/src/containers/Login.container.js @@ -5,13 +5,13 @@ import * as loginActions from '../actions/Login.actions'; import { Form, Button, Card } from "react-bootstrap"; export class Login extends React.Component { - + constructor(props) { super(props); this.state = { username: "", - password: "" + password: "", }; this.login = this.login.bind(this); @@ -71,7 +71,7 @@ export class Login extends React.Component { {this.props.state.error && <div><br/>{JSON.stringify(this.props.state.errorMessage.message)}</div>} </Form> </Card.Body> - </Card> + </Card> ); } } diff --git a/frontend/src/containers/Profile.container.js b/frontend/src/containers/Profile.container.js index 22cd54001c79de6818c1fc87308a71cccde2d4a4..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/frontend/src/containers/Profile.container.js +++ b/frontend/src/containers/Profile.container.js @@ -1,191 +0,0 @@ -import { connect } from 'react-redux'; -import React from 'react'; -import { withRouter } from 'react-router-dom' -import { Form, Button, Card, Image, Container, Row, Col } from "react-bootstrap"; -import * as profileActions from "../actions/Profile.actions"; - -export class Profile extends React.Component { - - constructor(props) { - super(props); - - this.state = { - readOnly: true - }; - - this.switchToEditionMode = this.switchToEditionMode.bind(this); - } - - componentWillMount(){ - this.props.fetchUserData(); - this.props.reinitializeState(); - } - - componentDidUpdate(prevProps) { - if (prevProps.state !== this.props.state) { - this.setState({ - readOnly: this.props.state.updateUserSuccess - }); - } - } - - handleChange = event => { - this.setState({ - [event.target.id]: event.target.value, - }); - } - - switchToEditionMode() { - this.setState({ - readOnly: false - }); - } - - changeUserData() { - this.props.changeUserData(this.state); - } - - - render() { - return ( - <Card style={{ width: '18rem', margin: '0 auto', marginTop:'30px' }}> - <Card.Body> - <Card.Title>Profile</Card.Title> - <Container> - <Row> - <Col xs={6} md={4}> - <Image src={this.props.state.me.picture} width={210} height={210} roundedCircle /> - </Col> - </Row> - </Container> - <Form autoComplete="off" onSubmit={(e) => {e.preventDefault(); this.changeUserData()}}> - <Form.Group controlId="username"> - <Form.Label>Username</Form.Label> - <Form.Control - defaultValue={this.props.state.me.username} - onChange={this.handleChange} - type="text" - minLength={8} - readOnly - plaintext - /> - </Form.Group> - <Form.Group controlId="firstname"> - <Form.Label>First name</Form.Label> - <Form.Control - defaultValue={this.props.state.me.firstname} - onChange={this.handleChange} - type="text" - minLength={8} - readOnly={this.state.readOnly} - /> - </Form.Group> - <Form.Group controlId="lastname"> - <Form.Label>Last Name</Form.Label> - <Form.Control - defaultValue={this.props.state.me.lastname} - onChange={this.handleChange} - type="text" - minLength={8} - readOnly={this.state.readOnly} - /> - </Form.Group> - <Form.Group controlId="student_number"> - <Form.Label>No Student</Form.Label> - <Form.Control - defaultValue={this.props.state.me.student_number} - onChange={this.handleChange} - type="text" - minLength={8} - readOnly - plaintext - /> - </Form.Group> - <Form.Group controlId="email"> - <Form.Label>Email</Form.Label> - <Form.Control - defaultValue={this.props.state.me.email} - onChange={this.handleChange} - type="text" - minLength={8} - readOnly={this.state.readOnly} - /> - </Form.Group> - <Form.Group controlId="date_birth"> - <Form.Label>Date Birth</Form.Label> - <Form.Control - defaultValue={this.props.state.me.date_birth} - onChange={this.handleChange} - type="date" - minLength={8} - readOnly={this.state.readOnly} - /> - </Form.Group> - - { !this.state.readOnly && this.state.password && - <Form.Group controlId="oldpassword"> - <Form.Label>Old Password</Form.Label> - <Form.Control - onChange={this.handleChange} - type="password" - minLength={8} - /> - </Form.Group> - } - { !this.state.readOnly && - <Form.Group controlId="password"> - <Form.Label>Password</Form.Label> - <Form.Control - onClick={(e) => { - this.setState({changePass: true}); - }} - onChange={this.handleChange} - onBlur={this.handleChange} - type="password" - minLength={8} - /> - </Form.Group> - } - { !this.state.readOnly && - <Button - block - type="submit" - variant="primary" - > - Save - </Button> - } - { this.state.readOnly && - <Button - block - onClick={this.switchToEditionMode} - variant="primary" - > - Edit - </Button> - } - </Form> - {this.props.state.updateUserError && <div><br/>{JSON.stringify(this.props.state.updateUserErrorMessage.message)}</div>} - {this.props.state.updateUserSuccess && <div><br/>Profile changed with success.</div>} - </Card.Body> - </Card> - ); - } -} - -// map state from store to props -const mapStateToProps = (state) => { - return { - state: state.profile - } -} -// map actions to props -const mapDispatchToProps = (dispatch) => { - return { - fetchUserData: () => dispatch(profileActions.fetchUserData()), - changeUserData: (data) => dispatch(profileActions.changeUserData(data)), - reinitializeState: () => dispatch(profileActions.reinitializeState()), - } -} - -export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Profile)) diff --git a/frontend/src/containers/SignUp.container.js b/frontend/src/containers/SignUp.container.js index 28efb41cd18597899f0246cea90f6479ddcec613..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/frontend/src/containers/SignUp.container.js +++ b/frontend/src/containers/SignUp.container.js @@ -1,146 +0,0 @@ -import { connect } from 'react-redux'; -import React from 'react'; -import { withRouter } from 'react-router-dom' -import * as signupActions from '../actions/SignUp.actions'; -import { Form, Button, Card } from "react-bootstrap"; - -export class SignUp extends React.Component { - - constructor(props) { - super(props); - - this.state = { - username: "", - password: "", - firstname: "", - lastname: "", - email: "", - student_number: null, - date_birth: "", - }; - this.register = this.register.bind(this); - } - - componentWillMount() { - this.props.reinitializeState(); - } - - register(e) { - this.props.registerRequest(this.state); - e.preventDefault(); - } - - validateForm() { - return this.state.username.length > 0 && this.state.password.length > 0; - } - - handleChange = event => { - this.setState({ - [event.target.id]: event.target.value - }); - } - - - render() { - return ( - <Card style={{ width: '18rem', margin: '0 auto', marginTop:'30px' }}> - <Card.Body> - <Card.Title>Register</Card.Title> - <Form onSubmit={(e) => this.register(e)}> - <Form.Group controlId="username"> - <Form.Label>Username</Form.Label> - <Form.Control - autoFocus - type="text" - value={this.state.username} - onChange={this.handleChange} - /> - </Form.Group> - <Form.Group controlId="firstname"> - <Form.Label>Firstname</Form.Label> - <Form.Control - autoFocus - type="text" - minLength={1} - value={this.state.firstname} - onChange={this.handleChange} - /> - </Form.Group> - <Form.Group controlId="lastname"> - <Form.Label>Lastname</Form.Label> - <Form.Control - autoFocus - type="text" - minLength={1} - value={this.state.lastname} - onChange={this.handleChange} - /> - </Form.Group> - <Form.Group controlId="email"> - <Form.Label>E-mail</Form.Label> - <Form.Control - value={this.state.email} - onChange={this.handleChange} - type="email" - /> - </Form.Group> - <Form.Group controlId="password"> - <Form.Label>Password</Form.Label> - <Form.Control - value={this.state.password} - onChange={this.handleChange} - type="password" - minLength={8} - /> - </Form.Group> - <Form.Group controlId="date_birth" bsSize="large"> - <Form.Label>Birthday</Form.Label> - <Form.Control - type="date" - value={this.state.date_birth} - onChange={this.handleChange} - /> - </Form.Group> - <Form.Group controlId="student_number"> - <Form.Label>Student number</Form.Label> - <Form.Control - type="text" - minLength={8} - maxLength={8} - value={this.state.student_number} - onChange={this.handleChange} - /> - </Form.Group> - <Button - block - disabled={!this.validateForm()} - type="submit" - variant="primary" - > - Register - </Button> - {this.props.state.loading && <div><br/>Registering you...</div>} - {this.props.state.error && <div><br/>{JSON.stringify(this.props.state.errorMessage.message)}</div>} - {this.props.state.success && <div><br/>Success! You can now log in.</div>} - </Form> - </Card.Body> - </Card> - ); - } -} - -// map state from store to props -const mapStateToProps = (state) => { - return { - state: state.signup - } -} -// map actions to props -const mapDispatchToProps = (dispatch) => { - return { - registerRequest: (registerData) => dispatch(signupActions.register(registerData)), - reinitializeState: () => dispatch(signupActions.reinitializeState()), - } -} - -export default withRouter(connect(mapStateToProps, mapDispatchToProps)(SignUp))