mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 09:17:32 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			224 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
| /**
 | |
|  * Invoice Ninja (https://invoiceninja.com).
 | |
|  *
 | |
|  * @link https://github.com/invoiceninja/invoiceninja source repository
 | |
|  *
 | |
|  * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
 | |
|  *
 | |
|  * @license https://www.elastic.co/licensing/elastic-license
 | |
|  */
 | |
| 
 | |
| class PayTraceCreditCard {
 | |
|     constructor() {
 | |
|         this.clientKey = document.querySelector(
 | |
|             'meta[name=paytrace-client-key]'
 | |
|         )?.content;
 | |
|     }
 | |
| 
 | |
|     get creditCardStyles() {
 | |
|         return {
 | |
|             'font_color': '#000',
 | |
|             'border_color': '#a1b1c9',
 | |
|             'border_style': 'dotted',
 | |
|             'font_size': '13pt',
 | |
|             'input_border_radius': '3px',
 | |
|             'input_border_width': '1px',
 | |
|             'input_font': 'Times New Roman, arial, fantasy',
 | |
|             'input_font_weight': '400',
 | |
|             'input_margin': '5px 0px 5px 0px',
 | |
|             'input_padding': '0px 5px 0px 5px',
 | |
|             'label_color': '#a0aec0',
 | |
|             'label_size': '16px',
 | |
|             'label_width': '150px',
 | |
|             'label_font': 'Times New Roman, sans-serif, serif',
 | |
|             'label_font_weight': 'light',
 | |
|             'label_margin': '5px 0px 0px 0px',
 | |
|             'label_padding': '0px 5px 0px 5px',
 | |
|             'background_color': 'white',
 | |
|             'height': '30px',
 | |
|             'width': '370px',
 | |
|             'padding_bottom': '0px'
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     get codeStyles() {
 | |
|         return {
 | |
|             'font_color': '#000',
 | |
|             'border_color': '#a1b1c9',
 | |
|             'border_style': 'dotted',
 | |
|             'font_size': '13pt',
 | |
|             'input_border_radius': '2px',
 | |
|             'input_border_width': '1px',
 | |
|             'input_font': 'serif, cursive, fantasy',
 | |
|             'input_font_weight': '700',
 | |
|             'input_margin': '5px 0px 5px 20px',
 | |
|             'input_padding': '0px 5px 0px 5px',
 | |
|             'label_color': '#a0aec0',
 | |
|             'label_size': '16px',
 | |
|             'label_width': '150px',
 | |
|             'label_font': 'sans-serif, arial, serif',
 | |
|             'label_font_weight': 'bold',
 | |
|             'label_margin': '5px 0px 0px 20px',
 | |
|             'label_padding': '2px 5px 2px 5px',
 | |
|             'background_color': 'white',
 | |
|             'height': '30px',
 | |
|             'width': '150px',
 | |
|             'padding_bottom': '2px'
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     get expStyles() {
 | |
|         return {
 | |
|             'font_color': '#000',
 | |
|             'border_color': '#a1b1c9',
 | |
|             'border_style': 'dashed',
 | |
|             'font_size': '12pt',
 | |
|             'input_border_radius': '0px',
 | |
|             'input_border_width': '2px',
 | |
|             'input_font': 'arial, cursive, fantasy',
 | |
|             'input_font_weight': '400',
 | |
|             'input_margin': '5px 0px 5px 0px',
 | |
|             'input_padding': '0px 5px 0px 5px',
 | |
|             'label_color': '#a0aec0',
 | |
|             'label_size': '16px',
 | |
|             'label_width': '150px',
 | |
|             'label_font': 'arial, fantasy, serif',
 | |
|             'label_font_weight': 'normal',
 | |
|             'label_margin': '5px 0px 0px 0px',
 | |
|             'label_padding': '2px 5px 2px 5px',
 | |
|             'background_color': 'white',
 | |
|             'height': '30px',
 | |
|             'width': '85px',
 | |
|             'padding_bottom': '2px',
 | |
|             'type': 'dropdown'
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     updatePayTraceLabels() {
 | |
|         window.PTPayment.getControl('securityCode').label.text(
 | |
|             document.querySelector('meta[name=ctrans-cvv]').content
 | |
|         );
 | |
| 
 | |
|         window.PTPayment.getControl('creditCard').label.text(
 | |
|             document.querySelector('meta[name=ctrans-card_number]').content
 | |
|         );
 | |
| 
 | |
|         window.PTPayment.getControl('expiration').label.text(
 | |
|             document.querySelector('meta[name=ctrans-expires]').content
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     setupPayTrace() {
 | |
|         return window.PTPayment.setup({
 | |
|             styles: {
 | |
|                 code: this.codeStyles,
 | |
|                 cc: this.creditCardStyles,
 | |
|                 exp: this.expStyles,
 | |
|             },
 | |
|             authorization: {
 | |
|                 clientKey: this.clientKey,
 | |
|             },
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     handlePaymentWithCreditCard(event) {
 | |
|         event.target.parentElement.disabled = true;
 | |
|         document.getElementById('errors').hidden = true;
 | |
| 
 | |
|         window.PTPayment.validate((errors) => {
 | |
|             if (errors.length >= 1) {
 | |
|                 let errorsContainer = document.getElementById('errors');
 | |
| 
 | |
|                 errorsContainer.textContent = errors[0].description;
 | |
|                 errorsContainer.hidden = false;
 | |
| 
 | |
|                 return (event.target.parentElement.disabled = false);
 | |
|             }
 | |
| 
 | |
|             this.ptInstance
 | |
|                 .process()
 | |
|                 .then((response) => {
 | |
|                     document.getElementById('HPF_Token').value =
 | |
|                         response.message.hpf_token;
 | |
|                     document.getElementById('enc_key').value =
 | |
|                         response.message.enc_key;
 | |
| 
 | |
|                     let tokenBillingCheckbox = document.querySelector(
 | |
|                         'input[name="token-billing-checkbox"]:checked'
 | |
|                     );
 | |
| 
 | |
|                     if (tokenBillingCheckbox) {
 | |
|                         document.querySelector(
 | |
|                             'input[name="store_card"]'
 | |
|                         ).value = tokenBillingCheckbox.value;
 | |
|                     }
 | |
| 
 | |
|                     document.getElementById('server_response').submit();
 | |
|                 })
 | |
|                 .catch((error) => {
 | |
|                     document.getElementById(
 | |
|                         'errors'
 | |
|                     ).textContent = JSON.stringify(error);
 | |
|                     document.getElementById('errors').hidden = false;
 | |
| 
 | |
|                     console.log(error);
 | |
|                 });
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     handlePaymentWithToken(event) {
 | |
|         event.target.parentElement.disabled = true;
 | |
| 
 | |
|         document.getElementById('server_response').submit();
 | |
|     }
 | |
| 
 | |
|     handle() {
 | |
|         
 | |
|         Array.from(
 | |
|             document.getElementsByClassName('toggle-payment-with-token')
 | |
|         ).forEach((element) =>
 | |
|             element.addEventListener('click', (element) => {
 | |
|                 document
 | |
|                     .getElementById('paytrace--credit-card-container')
 | |
|                     .classList.add('hidden');
 | |
|                 document.getElementById(
 | |
|                     'save-card--container'
 | |
|                 ).style.display = 'none';
 | |
|                 document.querySelector('input[name=token]').value =
 | |
|                     element.target.dataset.token;
 | |
|             })
 | |
|         );
 | |
| 
 | |
|         document
 | |
|             .getElementById('toggle-payment-with-credit-card')
 | |
|             ?.addEventListener('click', (element) => {
 | |
|                 document
 | |
|                     .getElementById('paytrace--credit-card-container')
 | |
|                     .classList.remove('hidden');
 | |
|                 document.getElementById(
 | |
|                     'save-card--container'
 | |
|                 ).style.display = 'grid';
 | |
|                 document.querySelector('input[name=token]').value = '';
 | |
| 
 | |
|                 this.setupPayTrace().then((instance) => {
 | |
|                     this.ptInstance = instance;
 | |
|                     this.updatePayTraceLabels();
 | |
|                 });
 | |
|             });
 | |
| 
 | |
|         document
 | |
|             .getElementById('pay-now')
 | |
|             .addEventListener('click', (e) => {
 | |
|                 if (
 | |
|                     document.querySelector('input[name=token]').value === ''
 | |
|                 ) {
 | |
|                     return this.handlePaymentWithCreditCard(e);
 | |
|                 }
 | |
| 
 | |
|                 return this.handlePaymentWithToken(e);
 | |
|             });
 | |
|     }
 | |
| }
 | |
| 
 | |
| new PayTraceCreditCard().handle();
 |