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"} |
);
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;