diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 650b687250ba..892ab4b01a6b 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -18,7 +18,7 @@ jobs: phpunit-versions: ['latest'] ci_node_total: [ 8 ] ci_node_index: [ 0, 1, 2, 3, 4, 5, 6, 7] - laravel: [10.*] + laravel: [11.*] dependency-version: [prefer-stable] env: @@ -103,7 +103,6 @@ jobs: restore-keys: | ${{ runner.os }}-${{ matrix.php }}-composer- - - name: Install composer dependencies run: | composer config -g github-oauth.github.com ${{ secrets.GITHUB_TOKEN }} diff --git a/app/DataMapper/BaseSettings.php b/app/DataMapper/BaseSettings.php index 4cc61589abb9..882f1ed0ba8b 100644 --- a/app/DataMapper/BaseSettings.php +++ b/app/DataMapper/BaseSettings.php @@ -16,13 +16,6 @@ namespace App\DataMapper; */ class BaseSettings { - // //@deprecated - // public function __construct($obj) - // { - // // foreach ($obj as $key => $value) { - // // $obj->{$key} = $value; - // // } - // } public static function setCasts($obj, $casts) { diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index 2e201f637fe9..3aaf31106c3d 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -522,8 +522,6 @@ class CompanySettings extends BaseSettings public string $email_template_payment_failed = ''; public static $casts = [ - 'email_template_payment_failed' => 'string', - 'email_subject_payment_failed' => 'string', 'payment_flow' => 'string', 'enable_quote_reminder1' => 'bool', 'quote_num_days_reminder1' => 'int', @@ -774,6 +772,8 @@ class CompanySettings extends BaseSettings 'portal_custom_js' => 'string', 'client_portal_enable_uploads' => 'bool', 'purchase_order_number_counter' => 'integer', + 'email_template_payment_failed' => 'string', + 'email_subject_payment_failed' => 'string', ]; public static $free_plan_casts = [ diff --git a/app/DataMapper/EmailTemplateDefaults.php b/app/DataMapper/EmailTemplateDefaults.php index 0d34fcfe4897..24579e9fa244 100644 --- a/app/DataMapper/EmailTemplateDefaults.php +++ b/app/DataMapper/EmailTemplateDefaults.php @@ -140,7 +140,7 @@ class EmailTemplateDefaults public static function emailPaymentFailedTemplate() { - return '
$client
'.ctrans('texts.client_payment_failure_body', ['invoice' => '$number', 'amount' => '$amount']).'
$client
'.ctrans('texts.client_payment_failure_body', ['invoice' => '$number', 'amount' => '$amount']).'
CVV is required
"),document.getElementById("card_button").disabled=!1,document.querySelector("#card_button > svg").classList.add("hidden"),document.querySelector("#card_button > span").classList.remove("hidden");return}var t=$("#my-card"),a={};a.clientKey=this.publicKey,a.apiLoginID=this.loginId;var d={};d.cardNumber=t.CardJs("cardNumber").replace(/[^\d]/g,""),d.month=t.CardJs("expiryMonth").replace(/[^\d]/g,""),d.year=t.CardJs("expiryYear").replace(/[^\d]/g,""),d.cardCode=document.getElementById("cvv").value.replace(/[^\d]/g,"");var r={};return r.authData=a,r.cardData=d,document.getElementById("card_button").disabled=!0,document.querySelector("#card_button > svg").classList.remove("hidden"),document.querySelector("#card_button > span").classList.add("hidden"),Accept.dispatchData(r,this.responseHandler),!1}responseHandler(e){if(e.messages.resultCode==="Error"){var t=0,a=$("#errors");a.show().html(""+e.messages.message[t].code+": "+e.messages.message[t].text+"
"),document.getElementById("card_button").disabled=!1,document.querySelector("#card_button > svg").classList.add("hidden"),document.querySelector("#card_button > span").classList.remove("hidden")}else e.messages.resultCode==="Ok"&&(document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue,document.getElementById("server_response").submit());return!1}handle(){return this.cardButton.addEventListener("click",()=>{this.cardButton.disabled=!this.cardButton.disabled,this.handleAuthorization()}),this}}const c=document.querySelector('meta[name="authorize-public-key"]').content,o=document.querySelector('meta[name="authorize-login-id"]').content,s=document.querySelector('meta[name="authnet-require-cvv"]').content;new n(c,o).handle(); diff --git a/public/build/assets/authorize-credit-card-payment-222655bd.js b/public/build/assets/authorize-credit-card-payment-222655bd.js new file mode 100644 index 000000000000..77e6ff82fcac --- /dev/null +++ b/public/build/assets/authorize-credit-card-payment-222655bd.js @@ -0,0 +1,9 @@ +var m=Object.defineProperty;var y=(n,e,t)=>e in n?m(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var o=(n,e,t)=>(y(n,typeof e!="symbol"?e+"":e,t),t);import{i as h,w as g}from"./wait-8f4ae121.js";/** + * 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 p{constructor(e,t){o(this,"handleAuthorization",()=>{var c,l,s,i;if(this.cvvRequired=="1"&&document.getElementById("cvv").value.length<3){const r=document.getElementById("errors");r&&(r.innerText="CVV is required",r.style.display="block"),document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden");return}var e={};e.clientKey=this.publicKey,e.apiLoginID=this.loginId;var t={};t.cardNumber=(c=this.sc.value("number"))==null?void 0:c.replace(/[^\d]/g,""),t.month=(l=this.sc.value("month"))==null?void 0:l.replace(/[^\d]/g,""),t.year=`20${(s=this.sc.value("year"))==null?void 0:s.replace(/[^\d]/g,"")}`,t.cardCode=(i=this.sc.value("cvv"))==null?void 0:i.replace(/[^\d]/g,"");var a={};return a.authData=e,a.cardData=t,document.getElementById("pay-now")&&(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden")),Accept.dispatchData(a,this.responseHandler),!1});o(this,"responseHandler",e=>{if(e.messages.resultCode==="Error"){var t=0;const a=document.getElementById("errors");a&&(a.innerText=`${e.messages.message[t].code}: ${e.messages.message[t].text}`,a.style.display="block"),document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}else if(e.messages.resultCode==="Ok"){document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue;let a=document.querySelector("input[name=token-billing-checkbox]:checked");a&&(document.getElementById("store_card").value=a.value),document.getElementById("server_response").submit()}return!1});o(this,"handle",()=>{Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(a=>a.addEventListener("click",d=>{document.getElementById("save-card--container").style.display="none",document.getElementById("authorize--credit-card-container").style.display="none",document.getElementById("token").value=d.target.dataset.token}));let e=document.getElementById("toggle-payment-with-credit-card");e&&e.addEventListener("click",()=>{document.getElementById("save-card--container").style.display="grid",document.getElementById("authorize--credit-card-container").style.display="flex",document.getElementById("token").value=null});let t=document.getElementById("pay-now");return t&&t.addEventListener("click",a=>{let d=document.getElementById("token");d.value?this.handlePayNowAction(d.value):this.handleAuthorization()}),this});this.publicKey=e,this.loginId=t,this.cardHolderName=document.getElementById("cardholder_name"),this.sc=createSimpleCard({fields:{card:{number:"#number",date:"#date",cvv:"#cvv"}}}),this.sc.mount(),this.cvvRequired=document.querySelector('meta[name="authnet-require-cvv"]').content}handlePayNowAction(e){document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),document.getElementById("token").value=e,document.getElementById("server_response").submit()}}function u(){const n=document.querySelector('meta[name="authorize-public-key"]').content,e=document.querySelector('meta[name="authorize-login-id"]').content;new p(n,e).handle()}h()?u():g("#authorize-net-credit-card-payment").then(()=>u()); diff --git a/public/build/assets/authorize-credit-card-payment-a217579b.js b/public/build/assets/authorize-credit-card-payment-a217579b.js deleted file mode 100644 index 1f462a77a11e..000000000000 --- a/public/build/assets/authorize-credit-card-payment-a217579b.js +++ /dev/null @@ -1,9 +0,0 @@ -var l=Object.defineProperty;var c=(d,e,t)=>e in d?l(d,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):d[e]=t;var o=(d,e,t)=>(c(d,typeof e!="symbol"?e+"":e,t),t);/** - * 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 s{constructor(e,t){o(this,"handleAuthorization",()=>{if(m=="1"&&document.getElementById("cvv").value.length<3){var e=$("#errors");e.show().html("CVV is required
"),document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden");return}var t=$("#my-card"),n={};n.clientKey=this.publicKey,n.apiLoginID=this.loginId;var a={};a.cardNumber=t.CardJs("cardNumber").replace(/[^\d]/g,""),a.month=t.CardJs("expiryMonth").replace(/[^\d]/g,""),a.year=t.CardJs("expiryYear").replace(/[^\d]/g,""),a.cardCode=document.getElementById("cvv").value.replace(/[^\d]/g,"");var r={};return r.authData=n,r.cardData=a,document.getElementById("pay-now")&&(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden")),Accept.dispatchData(r,this.responseHandler),!1});o(this,"responseHandler",e=>{if(e.messages.resultCode==="Error"){var t=0,n=$("#errors");n.show().html(""+e.messages.message[t].code+": "+e.messages.message[t].text+"
"),document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}else if(e.messages.resultCode==="Ok"){document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue;let a=document.querySelector("input[name=token-billing-checkbox]:checked");a&&(document.getElementById("store_card").value=a.value),document.getElementById("server_response").submit()}return!1});o(this,"handle",()=>{Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(n=>n.addEventListener("click",a=>{document.getElementById("save-card--container").style.display="none",document.getElementById("authorize--credit-card-container").style.display="none",document.getElementById("token").value=a.target.dataset.token}));let e=document.getElementById("toggle-payment-with-credit-card");e&&e.addEventListener("click",()=>{document.getElementById("save-card--container").style.display="grid",document.getElementById("authorize--credit-card-container").style.display="flex",document.getElementById("token").value=null});let t=document.getElementById("pay-now");return t&&t.addEventListener("click",n=>{let a=document.getElementById("token");a.value?this.handlePayNowAction(a.value):this.handleAuthorization()}),this});this.publicKey=e,this.loginId=t,this.cardHolderName=document.getElementById("cardholder_name")}handlePayNowAction(e){document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),document.getElementById("token").value=e,document.getElementById("server_response").submit()}}const u=document.querySelector('meta[name="authorize-public-key"]').content,i=document.querySelector('meta[name="authorize-login-id"]').content,m=document.querySelector('meta[name="authnet-require-cvv"]').content;new s(u,i).handle(); diff --git a/public/build/assets/authorize-stripe-acss-f6bd46c1.js b/public/build/assets/authorize-stripe-acss-f6bd46c1.js new file mode 100644 index 000000000000..34c2126d897c --- /dev/null +++ b/public/build/assets/authorize-stripe-acss-f6bd46c1.js @@ -0,0 +1,9 @@ +import{w as y}from"./wait-8f4ae121.js";/** + * Invoice Ninja (https://invoiceninja.com). + * + * @link https://github.com/invoiceninja/invoiceninja source repository + * + * @copyright Copyright (c) 2024. Invoice Ninja LLC (https://invoiceninja.com) + * + * @license https://www.elastic.co/licensing/elastic-license + */y("#stripe-acss-authorize").then(()=>f());function f(){var i,l,o;let n;const a=(i=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:i.content,r=(l=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:l.content;a&&a.length>0?n=Stripe(r,{stripeAccount:a}):n=Stripe(r);const c=document.getElementById("acss-name"),s=document.getElementById("acss-email-address"),t=document.getElementById("authorize-acss"),d=(o=document.querySelector('meta[name="stripe-pi-client-secret"]'))==null?void 0:o.content,e=document.getElementById("errors");t.addEventListener("click",async u=>{u.preventDefault(),e.hidden=!0,t.disabled=!0;const m=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;if(s.value.length<3||!s.value.match(m)){e.textContent="Please enter a valid email address.",e.hidden=!1,t.disabled=!1;return}if(c.value.length<3){e.textContent="Please enter a name for the account holder.",e.hidden=!1,t.disabled=!1;return}const{setupIntent:p,error:h}=await n.confirmAcssDebitSetup(d,{payment_method:{billing_details:{name:c.value,email:s.value}}});document.getElementById("gateway_response").value=JSON.stringify(p??h),document.getElementById("server_response").submit()})} diff --git a/public/build/assets/braintree-ach-3d6b328f.js b/public/build/assets/braintree-ach-3d6b328f.js new file mode 100644 index 000000000000..e6fab3d9fe0b --- /dev/null +++ b/public/build/assets/braintree-ach-3d6b328f.js @@ -0,0 +1,9 @@ +import{i as l,w as c}from"./wait-8f4ae121.js";/** + * 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 + */function i(){var o;window.braintree.client.create({authorization:(o=document.querySelector('meta[name="client-token"]'))==null?void 0:o.content}).then(function(t){return braintree.usBankAccount.create({client:t})}).then(function(t){var a;(a=document.getElementById("authorize-bank-account"))==null||a.addEventListener("click",r=>{r.target.parentElement.disabled=!0,document.getElementById("errors").hidden=!0,document.getElementById("errors").textContent="";let n={accountNumber:document.getElementById("account-number").value,routingNumber:document.getElementById("routing-number").value,accountType:document.querySelector('input[name="account-type"]:checked').value,ownershipType:document.querySelector('input[name="ownership-type"]:checked').value,billingAddress:{streetAddress:document.getElementById("billing-street-address").value,extendedAddress:document.getElementById("billing-extended-address").value,locality:document.getElementById("billing-locality").value,region:document.getElementById("billing-region").value,postalCode:document.getElementById("billing-postal-code").value}};if(n.ownershipType==="personal"){let e=document.getElementById("account-holder-name").value.split(" ",2);n.firstName=e[0],n.lastName=e[1]}else n.businessName=document.getElementById("account-holder-name").value;t.tokenize({bankDetails:n,mandateText:'By clicking ["Checkout"], I authorize Braintree, a service of PayPal, on behalf of [your business name here] (i) to verify my bank account information using bank information and consumer reports and (ii) to debit my bank account.'}).then(function(e){document.querySelector("input[name=nonce]").value=e.nonce,document.getElementById("server_response").submit()}).catch(function(e){r.target.parentElement.disabled=!1,document.getElementById("errors").textContent=`${e.details.originalError.message} ${e.details.originalError.details.originalError[0].message}`,document.getElementById("errors").hidden=!1})})}).catch(function(t){document.getElementById("errors").textContent=t.message,document.getElementById("errors").hidden=!1})}l()?i():c("#braintree-ach-authorize").then(()=>i()); diff --git a/public/build/assets/braintree-ach-b29d040e.js b/public/build/assets/braintree-ach-b29d040e.js deleted file mode 100644 index 326e0c7aa173..000000000000 --- a/public/build/assets/braintree-ach-b29d040e.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * 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 - */var a;window.braintree.client.create({authorization:(a=document.querySelector('meta[name="client-token"]'))==null?void 0:a.content}).then(function(t){return braintree.usBankAccount.create({client:t})}).then(function(t){var o;(o=document.getElementById("authorize-bank-account"))==null||o.addEventListener("click",r=>{r.target.parentElement.disabled=!0,document.getElementById("errors").hidden=!0,document.getElementById("errors").textContent="";let n={accountNumber:document.getElementById("account-number").value,routingNumber:document.getElementById("routing-number").value,accountType:document.querySelector('input[name="account-type"]:checked').value,ownershipType:document.querySelector('input[name="ownership-type"]:checked').value,billingAddress:{streetAddress:document.getElementById("billing-street-address").value,extendedAddress:document.getElementById("billing-extended-address").value,locality:document.getElementById("billing-locality").value,region:document.getElementById("billing-region").value,postalCode:document.getElementById("billing-postal-code").value}};if(n.ownershipType==="personal"){let e=document.getElementById("account-holder-name").value.split(" ",2);n.firstName=e[0],n.lastName=e[1]}else n.businessName=document.getElementById("account-holder-name").value;t.tokenize({bankDetails:n,mandateText:'By clicking ["Checkout"], I authorize Braintree, a service of PayPal, on behalf of [your business name here] (i) to verify my bank account information using bank information and consumer reports and (ii) to debit my bank account.'}).then(function(e){document.querySelector("input[name=nonce]").value=e.nonce,document.getElementById("server_response").submit()}).catch(function(e){r.target.parentElement.disabled=!1,document.getElementById("errors").textContent=`${e.details.originalError.message} ${e.details.originalError.details.originalError[0].message}`,document.getElementById("errors").hidden=!1})})}).catch(function(t){document.getElementById("errors").textContent=t.message,document.getElementById("errors").hidden=!1}); diff --git a/public/build/assets/braintree-credit-card-1c3f3108.js b/public/build/assets/braintree-credit-card-1c3f3108.js deleted file mode 100644 index f9a4e882261c..000000000000 --- a/public/build/assets/braintree-credit-card-1c3f3108.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * 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 i{initBraintreeDataCollector(){window.braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content},function(e,n){window.braintree.dataCollector.create({client:n,paypal:!0},function(t,a){t||(document.querySelector("input[name=client-data]").value=a.deviceData)})})}mountBraintreePaymentWidget(){window.braintree.dropin.create({authorization:document.querySelector("meta[name=client-token]").content,container:"#dropin-container",threeDSecure:document.querySelector("input[name=threeds_enable]").value.toLowerCase()==="true"},this.handleCallback)}handleCallback(e,n){if(e){console.error(e);return}let t=document.getElementById("pay-now");params=JSON.parse(document.querySelector("input[name=threeds]").value),t.addEventListener("click",()=>{n.requestPaymentMethod({threeDSecure:{challengeRequested:!0,amount:params.amount,email:params.email,billingAddress:{givenName:params.billingAddress.givenName,surname:params.billingAddress.surname,phoneNumber:params.billingAddress.phoneNumber,streetAddress:params.billingAddress.streetAddress,extendedAddress:params.billingAddress.extendedAddress,locality:params.billingAddress.locality,region:params.billingAddress.region,postalCode:params.billingAddress.postalCode,countryCodeAlpha2:params.billingAddress.countryCodeAlpha2}}},function(a,r){if(a){console.log(a),dropin.clearSelectedPaymentMethod(),alert("There was a problem verifying this card, please contact your merchant");return}if(document.querySelector("input[name=threeds_enable]").value==="true"&&!r.liabilityShifted){console.log("Liability did not shift",r),alert("There was a problem verifying this card, please contact your merchant");return}t.disabled=!0,t.querySelector("svg").classList.remove("hidden"),t.querySelector("span").classList.add("hidden"),document.querySelector("input[name=gateway_response]").value=JSON.stringify(r);let d=document.querySelector('input[name="token-billing-checkbox"]:checked');d&&(document.querySelector('input[name="store_card"]').value=d.value),document.getElementById("server-response").submit()})})}handle(){this.initBraintreeDataCollector(),this.mountBraintreePaymentWidget(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(n=>n.addEventListener("click",t=>{document.getElementById("dropin-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=t.target.dataset.token,document.getElementById("pay-now-with-token").classList.remove("hidden"),document.getElementById("pay-now").classList.add("hidden")})),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",n=>{document.getElementById("dropin-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="",document.getElementById("pay-now-with-token").classList.add("hidden"),document.getElementById("pay-now").classList.remove("hidden")});let e=document.getElementById("pay-now-with-token");e.addEventListener("click",n=>{e.disabled=!0,e.querySelector("svg").classList.remove("hidden"),e.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()})}}new i().handle(); diff --git a/public/build/assets/braintree-credit-card-60bd8878.js b/public/build/assets/braintree-credit-card-60bd8878.js new file mode 100644 index 000000000000..d2c7d7f9820e --- /dev/null +++ b/public/build/assets/braintree-credit-card-60bd8878.js @@ -0,0 +1,9 @@ +import{i as l,w as s}from"./wait-8f4ae121.js";/** + * 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 c{initBraintreeDataCollector(){window.braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content},function(t,r){window.braintree.dataCollector.create({client:r,paypal:!0},function(n,e){n||(document.querySelector("input[name=client-data]").value=e.deviceData)})})}mountBraintreePaymentWidget(){window.braintree.dropin.create({authorization:document.querySelector("meta[name=client-token]").content,container:"#dropin-container",threeDSecure:document.querySelector("input[name=threeds_enable]").value.toLowerCase()==="true"},this.handleCallback)}handleCallback(t,r){if(t){console.error(t);return}let n=document.getElementById("pay-now"),e=JSON.parse(document.querySelector("input[name=threeds]").value);n.addEventListener("click",()=>{r.requestPaymentMethod({threeDSecure:{challengeRequested:!0,amount:e.amount,email:e.email,billingAddress:{givenName:e.billingAddress.givenName,surname:e.billingAddress.surname,phoneNumber:e.billingAddress.phoneNumber,streetAddress:e.billingAddress.streetAddress,extendedAddress:e.billingAddress.extendedAddress,locality:e.billingAddress.locality,region:e.billingAddress.region,postalCode:e.billingAddress.postalCode,countryCodeAlpha2:e.billingAddress.countryCodeAlpha2}}},function(i,a){if(i){console.log(i),dropin.clearSelectedPaymentMethod(),alert("There was a problem verifying this card, please contact your merchant");return}if(document.querySelector("input[name=threeds_enable]").value==="true"&&!a.liabilityShifted){console.log("Liability did not shift",a),alert("There was a problem verifying this card, please contact your merchant");return}n.disabled=!0,n.querySelector("svg").classList.remove("hidden"),n.querySelector("span").classList.add("hidden"),document.querySelector("input[name=gateway_response]").value=JSON.stringify(a);let d=document.querySelector('input[name="token-billing-checkbox"]:checked');d&&(document.querySelector('input[name="store_card"]').value=d.value),document.getElementById("server-response").submit()})})}handle(){this.initBraintreeDataCollector(),this.mountBraintreePaymentWidget(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(r=>r.addEventListener("click",n=>{document.getElementById("dropin-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=n.target.dataset.token,document.getElementById("pay-now-with-token").classList.remove("hidden"),document.getElementById("pay-now").classList.add("hidden")})),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",r=>{document.getElementById("dropin-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="",document.getElementById("pay-now-with-token").classList.add("hidden"),document.getElementById("pay-now").classList.remove("hidden")});let t=document.getElementById("pay-now-with-token");t.addEventListener("click",r=>{t.disabled=!0,t.querySelector("svg").classList.remove("hidden"),t.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()})}}function o(){new c().handle()}l()?o():s("#braintree-credit-card-payment","meta[name=client-token]").then(()=>o()); diff --git a/public/build/assets/braintree-paypal-45391805.js b/public/build/assets/braintree-paypal-f78ad64b.js similarity index 69% rename from public/build/assets/braintree-paypal-45391805.js rename to public/build/assets/braintree-paypal-f78ad64b.js index 662aab2a1bc2..98e40ff55193 100644 --- a/public/build/assets/braintree-paypal-45391805.js +++ b/public/build/assets/braintree-paypal-f78ad64b.js @@ -1,4 +1,4 @@ -/** +import{i as s,w as u}from"./wait-8f4ae121.js";/** * Invoice Ninja (https://invoiceninja.com). * * @link https://github.com/invoiceninja/invoiceninja source repository @@ -6,4 +6,4 @@ * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) * * @license https://www.elastic.co/licensing/elastic-license - */class a{initBraintreeDataCollector(){window.braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content},function(e,t){window.braintree.dataCollector.create({client:t,paypal:!0},function(n,o){n||(document.querySelector("input[name=client-data]").value=o.deviceData)})})}static getPaymentDetails(){return{flow:"vault"}}static handleErrorMessage(e){let t=document.getElementById("errors");t.innerText=e,t.hidden=!1}handlePaymentWithToken(){Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(t=>t.addEventListener("click",n=>{document.getElementById("paypal-button").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=n.target.dataset.token,document.getElementById("pay-now-with-token").classList.remove("hidden"),document.getElementById("pay-now").classList.add("hidden")}));let e=document.getElementById("pay-now-with-token");e.addEventListener("click",t=>{e.disabled=!0,e.querySelector("svg").classList.remove("hidden"),e.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()})}handle(){this.initBraintreeDataCollector(),this.handlePaymentWithToken(),braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content}).then(function(e){return braintree.paypalCheckout.create({client:e})}).then(function(e){return e.loadPayPalSDK({vault:!0}).then(function(t){return paypal.Buttons({fundingSource:paypal.FUNDING.PAYPAL,createBillingAgreement:function(){return t.createPayment(a.getPaymentDetails())},onApprove:function(n,o){return t.tokenizePayment(n).then(function(i){let r=document.querySelector('input[name="token-billing-checkbox"]:checked');r&&(document.querySelector('input[name="store_card"]').value=r.value),document.querySelector("input[name=gateway_response]").value=JSON.stringify(i),document.getElementById("server-response").submit()})},onCancel:function(n){},onError:function(n){console.log(n.message),a.handleErrorMessage(n.message)}}).render("#paypal-button")})}).catch(function(e){console.log(e.message),a.handleErrorMessage(e.message)})}}new a().handle(); + */class a{initBraintreeDataCollector(){window.braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content},function(e,t){window.braintree.dataCollector.create({client:t,paypal:!0},function(n,o){n||(document.querySelector("input[name=client-data]").value=o.deviceData)})})}static getPaymentDetails(){return{flow:"vault"}}static handleErrorMessage(e){let t=document.getElementById("errors");t.innerText=e,t.hidden=!1}handlePaymentWithToken(){Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(t=>t.addEventListener("click",n=>{document.getElementById("paypal-button").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=n.target.dataset.token,document.getElementById("pay-now-with-token").classList.remove("hidden"),document.getElementById("pay-now").classList.add("hidden")}));let e=document.getElementById("pay-now-with-token");e.addEventListener("click",t=>{e.disabled=!0,e.querySelector("svg").classList.remove("hidden"),e.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()})}handle(){this.initBraintreeDataCollector(),this.handlePaymentWithToken(),braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content}).then(function(e){return braintree.paypalCheckout.create({client:e})}).then(function(e){return e.loadPayPalSDK({vault:!0}).then(function(t){return paypal.Buttons({fundingSource:paypal.FUNDING.PAYPAL,createBillingAgreement:function(){return t.createPayment(a.getPaymentDetails())},onApprove:function(n,o){return t.tokenizePayment(n).then(function(d){var i,c;(i=document.querySelector("#paypal-button"))==null||i.classList.add("hidden"),(c=document.querySelector("#paypal-spinner"))==null||c.classList.remove("hidden");let r=document.querySelector('input[name="token-billing-checkbox"]:checked');r&&(document.querySelector('input[name="store_card"]').value=r.value),document.querySelector("input[name=gateway_response]").value=JSON.stringify(d),document.getElementById("server-response").submit()})},onCancel:function(n){},onError:function(n){console.log(n.message),a.handleErrorMessage(n.message)}}).render("#paypal-button")})}).catch(function(e){console.log(e.message),a.handleErrorMessage(e.message)})}}function l(){new a().handle()}s()?l():u("#braintree-paypal-payment").then(()=>l()); diff --git a/public/build/assets/checkout-credit-card-2cca8b36.js b/public/build/assets/checkout-credit-card-2cca8b36.js new file mode 100644 index 000000000000..cc32bdcba638 --- /dev/null +++ b/public/build/assets/checkout-credit-card-2cca8b36.js @@ -0,0 +1,9 @@ +import{i as s,w as i}from"./wait-8f4ae121.js";/** + * 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 a{constructor(){this.tokens=[]}handlePaymentUsingToken(t){document.getElementById("checkout--container").classList.add("hidden"),document.getElementById("pay-now-with-token--container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=t.target.dataset.token}handlePaymentUsingCreditCard(t){document.getElementById("checkout--container").classList.remove("hidden"),document.getElementById("pay-now-with-token--container").classList.add("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="";const e=document.getElementById("pay-button"),d=document.querySelector('meta[name="public-key"]').content??"",o=document.getElementById("payment-form");Frames.init(d),Frames.addEventHandler(Frames.Events.CARD_VALIDATION_CHANGED,function(n){e.disabled=!Frames.isCardValid()}),Frames.addEventHandler(Frames.Events.CARD_TOKENIZATION_FAILED,function(n){e.disabled=!1}),Frames.addEventHandler(Frames.Events.CARD_TOKENIZED,function(n){e.disabled=!0,document.querySelector('input[name="gateway_response"]').value=JSON.stringify(n),document.querySelector('input[name="store_card"]').value=document.querySelector("input[name=token-billing-checkbox]:checked").value,document.getElementById("server-response").submit()}),o.addEventListener("submit",function(n){n.preventDefault(),e.disabled=!0,Frames.submitCard()})}completePaymentUsingToken(t){let e=document.getElementById("pay-now-with-token");e.disabled=!0,e.querySelector("svg").classList.remove("hidden"),e.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()}handle(){this.handlePaymentUsingCreditCard(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(t=>t.addEventListener("click",this.handlePaymentUsingToken)),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",this.handlePaymentUsingCreditCard),document.getElementById("pay-now-with-token").addEventListener("click",this.completePaymentUsingToken)}}function r(){new a().handle()}s()?r():i("#checkout-credit-card-payment").then(()=>new a().handle()); diff --git a/public/build/assets/checkout-credit-card-8a04938c.js b/public/build/assets/checkout-credit-card-8a04938c.js deleted file mode 100644 index 0125ca29bec6..000000000000 --- a/public/build/assets/checkout-credit-card-8a04938c.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * 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 o{constructor(){this.tokens=[]}mountFrames(){console.log("Mount checkout frames..")}handlePaymentUsingToken(t){document.getElementById("checkout--container").classList.add("hidden"),document.getElementById("pay-now-with-token--container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=t.target.dataset.token}handlePaymentUsingCreditCard(t){document.getElementById("checkout--container").classList.remove("hidden"),document.getElementById("pay-now-with-token--container").classList.add("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="";const e=document.getElementById("pay-button"),d=document.querySelector('meta[name="public-key"]').content??"",a=document.getElementById("payment-form");Frames.init(d),Frames.addEventHandler(Frames.Events.CARD_VALIDATION_CHANGED,function(n){e.disabled=!Frames.isCardValid()}),Frames.addEventHandler(Frames.Events.CARD_TOKENIZATION_FAILED,function(n){e.disabled=!1}),Frames.addEventHandler(Frames.Events.CARD_TOKENIZED,function(n){e.disabled=!0,document.querySelector('input[name="gateway_response"]').value=JSON.stringify(n),document.querySelector('input[name="store_card"]').value=document.querySelector("input[name=token-billing-checkbox]:checked").value,document.getElementById("server-response").submit()}),a.addEventListener("submit",function(n){n.preventDefault(),e.disabled=!0,Frames.submitCard()})}completePaymentUsingToken(t){let e=document.getElementById("pay-now-with-token");e.disabled=!0,e.querySelector("svg").classList.remove("hidden"),e.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()}handle(){this.handlePaymentUsingCreditCard(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(t=>t.addEventListener("click",this.handlePaymentUsingToken)),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",this.handlePaymentUsingCreditCard),document.getElementById("pay-now-with-token").addEventListener("click",this.completePaymentUsingToken)}}new o().handle(); diff --git a/public/build/assets/eway-credit-card-62ce5f3b.js b/public/build/assets/eway-credit-card-150298fa.js similarity index 81% rename from public/build/assets/eway-credit-card-62ce5f3b.js rename to public/build/assets/eway-credit-card-150298fa.js index 3c3ceed101ae..c666a834e504 100644 --- a/public/build/assets/eway-credit-card-62ce5f3b.js +++ b/public/build/assets/eway-credit-card-150298fa.js @@ -1,4 +1,4 @@ -/** +import{i as d,w as n}from"./wait-8f4ae121.js";/** * Invoice Ninja (https://invoiceninja.com). * * @link https://github.com/invoiceninja/invoiceninja source repository @@ -6,4 +6,4 @@ * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) * * @license https://www.elastic.co/licensing/elastic-license - */class i{constructor(){this.cardStyles="padding: 2px; border: 1px solid #AAA; border-radius: 3px; height: 34px; width: 100%;",this.errorCodes=new Map,this.errorCodes.set("V6000","Validation error"),this.errorCodes.set("V6001","Invalid CustomerIP"),this.errorCodes.set("V6002","Invalid DeviceID"),this.errorCodes.set("V6003","Invalid Request PartnerID"),this.errorCodes.set("V6004","Invalid Request Method"),this.errorCodes.set("V6010","Invalid TransactionType, account not certified for eCome only MOTO or Recurring available"),this.errorCodes.set("V6011","Invalid Payment TotalAmount"),this.errorCodes.set("V6012","Invalid Payment InvoiceDescription"),this.errorCodes.set("V6013","Invalid Payment InvoiceNumber"),this.errorCodes.set("V6014","Invalid Payment InvoiceReference"),this.errorCodes.set("V6015","Invalid Payment CurrencyCode"),this.errorCodes.set("V6016","Payment Required"),this.errorCodes.set("V6017","Payment CurrencyCode Required"),this.errorCodes.set("V6018","Unknown Payment CurrencyCode"),this.errorCodes.set("V6019","Cardholder identity authentication required"),this.errorCodes.set("V6020","Cardholder Input Required"),this.errorCodes.set("V6021","EWAY_CARDHOLDERNAME Required"),this.errorCodes.set("V6022","EWAY_CARDNUMBER Required"),this.errorCodes.set("V6023","EWAY_CARDCVN Required"),this.errorCodes.set("V6024","Cardholder Identity Authentication One Time Password Not Active Yet"),this.errorCodes.set("V6025","PIN Required"),this.errorCodes.set("V6033","Invalid Expiry Date"),this.errorCodes.set("V6034","Invalid Issue Number"),this.errorCodes.set("V6035","Invalid Valid From Date"),this.errorCodes.set("V6039","Invalid Network Token Status"),this.errorCodes.set("V6040","Invalid TokenCustomerID"),this.errorCodes.set("V6041","Customer Required"),this.errorCodes.set("V6042","Customer FirstName Required"),this.errorCodes.set("V6043","Customer LastName Required"),this.errorCodes.set("V6044","Customer CountryCode Required"),this.errorCodes.set("V6045","Customer Title Required"),this.errorCodes.set("V6046","TokenCustomerID Required"),this.errorCodes.set("V6047","RedirectURL Required"),this.errorCodes.set("V6048","CheckoutURL Required when CheckoutPayment specified"),this.errorCodes.set("V6049","nvalid Checkout URL"),this.errorCodes.set("V6051","Invalid Customer FirstName"),this.errorCodes.set("V6052","Invalid Customer LastName"),this.errorCodes.set("V6053","Invalid Customer CountryCode"),this.errorCodes.set("V6058","Invalid Customer Title"),this.errorCodes.set("V6059","Invalid RedirectURL"),this.errorCodes.set("V6060","Invalid TokenCustomerID"),this.errorCodes.set("V6061","Invalid Customer Reference"),this.errorCodes.set("V6062","Invalid Customer CompanyName"),this.errorCodes.set("V6063","Invalid Customer JobDescription"),this.errorCodes.set("V6064","Invalid Customer Street1"),this.errorCodes.set("V6065","Invalid Customer Street2"),this.errorCodes.set("V6066","Invalid Customer City"),this.errorCodes.set("V6067","Invalid Customer State"),this.errorCodes.set("V6068","Invalid Customer PostalCode"),this.errorCodes.set("V6069","Invalid Customer Email"),this.errorCodes.set("V6070","Invalid Customer Phone"),this.errorCodes.set("V6071","Invalid Customer Mobile"),this.errorCodes.set("V6072","Invalid Customer Comments"),this.errorCodes.set("V6073","Invalid Customer Fax"),this.errorCodes.set("V6074","Invalid Customer URL"),this.errorCodes.set("V6075","Invalid ShippingAddress FirstName"),this.errorCodes.set("V6076","Invalid ShippingAddress LastName"),this.errorCodes.set("V6077","Invalid ShippingAddress Street1"),this.errorCodes.set("V6078","Invalid ShippingAddress Street2"),this.errorCodes.set("V6079","Invalid ShippingAddress City"),this.errorCodes.set("V6080","Invalid ShippingAddress State"),this.errorCodes.set("V6081","Invalid ShippingAddress PostalCode"),this.errorCodes.set("V6082","Invalid ShippingAddress Email"),this.errorCodes.set("V6083","Invalid ShippingAddress Phone"),this.errorCodes.set("V6084","Invalid ShippingAddress Country"),this.errorCodes.set("V6085","Invalid ShippingAddress ShippingMethod"),this.errorCodes.set("V6086","Invalid ShippingAddress Fax"),this.errorCodes.set("V6091","Unknown Customer CountryCode"),this.errorCodes.set("V6092","Unknown ShippingAddress CountryCode"),this.errorCodes.set("V6093","Insufficient Address Information"),this.errorCodes.set("V6100","Invalid EWAY_CARDNAME"),this.errorCodes.set("V6101","Invalid EWAY_CARDEXPIRYMONTH"),this.errorCodes.set("V6102","Invalid EWAY_CARDEXPIRYYEAR"),this.errorCodes.set("V6103","Invalid EWAY_CARDSTARTMONTH"),this.errorCodes.set("V6104","Invalid EWAY_CARDSTARTYEAR"),this.errorCodes.set("V6105","Invalid EWAY_CARDISSUENUMBER"),this.errorCodes.set("V6106","Invalid EWAY_CARDCVN"),this.errorCodes.set("V6107","Invalid EWAY_ACCESSCODE"),this.errorCodes.set("V6108","Invalid CustomerHostAddress"),this.errorCodes.set("V6109","Invalid UserAgent"),this.errorCodes.set("V6110","Invalid EWAY_CARDNUMBER"),this.errorCodes.set("V6111","Unauthorised API Access, Account Not PCI Certified"),this.errorCodes.set("V6112","Redundant card details other than expiry year and month"),this.errorCodes.set("V6113","Invalid transaction for refund"),this.errorCodes.set("V6114","Gateway validation error"),this.errorCodes.set("V6115","Invalid DirectRefundRequest, Transaction ID"),this.errorCodes.set("V6116","Invalid card data on original TransactionID"),this.errorCodes.set("V6117","Invalid CreateAccessCodeSharedRequest, FooterText"),this.errorCodes.set("V6118","Invalid CreateAccessCodeSharedRequest, HeaderText"),this.errorCodes.set("V6119","Invalid CreateAccessCodeSharedRequest, Language"),this.errorCodes.set("V6120","Invalid CreateAccessCodeSharedRequest, LogoUrl"),this.errorCodes.set("V6121","Invalid TransactionSearch, Filter Match Type"),this.errorCodes.set("V6122","Invalid TransactionSearch, Non numeric Transaction ID"),this.errorCodes.set("V6123","Invalid TransactionSearch,no TransactionID or AccessCode specified"),this.errorCodes.set("V6124","Invalid Line Items. The line items have been provided however the totals do not match the TotalAmount field"),this.errorCodes.set("V6125","Selected Payment Type not enabled"),this.errorCodes.set("V6126","Invalid encrypted card number, decryption failed"),this.errorCodes.set("V6127","Invalid encrypted cvn, decryption failed"),this.errorCodes.set("V6128","Invalid Method for Payment Type"),this.errorCodes.set("V6129","Transaction has not been authorised for Capture/Cancellation"),this.errorCodes.set("V6130","Generic customer information error"),this.errorCodes.set("V6131","Generic shipping information error"),this.errorCodes.set("V6132","Transaction has already been completed or voided, operation not permitted"),this.errorCodes.set("V6133","Checkout not available for Payment Type"),this.errorCodes.set("V6134","Invalid Auth Transaction ID for Capture/Void"),this.errorCodes.set("V6135","PayPal Error Processing Refund"),this.errorCodes.set("V6136","Original transaction does not exist or state is incorrect"),this.errorCodes.set("V6140","Merchant account is suspended"),this.errorCodes.set("V6141","Invalid PayPal account details or API signature"),this.errorCodes.set("V6142","Authorise not available for Bank/Branch"),this.errorCodes.set("V6143","Invalid Public Key"),this.errorCodes.set("V6144","Method not available with Public API Key Authentication"),this.errorCodes.set("V6145","Credit Card not allow if Token Customer ID is provided with Public API Key Authentication"),this.errorCodes.set("V6146","Client Side Encryption Key Missing or Invalid"),this.errorCodes.set("V6147","Unable to Create One Time Code for Secure Field"),this.errorCodes.set("V6148","Secure Field has Expired"),this.errorCodes.set("V6149","Invalid Secure Field One Time Code"),this.errorCodes.set("V6150","Invalid Refund Amount"),this.errorCodes.set("V6151","Refund amount greater than original transaction"),this.errorCodes.set("V6152","Original transaction already refunded for total amount"),this.errorCodes.set("V6153","Card type not support by merchant"),this.errorCodes.set("V6154","Insufficent Funds Available For Refund"),this.errorCodes.set("V6155","Missing one or more fields in request"),this.errorCodes.set("V6160","Encryption Method Not Supported"),this.errorCodes.set("V6161","Encryption failed, missing or invalid key"),this.errorCodes.set("V6165","Invalid Click-to-Pay (Visa Checkout) data or decryption failed"),this.errorCodes.set("V6170","Invalid TransactionSearch, Invoice Number is not unique"),this.errorCodes.set("V6171","Invalid TransactionSearch, Invoice Number not found"),this.errorCodes.set("V6220","Three domain secure XID invalid"),this.errorCodes.set("V6221","Three domain secure ECI invalid"),this.errorCodes.set("V6222","Three domain secure AVV invalid"),this.errorCodes.set("V6223","Three domain secure XID is required"),this.errorCodes.set("V6224","Three Domain Secure ECI is required"),this.errorCodes.set("V6225","Three Domain Secure AVV is required"),this.errorCodes.set("V6226","Three Domain Secure AuthStatus is required"),this.errorCodes.set("V6227","Three Domain Secure AuthStatus invalid"),this.errorCodes.set("V6228","Three domain secure Version is required"),this.errorCodes.set("V6230","Three domain secure Directory Server Txn ID invalid"),this.errorCodes.set("V6231","Three domain secure Directory Server Txn ID is required"),this.errorCodes.set("V6232","Three domain secure Version is invalid"),this.errorCodes.set("V6501","Invalid Amex InstallementPlan"),this.errorCodes.set("V6502","Invalid Number Of Installements for Amex. Valid values are from 0 to 99 inclusive"),this.errorCodes.set("V6503","Merchant Amex ID required"),this.errorCodes.set("V6504","Invalid Merchant Amex ID"),this.errorCodes.set("V6505","Merchant Terminal ID required"),this.errorCodes.set("V6506","Merchant category code required"),this.errorCodes.set("V6507","Invalid merchant category code"),this.errorCodes.set("V6508","Amex 3D ECI required"),this.errorCodes.set("V6509","Invalid Amex 3D ECI"),this.errorCodes.set("V6510","Invalid Amex 3D verification value"),this.errorCodes.set("V6511","Invalid merchant location data"),this.errorCodes.set("V6512","Invalid merchant street address"),this.errorCodes.set("V6513","Invalid merchant city"),this.errorCodes.set("V6514","Invalid merchant country"),this.errorCodes.set("V6515","Invalid merchant phone"),this.errorCodes.set("V6516","Invalid merchant postcode"),this.errorCodes.set("V6517","Amex connection error"),this.errorCodes.set("V6518","Amex EC Card Details API returned invalid data"),this.errorCodes.set("V6520","Invalid or missing Amex Point Of Sale Data"),this.errorCodes.set("V6521","Invalid or missing Amex transaction date time"),this.errorCodes.set("V6522","Invalid or missing Amex Original transaction date time"),this.errorCodes.set("V6530","Credit Card Number in non Credit Card Field")}get groupFieldConfig(){var e,t,r,s,o;return{publicApiKey:(e=document.querySelector("meta[name=public-api-key]"))==null?void 0:e.content,fieldDivId:"eway-secure-panel",fieldType:"group",styles:"",layout:{fonts:["Lobster"],rows:[{styles:"",cells:[{colSpan:12,styles:"margin-top: 15px;",label:{fieldColSpan:4,text:(t=document.querySelector("meta[name=translation-card-name]"))==null?void 0:t.content,styles:""},field:{fieldColSpan:8,fieldType:"name",styles:this.cardStyles,divStyles:"padding-left: 10px;"}},{colSpan:12,styles:"margin-top: 15px;",label:{fieldColSpan:4,text:(r=document.querySelector("meta[name=translation-expiry_date]"))==null?void 0:r.content,styles:""},field:{fieldColSpan:8,fieldType:"expirytext",styles:this.cardStyles,divStyles:"padding-left: 10px;"}}]},{styles:"",cells:[{colSpan:12,styles:"margin-top: 15px;",label:{fieldColSpan:4,text:(s=document.querySelector("meta[name=translation-card_number]"))==null?void 0:s.content,styles:""},field:{fieldColSpan:8,fieldType:"card",styles:this.cardStyles}},{colSpan:12,styles:"margin-top: 15px;",label:{fieldColSpan:4,text:(o=document.querySelector("meta[name=translation-cvv]"))==null?void 0:o.content,styles:""},field:{fieldColSpan:8,fieldType:"cvn",styles:this.cardStyles}}]}]}}}securePanelCallback(e){if(document.getElementById("errors").hidden=!0,e.errors)return this.handleErrors(e.errors);document.getElementById("authorize-card")&&(document.getElementById("authorize-card").disabled=!1),document.getElementById("pay-now")&&(document.getElementById("pay-now").disabled=!1),document.querySelector("input[name=securefieldcode]").value=e.secureFieldCode}handleErrors(e){let t=e.split(" "),r="";t.forEach(s=>{r=r.concat(this.errorCodes.get(s)+"CVV is required
"); - - document.getElementById('card_button').disabled = false; - document.querySelector('#card_button > svg').classList.add('hidden'); - document.querySelector('#card_button > span').classList.remove('hidden'); - + document.getElementById('pay-now').disabled = false; + document.querySelector('#pay-now > svg').classList.add('hidden'); + document + .querySelector('#pay-now > span') + .classList.remove('hidden'); return; } - var myCard = $('#my-card'); - var authData = {}; authData.clientKey = this.publicKey; authData.apiLoginID = this.loginId; var cardData = {}; - cardData.cardNumber = myCard.CardJs('cardNumber').replace(/[^\d]/g, ''); - cardData.month = myCard.CardJs('expiryMonth').replace(/[^\d]/g, ''); - cardData.year = myCard.CardJs('expiryYear').replace(/[^\d]/g, ''); - cardData.cardCode = document.getElementById("cvv").value.replace(/[^\d]/g, '');; + cardData.cardNumber = this.sc.value('number')?.replace(/[^\d]/g, ''); + cardData.month = this.sc.value('month')?.replace(/[^\d]/g, ''); + cardData.year = `20${this.sc.value('year')?.replace(/[^\d]/g, '')}`; + cardData.cardCode = this.sc.value('cvv')?.replace(/[^\d]/g, ''); var secureData = {}; secureData.authData = authData; @@ -61,8 +76,12 @@ class AuthorizeAuthorizeCard { if (response.messages.resultCode === "Error") { var i = 0; - var $errors = $('#errors'); // get the reference of the div - $errors.show().html("" + response.messages.message[i].code + ": " + response.messages.message[i].text + "
"); + const $errors = document.getElementById('errors'); // get the reference of the div + + if ($errors) { + $errors.innerText = `${response.messages.message[i].code}: ${response.messages.message[i].text}`; + $errors.style.display = 'block'; + } document.getElementById('card_button').disabled = false; document.querySelector('#card_button > svg').classList.add('hidden'); diff --git a/resources/js/clients/payment_methods/braintree-ach.js b/resources/js/clients/payment_methods/braintree-ach.js index e646c8de0ee3..aa4f4e1cc5a4 100644 --- a/resources/js/clients/payment_methods/braintree-ach.js +++ b/resources/js/clients/payment_methods/braintree-ach.js @@ -8,61 +8,67 @@ * @license https://www.elastic.co/licensing/elastic-license */ -window.braintree.client.create({ - authorization: document.querySelector('meta[name="client-token"]')?.content -}).then(function (clientInstance) { - return braintree.usBankAccount.create({ - client: clientInstance - }); -}).then(function (usBankAccountInstance) { - document - .getElementById('authorize-bank-account') - ?.addEventListener('click', (e) => { - e.target.parentElement.disabled = true; +import { instant, wait } from '../wait'; - document.getElementById('errors').hidden = true; - document.getElementById('errors').textContent = ''; - - let bankDetails = { - accountNumber: document.getElementById('account-number').value, - routingNumber: document.getElementById('routing-number').value, - accountType: document.querySelector('input[name="account-type"]:checked').value, - ownershipType: document.querySelector('input[name="ownership-type"]:checked').value, - billingAddress: { - streetAddress: document.getElementById('billing-street-address').value, - extendedAddress: document.getElementById('billing-extended-address').value, - locality: document.getElementById('billing-locality').value, - region: document.getElementById('billing-region').value, - postalCode: document.getElementById('billing-postal-code').value - } - } - - if (bankDetails.ownershipType === 'personal') { - let name = document.getElementById('account-holder-name').value.split(' ', 2); - - bankDetails.firstName = name[0]; - bankDetails.lastName = name[1]; - } else { - bankDetails.businessName = document.getElementById('account-holder-name').value; - } - - usBankAccountInstance.tokenize({ - bankDetails, - mandateText: 'By clicking ["Checkout"], I authorize Braintree, a service of PayPal, on behalf of [your business name here] (i) to verify my bank account information using bank information and consumer reports and (ii) to debit my bank account.' - }).then(function (payload) { - document.querySelector('input[name=nonce]').value = payload.nonce; - document.getElementById('server_response').submit(); - }) - .catch(function (error) { - e.target.parentElement.disabled = false; - - document.getElementById('errors').textContent = `${error.details.originalError.message} ${error.details.originalError.details.originalError[0].message}`; - document.getElementById('errors').hidden = false; - }); +function boot() { + window.braintree.client.create({ + authorization: document.querySelector('meta[name="client-token"]')?.content + }).then(function (clientInstance) { + return braintree.usBankAccount.create({ + client: clientInstance }); -}).catch(function (err) { + }).then(function (usBankAccountInstance) { + document + .getElementById('authorize-bank-account') + ?.addEventListener('click', (e) => { + e.target.parentElement.disabled = true; + + document.getElementById('errors').hidden = true; + document.getElementById('errors').textContent = ''; + + let bankDetails = { + accountNumber: document.getElementById('account-number').value, + routingNumber: document.getElementById('routing-number').value, + accountType: document.querySelector('input[name="account-type"]:checked').value, + ownershipType: document.querySelector('input[name="ownership-type"]:checked').value, + billingAddress: { + streetAddress: document.getElementById('billing-street-address').value, + extendedAddress: document.getElementById('billing-extended-address').value, + locality: document.getElementById('billing-locality').value, + region: document.getElementById('billing-region').value, + postalCode: document.getElementById('billing-postal-code').value + } + } + + if (bankDetails.ownershipType === 'personal') { + let name = document.getElementById('account-holder-name').value.split(' ', 2); + + bankDetails.firstName = name[0]; + bankDetails.lastName = name[1]; + } else { + bankDetails.businessName = document.getElementById('account-holder-name').value; + } + + usBankAccountInstance.tokenize({ + bankDetails, + mandateText: 'By clicking ["Checkout"], I authorize Braintree, a service of PayPal, on behalf of [your business name here] (i) to verify my bank account information using bank information and consumer reports and (ii) to debit my bank account.' + }).then(function (payload) { + document.querySelector('input[name=nonce]').value = payload.nonce; + document.getElementById('server_response').submit(); + }) + .catch(function (error) { + e.target.parentElement.disabled = false; + + document.getElementById('errors').textContent = `${error.details.originalError.message} ${error.details.originalError.details.originalError[0].message}`; + document.getElementById('errors').hidden = false; + }); + }); + }).catch(function (err) { + + document.getElementById('errors').textContent = err.message; + document.getElementById('errors').hidden = false; + + }); +} - document.getElementById('errors').textContent = err.message; - document.getElementById('errors').hidden = false; - -}); +instant() ? boot() : wait('#braintree-ach-authorize').then(() => boot()); diff --git a/resources/js/clients/payments/authorize-credit-card-payment.js b/resources/js/clients/payments/authorize-credit-card-payment.js index 2d4ec69b3546..1c2c8d88b6a4 100644 --- a/resources/js/clients/payments/authorize-credit-card-payment.js +++ b/resources/js/clients/payments/authorize-credit-card-payment.js @@ -5,40 +5,64 @@ * * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) * - * @license https://www.elastic.co/licensing/elastic-license + * @license https://www.elastic.co/licensing/elastic-license */ -class AuthorizeAuthorizeCard { +import { wait, instant } from '../wait'; +class AuthorizeAuthorizeCard { constructor(publicKey, loginId) { this.publicKey = publicKey; this.loginId = loginId; - this.cardHolderName = document.getElementById("cardholder_name"); + this.cardHolderName = document.getElementById('cardholder_name'); + + this.sc = createSimpleCard({ + fields: { + card: { + number: '#number', + date: '#date', + cvv: '#cvv', + }, + }, + }); + + this.sc.mount(); + + this.cvvRequired = document.querySelector( + 'meta[name="authnet-require-cvv"]' + ).content; + } handleAuthorization = () => { + if ( + this.cvvRequired == '1' && + document.getElementById('cvv').value.length < 3 + ) { + const $errors = document.getElementById('errors'); - if (cvvRequired == "1" && document.getElementById("cvv").value.length < 3) { - var $errors = $('#errors'); - $errors.show().html("CVV is required
"); + if ($errors) { + $errors.innerText = 'CVV is required'; + $errors.style.display = 'block'; + } document.getElementById('pay-now').disabled = false; document.querySelector('#pay-now > svg').classList.add('hidden'); - document.querySelector('#pay-now > span').classList.remove('hidden'); + document + .querySelector('#pay-now > span') + .classList.remove('hidden'); return; } - var myCard = $('#my-card'); - var authData = {}; authData.clientKey = this.publicKey; authData.apiLoginID = this.loginId; var cardData = {}; - cardData.cardNumber = myCard.CardJs('cardNumber').replace(/[^\d]/g, ''); - cardData.month = myCard.CardJs('expiryMonth').replace(/[^\d]/g, ''); - cardData.year = myCard.CardJs('expiryYear').replace(/[^\d]/g, ''); - cardData.cardCode = document.getElementById("cvv").value.replace(/[^\d]/g, ''); + cardData.cardNumber = this.sc.value('number')?.replace(/[^\d]/g, ''); + cardData.month = this.sc.value('month')?.replace(/[^\d]/g, ''); + cardData.year = `20${this.sc.value('year')?.replace(/[^\d]/g, '')}`; + cardData.cardCode = this.sc.value('cvv')?.replace(/[^\d]/g, ''); var secureData = {}; secureData.authData = authData; @@ -58,102 +82,111 @@ class AuthorizeAuthorizeCard { Accept.dispatchData(secureData, this.responseHandler); return false; - - } + }; handlePayNowAction(token_hashed_id) { document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); document.querySelector('#pay-now > span').classList.add('hidden'); - document.getElementById("token").value = token_hashed_id; - document.getElementById("server_response").submit(); + document.getElementById('token').value = token_hashed_id; + document.getElementById('server_response').submit(); } responseHandler = (response) => { - if (response.messages.resultCode === "Error") { + if (response.messages.resultCode === 'Error') { var i = 0; - var $errors = $('#errors'); // get the reference of the div - $errors.show().html("" + response.messages.message[i].code + ": " + response.messages.message[i].text + "
"); + const $errors = document.getElementById('errors'); // get the reference of the div + + if ($errors) { + $errors.innerText = `${response.messages.message[i].code}: ${response.messages.message[i].text}`; + $errors.style.display = 'block'; + } document.getElementById('pay-now').disabled = false; document.querySelector('#pay-now > svg').classList.add('hidden'); - document.querySelector('#pay-now > span').classList.remove('hidden'); - } else if (response.messages.resultCode === "Ok") { + document + .querySelector('#pay-now > span') + .classList.remove('hidden'); + } else if (response.messages.resultCode === 'Ok') { + document.getElementById('dataDescriptor').value = + response.opaqueData.dataDescriptor; + document.getElementById('dataValue').value = + response.opaqueData.dataValue; - document.getElementById("dataDescriptor").value = response.opaqueData.dataDescriptor; - document.getElementById("dataValue").value = response.opaqueData.dataValue; - - let storeCard = document.querySelector('input[name=token-billing-checkbox]:checked'); + let storeCard = document.querySelector( + 'input[name=token-billing-checkbox]:checked' + ); if (storeCard) { - document.getElementById("store_card").value = storeCard.value; + document.getElementById('store_card').value = storeCard.value; } - document.getElementById("server_response").submit(); + document.getElementById('server_response').submit(); } return false; - } - + }; handle = () => { - Array - .from(document.getElementsByClassName('toggle-payment-with-token')) - .forEach((element) => element.addEventListener('click', (e) => { - document - .getElementById('save-card--container').style.display = 'none'; - document - .getElementById('authorize--credit-card-container').style.display = 'none'; + Array.from( + document.getElementsByClassName('toggle-payment-with-token') + ).forEach((element) => + element.addEventListener('click', (e) => { + document.getElementById('save-card--container').style.display = + 'none'; + document.getElementById( + 'authorize--credit-card-container' + ).style.display = 'none'; - document - .getElementById('token').value = e.target.dataset.token; - })); + document.getElementById('token').value = e.target.dataset.token; + }) + ); - let payWithCreditCardToggle = document.getElementById('toggle-payment-with-credit-card'); + let payWithCreditCardToggle = document.getElementById( + 'toggle-payment-with-credit-card' + ); if (payWithCreditCardToggle) { - payWithCreditCardToggle - .addEventListener('click', () => { - document - .getElementById('save-card--container').style.display = 'grid'; - document - .getElementById('authorize--credit-card-container').style.display = 'flex'; + payWithCreditCardToggle.addEventListener('click', () => { + document.getElementById('save-card--container').style.display = + 'grid'; + document.getElementById( + 'authorize--credit-card-container' + ).style.display = 'flex'; - document - .getElementById('token').value = null; - }); + document.getElementById('token').value = null; + }); } let payNowButton = document.getElementById('pay-now'); if (payNowButton) { - payNowButton - .addEventListener('click', (e) => { - let token = document.getElementById('token'); + payNowButton.addEventListener('click', (e) => { + let token = document.getElementById('token'); - token.value - ? this.handlePayNowAction(token.value) - : this.handleAuthorization(); - }); + token.value + ? this.handlePayNowAction(token.value) + : this.handleAuthorization(); + }); } return this; - } + }; } -const publicKey = document.querySelector( - 'meta[name="authorize-public-key"]' -).content; +function boot() { + const publicKey = document.querySelector( + 'meta[name="authorize-public-key"]' + ).content; -const loginId = document.querySelector( - 'meta[name="authorize-login-id"]' -).content; + const loginId = document.querySelector( + 'meta[name="authorize-login-id"]' + ).content; -const cvvRequired = document.querySelector( - 'meta[name="authnet-require-cvv"]' -).content; + /** @handle */ + new AuthorizeAuthorizeCard(publicKey, loginId).handle(); +} -/** @handle */ -new AuthorizeAuthorizeCard(publicKey, loginId).handle(); +instant() ? boot() : wait('#authorize-net-credit-card-payment').then(() => boot()); diff --git a/resources/js/clients/payments/braintree-credit-card.js b/resources/js/clients/payments/braintree-credit-card.js index 1c7dacac0489..b959706dc952 100644 --- a/resources/js/clients/payments/braintree-credit-card.js +++ b/resources/js/clients/payments/braintree-credit-card.js @@ -8,6 +8,7 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; class BraintreeCreditCard { initBraintreeDataCollector() { @@ -43,40 +44,39 @@ class BraintreeCreditCard { } let payNow = document.getElementById('pay-now'); - - params = JSON.parse(document.querySelector('input[name=threeds]').value); + let params = JSON.parse(document.querySelector('input[name=threeds]').value); payNow.addEventListener('click', () => { dropinInstance.requestPaymentMethod({ threeDSecure: { - challengeRequested:true, - amount: params.amount, - email: params.email, - billingAddress: { - givenName: params.billingAddress.givenName, // ASCII-printable characters required, else will throw a validation error - surname: params.billingAddress.surname, // ASCII-printable characters required, else will throw a validation error - phoneNumber: params.billingAddress.phoneNumber, - streetAddress: params.billingAddress.streetAddress, - extendedAddress: params.billingAddress.extendedAddress, - locality: params.billingAddress.locality, - region: params.billingAddress.region, - postalCode: params.billingAddress.postalCode, - countryCodeAlpha2: params.billingAddress.countryCodeAlpha2 - } + challengeRequested: true, + amount: params.amount, + email: params.email, + billingAddress: { + givenName: params.billingAddress.givenName, // ASCII-printable characters required, else will throw a validation error + surname: params.billingAddress.surname, // ASCII-printable characters required, else will throw a validation error + phoneNumber: params.billingAddress.phoneNumber, + streetAddress: params.billingAddress.streetAddress, + extendedAddress: params.billingAddress.extendedAddress, + locality: params.billingAddress.locality, + region: params.billingAddress.region, + postalCode: params.billingAddress.postalCode, + countryCodeAlpha2: params.billingAddress.countryCodeAlpha2 + } + } + }, function (err, payload) { + if (err) { + console.log(err); + dropin.clearSelectedPaymentMethod(); + alert("There was a problem verifying this card, please contact your merchant"); + return; + } + + if (document.querySelector('input[name=threeds_enable]').value === 'true' && !payload.liabilityShifted) { + console.log('Liability did not shift', payload); + alert("There was a problem verifying this card, please contact your merchant"); + return; } - }, function(err, payload) { - if (err) { - console.log(err); - dropin.clearSelectedPaymentMethod(); - alert("There was a problem verifying this card, please contact your merchant"); - return; - } - - if (document.querySelector('input[name=threeds_enable]').value === 'true' && !payload.liabilityShifted) { - console.log('Liability did not shift', payload); - alert("There was a problem verifying this card, please contact your merchant"); - return; - } payNow.disabled = true; @@ -138,4 +138,8 @@ class BraintreeCreditCard { } } -new BraintreeCreditCard().handle(); +function boot() { + new BraintreeCreditCard().handle(); +} + +instant() ? boot() : wait('#braintree-credit-card-payment', 'meta[name=client-token]').then(() => boot()); diff --git a/resources/js/clients/payments/braintree-paypal.js b/resources/js/clients/payments/braintree-paypal.js index affaf1cb26b2..4f0a4965fd5b 100644 --- a/resources/js/clients/payments/braintree-paypal.js +++ b/resources/js/clients/payments/braintree-paypal.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class BraintreePayPal { initBraintreeDataCollector() { window.braintree.client.create({ @@ -86,6 +88,9 @@ class BraintreePayPal { onApprove: function (data, actions) { return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) { + document.querySelector('#paypal-button')?.classList.add('hidden'); + document.querySelector('#paypal-spinner')?.classList.remove('hidden'); + let tokenBillingCheckbox = document.querySelector( 'input[name="token-billing-checkbox"]:checked' ); @@ -119,4 +124,8 @@ class BraintreePayPal { } } -new BraintreePayPal().handle(); +function boot() { + new BraintreePayPal().handle(); +} + +instant() ? boot() : wait('#braintree-paypal-payment').then(() => boot()); diff --git a/resources/js/clients/payments/checkout-credit-card.js b/resources/js/clients/payments/checkout-credit-card.js index bb32fa7337ce..ed07906efd48 100644 --- a/resources/js/clients/payments/checkout-credit-card.js +++ b/resources/js/clients/payments/checkout-credit-card.js @@ -5,64 +5,70 @@ * * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) * - * @license https://www.elastic.co/licensing/elastic-license + * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class CheckoutCreditCard { constructor() { this.tokens = []; } - mountFrames() { - console.log('Mount checkout frames..'); - } - handlePaymentUsingToken(e) { document.getElementById('checkout--container').classList.add('hidden'); - document.getElementById('pay-now-with-token--container').classList.remove('hidden'); + document + .getElementById('pay-now-with-token--container') + .classList.remove('hidden'); document.getElementById('save-card--container').style.display = 'none'; - document - .querySelector('input[name=token]') - .value = e.target.dataset.token; + document.querySelector('input[name=token]').value = + e.target.dataset.token; } handlePaymentUsingCreditCard(e) { - document.getElementById('checkout--container').classList.remove('hidden'); - document.getElementById('pay-now-with-token--container').classList.add('hidden'); + document + .getElementById('checkout--container') + .classList.remove('hidden'); + document + .getElementById('pay-now-with-token--container') + .classList.add('hidden'); document.getElementById('save-card--container').style.display = 'grid'; - document - .querySelector('input[name=token]') - .value = ''; + document.querySelector('input[name=token]').value = ''; const payButton = document.getElementById('pay-button'); - - const publicKey = document.querySelector('meta[name="public-key"]').content ?? ''; + + const publicKey = + document.querySelector('meta[name="public-key"]').content ?? ''; const form = document.getElementById('payment-form'); Frames.init(publicKey); - Frames.addEventHandler(Frames.Events.CARD_VALIDATION_CHANGED, function (event) { - payButton.disabled = !Frames.isCardValid(); - }); + Frames.addEventHandler( + Frames.Events.CARD_VALIDATION_CHANGED, + function (event) { + payButton.disabled = !Frames.isCardValid(); + } + ); - Frames.addEventHandler(Frames.Events.CARD_TOKENIZATION_FAILED, function (event) { - payButton.disabled = false; - }); + Frames.addEventHandler( + Frames.Events.CARD_TOKENIZATION_FAILED, + function (event) { + payButton.disabled = false; + } + ); Frames.addEventHandler(Frames.Events.CARD_TOKENIZED, function (event) { payButton.disabled = true; - document.querySelector( - 'input[name="gateway_response"]' - ).value = JSON.stringify(event); + document.querySelector('input[name="gateway_response"]').value = + JSON.stringify(event); - document.querySelector( - 'input[name="store_card"]' - ).value = document.querySelector( - 'input[name=token-billing-checkbox]:checked' - ).value; + document.querySelector('input[name="store_card"]').value = + document.querySelector( + 'input[name=token-billing-checkbox]:checked' + ).value; document.getElementById('server-response').submit(); }); @@ -87,9 +93,11 @@ class CheckoutCreditCard { handle() { this.handlePaymentUsingCreditCard(); - Array - .from(document.getElementsByClassName('toggle-payment-with-token')) - .forEach((element) => element.addEventListener('click', this.handlePaymentUsingToken)); + Array.from( + document.getElementsByClassName('toggle-payment-with-token') + ).forEach((element) => + element.addEventListener('click', this.handlePaymentUsingToken) + ); document .getElementById('toggle-payment-with-credit-card') @@ -101,4 +109,10 @@ class CheckoutCreditCard { } } -new CheckoutCreditCard().handle(); +function boot() { + new CheckoutCreditCard().handle() +} + +instant() ? boot() : wait('#checkout-credit-card-payment').then(() => + new CheckoutCreditCard().handle() +); diff --git a/resources/js/clients/payments/eway-credit-card.js b/resources/js/clients/payments/eway-credit-card.js index 3d4f99297e70..c4ba16b2d14c 100644 --- a/resources/js/clients/payments/eway-credit-card.js +++ b/resources/js/clients/payments/eway-credit-card.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class EwayRapid { constructor() { this.cardStyles = @@ -431,6 +433,11 @@ class EwayRapid { completeAuthorization(event) { event.target.parentElement.disabled = true; + const button = document.getElementById('authorize-card'); + + button.querySelector('svg').classList.remove('hidden'); + button.querySelector('span').classList.add('hidden'); + document.getElementById('server-response').submit(); } @@ -483,8 +490,7 @@ class EwayRapid { }) ); - if (document.getElementById('toggle-payment-with-credit-card')) - { + if (document.getElementById('toggle-payment-with-credit-card')) { document .getElementById('toggle-payment-with-credit-card') .addEventListener('click', (element) => { @@ -498,9 +504,14 @@ class EwayRapid { }); } + const payNowButton = document.getElementById('pay-now'); + document.getElementById('pay-now')?.addEventListener('click', (e) => { let tokenInput = document.querySelector('input[name=token]'); + payNowButton.querySelector('svg').classList.remove('hidden'); + payNowButton.querySelector('span').classList.add('hidden'); + if (tokenInput.value) { return this.completePaymentUsingToken(e); } @@ -510,4 +521,8 @@ class EwayRapid { } } -new EwayRapid().handle(); +function boot() { + new EwayRapid().handle(); +} + +instant() ? boot() : wait('#eway-credit-card-payment').then(() => boot()); diff --git a/resources/js/clients/payments/forte-ach-payment.js b/resources/js/clients/payments/forte-ach-payment.js index 90bf9f675377..8e50c5e2a2ba 100644 --- a/resources/js/clients/payments/forte-ach-payment.js +++ b/resources/js/clients/payments/forte-ach-payment.js @@ -8,6 +8,8 @@ * @license https://opensource.org/licenses/AAL */ +import { wait, instant } from '../wait'; + class ForteAuthorizeACH { constructor(apiLoginId) { this.apiLoginId = apiLoginId; @@ -73,9 +75,13 @@ class ForteAuthorizeACH { }; } -const apiLoginId = document.querySelector( - 'meta[name="forte-api-login-id"]' -).content; +function boot() { + const apiLoginId = document.querySelector( + 'meta[name="forte-api-login-id"]' + ).content; + + /** @handle */ + new ForteAuthorizeACH(apiLoginId).handle(); +} -/** @handle */ -new ForteAuthorizeACH(apiLoginId).handle(); +instant() ? boot() : wait('#force-ach-payment').then(() => boot()); diff --git a/resources/js/clients/payments/forte-credit-card-payment.js b/resources/js/clients/payments/forte-credit-card-payment.js index e406d2153911..c06fc7396793 100644 --- a/resources/js/clients/payments/forte-credit-card-payment.js +++ b/resources/js/clients/payments/forte-credit-card-payment.js @@ -8,21 +8,33 @@ * @license https://opensource.org/licenses/AAL */ +import { wait, instant } from '../wait'; + class ForteAuthorizeCard { constructor(apiLoginId) { this.apiLoginId = apiLoginId; this.cardHolderName = document.getElementById('cardholder_name'); + + this.sc = createSimpleCard({ + fields: { + card: { + number: '#number', + date: '#date', + cvv: '#cvv', + }, + }, + }); + + this.sc.mount(); } handleAuthorization = () => { - var myCard = $('#my-card'); - - var data = { + const data = { api_login_id: this.apiLoginId, - card_number: myCard.CardJs('cardNumber').replace(/[^\d]/g, ''), - expire_year: myCard.CardJs('expiryYear').replace(/[^\d]/g, ''), - expire_month: myCard.CardJs('expiryMonth').replace(/[^\d]/g, ''), - cvv: document.getElementById('cvv').value.replace(/[^\d]/g, ''), + card_number: this.sc.value('number')?.replace(/[^\d]/g, ''), + expire_year: `20${this.sc.value('year')?.replace(/[^\d]/g, '')}`, + expire_month: this.sc.value('month')?.replace(/[^\d]/g, ''), + cvv: this.sc.value('cvv')?.replace(/[^\d]/g, ''), }; let payNowButton = document.getElementById('pay-now'); @@ -41,18 +53,8 @@ class ForteAuthorizeCard { }; successResponseHandler = (response) => { - document.getElementById('payment_token').value = response.onetime_token; - document.getElementById('card_brand').value = response.card_brand; - document.getElementById('expire_year').value = response.expire_year; - document.getElementById('expire_month').value = response.expire_month; - document.getElementById('last_4').value = response.last_4; - - let storeCard = document.querySelector('input[name=token-billing-checkbox]:checked'); - - if (storeCard) { - document.getElementById("store_card").value = storeCard.value; - } + document.getElementById('card_brand').value = response.card_type; document.getElementById('server_response').submit(); @@ -72,99 +74,26 @@ class ForteAuthorizeCard { return false; }; - - handlePayNowAction(token_hashed_id) { - document.getElementById('pay-now').disabled = true; - document.querySelector('#pay-now > svg').classList.remove('hidden'); - document.querySelector('#pay-now > span').classList.add('hidden'); - - document.getElementById("token").value = token_hashed_id; - document.getElementById("server_response").submit(); - } - - handle = () => { - Array - .from(document.getElementsByClassName('toggle-payment-with-token')) - .forEach((element) => element.addEventListener('click', (e) => { - document - .getElementById('save-card--container').style.display = 'none'; - document - .getElementById('forte--credit-card-container').style.display = 'none'; - - document - .getElementById('token').value = e.target.dataset.token; - })); - - let payWithCreditCardToggle = document.getElementById('toggle-payment-with-credit-card'); - - if (payWithCreditCardToggle) { - payWithCreditCardToggle - .addEventListener('click', () => { - document - .getElementById('save-card--container').style.display = 'grid'; - document - .getElementById('forte--credit-card-container').style.display = 'flex'; - - document - .getElementById('token').value = null; - }); - } - let payNowButton = document.getElementById('pay-now'); if (payNowButton) { - payNowButton - .addEventListener('click', (e) => { - let token = document.getElementById('token'); - - token.value - ? this.handlePayNowAction(token.value) - : this.handleAuthorization(); - }); + payNowButton.addEventListener('click', (e) => { + this.handleAuthorization(); + }); } return this; - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + }; } -const apiLoginId = document.querySelector( - 'meta[name="forte-api-login-id"]' -).content; +function boot() { + const apiLoginId = document.querySelector( + 'meta[name="forte-api-login-id"]' + ).content; -/** @handle */ -new ForteAuthorizeCard(apiLoginId).handle(); + /** @handle */ + new ForteAuthorizeCard(apiLoginId).handle(); +} + +instant() ? boot() : wait('#forte-credit-card-payment').then(() => boot()); diff --git a/resources/js/clients/payments/mollie-credit-card.js b/resources/js/clients/payments/mollie-credit-card.js index c973f1147c58..e81a2da34dbf 100644 --- a/resources/js/clients/payments/mollie-credit-card.js +++ b/resources/js/clients/payments/mollie-credit-card.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class _Mollie { constructor() { this.mollie = Mollie( @@ -26,7 +28,7 @@ class _Mollie { let cardHolderError = document.getElementById('card-holder-error'); - cardHolder.addEventListener('change', function(event) { + cardHolder.addEventListener('change', function (event) { if (event.error && event.touched) { cardHolderError.textContent = event.error; } else { @@ -43,7 +45,7 @@ class _Mollie { let cardNumberError = document.getElementById('card-number-error'); - cardNumber.addEventListener('change', function(event) { + cardNumber.addEventListener('change', function (event) { if (event.error && event.touched) { cardNumberError.textContent = event.error; } else { @@ -60,7 +62,7 @@ class _Mollie { let expiryDateError = document.getElementById('expiry-date-error'); - expiryDate.addEventListener('change', function(event) { + expiryDate.addEventListener('change', function (event) { if (event.error && event.touched) { expiryDateError.textContent = event.error; } else { @@ -77,7 +79,7 @@ class _Mollie { let verificationCodeError = document.getElementById('cvv-error'); - verificationCode.addEventListener('change', function(event) { + verificationCode.addEventListener('change', function (event) { if (event.error && event.touched) { verificationCodeError.textContent = event.error; } else { @@ -97,7 +99,7 @@ class _Mollie { return document.getElementById('server-response').submit(); } - this.mollie.createToken().then(function(result) { + this.mollie.createToken().then(function (result) { let token = result.token; let error = result.error; @@ -166,4 +168,9 @@ class _Mollie { } } -new _Mollie().handle(); + +function boot() { + new _Mollie().handle(); +} + +instant() ? boot(): wait('#mollie-credit-card-payment').then(() => boot()); diff --git a/resources/js/clients/payments/paytrace-credit-card.js b/resources/js/clients/payments/paytrace-credit-card.js index 9b67b1ed8d07..7d639bd2a3b1 100644 --- a/resources/js/clients/payments/paytrace-credit-card.js +++ b/resources/js/clients/payments/paytrace-credit-card.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { instant, wait } from '../wait'; + class PayTraceCreditCard { constructor() { this.clientKey = document.querySelector( @@ -122,6 +124,11 @@ class PayTraceCreditCard { } handlePaymentWithCreditCard(event) { + const button = document.getElementById('pay-now'); + + button.querySelector('svg').classList.remove('hidden'); + button.querySelector('span').classList.add('hidden'); + event.target.parentElement.disabled = true; document.getElementById('errors').hidden = true; @@ -132,6 +139,10 @@ class PayTraceCreditCard { errorsContainer.textContent = errors[0].description; errorsContainer.hidden = false; + + button.querySelector('svg').classList.add('hidden'); + button.querySelector('span').classList.remove('hidden'); + return (event.target.parentElement.disabled = false); } @@ -161,6 +172,9 @@ class PayTraceCreditCard { ).textContent = JSON.stringify(error); document.getElementById('errors').hidden = false; + button.querySelector('svg').classList.add('hidden'); + button.querySelector('span').classList.remove('hidden'); + console.log(error); }); }); @@ -169,11 +183,16 @@ class PayTraceCreditCard { handlePaymentWithToken(event) { event.target.parentElement.disabled = true; + const button = document.getElementById('pay-now'); + + button.querySelector('svg').classList.remove('hidden'); + button.querySelector('span').classList.add('hidden'); + document.getElementById('server_response').submit(); } handle() { - + Array.from( document.getElementsByClassName('toggle-payment-with-token') ).forEach((element) => @@ -217,7 +236,15 @@ class PayTraceCreditCard { return this.handlePaymentWithToken(e); }); + + if (Array.from(document.getElementsByClassName('toggle-payment-with-token')).length === 0 && !instant()) { + document.getElementById('toggle-payment-with-credit-card').click(); + } } } -new PayTraceCreditCard().handle(); +function boot() { + new PayTraceCreditCard().handle(); +} + +instant() ? boot() : wait('#paytrace-credit-card-payment').then(() => boot()) diff --git a/resources/js/clients/payments/razorpay-aio.js b/resources/js/clients/payments/razorpay-aio.js index 4097b07fcbf9..42e8ae1313d1 100644 --- a/resources/js/clients/payments/razorpay-aio.js +++ b/resources/js/clients/payments/razorpay-aio.js @@ -8,29 +8,35 @@ * @license https://www.elastic.co/licensing/elastic-license */ -let options = JSON.parse( - document.querySelector('meta[name=razorpay-options]')?.content -); +import { wait, instant } from '../wait'; -options.handler = function (response) { - document.getElementById('razorpay_payment_id').value = - response.razorpay_payment_id; - document.getElementById('razorpay_signature').value = - response.razorpay_signature; - document.getElementById('server-response').submit(); -}; +function boot() { + let options = JSON.parse( + document.querySelector('meta[name=razorpay-options]')?.content + ); + + options.handler = function (response) { + document.getElementById('razorpay_payment_id').value = + response.razorpay_payment_id; + document.getElementById('razorpay_signature').value = + response.razorpay_signature; + document.getElementById('server-response').submit(); + }; + + options.modal = { + ondismiss: function () { + payNowButton.disabled = false; + }, + }; + + let razorpay = new Razorpay(options); + let payNowButton = document.getElementById('pay-now'); + + payNowButton.onclick = function (event) { + payNowButton.disabled = true; + + razorpay.open(); + }; +} -options.modal = { - ondismiss: function () { - payNowButton.disabled = false; - }, -}; - -let razorpay = new Razorpay(options); -let payNowButton = document.getElementById('pay-now'); - -payNowButton.onclick = function (event) { - payNowButton.disabled = true; - - razorpay.open(); -}; +instant() ? boot() : wait('#razorpay-hosted-payment').then(() => boot()); diff --git a/resources/js/clients/payments/square-credit-card.js b/resources/js/clients/payments/square-credit-card.js index 4242eae5d651..73ea9ea503a3 100644 --- a/resources/js/clients/payments/square-credit-card.js +++ b/resources/js/clients/payments/square-credit-card.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class SquareCreditCard { constructor() { this.appId = document.querySelector('meta[name=square-appId]').content; @@ -130,54 +132,58 @@ class SquareCreditCard { await this.init().then(() => { - document - .getElementById('authorize-card') - ?.addEventListener('click', (e) => - this.completePaymentWithoutToken(e) + document + .getElementById('authorize-card') + ?.addEventListener('click', (e) => + this.completePaymentWithoutToken(e) + ); + + document.getElementById('pay-now')?.addEventListener('click', (e) => { + let tokenInput = document.querySelector('input[name=token]'); + + if (tokenInput.value) { + return this.completePaymentUsingToken(e); + } + + return this.completePaymentWithoutToken(e); + }); + + Array.from( + document.getElementsByClassName('toggle-payment-with-token') + ).forEach((element) => + element.addEventListener('click', async (element) => { + document + .getElementById('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('pay-now')?.addEventListener('click', (e) => { - let tokenInput = document.querySelector('input[name=token]'); - - if (tokenInput.value) { - return this.completePaymentUsingToken(e); - } - - return this.completePaymentWithoutToken(e); - }); - - Array.from( - document.getElementsByClassName('toggle-payment-with-token') - ).forEach((element) => - element.addEventListener('click', async (element) => { - document - .getElementById('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', async (element) => { - document - .getElementById('card-container') - .classList.remove('hidden'); - document.getElementById('save-card--container').style.display = - 'grid'; - document.querySelector('input[name=token]').value = ''; - }); + document + .getElementById('toggle-payment-with-credit-card') + ?.addEventListener('click', async (element) => { + document + .getElementById('card-container') + .classList.remove('hidden'); + document.getElementById('save-card--container').style.display = + 'grid'; + document.querySelector('input[name=token]').value = ''; + }); document.getElementById('loader').classList.add('hidden'); document.getElementById('payment-list').classList.remove('hidden'); document.getElementById('toggle-payment-with-credit-card')?.click(); - }); + }); } } -new SquareCreditCard().handle(); +function boot() { + new SquareCreditCard().handle(); +} + +instant() ? boot() : wait('#square-credit-card-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-acss.js b/resources/js/clients/payments/stripe-acss.js index 613e8e373497..497a369e27d2 100644 --- a/resources/js/clients/payments/stripe-acss.js +++ b/resources/js/clients/payments/stripe-acss.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { instant, wait } from '../wait'; + class ProcessACSS { constructor(key, stripeConnect) { this.key = key; @@ -17,13 +19,13 @@ class ProcessACSS { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -33,7 +35,6 @@ class ProcessACSS { }; handle = () => { - Array .from(document.getElementsByClassName('toggle-payment-with-token')) .forEach((element) => element.addEventListener('click', (element) => { @@ -41,8 +42,7 @@ class ProcessACSS { console.log(element.target.dataset.token); })); - if(document.getElementById('toggle-payment-with-new-account')) - { + if (document.getElementById('toggle-payment-with-new-account')) { document .getElementById('toggle-payment-with-new-account') .addEventListener('click', (element) => { @@ -52,19 +52,18 @@ class ProcessACSS { } - if (document.getElementById('pay-now-with-token')) - { + if (document.getElementById('pay-now-with-token')) { document.getElementById('pay-now-with-token').addEventListener('click', (e) => { const token = document .querySelector('input[name=token]') .value; - document.getElementById('pay-now-with-token').disabled = true; - document.querySelector('#pay-now-with-token > svg').classList.remove('hidden'); - document.querySelector('#pay-now-with-token > span').classList.add('hidden'); - document.getElementById('server-response').submit(); - + document.getElementById('pay-now-with-token').disabled = true; + document.querySelector('#pay-now-with-token > svg').classList.remove('hidden'); + document.querySelector('#pay-now-with-token > span').classList.add('hidden'); + document.getElementById('server-response').submit(); + }); } else { @@ -80,23 +79,23 @@ class ProcessACSS { tokenBillingCheckbox.value; } - let errors = document.getElementById('errors'); - errors.textContent = ''; - errors.hidden = true; - - if (document.getElementById('acss-name').value === "") { - document.getElementById('acss-name').focus(); - errors.textContent = document.querySelector('meta[name=translation-name-required]').content; - errors.hidden = false; - return; - } + let errors = document.getElementById('errors'); + errors.textContent = ''; + errors.hidden = true; - if (document.getElementById('acss-email-address').value === "") { - document.getElementById('acss-email-address').focus(); - errors.textContent = document.querySelector('meta[name=translation-email-required]').content; - errors.hidden = false; - return ; - } + if (document.getElementById('acss-name').value === "") { + document.getElementById('acss-name').focus(); + errors.textContent = document.querySelector('meta[name=translation-name-required]').content; + errors.hidden = false; + return; + } + + if (document.getElementById('acss-email-address').value === "") { + document.getElementById('acss-email-address').focus(); + errors.textContent = document.querySelector('meta[name=translation-email-required]').content; + errors.hidden = false; + return; + } document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); @@ -139,17 +138,30 @@ class ProcessACSS { errors.textContent = message; errors.hidden = false; - document.getElementById('pay-now').disabled = false; - document.querySelector('#pay-now > svg').classList.add('hidden'); - document.querySelector('#pay-now > span').classList.remove('hidden'); + document.getElementById('pay-now').disabled = false; + document.querySelector('#pay-now > svg').classList.add('hidden'); + document.querySelector('#pay-now > span').classList.remove('hidden'); } } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessACSS(publishableKey, stripeConnect).setupStripe().handle(); -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + /** + * @type {HTMLInputElement|null} + */ + const first = document.querySelector('input[name="payment-type"]'); -new ProcessACSS(publishableKey, stripeConnect).setupStripe().handle(); + if (first) { + first.click(); + } +} + +instant() ? boot() : wait('#stripe-acss-payment').then(() => boot()); \ No newline at end of file diff --git a/resources/js/clients/payments/stripe-alipay.js b/resources/js/clients/payments/stripe-alipay.js index 9b902a7dee35..6a00310fcae9 100644 --- a/resources/js/clients/payments/stripe-alipay.js +++ b/resources/js/clients/payments/stripe-alipay.js @@ -5,9 +5,11 @@ * * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) * - * @license https://www.elastic.co/licensing/elastic-license + * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessAlipay { constructor(key, stripeConnect) { this.key = key; @@ -17,57 +19,68 @@ class ProcessAlipay { } setupStripe = () => { + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - - } - else { + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); } - return this; }; async handle() { + document + .getElementById('pay-now') + .addEventListener('click', async (e) => { + document.getElementById('pay-now').disabled = true; + document + .querySelector('#pay-now > svg') + .classList.add('hidden'); + document + .querySelector('#pay-now > span') + .classList.remove('hidden'); - document.getElementById('pay-now').addEventListener('click', async (e) => { - document.getElementById('pay-now').disabled = true; - document.querySelector('#pay-now > svg').classList.add('hidden'); - document.querySelector('#pay-now > span').classList.remove('hidden'); - - const { error } = await this.stripe.confirmAlipayPayment(document.querySelector('meta[name=ci_intent]').content, { - // Return URL where the customer should be redirected after the authorization - return_url: `${document.querySelector('meta[name=return_url]').content}`, - }); + const { error } = await this.stripe.confirmAlipayPayment( + document.querySelector('meta[name=ci_intent]').content, + { + // Return URL where the customer should be redirected after the authorization + return_url: `${ + document.querySelector('meta[name=return_url]') + .content + }`, + } + ); document.getElementById('pay-now').disabled = false; - document.querySelector('#pay-now > svg').classList.remove('hidden'); - document.querySelector('#pay-now > span').classList.add('hidden'); + document + .querySelector('#pay-now > svg') + .classList.remove('hidden'); + document + .querySelector('#pay-now > span') + .classList.add('hidden'); if (error) { - this.errors.textContent = ''; this.errors.textContent = result.error.message; this.errors.hidden = false; - } }); - } } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = + document.querySelector('meta[name="stripe-publishable-key"]') + ?.content ?? ''; -const stripeConnect = document.querySelector( - 'meta[name="stripe-account-id"]' -)?.content ?? ''; + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; -new ProcessAlipay(publishableKey, stripeConnect).setupStripe().handle(); + new ProcessAlipay(publishableKey, stripeConnect).setupStripe().handle(); +} + +instant() ? boot() : wait('#stripe-alipay-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-bacs.js b/resources/js/clients/payments/stripe-bacs.js index a67c9057c588..964698d2d656 100644 --- a/resources/js/clients/payments/stripe-bacs.js +++ b/resources/js/clients/payments/stripe-bacs.js @@ -8,8 +8,10 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { instant, wait } from '../wait'; + class ProcessBACS { - constructor(key, stripeConnect) { + constructor(key, stripeConnect, onlyAuthorization) { this.key = key; this.errors = document.getElementById('errors'); this.stripeConnect = stripeConnect; @@ -18,7 +20,7 @@ class ProcessBACS { setupStripe = () => { - if (this.stripeConnect){ + if (this.stripeConnect) { // this.stripe.stripeAccount = this.stripeConnect; this.stripe = Stripe(this.key, { @@ -42,9 +44,10 @@ class ProcessBACS { document.getElementById('authorize-bacs').disabled = true; document.querySelector('#authorize-bacs > svg').classList.remove('hidden'); document.querySelector('#authorize-bacs > span').classList.add('hidden'); - location.href=document.querySelector('meta[name=stripe-redirect-url]').content; - });} - else{ + location.href = document.querySelector('meta[name=stripe-redirect-url]').content; + }); + } + else { this.payNowButton = document.getElementById('pay-now'); document.getElementById('pay-now').addEventListener('click', (e) => { this.payNowButton.disabled = true; @@ -54,14 +57,15 @@ class ProcessBACS { }); this.payment_data = Array.from(document.getElementsByClassName('toggle-payment-with-token')); - if (this.payment_data.length > 0){ + if (this.payment_data.length > 0) { this.payment_data.forEach((element) => element.addEventListener('click', (element) => { document.querySelector('input[name=token]').value = element.target.dataset.token; }) - );} - else{ + ); + } + else { this.errors.textContent = document.querySelector( 'meta[name=translation-payment-method-required]' ).content; @@ -69,19 +73,33 @@ class ProcessBACS { this.payNowButton.disabled = true; this.payNowButton.querySelector('span').classList.remove('hidden'); this.payNowButton.querySelector('svg').classList.add('hidden'); - }} + } + } } } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + const onlyAuthorization = + document.querySelector('meta[name="only-authorization"]')?.content ?? ''; + + new ProcessBACS(publishableKey, stripeConnect, onlyAuthorization).setupStripe().handle(); -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; -const onlyAuthorization = - document.querySelector('meta[name="only-authorization"]')?.content ?? ''; + /** + * @type {HTMLInputElement|null} + */ + const first = document.querySelector('input[name="payment-type"]'); -new ProcessBACS(publishableKey, stripeConnect).setupStripe().handle(); + if (first) { + first.click(); + } +} + +instant() ? boot() : wait('#stripe-bacs-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-bancontact.js b/resources/js/clients/payments/stripe-bancontact.js index 35860607b775..74ad70cddf46 100644 --- a/resources/js/clients/payments/stripe-bancontact.js +++ b/resources/js/clients/payments/stripe-bancontact.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessBANCONTACTPay { constructor(key, stripeConnect) { this.key = key; @@ -17,13 +19,13 @@ class ProcessBANCONTACTPay { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -40,7 +42,7 @@ class ProcessBANCONTACTPay { errors.textContent = document.querySelector('meta[name=translation-name-required]').content; errors.hidden = false; console.log("name"); - return ; + return; } document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); @@ -63,11 +65,15 @@ class ProcessBANCONTACTPay { }; } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessBANCONTACTPay(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; - -new ProcessBANCONTACTPay(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-bancontact-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-becs.js b/resources/js/clients/payments/stripe-becs.js index 61544ccf53c7..b463e1014813 100644 --- a/resources/js/clients/payments/stripe-becs.js +++ b/resources/js/clients/payments/stripe-becs.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessBECS { constructor(key, stripeConnect) { this.key = key; @@ -17,13 +19,13 @@ class ProcessBECS { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -64,30 +66,30 @@ class ProcessBECS { handle = () => { document.getElementById('pay-now').addEventListener('click', (e) => { - let errors = document.getElementById('errors'); + let errors = document.getElementById('errors'); - if (document.getElementById('becs-name').value === "") { - document.getElementById('becs-name').focus(); - errors.textContent = document.querySelector('meta[name=translation-name-required]').content; - errors.hidden = false; - return; - } + if (document.getElementById('becs-name').value === "") { + document.getElementById('becs-name').focus(); + errors.textContent = document.querySelector('meta[name=translation-name-required]').content; + errors.hidden = false; + return; + } - if (document.getElementById('becs-email-address').value === "") { - document.getElementById('becs-email-address').focus(); - errors.textContent = document.querySelector('meta[name=translation-email-required]').content; - errors.hidden = false; - return ; - } + if (document.getElementById('becs-email-address').value === "") { + document.getElementById('becs-email-address').focus(); + errors.textContent = document.querySelector('meta[name=translation-email-required]').content; + errors.hidden = false; + return; + } - if (!document.getElementById('becs-mandate-acceptance').checked) { - document.getElementById('becs-mandate-acceptance').focus(); - errors.textContent = document.querySelector('meta[name=translation-terms-required]').content; - errors.hidden = false; - console.log("Terms"); - return ; - } + if (!document.getElementById('becs-mandate-acceptance').checked) { + document.getElementById('becs-mandate-acceptance').focus(); + errors.textContent = document.querySelector('meta[name=translation-terms-required]').content; + errors.hidden = false; + console.log("Terms"); + return; + } document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); @@ -129,17 +131,21 @@ class ProcessBECS { errors.textContent = message; errors.hidden = false; - document.getElementById('pay-now').disabled = false; - document.querySelector('#pay-now > svg').classList.add('hidden'); - document.querySelector('#pay-now > span').classList.remove('hidden'); + document.getElementById('pay-now').disabled = false; + document.querySelector('#pay-now > svg').classList.add('hidden'); + document.querySelector('#pay-now > span').classList.remove('hidden'); } } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessBECS(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; - -new ProcessBECS(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-becs-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-browserpay.js b/resources/js/clients/payments/stripe-browserpay.js index dff741ddc63a..ad53816f4ccd 100644 --- a/resources/js/clients/payments/stripe-browserpay.js +++ b/resources/js/clients/payments/stripe-browserpay.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class StripeBrowserPay { constructor() { this.clientSecret = document.querySelector( @@ -68,7 +70,7 @@ class StripeBrowserPay { ) .then(function (confirmResult) { if (confirmResult.error) { - + document.querySelector('#errors').innerText = confirmResult.error.message; document.querySelector('#errors').hidden = false; @@ -142,4 +144,8 @@ class StripeBrowserPay { } } -new StripeBrowserPay().handle(); +function boot() { + new StripeBrowserPay().handle() +} + +instant() ? boot() : wait('#stripe-browserpay-payment').then(() => boot()) diff --git a/resources/js/clients/payments/stripe-credit-card.js b/resources/js/clients/payments/stripe-credit-card.js index f35d20dcbde2..eb60acde543d 100644 --- a/resources/js/clients/payments/stripe-credit-card.js +++ b/resources/js/clients/payments/stripe-credit-card.js @@ -5,9 +5,11 @@ * * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) * - * @license https://www.elastic.co/licensing/elastic-license + * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class StripeCreditCard { constructor(key, secret, onlyAuthorization, stripeConnect) { this.key = key; @@ -17,18 +19,14 @@ class StripeCreditCard { } setupStripe() { - - if (this.stripeConnect){ - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - - } - else { + if (this.stripeConnect) { + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); } - + this.elements = this.stripe.elements(); return this; @@ -36,9 +34,13 @@ class StripeCreditCard { createElement() { this.cardElement = this.elements.create('card', { - hidePostalCode: document.querySelector('meta[name=stripe-require-postal-code]')?.content === "0", + hidePostalCode: + document.querySelector('meta[name=stripe-require-postal-code]') + ?.content === '0', value: { - postalCode: document.querySelector('meta[name=client-postal-code]').content, + postalCode: document.querySelector( + 'meta[name=client-postal-code]' + ).content, }, hideIcon: false, }); @@ -90,7 +92,7 @@ class StripeCreditCard { this.stripe .handleCardPayment(this.secret, this.cardElement, { payment_method_data: { - billing_details: {name: cardHolderName.value}, + billing_details: { name: cardHolderName.value }, }, }) .then((result) => { @@ -103,9 +105,8 @@ class StripeCreditCard { } handleSuccess(result) { - document.querySelector( - 'input[name="gateway_response"]' - ).value = JSON.stringify(result.paymentIntent); + document.querySelector('input[name="gateway_response"]').value = + JSON.stringify(result.paymentIntent); let tokenBillingCheckbox = document.querySelector( 'input[name="token-billing-checkbox"]:checked' @@ -145,7 +146,7 @@ class StripeCreditCard { this.stripe .handleCardSetup(this.secret, this.cardElement, { payment_method_data: { - billing_details: {name: cardHolderName.value}, + billing_details: { name: cardHolderName.value }, }, }) .then((result) => { @@ -177,63 +178,76 @@ class StripeCreditCard { return this.handleAuthorization(); }); } else { - Array - .from(document.getElementsByClassName('toggle-payment-with-token')) - .forEach((element) => element.addEventListener('click', (element) => { - document.getElementById('stripe--payment-container').classList.add('hidden'); - document.getElementById('save-card--container').style.display = 'none'; - document.querySelector('input[name=token]').value = element.target.dataset.token; - })); + Array.from( + document.getElementsByClassName('toggle-payment-with-token') + ).forEach((element) => + element.addEventListener('click', (element) => { + document + .getElementById('stripe--payment-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('stripe--payment-container').classList.remove('hidden'); - document.getElementById('save-card--container').style.display = 'grid'; - document.querySelector('input[name=token]').value = ""; + document + .getElementById('stripe--payment-container') + .classList.remove('hidden'); + document.getElementById( + 'save-card--container' + ).style.display = 'grid'; + document.querySelector('input[name=token]').value = ''; }); this.createElement().mountCardElement(); - document - .getElementById('pay-now') - .addEventListener('click', () => { - + document.getElementById('pay-now').addEventListener('click', () => { try { - let tokenInput = document.querySelector('input[name=token]'); + let tokenInput = + document.querySelector('input[name=token]'); if (tokenInput.value) { return this.completePaymentUsingToken(); } return this.completePaymentWithoutToken(); - }catch(error){ + } catch (error) { console.log(error.message); } - - }); + }); } } } -const publishableKey = - document.querySelector('meta[name="stripe-publishable-key"]')?.content ?? ''; +function boot() { + const publishableKey = + document.querySelector('meta[name="stripe-publishable-key"]') + ?.content ?? ''; -const secret = - document.querySelector('meta[name="stripe-secret"]')?.content ?? ''; + const secret = + document.querySelector('meta[name="stripe-secret"]')?.content ?? ''; -const onlyAuthorization = - document.querySelector('meta[name="only-authorization"]')?.content ?? ''; + const onlyAuthorization = + document.querySelector('meta[name="only-authorization"]')?.content ?? + ''; -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; -let s = new StripeCreditCard(publishableKey, secret, onlyAuthorization, stripeConnect); + let s = new StripeCreditCard( + publishableKey, + secret, + onlyAuthorization, + stripeConnect + ); -s.handle(); + s.handle(); +} -document.addEventListener('livewire:init', () => { - -Livewire.on('passed-required-fields-check', () => s.handle()); - -}); \ No newline at end of file +instant() ? boot() : wait('#stripe-credit-card-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-eps.js b/resources/js/clients/payments/stripe-eps.js index 2ae980bc321a..08e238f945ee 100644 --- a/resources/js/clients/payments/stripe-eps.js +++ b/resources/js/clients/payments/stripe-eps.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessEPSPay { constructor(key, stripeConnect) { this.key = key; @@ -18,13 +20,13 @@ class ProcessEPSPay { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -56,7 +58,7 @@ class ProcessEPSPay { if (!document.getElementById('eps-name').value) { errors.textContent = document.querySelector('meta[name=translation-name-required]').content; errors.hidden = false; - return ; + return; } document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); @@ -80,11 +82,15 @@ class ProcessEPSPay { }; } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessEPSPay(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; - -new ProcessEPSPay(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-eps-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-fpx.js b/resources/js/clients/payments/stripe-fpx.js index 45db81feea30..2a6b1cb76301 100644 --- a/resources/js/clients/payments/stripe-fpx.js +++ b/resources/js/clients/payments/stripe-fpx.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessFPXPay { constructor(key, stripeConnect) { this.key = key; @@ -18,13 +20,13 @@ class ProcessFPXPay { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -39,7 +41,7 @@ class ProcessFPXPay { fontSize: '16px', }, }; - this.fpx = elements.create('fpxBank', {style: style, accountHolderType: 'individual',}); + this.fpx = elements.create('fpxBank', { style: style, accountHolderType: 'individual', }); this.fpx.mount("#fpx-bank-element"); return this; }; @@ -81,13 +83,15 @@ class ProcessFPXPay { } } +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessFPXPay(publishableKey, stripeConnect).setupStripe().handle(); +} - -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; - -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; - -new ProcessFPXPay(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-fpx-payment').then(() => boot()); diff --git a/resources/js/clients/payments/stripe-giropay.js b/resources/js/clients/payments/stripe-giropay.js index 1a3903e9570f..7ab942de8376 100644 --- a/resources/js/clients/payments/stripe-giropay.js +++ b/resources/js/clients/payments/stripe-giropay.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessGiroPay { constructor(key, stripeConnect) { this.key = key; @@ -17,13 +19,13 @@ class ProcessGiroPay { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -41,7 +43,7 @@ class ProcessGiroPay { errors.textContent = document.querySelector('meta[name=translation-terms-required]').content; errors.hidden = false; console.log("Terms"); - return ; + return; } document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); @@ -64,11 +66,15 @@ class ProcessGiroPay { }; } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessGiroPay(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; - -new ProcessGiroPay(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-giropay-payment').then(() => boot()); \ No newline at end of file diff --git a/resources/js/clients/payments/stripe-ideal.js b/resources/js/clients/payments/stripe-ideal.js index db397cb1e178..9831341370a2 100644 --- a/resources/js/clients/payments/stripe-ideal.js +++ b/resources/js/clients/payments/stripe-ideal.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessIDEALPay { constructor(key, stripeConnect) { this.key = key; @@ -18,13 +20,13 @@ class ProcessIDEALPay { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -57,7 +59,7 @@ class ProcessIDEALPay { errors.textContent = document.querySelector('meta[name=translation-name-required]').content; errors.hidden = false; console.log("name"); - return ; + return; } document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); @@ -81,11 +83,17 @@ class ProcessIDEALPay { }; } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessIDEALPay(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; +instant() ? boot() : wait('#stripe-ideal-payment').then(() => boot()); -new ProcessIDEALPay(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-ideal-payment').then(() => boot()); \ No newline at end of file diff --git a/resources/js/clients/payments/stripe-klarna.js b/resources/js/clients/payments/stripe-klarna.js index cebbb6e42fcb..f81d95f080ac 100644 --- a/resources/js/clients/payments/stripe-klarna.js +++ b/resources/js/clients/payments/stripe-klarna.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessKlarna { constructor(key, stripeConnect) { this.key = key; @@ -17,7 +19,7 @@ class ProcessKlarna { setupStripe = () => { - if (this.stripeConnect){ + if (this.stripeConnect) { // this.stripe.stripeAccount = this.stripeConnect; this.stripe = Stripe(this.key, { @@ -47,7 +49,7 @@ class ProcessKlarna { document.getElementById('pay-now').addEventListener('click', (e) => { let errors = document.getElementById('errors'); let name = document.getElementById("klarna-name").value; - if (! /^[A-Za-z\s]*$/.test(name)){ + if (! /^[A-Za-z\s]*$/.test(name)) { document.getElementById('klarna-name-correction').hidden = false; document.getElementById('klarna-name').textContent = name.replace(/^[A-Za-z\s]*$/, "") document.getElementById('klarna-name').focus(); @@ -81,21 +83,28 @@ class ProcessKlarna { 'meta[name="return-url"]' ).content, } - ).then((result) => { + ).then((result) => { if (result.hasOwnProperty('error')) { return this.handleError(result.error.message); } - });} + }); + } }); }; } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessKlarna(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; +instant() ? boot() : wait('#stripe-klarna-payment').then(() => boot()); -new ProcessKlarna(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-klarna-payment').then(() => boot()); \ No newline at end of file diff --git a/resources/js/clients/payments/stripe-przelewy24.js b/resources/js/clients/payments/stripe-przelewy24.js index 9f990240d0ec..6119ea7492fd 100644 --- a/resources/js/clients/payments/stripe-przelewy24.js +++ b/resources/js/clients/payments/stripe-przelewy24.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessPRZELEWY24 { constructor(key, stripeConnect) { this.key = key; @@ -17,19 +19,19 @@ class ProcessPRZELEWY24 { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); } - + let elements = this.stripe.elements() var options = { // Custom styling can be passed to options when creating an Element @@ -113,11 +115,17 @@ class ProcessPRZELEWY24 { }; } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessPRZELEWY24(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; +instant() ? boot() : wait('#stripe-przelewy24-payment').then(() => boot()); -new ProcessPRZELEWY24(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-przelewy24-payment').then(() => boot()); \ No newline at end of file diff --git a/resources/js/clients/payments/stripe-sepa.js b/resources/js/clients/payments/stripe-sepa.js index cafcf8e7cc9c..d7f871c5843e 100644 --- a/resources/js/clients/payments/stripe-sepa.js +++ b/resources/js/clients/payments/stripe-sepa.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessSEPA { constructor(key, stripeConnect) { this.key = key; @@ -106,9 +108,9 @@ class ProcessSEPA { this.stripe .confirmSepaDebitPayment( document.querySelector('meta[name=pi-client-secret') - .content, { - payment_method: document.querySelector('input[name=token]').value - } + .content, { + payment_method: document.querySelector('input[name=token]').value + } ) .then((result) => { if (result.error) { @@ -147,28 +149,25 @@ class ProcessSEPA { return; } - document.getElementById('pay-now').disabled = true; document.querySelector('#pay-now > svg').classList.remove('hidden'); document.querySelector('#pay-now > span').classList.add('hidden'); - - this.stripe .confirmSepaDebitPayment( document.querySelector('meta[name=pi-client-secret') - .content, { - payment_method: { - sepa_debit: this.iban, - billing_details: { - name: document.getElementById('sepa-name') - .value, - email: document.getElementById( - 'sepa-email-address' - ).value, - }, + .content, { + payment_method: { + sepa_debit: this.iban, + billing_details: { + name: document.getElementById('sepa-name') + .value, + email: document.getElementById( + 'sepa-email-address' + ).value, }, - } + }, + } ) .then((result) => { if (result.error) { @@ -197,7 +196,7 @@ class ProcessSEPA { tokenBillingCheckbox.value; } - if(document.querySelector('input[name=token]').value.length > 2){ + if (document.querySelector('input[name=token]').value.length > 2) { document.querySelector('input[name="store_card"]').value = false; } @@ -233,11 +232,17 @@ class ProcessSEPA { } } -const publishableKey = - document.querySelector('meta[name="stripe-publishable-key"]')?.content ?? +function boot() { + const publishableKey = + document.querySelector('meta[name="stripe-publishable-key"]')?.content ?? ''; -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; -new ProcessSEPA(publishableKey, stripeConnect).setupStripe().handle(); + new ProcessSEPA(publishableKey, stripeConnect).setupStripe().handle(); +} + +instant() ? boot() : wait('#stripe-sepa-payment').then(() => boot()); + +instant() ? boot() : wait('#stripe-sepa-payment').then(() => boot()); \ No newline at end of file diff --git a/resources/js/clients/payments/stripe-sofort.js b/resources/js/clients/payments/stripe-sofort.js index 394849697df4..c1bfd7f1e105 100644 --- a/resources/js/clients/payments/stripe-sofort.js +++ b/resources/js/clients/payments/stripe-sofort.js @@ -8,6 +8,8 @@ * @license https://www.elastic.co/licensing/elastic-license */ +import { wait, instant } from '../wait'; + class ProcessSOFORT { constructor(key, stripeConnect) { this.key = key; @@ -18,13 +20,13 @@ class ProcessSOFORT { setupStripe = () => { - if (this.stripeConnect){ - // this.stripe.stripeAccount = this.stripeConnect; - - this.stripe = Stripe(this.key, { - stripeAccount: this.stripeConnect, - }); - + if (this.stripeConnect) { + // this.stripe.stripeAccount = this.stripeConnect; + + this.stripe = Stripe(this.key, { + stripeAccount: this.stripeConnect, + }); + } else { this.stripe = Stripe(this.key); @@ -58,11 +60,17 @@ class ProcessSOFORT { }; } -const publishableKey = document.querySelector( - 'meta[name="stripe-publishable-key"]' -)?.content ?? ''; +function boot() { + const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' + )?.content ?? ''; + + const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + + new ProcessSOFORT(publishableKey, stripeConnect).setupStripe().handle(); +} -const stripeConnect = - document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; +instant() ? boot() : wait('#stripe-sofort-payment').then(() => boot()); -new ProcessSOFORT(publishableKey, stripeConnect).setupStripe().handle(); +instant() ? boot() : wait('#stripe-sofort-payment').then(() => boot()); \ No newline at end of file diff --git a/resources/views/email/admin/generic.blade.php b/resources/views/email/admin/generic.blade.php index 9177d9147da3..7c85385c7aa6 100644 --- a/resources/views/email/admin/generic.blade.php +++ b/resources/views/email/admin/generic.blade.php @@ -26,7 +26,7 @@{{ $additional_info }}
@endisset - @isset($url) + @if($url) - @endisset + @endif @isset($signature){!! nl2br($signature) !!}
diff --git a/resources/views/email/client/generic.blade.php b/resources/views/email/client/generic.blade.php index 9f400d1049fb..7a36899ee98f 100644 --- a/resources/views/email/client/generic.blade.php +++ b/resources/views/email/client/generic.blade.php @@ -20,7 +20,7 @@{{ $additional_info }}
@endisset - @isset($url) + @if($url){!! nl2br($signature) !!}
diff --git a/resources/views/portal/ninja2020/flow2/error.blade.php b/resources/views/portal/ninja2020/flow2/error.blade.php new file mode 100644 index 000000000000..0d3496016a65 --- /dev/null +++ b/resources/views/portal/ninja2020/flow2/error.blade.php @@ -0,0 +1,11 @@ +{{ ctrans('texts.required_fields') }}
- + @if($is_loading){{ session('ach_error') }}
+