From e1bba9d8dbf097ad321309e069e99a9fe0ef7dbe Mon Sep 17 00:00:00 2001 From: Edin Dazdarevic Date: Mon, 23 Feb 2015 21:30:06 +0100 Subject: [PATCH] basic version of ValidationMixin, register page getting more functional --- front-ui/app/components/account/register.js | 116 ++++++++++++++---- .../shared/mixins/ribicaValidationMixin.js | 51 ++++++++ front-ui/app/css/main.css | 4 + front-ui/app/models/userRegistration.js | 26 ++++ 4 files changed, 174 insertions(+), 23 deletions(-) create mode 100644 front-ui/app/components/shared/mixins/ribicaValidationMixin.js create mode 100644 front-ui/app/models/userRegistration.js diff --git a/front-ui/app/components/account/register.js b/front-ui/app/components/account/register.js index 45bd0a8..81a3ecb 100644 --- a/front-ui/app/components/account/register.js +++ b/front-ui/app/components/account/register.js @@ -1,8 +1,10 @@ -var React = require("react/addons"); +var React = require("react/addons"), + UserRegistration = require('../../models/userRegistration'), + RibicaValidationMixin = require('../../components/shared/mixins/ribicaValidationMixin'); + var Register = React.createClass({ - mixins: [React.addons.LinkedStateMixin], - + mixins: [React.addons.LinkedStateMixin, RibicaValidationMixin], getInitialState: function() { return { myBabyDetailsVisible: false, @@ -10,7 +12,8 @@ var Register = React.createClass({ lastName: '', email: '', password: '', - passwordConfirmation: '' + passwordConfirmation: '', + errors: {} }; }, myBabyChange: function() { @@ -62,8 +65,8 @@ var Register = React.createClass({
- Djevojcica - Djecak + Djevojčica + Dječak Jos ne znamo
@@ -75,7 +78,7 @@ var Register = React.createClass({
- +
{this.renderDaySelector()} @@ -86,10 +89,76 @@ var Register = React.createClass({
) }, - handleChange: function(prop, event) { - var obj = {}; - obj[prop] = event.target.value; - this.setState(obj); + validations: { + firstName: function(value) { + var errors = []; + if (!value || value === '') { + errors.push("First name is required."); + } else if (value && value.length > 5) { + errors.push("First name is larger than 5 characters."); + } + return errors; + }, + lastName : function(value) { + if (value === 'Dazdarevic') { + return ["You're the owner!"]; + } + return []; + }, + _emailRe: /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, + _emailTimeoutId: null, + email: function(value, callback) { + var validEmail = this._emailRe.test(value); + + if (validEmail) { + //clearTimeout(this._emailTimeoutId); + //this._emailTimeoutId = setTimeout(function(){ + + //// TODO: check if email exists + //if (value === 'edin@edin.com') { + //if(callback) { + //var errors= ['Email is already taken']; + //callback(errors); + //} + //} else { + //if(callback) { + //callback([]); + //} + //} + + //}.bind(this), 1000); + } else { + return ['Neispravna email adresa.']; + } + } + }, + renderErrorMessage: function(message){ + return (
{message}
) + }, + doRegister: function(e) { + // TODO: move this to the UserRegistrationStore + if(this.validate()) { + alert('all fine!'); + var user = new UserRegistration({ + first_name: this.state.firstName, + last_name: this.state.lastName, + email: this.state.email, + password: this.state.password, + password_confirmation: this.state.passwordConfirmation + }); + + user.save(null, { + success: function() { + alert('saved!'); + }, + error: function(model, response, options) { + alert('error'); + console.log('error:', response); + }.bind(this) + }); + } + + e.preventDefault(); }, render : function() { return (
@@ -99,6 +168,7 @@ var Register = React.createClass({ {this.state.email} | {this.state.password} | {this.state.passwordConfirmation} | + {this.isValid() ? "yes" : "no"} |
@@ -106,39 +176,42 @@ var Register = React.createClass({
- + + {this.getValidationMessages('firstName').map(this.renderErrorMessage)}
- + + {this.getValidationMessages('lastName').map(this.renderErrorMessage)}
- + + {this.getValidationMessages('email').map(this.renderErrorMessage)}
- +
- +
- +
- +
- Vec rodjena + Vec rođena Na putu
@@ -147,13 +220,10 @@ var Register = React.createClass({
- +
- - -
); diff --git a/front-ui/app/components/shared/mixins/ribicaValidationMixin.js b/front-ui/app/components/shared/mixins/ribicaValidationMixin.js new file mode 100644 index 0000000..b618919 --- /dev/null +++ b/front-ui/app/components/shared/mixins/ribicaValidationMixin.js @@ -0,0 +1,51 @@ +var RibicaValidationMixin = { + _updateState: function(prop, value) { + var newState = {}; + newState[prop] = value; + this.setState(newState); + }, + _validate: function(prop, value) { + if(this.validations && this.validations[prop]) { + var cb = function(err) { + if (err !== undefined) { + var errors = this.state.errors; + if(err.length > 0) { + errors[prop] = err; + } else { + delete errors[prop]; + } + this.setState({errors: errors}); + } + }.bind(this); + + var immediateErrors = this.validations[prop](value, cb); + if(immediateErrors !== undefined) { + cb(immediateErrors); + } + } + }, + handleChange: function(prop) { + return function(event) { + event.preventDefault(); + this._updateState(prop, event.target.value); + this._validate(prop, event.target.value); + }.bind(this); + + }, + getValidationMessages:function(prop) { + return (this.state.errors[prop] || []); + }, + validate: function() { + for (var key in this.state) { + if (this.state.hasOwnProperty(key)) { + this._validate(key, this.state[key]); + } + } + return this.isValid(); + }, + isValid: function() { + return Object.keys(this.state.errors).length === 0; + } +}; + +module.exports = RibicaValidationMixin; diff --git a/front-ui/app/css/main.css b/front-ui/app/css/main.css index e0c0dcc..812108e 100644 --- a/front-ui/app/css/main.css +++ b/front-ui/app/css/main.css @@ -21,3 +21,7 @@ body { display: inline-block; } + +.error-message { + color: red; +} diff --git a/front-ui/app/models/userRegistration.js b/front-ui/app/models/userRegistration.js new file mode 100644 index 0000000..28c2305 --- /dev/null +++ b/front-ui/app/models/userRegistration.js @@ -0,0 +1,26 @@ +var Backbone = require('backbone'); +var Globals = require('../globals'); + +var UserRegistration = Backbone.Model.extend({ + + initialize: function() { + $.ajaxPrefilter( + function(options, originalOptions, jqXHR) { + options.xhrFields = { + withCredentials: true + } + } + ); + }, + + url: Globals.ApiUrl + '/user', + defaults: { + first_name : '', + last_name : '', + email : '', + password: '', + password_confirmation: '' + } +}); + +module.exports = UserRegistration;