Parcourir la source

Added validations + minor fixes.

Paulo Reis il y a 10 ans
Parent
commit
26e21732f8

+ 19 - 8
services/web/app/views/subscriptions/new.jade

@@ -175,6 +175,7 @@ block content
 												div(ng-if="price.next.tax!='0.00'").pull-right {{price.currency.symbol}}{{price.next.tax}}
 												div(ng-if="price.next.tax!='0.00'").pull-right {{price.currency.symbol}}{{price.next.tax}}
 												div.pull-right
 												div.pull-right
 													strong {{price.currency.symbol}}{{price.next.total}}
 													strong {{price.currency.symbol}}{{price.next.total}}
+								
 								.col-md-12(sixpack-when="simple")
 								.col-md-12(sixpack-when="simple")
 									form(ng-if="planName")
 									form(ng-if="planName")
 										div.payment-method-toggle
 										div.payment-method-toggle
@@ -196,10 +197,18 @@ block content
 												i.fa.fa-cc-paypal.fa-2x
 												i.fa.fa-cc-paypal.fa-2x
 										//- TODO Validation messages
 										//- TODO Validation messages
 										div(ng-if="paymentMethod === 'credit_card'")
 										div(ng-if="paymentMethod === 'credit_card'")
+											ol 
+												li validation.correctCardNumber : {{ validation.correctCardNumber }}
+												li validation.correctExpiry : {{ validation.correctExpiry }}
+												li validation.correctCvv : {{ validation.correctCvv }}
+												li data.month : {{ data.month }}
+												li data.year : {{ data.year }}
+												li data.mmYY : {{ data.mmYY }}
+
 											.form-group
 											.form-group
 												label(for="card-name") Name on card
 												label(for="card-name") Name on card
 												input#card-name.form-control(type="text")
 												input#card-name.form-control(type="text")
-											.form-group(ng-class="validation.number == false || validation.errorFields.number ? 'has-error' : ''")
+											.form-group(ng-class="validation.correctCardNumber == false || validation.errorFields.number ? 'has-error' : ''")
 												label(for="card-no") Card number
 												label(for="card-no") Card number
 												input#card-no.form-control(
 												input#card-no.form-control(
 													type="text"
 													type="text"
@@ -208,13 +217,15 @@ block content
 													cc-format-card-number)
 													cc-format-card-number)
 											.row
 											.row
 												.col-xs-6
 												.col-xs-6
-													label Expiry date
-													input.form-control(
-														type="text"
-														ng-model="data.mmYY"
-														placeholder="MM // YY"
-														cc-format-expiry
-													)
+													.form-group.has-feedback(ng-class="validation.correctExpiry == false || validation.errorFields.expiry ? 'has-error' : ''")
+														label Expiry date
+														input.form-control(
+															type="text"
+															ng-model="data.mmYY"
+															placeholder="MM / YY"
+															ng-blur="validateExpiry()"
+															cc-format-expiry
+														)
 												.col-xs-6
 												.col-xs-6
 													.form-group.has-feedback(ng-class="validation.correctCvv == false || validation.errorFields.cvv ? 'has-error' : ''")
 													.form-group.has-feedback(ng-class="validation.correctCvv == false || validation.errorFields.cvv ? 'has-error' : ''")
 														label Security code
 														label Security code

+ 25 - 2
services/web/public/coffee/directives/creditCards.coffee

@@ -78,6 +78,27 @@ define [
 		cardFromType = (type) ->
 		cardFromType = (type) ->
 			return card for card in cards when card.type is type
 			return card for card in cards when card.type is type
 
 
+		cardType = (num) ->
+			return null unless num
+			cardFromNumber(num)?.type or null
+
+		formatCardNumber = (num) ->
+			num = num.replace(/\D/g, '')
+			card = cardFromNumber(num)
+			return num unless card
+
+			upperLength = card.length[card.length.length - 1]
+			num = num[0...upperLength]
+
+			if card.format.global
+				num.match(card.format)?.join(' ')
+			else
+				groups = card.format.exec(num)
+				return unless groups?
+				groups.shift()
+				groups = $.grep(groups, (n) -> n) # Filter empty groups
+				groups.join(' ')
+
 		parseExpiry = (value = "") ->
 		parseExpiry = (value = "") ->
 			[month, year] = value.split(/[\s\/]+/, 2)
 			[month, year] = value.split(/[\s\/]+/, 2)
 
 
@@ -97,6 +118,8 @@ define [
 		return {
 		return {
 			fromNumber: cardFromNumber
 			fromNumber: cardFromNumber
 			fromType: cardFromType
 			fromType: cardFromType
+			cardType: cardType 
+			formatCardNumber: formatCardNumber  
 			defaultFormat: defaultFormat
 			defaultFormat: defaultFormat
 			defaultInputFormat: defaultInputFormat
 			defaultInputFormat: defaultInputFormat
 			parseExpiry: parseExpiry
 			parseExpiry: parseExpiry
@@ -144,7 +167,7 @@ define [
 			setTimeout ->
 			setTimeout ->
 				value   = $target.val()
 				value   = $target.val()
 				value   = replaceFullWidthChars(value)
 				value   = replaceFullWidthChars(value)
-				value   = $.payment.formatCardNumber(value)
+				value   = ccUtils.formatCardNumber(value)
 
 
 		formatCardNumber = (e) ->
 		formatCardNumber = (e) ->
 			# Only format if input is a number
 			# Only format if input is a number
@@ -367,7 +390,7 @@ define [
 		setCardType = (e) ->
 		setCardType = (e) ->
 			$target  = $(e.currentTarget)
 			$target  = $(e.currentTarget)
 			val      = $target.val()
 			val      = $target.val()
-			cardType = $.payment.cardType(val) or 'unknown'
+			cardType = ccUtils.cardType(val) or 'unknown'
 
 
 			unless $target.hasClass(cardType)
 			unless $target.hasClass(cardType)
 				allTypes = (card.type for card in cards)
 				allTypes = (card.type for card in cards)

+ 8 - 3
services/web/public/coffee/main/new-subscription.coffee

@@ -3,7 +3,7 @@ define [
 	"directives/creditCards"
 	"directives/creditCards"
 ], (App)->
 ], (App)->
 
 
-	App.controller "NewSubscriptionController", ($scope, MultiCurrencyPricing, abTestManager, $http, sixpack, event_tracking)->
+	App.controller "NewSubscriptionController", ($scope, MultiCurrencyPricing, abTestManager, $http, sixpack, event_tracking, ccUtils)->
 		throw new Error("Recurly API Library Missing.")  if typeof recurly is "undefined"
 		throw new Error("Recurly API Library Missing.")  if typeof recurly is "undefined"
 	
 	
 		$scope.currencyCode = MultiCurrencyPricing.currencyCode
 		$scope.currencyCode = MultiCurrencyPricing.currencyCode
@@ -32,11 +32,16 @@ define [
 			coupon: window.couponCode
 			coupon: window.couponCode
 			mmYY: ""
 			mmYY: ""
 
 
- 
+		$scope.$watch 'data.mmYY', (newVal) ->
+			parsedDateObj = ccUtils.parseExpiry newVal
+			if parsedDateObj?
+				$scope.data.month = parsedDateObj.month
+				$scope.data.year = parsedDateObj.year
+
 		$scope.validation =
 		$scope.validation =
 			correctCardNumber : true
 			correctCardNumber : true
 			correctExpiry: true
 			correctExpiry: true
-			correctCvv:true
+			correctCvv: true
 
 
 		$scope.processing = false
 		$scope.processing = false