160 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			160 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								// License: LGPL-3.0-or-later
							 | 
						||
| 
								 | 
							
								var flyd = require("flyd")
							 | 
						||
| 
								 | 
							
								var h = require("virtual-dom/h")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = {root: root}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function root(state) {
							 | 
						||
| 
								 | 
							
									return [
							 | 
						||
| 
								 | 
							
										h('header.step-header', h('h4.step-title', 'Preview')),
							 | 
						||
| 
								 | 
							
										h('div.step-inner', [
							 | 
						||
| 
								 | 
							
											body(state.settings)
							 | 
						||
| 
								 | 
							
										])
							 | 
						||
| 
								 | 
							
									]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function body(settings){
							 | 
						||
| 
								 | 
							
									if(settings.designations.name === 'multiple'){
							 | 
						||
| 
								 | 
							
										settings.designations.multiples = objToArray(settings.designations.multiples)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if(settings.amounts.name === 'multiple') {
							 | 
						||
| 
								 | 
							
										settings.amounts.multiples = objToArray(settings.amounts.multiples)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return [
							 | 
						||
| 
								 | 
							
										h('p.strong.u-centered', 'Below is a live preview of your donate form'),
							 | 
						||
| 
								 | 
							
										donateButton(settings),
							 | 
						||
| 
								 | 
							
										table(settings)
							 | 
						||
| 
								 | 
							
									]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function table(settings) {
							 | 
						||
| 
								 | 
							
									var table = h('table.table--plaid',[
							 | 
						||
| 
								 | 
							
										h('tr', [h('td', 'Appearance'), appearanceTd(settings.appearance)]),
							 | 
						||
| 
								 | 
							
										singleOrMultipleRow(settings.designations, 'Designation'),
							 | 
						||
| 
								 | 
							
										singleOrMultipleRow(settings.amounts, 'Amount'),
							 | 
						||
| 
								 | 
							
										h('tr', [h('td', 'Recurring or one-time'), h('td', settings.type.name)]),
							 | 
						||
| 
								 | 
							
								    h('tr', [h('td', 'Hide dedication'), h('td', ifAny(settings.hideDedication ? 'true' :  h('span.u-color--grey', 'false')))]),
							 | 
						||
| 
								 | 
							
										h('tr', [h('td', 'Thank-you page url'), h('td', ifAny(settings.thankYou.url))]),
							 | 
						||
| 
								 | 
							
									])
							 | 
						||
| 
								 | 
							
									return table
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function appearanceTd(data) {
							 | 
						||
| 
								 | 
							
									if(data.name === 'custom image') {
							 | 
						||
| 
								 | 
							
										return h('td', [data.name, h('p.u-color--grey', data.customImg)])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if(data.name === 'custom text') {
							 | 
						||
| 
								 | 
							
										return h('td', [data.name, h('p.u-color--grey', data.customText)])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return h('td', data.name)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function singleOrMultipleRow(obj, text) {
							 | 
						||
| 
								 | 
							
									if(obj.name === 'single'){
							 | 
						||
| 
								 | 
							
										return h('tr', [h('td', text), h('td', obj.single+='')])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if(obj.name === 'multiple'){
							 | 
						||
| 
								 | 
							
										return h('tr', [h('td', text + 's'), h('td', arrayToList(obj.multiples))])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return h('tr', [h('td', text), h('td', h('span.u-color--grey', 'none'))])
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function donateButton(settings) {
							 | 
						||
| 
								 | 
							
									return h('div.u-centered.u-margin--20', {id: 'js-donateButtonWrapper'},
							 | 
						||
| 
								 | 
							
										h('a.commitchange-donate', {attributes: buttonAttributes(settings)},
							 | 
						||
| 
								 | 
							
											[buttonContent(settings.appearance)]
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function buttonAttributes(settings) {
							 | 
						||
| 
								 | 
							
									var appearance = settings.appearance.name
							 | 
						||
| 
								 | 
							
									var attrs = {}
							 | 
						||
| 
								 | 
							
									if(appearance === 'custom image' || appearance === 'custom text') {
							 | 
						||
| 
								 | 
							
										attrs['data-custom'] = ''
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (appearance === 'fixed') {
							 | 
						||
| 
								 | 
							
										attrs['data-fixed'] = ''
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (appearance === 'embedded'){
							 | 
						||
| 
								 | 
							
										attrs['data-embedded'] = ''
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.designations.name === 'single' && settings.designations.single) {
							 | 
						||
| 
								 | 
							
										attrs['data-designation'] = settings.designations.single
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.designations.name === 'multiple' && settings.designations.multiples.length) {
							 | 
						||
| 
								 | 
							
										attrs['data-multiple-designations'] = arrayToStringWithSeparator(settings.designations.multiples, '_')
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.designations.name === 'multiple' && settings.designations.prompt) {
							 | 
						||
| 
								 | 
							
										attrs['data-designations-prompt'] = settings.designations.prompt
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.amounts.name === 'single' && settings.amounts.single) {
							 | 
						||
| 
								 | 
							
										attrs['data-amount'] = settings.amounts.single
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.amounts.name === 'multiple' && settings.amounts.multiples.length) {
							 | 
						||
| 
								 | 
							
										attrs['data-amounts'] = arrayToStringWithSeparator(settings.amounts.multiples, ',')
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.thankYou.url) {
							 | 
						||
| 
								 | 
							
										attrs['data-redirect'] = settings.thankYou.url
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.type.name === 'one time') {
							 | 
						||
| 
								 | 
							
										attrs['data-type'] = 'one-time'
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (settings.type.name === 'recurring') {
							 | 
						||
| 
								 | 
							
										attrs['data-type'] = 'recurring'
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								  if (settings.hideDedication) {
							 | 
						||
| 
								 | 
							
								    attrs['data-hide-dedication'] = ''
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
									return attrs
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function buttonContent(data) {
							 | 
						||
| 
								 | 
							
									if (data.name === 'custom image') {
							 | 
						||
| 
								 | 
							
										return h('img', {src: data.customImg})
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (data.name === 'custom text') {
							 | 
						||
| 
								 | 
							
										return h('span', data.customText)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// todo: add to helpers or make global once we move away from view-script
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function arrayToStringWithSeparator(array, separator) {
							 | 
						||
| 
								 | 
							
									return array.reduce(function(prev, current){
							 | 
						||
| 
								 | 
							
										return prev + separator + current
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function camelCase(string) {
							 | 
						||
| 
								 | 
							
									return string.split(" ").reduce(function(prev, current){
							 | 
						||
| 
								 | 
							
										return prev + current.charAt(0).toUpperCase() + current.slice(1)
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function ifAny(data) {
							 | 
						||
| 
								 | 
							
									if(data) {
							 | 
						||
| 
								 | 
							
										return data
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return h('span.u-color--grey', 'none')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function objToArray(obj) {
							 | 
						||
| 
								 | 
							
									var array = []
							 | 
						||
| 
								 | 
							
									for(var key in obj) {
							 | 
						||
| 
								 | 
							
										if(obj[key]) { array.push(obj[key])}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return array
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function arrayToList(array , cssClass) {
							 | 
						||
| 
								 | 
							
									var cssClass = cssClass ? cssClass : '.' + 'hasBullets--grey'
							 | 
						||
| 
								 | 
							
									var lis = []
							 | 
						||
| 
								 | 
							
									array.map(function(item){
							 | 
						||
| 
								 | 
							
										item+=''
							 | 
						||
| 
								 | 
							
										if(item && item.length) {lis.push(h('li', item))}
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
									return h('ul' + cssClass, lis)
							 | 
						||
| 
								 | 
							
								}
							 |