1$('#add-card').click(async function () { 2 const button = $(this); 3 button.prop('disabled', true); 4 let res = await getAjaxPopUp('getaddcardpopup'); 5 button.prop('disabled', false); 6 if (res) { 7 const apiKey = $(this).data('apikey'); 8 let stripe = Stripe(apiKey); 9 const locale = (language == 'bz') ? 'de' : language; 10 const elements = stripe.elements({ locale: locale }); 11 const style = { 12 base: { 13 color: isDarkMode?'#fff' : '#2a2a2a', 14 fontFamily: '"Helvetica Neue", Helvetica, sans-serif', 15 fontSmoothing: 'antialiased', 16 fontSize: '16px', 17 '::placeholder': { 18 color: '#aab7c4' 19 } 20 }, 21 invalid: { 22 color: '#f04141', 23 iconColor: '#f04141' 24 } 25 }; 26 let card = elements.create('card', { 27 style: style, 28 hidePostalCode: true 29 }); 30 card.mount('#card-element'); 31 card.addEventListener('change', function (event) { 32 let displayError = document.getElementById('card-errors'); 33 if (event.error) { 34 displayError.textContent = event.error.message; 35 } else { 36 displayError.textContent = ''; 37 } 38 }); 39 $(document).on('click', '#confirm-card', async function () { 40 const button = $(this); 41 const intent = $(this).data('intent'); 42 button.prop('disabled', true); 43 stripe.confirmCardSetup(intent, { 44 payment_method: { 45 card: card 46 } 47 }).then(async function (result) { 48 if (result['error']) { 49 presentToast(result['error']['message'], 'fa-triangle-exclamation', 'warning'); 50 } else if (result['setupIntent']) { 51 await addCardToCustomer(result['setupIntent']); 52 $('#add-card-popup').find('.close-and-remove-popup').trigger('click'); 53 } 54 button.prop('disabled', false); 55 }); 56 }); 57 } 58}); 59$(document).on('click', '#creditcard .card .favorit', async function (e) { 60 const button = $(this); 61 const cardEl = $(this).parents('.card'); 62 const pm_id = cardEl.find('.card-inner').data('id'); 63 button.prop('disabled', true); 64 $.ajax({ 65 type: 'GET', 66 url: 'changedefaultcredicard', 67 cache: false, 68 data: { 69 id: pm_id 70 }, 71 success: function (result) { 72 try { 73 let res = JSON.parse(result); 74 if (res['success']) { 75 $('.card-inner').removeClass('active'); 76 cardEl.find('.card-inner').addClass('active'); 77 } else { 78 presentToast(translate['ERROR_GENERAL'], 'fa-triangle-exclamation', 'warning'); 79 } 80 button.prop('disabled', false); 81 } catch (err) { 82 console.error(err, result); 83 } 84 } 85 }); 86}); 87$(document).on('click', '#creditcard .cards .delete', async function (e) { 88 const button = $(this); 89 const cardEl = $(this).parents('.card'); 90 const pm_id = $(this).parents('.card-inner').data('id'); 91 button.prop('disabled', true); 92 $.ajax({ 93 type: 'GET', 94 url: 'removecreditcardfromcustomer', 95 cache: false, 96 data: { 97 id: pm_id 98 }, 99 success: function (result) { 100 try { 101 let res = JSON.parse(result); 102 if (res['success']) { 103 cardEl.remove(); 104 } else { 105 presentToast(translate['ERROR_GENERAL'], 'fa-triangle-exclamation', 'warning'); 106 } 107 } catch (err) { 108 console.error(err, result); 109 } 110 button.prop('disabled', false); 111 } 112 }); 113}); 114function addCardToCustomer(setupIntent) { 115 return new Promise(function (resolve, reject) { 116 $.ajax({ 117 type: 'GET', 118 url: 'addcreditcardtocustomer', 119 cache: false, 120 data: { 121 id: setupIntent['payment_method'] 122 }, 123 success: function (result) { 124 try { 125 let res = JSON.parse(result); 126 if (res['error']) { 127 let error = translate['ERROR_GENERAL']; 128 if (res['message']) 129 error = res['message']; 130 switch (res['error']) { 131 case 'card_declined': 132 error = translate['SETTINGS']['ERROR_CARD_DECLINED']; 133 break; 134 case 'expired_card': 135 error = translate['SETTINGS']['ERROR_EXPIRED_CARD']; 136 break; 137 case 'incorrect_cvc': 138 error = translate['SETTINGS']['ERROR_INCORRECT_CVC']; 139 break; 140 141 case 'processing_error': 142 error = translate['SETTINGS']['ERROR_PROCESSING_ERROR']; 143 break; 144 case 'incorrect_number': 145 error = translate['SETTINGS']['ERROR_INCORRECT_NUMBER']; 146 break; 147 default: 148 break; 149 } 150 presentToast(error, 'fa-triangle-exclamation', 'warning'); 151 } else { 152 if (res['pm']) { 153 let defaultCard = ''; 154 if (res['defaultPaymethod']) { 155 defaultCard = res['defaultPaymethod']; 156 } 157 158 let cardEl = document.createElement('div'); 159 cardEl.className = 'card'; 160 161 let cardInnerEl = document.createElement('div'); 162 cardInnerEl.className = 'card-inner' + ((defaultCard == res['pm']['id']) ? ' active' : ''); 163 cardInnerEl.setAttribute("data-id", res['pm']['id']); 164 165 let activeLabelEl = document.createElement('span'); 166 activeLabelEl.className = 'active-label'; 167 activeLabelEl.textContent = translate['SETTINGS']['ACTIVE_CARD']; 168 169 let deleteEl = document.createElement('div'); 170 deleteEl.className = 'delete'; 171 deleteEl.innerHTML = '<i class="fa-solid fa-tras
171h"></i>'; 172 173 let favoritedEl = document.createElement('div'); 174 favoritedEl.className = 'favorited'; 175 favoritedEl.innerHTML = '<i class="fa-solid fa-star"></i>'; 176 177 let favoritEl = document.createElement('div'); 178 favoritEl.className = 'favorit'; 179 favoritEl.innerHTML = '<i class="fa-regular fa-star"></i>'; 180 181 let iconEl = document.createElement('div'); 182 iconEl.className = 'icon'; 183 iconEl.innerHTML = '<i class="fa-solid fa-credit-card"></i>'; 184 185 let numberEl = document.createElement('div'); 186 numberEl.className = 'number'; 187 numberEl.innerHTML = 'XXXX XXXX XXXX ' + res['pm']['card']['last4']; 188 189 let brandEl = document.createElement('div'); 190 brandEl.className = 'brand'; 191 brandEl.textContent = res['pm']['card']['brand']; 192 193 let expireEl = document.createElement('div'); 194 expireEl.className = 'expire'; 195 let expireTitleEl = document.createElement('div'); 196 expireTitleEl.className = 'expire-title'; 197 expireTitleEl.textContent = translate['SETTINGS']['CARD_EXPIRE_ON']; 198 let expireValueEl = document.createElement('div'); 199 expireValueEl.className = 'expire-value'; 200 expireValueEl.textContent = ((res['pm']['card']['exp_month'].toString().length > 1) ? '' : '0') + res['pm']['card']['exp_month'] + '/' + res['pm']['card']['exp_year']; 201 202 expireEl.appendChild(expireTitleEl); 203 expireEl.appendChild(expireValueEl); 204 cardInnerEl.appendChild(activeLabelEl); 205 cardInnerEl.appendChild(favoritEl); 206 cardInnerEl.appendChild(favoritedEl); 207 cardInnerEl.appendChild(deleteEl); 208 cardInnerEl.appendChild(iconEl); 209 cardInnerEl.appendChild(numberEl); 210 cardInnerEl.appendChild(brandEl); 211 cardInnerEl.appendChild(expireEl); 212 cardEl.appendChild(cardInnerEl); 213 if (defaultCard == res['pm']['id']) 214 $('#creditcard .cards .card-inner').removeClass('active'); 215 $('#creditcard .cards').prepend(cardEl); 216 } 217 } 218 } catch (err) { 219 console.error(err, result); 220 } 221 resolve(true); 222 }, 223 }); 224 }) 225}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.