| @@ 1-97 (lines=97) @@ | ||
| 1 | 'use strict'; |
|
| 2 | ||
| 3 | var _ = require( 'underscore' ), |
|
| 4 | objectAssign = require( 'object-assign' ), |
|
| 5 | ValidationStates = require( '../form_validation' ).ValidationStates; |
|
| 6 | ||
| 7 | function inputIsValid( value, pattern ) { |
|
| 8 | if ( pattern === null ) { |
|
| 9 | return value !== ''; |
|
| 10 | } |
|
| 11 | return new RegExp( pattern ).test( value ); |
|
| 12 | } |
|
| 13 | ||
| 14 | function inputValidation( validationState, action ) { |
|
| 15 | var newValidationState = objectAssign( {}, validationState ), |
|
| 16 | bankDataIsValid; |
|
| 17 | ||
| 18 | switch ( action.type ) { |
|
| 19 | case 'VALIDATE_INPUT': |
|
| 20 | if ( validationState[ action.payload.contentName ].dataEntered === false && action.payload.value === '' ) { |
|
| 21 | return validationState; |
|
| 22 | } |
|
| 23 | ||
| 24 | newValidationState[ action.payload.contentName ] = { |
|
| 25 | dataEntered: true, |
|
| 26 | isValid: inputIsValid( action.payload.value, action.payload.pattern ) |
|
| 27 | }; |
|
| 28 | return newValidationState; |
|
| 29 | case 'MARK_EMPTY_FIELD_INVALID': |
|
| 30 | _.each( action.payload.requiredFields, function ( key ) { |
|
| 31 | if ( newValidationState[ key ].isValid === null ) { |
|
| 32 | newValidationState[ key ].isValid = false; |
|
| 33 | } |
|
| 34 | } ); |
|
| 35 | _.each( action.payload.neutralFields, function ( key ) { |
|
| 36 | newValidationState[ key ].isValid = null; |
|
| 37 | } ); |
|
| 38 | return newValidationState; |
|
| 39 | case 'RESET_FIELD_VALIDITY': |
|
| 40 | _.each( action.payload.affectedFields, function ( key ) { |
|
| 41 | newValidationState[ key ] = { dataEntered: false, isValid: null }; |
|
| 42 | } ); |
|
| 43 | return newValidationState; |
|
| 44 | case 'FINISH_PAYMENT_DATA_VALIDATION': |
|
| 45 | if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
| 46 | return newValidationState; |
|
| 47 | } else if ( action.payload.status === ValidationStates.OK ) { |
|
| 48 | newValidationState.amount = { dataEntered: true, isValid: true }; |
|
| 49 | newValidationState.paymentType = { dataEntered: true, isValid: true }; |
|
| 50 | } else { |
|
| 51 | newValidationState.amount = { dataEntered: true, isValid: !action.payload.messages.amount }; |
|
| 52 | newValidationState.paymentType = { dataEntered: true, isValid: !action.payload.messages.paymentType }; |
|
| 53 | } |
|
| 54 | return newValidationState; |
|
| 55 | case 'FINISH_BANK_DATA_VALIDATION': |
|
| 56 | if ( action.payload.status === ValidationStates.INCOMPLETE || action.payload.status === ValidationStates.NOT_APPLICABLE ) { |
|
| 57 | return newValidationState; |
|
| 58 | } |
|
| 59 | bankDataIsValid = action.payload.status !== ValidationStates.ERR; |
|
| 60 | newValidationState.iban = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 61 | if ( action.payload.bic || !bankDataIsValid ) { |
|
| 62 | newValidationState.bic = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 63 | } |
|
| 64 | if ( action.payload.account || !bankDataIsValid ) { |
|
| 65 | newValidationState.accountNumber = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 66 | } |
|
| 67 | if ( action.payload.bankCode || !bankDataIsValid ) { |
|
| 68 | newValidationState.bankCode = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 69 | } |
|
| 70 | return newValidationState; |
|
| 71 | case 'FINISH_EMAIL_ADDRESS_VALIDATION': |
|
| 72 | if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
| 73 | return newValidationState; |
|
| 74 | } |
|
| 75 | newValidationState.email = { dataEntered: true, isValid: action.payload.status !== ValidationStates.ERR }; |
|
| 76 | return newValidationState; |
|
| 77 | case 'FINISH_ADDRESS_VALIDATION': |
|
| 78 | if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
| 79 | return newValidationState; |
|
| 80 | } |
|
| 81 | _.forEach( newValidationState, function ( value, key ) { |
|
| 82 | if ( newValidationState[ key ].dataEntered === true ) { |
|
| 83 | newValidationState[ key ] = { |
|
| 84 | dataEntered: true, |
|
| 85 | isValid: newValidationState[ key ].isValid !== false && !( _.has( action.payload.messages, key ) ) |
|
| 86 | }; |
|
| 87 | } |
|
| 88 | } ); |
|
| 89 | return newValidationState; |
|
| 90 | default: |
|
| 91 | return validationState; |
|
| 92 | } |
|
| 93 | } |
|
| 94 | ||
| 95 | module.exports = { |
|
| 96 | inputValidation: inputValidation |
|
| 97 | }; |
|
| 98 | ||
| @@ 1-130 (lines=130) @@ | ||
| 1 | 'use strict'; |
|
| 2 | ||
| 3 | var _ = require( 'underscore' ), |
|
| 4 | objectAssign = require( 'object-assign' ), |
|
| 5 | ValidationStates = require( '../form_validation' ).ValidationStates; |
|
| 6 | ||
| 7 | function inputIsValid( value, pattern ) { |
|
| 8 | if ( pattern === null ) { |
|
| 9 | return value !== ''; |
|
| 10 | } |
|
| 11 | return new RegExp( pattern ).test( value ); |
|
| 12 | } |
|
| 13 | ||
| 14 | /** |
|
| 15 | * @param {boolean} formWasFilledBefore |
|
| 16 | * @return {Function} |
|
| 17 | */ |
|
| 18 | function newDataEnteredState( formWasFilledBefore ) { |
|
| 19 | if ( formWasFilledBefore ) { |
|
| 20 | return function () { |
|
| 21 | return true; |
|
| 22 | }; |
|
| 23 | } else { |
|
| 24 | return function ( state ) { |
|
| 25 | return state; |
|
| 26 | }; |
|
| 27 | } |
|
| 28 | } |
|
| 29 | ||
| 30 | function inputValidation( validationState, action ) { |
|
| 31 | var newValidationState = objectAssign( {}, validationState ), |
|
| 32 | bankDataIsValid, dataEnteredTransformer; |
|
| 33 | ||
| 34 | switch ( action.type ) { |
|
| 35 | case 'INITIALIZE_VALIDATION': |
|
| 36 | // We have no indicator if the form was freshly loaded with default values, called with payment data from |
|
| 37 | // a banner or reloaded with validation errors. So we try to determine the state of "dataEntered" by |
|
| 38 | // looking at the validation info from the server. In case of coming from the banner, |
|
| 39 | // initialValidationResult is filled, in case of validation errors, violatedFields is filled. |
|
| 40 | // In all other cases, we can't decide and just pass the initial state from the reducer, but that should be ok |
|
| 41 | dataEnteredTransformer = newDataEnteredState( |
|
| 42 | !_.isEmpty( action.payload.violatedFields ) || |
|
| 43 | !_.isEmpty( action.payload.initialValidationResult ) |
|
| 44 | ); |
|
| 45 | _.each( validationState, function ( value, key ) { |
|
| 46 | newValidationState[ key ] = { |
|
| 47 | dataEntered: dataEnteredTransformer( validationState[ key ].dataEntered ), |
|
| 48 | isValid: _.has( action.payload.violatedFields, key ) ? false : validationState[ key ].isValid |
|
| 49 | }; |
|
| 50 | } ); |
|
| 51 | return newValidationState; |
|
| 52 | case 'VALIDATE_INPUT': |
|
| 53 | if ( validationState[ action.payload.contentName ].dataEntered === false && action.payload.value === '' ) { |
|
| 54 | return validationState; |
|
| 55 | } |
|
| 56 | ||
| 57 | newValidationState[ action.payload.contentName ] = { |
|
| 58 | dataEntered: true, |
|
| 59 | isValid: inputIsValid( action.payload.value, action.payload.pattern ) |
|
| 60 | }; |
|
| 61 | return newValidationState; |
|
| 62 | case 'MARK_EMPTY_FIELD_INVALID': |
|
| 63 | _.each( action.payload.requiredFields, function ( key ) { |
|
| 64 | if ( newValidationState[ key ].isValid === null ) { |
|
| 65 | newValidationState[ key ].isValid = false; |
|
| 66 | } |
|
| 67 | } ); |
|
| 68 | _.each( action.payload.neutralFields, function ( key ) { |
|
| 69 | newValidationState[ key ].isValid = null; |
|
| 70 | } ); |
|
| 71 | return newValidationState; |
|
| 72 | case 'RESET_FIELD_VALIDITY': |
|
| 73 | _.each( action.payload.affectedFields, function ( key ) { |
|
| 74 | newValidationState[ key ] = { dataEntered: false, isValid: null }; |
|
| 75 | } ); |
|
| 76 | return newValidationState; |
|
| 77 | case 'FINISH_PAYMENT_DATA_VALIDATION': |
|
| 78 | if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
| 79 | return newValidationState; |
|
| 80 | } else if ( action.payload.status === ValidationStates.OK ) { |
|
| 81 | newValidationState.amount = { dataEntered: true, isValid: true }; |
|
| 82 | newValidationState.paymentType = { dataEntered: true, isValid: true }; |
|
| 83 | } else { |
|
| 84 | newValidationState.amount = { dataEntered: true, isValid: !action.payload.messages.amount }; |
|
| 85 | newValidationState.paymentType = { dataEntered: true, isValid: !action.payload.messages.paymentType }; |
|
| 86 | } |
|
| 87 | return newValidationState; |
|
| 88 | case 'FINISH_BANK_DATA_VALIDATION': |
|
| 89 | if ( action.payload.status === ValidationStates.INCOMPLETE || action.payload.status === ValidationStates.NOT_APPLICABLE ) { |
|
| 90 | return newValidationState; |
|
| 91 | } |
|
| 92 | bankDataIsValid = action.payload.status !== ValidationStates.ERR; |
|
| 93 | newValidationState.iban = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 94 | if ( action.payload.bic || !bankDataIsValid ) { |
|
| 95 | newValidationState.bic = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 96 | } |
|
| 97 | if ( action.payload.account || !bankDataIsValid ) { |
|
| 98 | newValidationState.accountNumber = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 99 | } |
|
| 100 | if ( action.payload.bankCode || !bankDataIsValid ) { |
|
| 101 | newValidationState.bankCode = { dataEntered: true, isValid: bankDataIsValid }; |
|
| 102 | } |
|
| 103 | return newValidationState; |
|
| 104 | case 'FINISH_EMAIL_ADDRESS_VALIDATION': |
|
| 105 | if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
| 106 | return newValidationState; |
|
| 107 | } |
|
| 108 | newValidationState.email = { dataEntered: true, isValid: action.payload.status !== ValidationStates.ERR }; |
|
| 109 | return newValidationState; |
|
| 110 | case 'FINISH_ADDRESS_VALIDATION': |
|
| 111 | if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
| 112 | return newValidationState; |
|
| 113 | } |
|
| 114 | _.forEach( newValidationState, function ( value, key ) { |
|
| 115 | if ( newValidationState[ key ].dataEntered === true ) { |
|
| 116 | newValidationState[ key ] = { |
|
| 117 | dataEntered: true, |
|
| 118 | isValid: newValidationState[ key ].isValid !== false && !( _.has( action.payload.messages, key ) ) |
|
| 119 | }; |
|
| 120 | } |
|
| 121 | } ); |
|
| 122 | return newValidationState; |
|
| 123 | default: |
|
| 124 | return validationState; |
|
| 125 | } |
|
| 126 | } |
|
| 127 | ||
| 128 | module.exports = { |
|
| 129 | inputValidation: inputValidation |
|
| 130 | }; |
|
| 131 | ||