Completed
Push — master ( a87885...624e0a )
by wiese
65:36
created

PaymentSummaryDisplayHandler.update   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
cc 2
c 4
b 0
f 0
nc 2
dl 0
loc 19
rs 9.4285
nop 1
1
'use strict';
2
3
var objectAssign = require( 'object-assign' ),
4
	DOM_SELECTORS = {
5
		data: {
6
			emtpyText: 'empty-text',
7
			displayError: 'display-error'
8
		},
9
		classes: {
10
			errorIcon: 'icon-error',
11
			summaryBankInfo: 'bank-info'
12
		}
13
	},
14
	PaymentSummaryDisplayHandler = {
15
16
		/**
17
		 * Elements showing state to user
18
		 */
19
		intervalTextElement: null,
20
		amountElement: null,
21
		paymentTypeElement: null,
22
		intervalIconElement: null,
23
		paymentIconsElement: null,
24
		periodicityTextElement: null,
25
		paymentElement: null,
26
		addressTypeIconElement: null,
27
		addressTypeElement: null,
28
		addressTypeTextElement: null,
29
		memberShipTypeElement: null,
30
		memberShipTypeIconElement: null,
31
		memberShipTypeTextElement: null,
32
33
		/**
34
		 * Dependencies
35
		 */
36
		numberFormatter: null,
37
38
		/**
39
		 * Icons
40
		 */
41
		intervalIcons: null,
42
		addressTypeIcon: null,
43
		paymentIcons: null,
44
		memberShipTypeIcon: null,
45
46
		/**
47
		 * Translations
48
		 */
49
		intervalTranslations: null,
50
		paymentTypeTranslations: null,
51
		countryTranslations: null,
52
		addressType: null,
53
		periodicityText: null,
54
		paymentText: null,
55
		memberShipType: null,
56
		memberShipTypeText: null,
57
58
		update: function ( formContent ) {
59
			this.updateAmoutIndicators( formContent.amount );
60
61
			this.intervalTextElement.text( this.intervalTranslations[ formContent.paymentIntervalInMonths ] );
62
			this.setSummaryIcon( this.intervalIconElement, formContent.paymentIntervalInMonths, this.intervalIcons );
63
			this.periodicityTextElement.text( this.periodicityText[ formContent.paymentIntervalInMonths ] );
64
65
			this.updatePaymentTypeIndicators( formContent.paymentType );
66
			this.setSummaryIcon( this.paymentIconsElement, formContent.paymentType, this.paymentIcons );
67
			this.updatePaymentTypeSummary( formContent );
68
69
			this.updateAddressTypeIndicators( formContent.addressType );
70
			this.setSummaryIcon( this.addressTypeIconElement, formContent.addressType, this.addressTypeIcon );
71
			this.addressTypeTextElement.html( this.getAddressSummaryContent( formContent ) );
72
73
			if( this.memberShipTypeElement ) {
74
				this.updateMembershipSummary( formContent );
75
			}
76
		},
77
		updateAmoutIndicators: function ( amount ) {
78
			var self = this,
79
				$guiElement;
80
81
			this.amountElement.each( function () {
82
				$guiElement = $( this );
83
				$guiElement.text( amount === 0 ? $guiElement.data( DOM_SELECTORS.data.emtpyText ) : self.numberFormatter.format( amount ) );
84
			} );
85
		},
86
		updatePaymentTypeIndicators: function ( paymentType ) {
87
			var self = this,
88
				$guiElement;
89
90
			this.paymentTypeElement.each( function () {
91
				$guiElement = $( this );
92
				$guiElement.text( paymentType === '' ? $guiElement.data( DOM_SELECTORS.data.emtpyText ) : self.paymentTypeTranslations[ paymentType ] );
93
			} );
94
		},
95
		updateAddressTypeIndicators: function ( addressType ) {
96
			var self = this,
97
				$guiElement;
98
99
			this.addressTypeElement.each( function () {
100
				$guiElement = $( this );
101
				$guiElement.text( addressType === '' ? $guiElement.data( DOM_SELECTORS.data.emtpyText ) : self.addressType[ addressType ] );
102
			} );
103
		},
104
		updatePaymentTypeSummary: function ( state ) {
105
			this.paymentElement.text( this.paymentText[ state.paymentType ] );
106
107
			if( state.paymentType !== 'BEZ' ) {
108
				return;
109
			}
110
111
			if( state.accountNumber && state.bankCode ) {
112
				this.paymentElement.prepend (
113
					this.getBankAccountSummary( 'Kontonummer', state.accountNumber, 'Bankleitzahl', state.bankCode )
114
				)
115
			} else if( state.iban && state.bic ) {
116
				this.paymentElement.prepend (
117
					this.getBankAccountSummary( 'IBAN', state.iban, 'BIC', state.bic )
118
				);
119
			}
120
		},
121
		updateMembershipSummary: function ( state ) {
122
			if( !state.membershipType ) {
123
				return;
124
			}
125
126
			this.memberShipTypeElement.text( this.memberShipType[ state.membershipType ] );
127
			this.setSummaryIcon( this.memberShipTypeIconElement, state.membershipType, this.memberShipTypeIcon );
128
			this.memberShipTypeTextElement.text( this.memberShipTypeText[ state.membershipType ] );
129
		},
130
		getBankAccountSummary: function ( accountLabel, accountNumber, bankLabel, bankNumber ) {
131
			return $( '<dl>' ).addClass( DOM_SELECTORS.classes.summaryBankInfo ).append(
132
				$('<dt>').text( accountLabel ),
133
				$('<dd>').text( accountNumber ),
134
				$('<dt>').text( bankLabel ),
135
				$('<dd>').text( bankNumber )
136
			);
137
		},
138
		getAddressSummaryContent: function ( formContent ) {
139
			if( formContent.addressType === "person" ) {
140
				// TODO Escape HTML (T180215)
141
				// TODO Reuse AddressDisplayHandler
142
				return (
143
						formContent.firstName && formContent.lastName ?
144
							formContent.salutation + ' ' + formContent.title + ' ' + formContent.firstName + ' ' + formContent.lastName + "<br />"
145
							: ''
146
					) +
147
					(formContent.street ? formContent.street + "<br />" : "") +
148
					(formContent.postcode && formContent.city ? formContent.postcode + " " + formContent.city + "<br />" : "") +
149
					( formContent.country ? this.countryTranslations[ formContent.country ] + "<br />" : "") +
150
					formContent.email;
151
			}
152
			else if( formContent.addressType === 'firma' ) {
153
				return (formContent.companyName ? formContent.companyName + "<br />" : "") +
154
					(formContent.street ? formContent.street + "<br />" : "") +
155
					(formContent.postcode && formContent.city ? formContent.postcode + " " + formContent.city + "<br />" : "") +
156
					( formContent.country ? this.countryTranslations[ formContent.country ] + "<br />" : "") +
157
					formContent.email;
158
			}
159
160
			return "";
161
		},
162
		setSummaryIcon: function ( elements, value, iconsDictionary ) {
163
			var icon = iconsDictionary[ value ];
164
165
			elements.removeClass( DOM_SELECTORS.classes.errorIcon );
166
167
			// determine the (dynamic) class matching the previous value, remove it from all elements
168
			if( elements.length && elements.get( 0 ).className.split( ' ' ).length > 1 ) {
169
				elements.removeClass( elements.get( 0 ).className.split( ' ' ).pop() );
170
			}
171
172
			if( icon === undefined ) {
173
				elements
174
					// only configured icons are supposed to communicate validation problems
175
					.filter( function () {
176
						return $( this ).data( DOM_SELECTORS.data.displayError ) === true;
177
					} )
178
					.addClass( DOM_SELECTORS.classes.errorIcon )
179
			}
180
			else {
181
				elements.addClass( icon );
182
			}
183
		}
184
	};
