Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ gem 'figaro'
gem 'curb'
gem 'activerecord-session_store'
gem 'faker'
gem "i18n-js", ">= 3.0.0.rc11"

# auth
gem 'devise'
Expand Down
3 changes: 3 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ GEM
high_voltage (2.4.0)
highline (1.7.8)
i18n (0.7.0)
i18n-js (3.0.0.rc12)
i18n (~> 0.6, >= 0.6.6)
jbuilder (2.4.1)
activesupport (>= 3.0.0, < 5.1)
multi_json (~> 1.2)
Expand Down Expand Up @@ -292,6 +294,7 @@ DEPENDENCIES
faker
figaro
high_voltage
i18n-js (>= 3.0.0.rc11)
jbuilder
jquery-datatables-rails
jquery-rails
Expand Down
3 changes: 0 additions & 3 deletions app/assets/javascripts/accesses.coffee

This file was deleted.

10 changes: 10 additions & 0 deletions app/assets/javascripts/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,15 @@
//= require dataTables/jquery.dataTables
//= require dataTables/bootstrap/3/jquery.dataTables.bootstrap
//= require bootstrap
//= require i18n.js
//= require i18n/translations

//= require campaigns
//= require checkout
//= require clubs
//= require landers
//= require preferences
//= require products
//= require users

//= require_tree .
164 changes: 164 additions & 0 deletions app/assets/javascripts/campaigns.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
var Campaign = {
Preferences: {
campaign_preferences: [],
campaign_preferences_backup: [],
init: function(){
$('#table_preferences_groups').dataTable();
Campaign.Preferences.get_preferences_from_field();
Campaign.Preferences.campaign_preferences_backup = Campaign.Preferences.campaign_preferences;
Campaign.Preferences.update_table();
},
assign: function(id, name) {
var pg = [];
pg.id = id;
pg.name = name;
if (!Campaign.Preferences.already_on_list(pg)) {
Campaign.Preferences.campaign_preferences.push(pg);
Campaign.Preferences.set_preferences_to_field();
Campaign.Preferences.update_table();
}
else {
alert(I18n.t('campaigns.group_already_on_list'));
}
},
remove_preference: function(index) {
Campaign.Preferences.campaign_preferences.splice(index, 1);
Campaign.Preferences.set_preferences_to_field();
Campaign.Preferences.update_table();
},
remove_all_preferences: function() {
Campaign.Preferences.campaign_preferences = [];
Campaign.Preferences.set_preferences_to_field();
Campaign.Preferences.update_table();
},
reset_preferences: function() {
Campaign.Preferences.campaign_preferences = Campaign.Preferences.campaign_preferences_backup;
Campaign.Preferences.update_table();
},
set_preferences_to_field: function() {
var prefs = [];
for (var i = 0; i < Campaign.Preferences.campaign_preferences.length; i++) {
prefs[i] = Campaign.Preferences.campaign_preferences[i].id;
}
$("#preferences_list").val(prefs);
},
get_preferences_from_field: function() {
Campaign.Preferences.campaign_preferences = [];
received_preferences = $("#preferences_list").val();
if (received_preferences.indexOf('|') > 0) {
var prefs = received_preferences.split(',');
for (var i = 0; i < prefs.length; i++) {
current_pref = prefs[i].split('|');
pref = [];
pref.id = current_pref[0];
pref.name = current_pref[1];
Campaign.Preferences.campaign_preferences.push(pref);
}
}
},
already_on_list: function(preference) {
for (var i = 0; i < Campaign.Preferences.campaign_preferences.length; i++) {
if (Campaign.Preferences.campaign_preferences[i].id == preference.id) {
return true;
}
}
return false;
},
update_table: function() {
$('#assigned_preferences_groups tbody').html('');
if (Campaign.Preferences.campaign_preferences.length > 0) {
for (var i = 0; i < Campaign.Preferences.campaign_preferences.length; i++) {
name_cell = '<td>' + Campaign.Preferences.campaign_preferences[i].name + '</td>';
remove_cell = '<td class="text-right"><a href="javascript:Campaign.Preferences.remove_preference(' + i + ');" title="Remove this product">'+I18n.t('remove')+'</a></td>';
$("#assigned_preferences_groups").append('<tr>' + name_cell + remove_cell + '</tr>');
}
}
else {
$("#assigned_preferences_groups").append('<tr><td colspan="2">'+I18n.t('campaigns.no_groups_assigned')+'</td></tr>');
}
}
},

Products:{
campaign_products: [],
campaign_products_backup: [],
init: function(){
$('#table_products').dataTable();
Campaign.Products.get_products_from_field();
Campaign.Products.campaign_products_backup = Campaign.Products.campaign_products;
Campaign.Products.update_table();
},
assign: function(id, sku, name) {
var product = [];
product.id = id;
product.sku = sku;
product.name = name;
if (!Campaign.Products.product_already_on_list(product)) {
Campaign.Products.campaign_products.push(product);
Campaign.Products.set_products_to_field();
Campaign.Products.update_table();
}
else {
alert(I18n.t('campaigns.product_already_on_list'));
}
},
remove_product: function(product_index) {
Campaign.Products.campaign_products.splice(product_index, 1);
Campaign.Products.set_products_to_field();
Campaign.Products.update_table();
},
remove_all_products: function() {
Campaign.Products.campaign_products = [];
Campaign.Products.set_products_to_field();
Campaign.Products.update_table();
},
reset_products: function() {
campaign_products = Campaign.Products.campaign_products_backup;
update_table();
},
set_products_to_field: function() {
products = [];
for (var i = 0; i < Campaign.Products.campaign_products.length; i++) {
products[i] = Campaign.Products.campaign_products[i].id;
}
$("#products_list").val(products);
},
get_products_from_field: function() {
Campaign.Products.campaign_products = [];
received_products = $("#products_list").val();
if (received_products.indexOf('|') > 0) {
products = received_products.split(',');
for (var i = 0; i < products.length; i++) {
current_product = products[i].split('|');
var product = [];
product.id = current_product[0];
product.sku = current_product[1];
product.name = current_product[2];
Campaign.Products.campaign_products.push(product);
}
}
},
product_already_on_list: function(product) {
for (var i = 0; i < Campaign.Products.campaign_products.length; i++) {
if (Campaign.Products.campaign_products[i].id == product.id) {
return true;
}
}
return false;
},
update_table: function() {
$('#assigned_products tbody').html('');
if (Campaign.Products.campaign_products.length > 0) {
for (var i = 0; i < Campaign.Products.campaign_products.length; i++) {
var sku_cell = '<td>' + Campaign.Products.campaign_products[i].sku + '</td>';
var name_cell = '<td>' + Campaign.Products.campaign_products[i].name + '</td>';
var remove_cell = '<td class="text-right"><a href="#" onclick="javascript:Campaign.Products.remove_product(' + i + '); return false;" title="Remove this product">'+I18n.t('remove')+'</a></td>';
$("#assigned_products").append('<tr>' + sku_cell + name_cell + remove_cell + '</tr>');
}
}
else {
$("#assigned_products").append('<tr><td colspan="3">'+I18n.t('campaigns.no_products_assigned')+'</td></tr>');
}
}
}
}
3 changes: 0 additions & 3 deletions app/assets/javascripts/campaigns.js.coffee

