Form validation that sucks less

This commit is contained in:
nikolark committed 2015-07-14 17:38:30 +02:00
1 parent 1fa2ab7ded
commit cef42d6ee1
2 files changed
+80 -80

No files matched your search

+40 -40
View File
@@ -20,6 +20,7 @@ function getParameterByName(name) {
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
function format_results(results) {
return nunjucks.render('search_results.html', {'results':results});
}
@@ -58,7 +59,7 @@ function set_field_state(field_element, state, help_text) {
};
var feedback_span = '<span class="glyphicon glyphicon-'+ state_to_icon[state] +' form-control-feedback" aria-hidden="true"></span>';
var css_class = 'has-'+state;
var form_group = field_element.parent();
var form_group = field_element.parent().parent();
form_group.removeClass('has-success has-warning has-error has-feedback'); // reset
if(['success', 'warning', 'error'].indexOf(state) !== -1) {
form_group.addClass(css_class +' has-feedback');
@@ -86,25 +87,46 @@ function set_field_state(field_element, state, help_text) {
}
}
function cardFormIsValid() {
return _.all(_.values(cardForm.fields));
}
function update_submit_button() {
if( cardFormIsValid() ) {
_dom.registerButton.prop('disabled', false);
return;
}
_dom.registerButton.prop('disabled', true);
}
function validatePhoneNumber(val) {
if(val.length === 0) {
cardForm.fields.phoneNumber = false;
update_submit_button();
return 'Phonenumber number should not be empty.';
}
cardForm.fields.phoneNumber = true;
update_submit_button();
return '';
}
function validateCardNumber(val) {
if(val.length === 0) {
cardForm.fields.cardNumber = false;
update_submit_button();
return 'Card number should not be empty.';
}
if(val.length > 0 && val[0] != "1") {
cardForm.fields.cardNumber = false;
update_submit_button();
return 'Card number should start with 1.';
}
if(val.length !== 9) {
cardForm.fields.cardNumber = false;
update_submit_button();
return 'Card number should be 9 digits long';
}
cardForm.fields.cardNumber = true;
update_submit_button();
return '';
}
@@ -116,40 +138,17 @@ function getFormData(formElement) {
return formData;
}
function validateCardForm() {
var formData = getFormData(_dom.registerCardForm);
var errors = [];
/* TODO
- phonenumber should be valid (python-phonenumbers)
- userid exists (optional)
*/
/* Phone number */
var phone_number_invalid = validatePhoneNumber(formData.phone_number);
if(phone_number_invalid) {
set_field_state(_dom.phoneNumberField, 'error', phone_number_invalid);
errors.push(phone_number_invalid);
}
/* Card number */
var cardno_invalid = validateCardNumber(formData.card_number);
if(cardno_invalid) {
set_field_state(_dom.cardNumberField, 'error', cardno_invalid);
errors.push(cardno_invalid);
}
console.log("Errors: ", errors);
if(errors.length === 0) {
_dom.registerButton.removeAttr('disabled');
return true;
}
_dom.registerButton.attr('disabled','disabled');
return false;
}
var _dom;
var register_form_fields = ['user_id', 'phone_number', 'card_number'];
var users;
var selectedUser;
var cardForm = {
fields: {
cardNumber: false,
phoneNumber: false
}
};
$(document).ready(function(){
@@ -175,7 +174,7 @@ $(document).ready(function(){
/* User search as you type */
_dom.query.on('keyup', function() {
var val = _dom.query.val().trim();
if(val === '') {
if(val.length <= 2) {
return;
}
$.getJSON(urls.insideUserApi, {q: val}, function(data) {
@@ -200,8 +199,9 @@ $(document).ready(function(){
/* Phone number as you type */
_dom.phoneNumberField.on('input', function() {
var val = _dom.phoneNumberField.val().trim();
if( validatePhoneNumber(val) !== '') {
set_field_state(_dom.phoneNumberField, 'error', validatePhoneNumber(val));
var validation_msg = validatePhoneNumber(val);
if( validation_msg !== '') {
set_field_state(_dom.phoneNumberField, 'error', validation_msg);
return;
}
$.getJSON(urls.insidePhoneNumberApi, {q: val}, function(data) {
@@ -219,8 +219,9 @@ $(document).ready(function(){
_dom.cardNumberField.on('input', function() {
/* Card number should exist in the database and not tied to existing user */
var val = _dom.cardNumberField.val().trim();
if( validateCardNumber(val) !== '' ) {
set_field_state(_dom.cardNumberField, 'error', validateCardNumber(val));
var validation_msg = validateCardNumber(val);
if( validation_msg !== '' ) {
set_field_state(_dom.cardNumberField, 'error', validation_msg);
return;
}
$.getJSON(urls.insideCardNumber, {card_number: val}, function(data) {
@@ -233,7 +234,7 @@ $(document).ready(function(){
}
else if(data.user !== null && data.valid) {
var user = data.user[0];
set_field_state(_dom.cardNumberField, 'error', 'Card number belongs to existing user: '+ user.firstname +' '+ user.lastname +' ('+user.id+').');
set_field_state(_dom.cardNumberField, 'error', 'Card number is in use and belongs to existing user: '+ user.firstname +' '+ user.lastname +' ('+user.id+').');
}
else if(data.user === null && data.valid) {
set_field_state(_dom.cardNumberField, 'success');
@@ -270,7 +271,7 @@ $(document).ready(function(){
// - show new user below form (hide/show after 10s)
// - clear form
if( !validateCardForm() ) {
if( !cardFormIsValid() ) {
// ERROR
return;
}
@@ -298,7 +299,6 @@ $(document).ready(function(){
/* On user id change */
_dom.userIdField.on('change', function() {
/* Render selected user in search form */
console.log("try updating selected user ", selectedUser);
if(selectedUser) {
render_selected_user({res: selectedUser});
return;
+40 -40
View File
@@ -20,6 +20,7 @@ function getParameterByName(name) {
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
function format_results(results) {
return nunjucks.render('search_results.html', {'results':results});
}
@@ -58,7 +59,7 @@ function set_field_state(field_element, state, help_text) {
};
var feedback_span = '<span class="glyphicon glyphicon-'+ state_to_icon[state] +' form-control-feedback" aria-hidden="true"></span>';
var css_class = 'has-'+state;
var form_group = field_element.parent();
var form_group = field_element.parent().parent();
form_group.removeClass('has-success has-warning has-error has-feedback'); // reset
if(['success', 'warning', 'error'].indexOf(state) !== -1) {
form_group.addClass(css_class +' has-feedback');
@@ -86,25 +87,46 @@ function set_field_state(field_element, state, help_text) {
}
}
function cardFormIsValid() {
return _.all(_.values(cardForm.fields));
}
function update_submit_button() {
if( cardFormIsValid() ) {
_dom.registerButton.prop('disabled', false);
return;
}
_dom.registerButton.prop('disabled', true);
}
function validatePhoneNumber(val) {
if(val.length === 0) {
cardForm.fields.phoneNumber = false;
update_submit_button();
return 'Phonenumber number should not be empty.';
}
cardForm.fields.phoneNumber = true;
update_submit_button();
return '';
}
function validateCardNumber(val) {
if(val.length === 0) {
cardForm.fields.cardNumber = false;
update_submit_button();
return 'Card number should not be empty.';
}
if(val.length > 0 && val[0] != "1") {
cardForm.fields.cardNumber = false;
update_submit_button();
return 'Card number should start with 1.';
}
if(val.length !== 9) {
cardForm.fields.cardNumber = false;
update_submit_button();
return 'Card number should be 9 digits long';
}
cardForm.fields.cardNumber = true;
update_submit_button();
return '';
}
@@ -116,40 +138,17 @@ function getFormData(formElement) {
return formData;
}
function validateCardForm() {
var formData = getFormData(_dom.registerCardForm);
var errors = [];
/* TODO
- phonenumber should be valid (python-phonenumbers)
- userid exists (optional)
*/
/* Phone number */
var phone_number_invalid = validatePhoneNumber(formData.phone_number);
if(phone_number_invalid) {
set_field_state(_dom.phoneNumberField, 'error', phone_number_invalid);
errors.push(phone_number_invalid);
}
/* Card number */
var cardno_invalid = validateCardNumber(formData.card_number);
if(cardno_invalid) {
set_field_state(_dom.cardNumberField, 'error', cardno_invalid);
errors.push(cardno_invalid);
}
console.log("Errors: ", errors);
if(errors.length === 0) {
_dom.registerButton.removeAttr('disabled');
return true;
}
_dom.registerButton.attr('disabled','disabled');
return false;
}
var _dom;
var register_form_fields = ['user_id', 'phone_number', 'card_number'];
var users;
var selectedUser;
var cardForm = {
fields: {
cardNumber: false,
phoneNumber: false
}
};
$(document).ready(function(){
@@ -175,7 +174,7 @@ $(document).ready(function(){
/* User search as you type */
_dom.query.on('keyup', function() {
var val = _dom.query.val().trim();
if(val === '') {
if(val.length <= 2) {
return;
}
$.getJSON(urls.insideUserApi, {q: val}, function(data) {
@@ -200,8 +199,9 @@ $(document).ready(function(){
/* Phone number as you type */
_dom.phoneNumberField.on('input', function() {
var val = _dom.phoneNumberField.val().trim();
if( validatePhoneNumber(val) !== '') {
set_field_state(_dom.phoneNumberField, 'error', validatePhoneNumber(val));
var validation_msg = validatePhoneNumber(val);
if( validation_msg !== '') {
set_field_state(_dom.phoneNumberField, 'error', validation_msg);
return;
}
$.getJSON(urls.insidePhoneNumberApi, {q: val}, function(data) {
@@ -219,8 +219,9 @@ $(document).ready(function(){
_dom.cardNumberField.on('input', function() {
/* Card number should exist in the database and not tied to existing user */
var val = _dom.cardNumberField.val().trim();
if( validateCardNumber(val) !== '' ) {
set_field_state(_dom.cardNumberField, 'error', validateCardNumber(val));
var validation_msg = validateCardNumber(val);
if( validation_msg !== '' ) {
set_field_state(_dom.cardNumberField, 'error', validation_msg);
return;
}
$.getJSON(urls.insideCardNumber, {card_number: val}, function(data) {
@@ -233,7 +234,7 @@ $(document).ready(function(){
}
else if(data.user !== null && data.valid) {
var user = data.user[0];
set_field_state(_dom.cardNumberField, 'error', 'Card number belongs to existing user: '+ user.firstname +' '+ user.lastname +' ('+user.id+').');
set_field_state(_dom.cardNumberField, 'error', 'Card number is in use and belongs to existing user: '+ user.firstname +' '+ user.lastname +' ('+user.id+').');
}
else if(data.user === null && data.valid) {
set_field_state(_dom.cardNumberField, 'success');
@@ -270,7 +271,7 @@ $(document).ready(function(){
// - show new user below form (hide/show after 10s)
// - clear form
if( !validateCardForm() ) {
if( !cardFormIsValid() ) {
// ERROR
return;
}
@@ -298,7 +299,6 @@ $(document).ready(function(){
/* On user id change */
_dom.userIdField.on('change', function() {
/* Render selected user in search form */
console.log("try updating selected user ", selectedUser);
if(selectedUser) {
render_selected_user({res: selectedUser});
return;