185
186
module.exports = {
187
	createPaymentSummaryDisplayHandler: function ( intervalTextElement, amountElement, paymentTypeElement,
188
		intervalTranslations, paymentTypeTranslations, numberFormatter,
189
		intervalIconElement, intervalIcons, paymentIconsElement, paymentIcons,
190
		periodicityTextElement, periodicityText, paymentElement, paymentText,
191
		addressTypeIconElement, addressTypeIcon, addressTypeElement, addressType,
192
		addressTypeTextElement, countryTranslations,
193
		memberShipTypeElement, memberShipType, memberShipTypeIconElement,
194
		memberShipTypeIcon, memberShipTypeTextElement, memberShipTypeText ) {
195
		return objectAssign( Object.create( PaymentSummaryDisplayHandler ), {
196
			intervalTextElement: intervalTextElement,
197
			amountElement: amountElement,
198
			paymentTypeElement: paymentTypeElement,
199
			intervalTranslations: intervalTranslations,
200
			paymentTypeTranslations: paymentTypeTranslations,
201
			numberFormatter: numberFormatter,
202
			intervalIconElement: intervalIconElement,
203
			intervalIcons: intervalIcons,
204
			paymentIconsElement: paymentIconsElement,
205
			paymentIcons: paymentIcons,
206
			periodicityTextElement: periodicityTextElement,
207
			periodicityText: periodicityText,
208
			paymentElement: paymentElement,
209
			paymentText: paymentText,
210
			addressTypeIconElement: addressTypeIconElement,
211
			addressTypeIcon: addressTypeIcon,
212
			addressTypeElement: addressTypeElement,
213
			addressType: addressType,
214
			addressTypeTextElement: addressTypeTextElement,
215
			countryTranslations: countryTranslations,
216
			memberShipTypeElement: memberShipTypeElement,
217
			memberShipType: memberShipType,
218
			memberShipTypeIconElement: memberShipTypeIconElement,
219
			memberShipTypeIcon: memberShipTypeIcon,
220
			memberShipTypeTextElement: memberShipTypeTextElement,
221
			memberShipTypeText: memberShipTypeText
222
		} );
223
	}
224
};
225