This file was deleted.

3 changes: 0 additions & 3 deletions app/assets/javascripts/checkout.coffee

This file was deleted.

143 changes: 143 additions & 0 deletions app/assets/javascripts/checkout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
var Checkout = {
enroll_url: '',
result_url: '',
init: function(user_id, enroll_user, enroll_url, result_url){
Checkout.enroll_url = enroll_url;
Checkout.result_url = result_url;

$('#modal').modal({
show: false,
backdrop: 'static',
keyboard: false
});

$('form').submit(function(e) {
$('#error_explanation').slideUp('fast');

var validation_result = Checkout.validate_form($('#credit_card_number').val(), $('#credit_card_exp_month').val(), $('#credit_card_exp_year').val());

if (validation_result.errors) {
$('#error_message').html(validation_result.message);
$('#error_explanation').slideDown('fast');
e.preventDefault();
return false;
}
else {
if(enroll_user == true){
Checkout.enroll(user_id, $('#credit_card_number').val(), $('#credit_card_exp_month').val(), $('#credit_card_exp_year').val());
}else{
Checkout.toggle_fields(false);
$('#submit').val(I18n.t('please_wait'));
location.href = enroll_url
}
}
});
},
enroll: function(user_id, cc_number, cc_month, cc_year) {
Checkout.toggle_fields(false);
$('#submit').val(I18n.t('please_wait'));
$.ajax({
url: Checkout.enroll_url,
data: { user_id: user_id, cc_number: cc_number, cc_month: cc_month, cc_year: cc_year },
dataType: 'jsonp',
type: "POST",
async: true,
success: function(data) {
console.log(data.message);
if (data.code >= 200 && data.code <= 202) {
location.href = Checkout.result_url
}
else {
alert(I18n.t('checkout.problem_creating_account'));
}
Checkout.toggle_fields(true);
$('#submit').val('Submit');
},
error: function(data) {
Checkout.toggle_fields(true);
$('#submit').val('Submit');
}
});
},
validate_form: function(card_number, exp_month, exp_year) {
var e = false;
var msg = '';

if (card_number == '') {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO we should be using JS validation libraries, like BootstrapValidator or similar that provides validation for CreditCard , Email and other sveral types of fields.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let me check that

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have created this US to handle this improvement https://www.pivotaltracker.com/story/show/117069191. I have found several CC validators, but none of was nice to me.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm using http://formvalidation.io/ in another project. The latest version
is paid, however previous version are free, they are available on github.
Also using https://github.com/1000hz/bootstrap-validator might be a good
choice, Since you don't need to care about appending the error messages
using if+else.

On Wed, Apr 6, 2016 at 12:34 PM, Sebastian De Luca <notifications@github.com

wrote:

In app/assets/javascripts/checkout.js
#27 (comment):

  •        alert(I18n.t('checkout.problem_creating_account'));
    
  •      }
    
  •      Checkout.toggle_fields(true);
    
  •      $('#submit').val('Submit');
    
  •    },
    
  •    error: function(data) {
    
  •      Checkout.toggle_fields(true);
    
  •      $('#submit').val('Submit');
    
  •    }
    
  • });
  • },
  • validate_form: function(card_number, exp_month, exp_year) {
  • var e = false;
  • var msg = '';
  • if (card_number == '') {

I have created this US to handle this improvement
https://www.pivotaltracker.com/story/show/117069191. I have found several
CC validators, but none of was nice to me.


You are receiving this because you commented.
Reply to this email directly or view it on GitHub
https://github.com/stoneacre/campaign-code/pull/27/files/42aab603db4c5599ae10864b67e0f4214bdbdaa5#r58727301

msg = msg + '<li>'+I18n.t('checkout.card_number_missing')+'</li>';
e = true;
}
else if (!Checkout.validate_cc_number (card_number)) {
msg = msg + '<li>'+I18n.t('checkout.card_number_invalid')+'</li>';
e = true;
}

if (exp_month == '') {
msg = msg + '<li>'+I18n.t('checkout.card_month_missing')+'</li>';
e = true;
}

if (exp_year == '') {
msg = msg + '<li>'+I18n.t('checkout.card_year_missing')+'</li>';
e = true;
}

if (!Checkout.validate_cc_exp_date(exp_month, exp_year)) {
msg = msg + '<li>'+I18n.t('checkout.card_expired')+'</li>';
e = true;
}

var result = { errors: e, message: msg };
return result;
},
validate_cc_exp_date: function(exp_month, exp_year) {
var d = new Date ();
var retval = true;
exp_month = parseInt(exp_month, 10);
if ((exp_month < (d.getMonth() + 1)) && (exp_year == d.getFullYear())) {
retval = false;
}
return retval;
},
validate_cc_number: function(card_number) {
var retval = false;
var reg_exp = /^\d{15,16}$/;
if (reg_exp.test(card_number)) {
retval = true;
}
return retval;
},
toggle_fields: function(state) {
if(state) {
$('#modal').modal('hide');
$('#submit').removeAttr("disabled");
$('#credit_card_number').removeAttr("disabled");
$('#credit_card_exp_month').removeAttr("disabled");
$('#credit_card_exp_year').removeAttr("disabled");

$('#submit').removeClass('disabled');
$('#credit_card_number').removeClass('disabled');
$('#credit_card_exp_month').removeClass('disabled');
$('#credit_card_exp_year').removeClass('disabled');
}
else {
$('#modal').modal('show');
$('#submit').attr("disabled", "disabled");
$('#credit_card_number').attr("disabled", "disabled");
$('#credit_card_exp_month').attr("disabled", "disabled");
$('#credit_card_exp_year').attr("disabled", "disabled");

$('#submit').addClass('disabled');
$('#credit_card_number').addClass('disabled');
$('#credit_card_exp_month').addClass('disabled');
$('#credit_card_exp_year').addClass('disabled');
}
},
thankyou: function(autologin_url){
if(autologin_url.length > 0) {
window.setTimeout(function() {
document.location = autologin_url;
}, 15000);
}
}
}
Loading