From 5cd2e942192442ff87834d2d2493303d54999de6 Mon Sep 17 00:00:00 2001 From: thejahid Date: Thu, 14 May 2026 21:16:18 +0600 Subject: [PATCH 1/2] feat(SFT-2764): enhance PayPal button integration with improved notifications and automatic form submission - Added tone parameter to showNotice function for customizable message styles. - Updated payment approval flow to automatically submit the form upon successful payment capture. - Improved error handling and user feedback during payment processing. --- .../front-end/payments/paypal/buttons.js | 18 +++++++- .../front-end/payments/stripe/elements.js | 2 +- .../front-end/payments/paypal/buttons.ts | 42 +++++++++++++++---- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js b/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js index 964b4e084..f5ea0b568 100644 --- a/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js +++ b/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js @@ -1 +1,17 @@ -(()=>{function O(t,r){var n={};for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&r.indexOf(e)<0&&(n[e]=t[e]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,e=Object.getOwnPropertySymbols(t);a"u")return r.resolve(null);var n=T(t),e=n.url,a=n.attributes,o=a["data-namespace"]||"paypal",i=g(o);return a["data-js-sdk-library"]||(a["data-js-sdk-library"]="paypal-js"),P(e,a)&&i?r.resolve(i):I({url:e,attributes:a},r).then(function(){var s=g(o);if(s)return s;throw new Error("The window.".concat(o," global variable is not available."))})}function I(t,r){r===void 0&&(r=Promise),h(t,r);var n=t.url,e=t.attributes;if(typeof n!="string"||n.length===0)throw new Error("Invalid url.");if(typeof e<"u"&&typeof e!="object")throw new Error("Expected attributes to be an object.");return new r(function(a,o){if(typeof document>"u")return a();C({url:n,attributes:e,onSuccess:function(){return a()},onError:function(){var i=new Error('The script "'.concat(n,'" failed to load. Check the HTTP status code and response body in DevTools to learn more.'));return o(i)}})})}function g(t){return window[t]}function h(t,r){if(typeof t!="object"||t===null)throw new Error("Expected an options object.");var n=t.environment;if(n&&n!=="production"&&n!=="sandbox")throw new Error('The `environment` option must be either "production" or "sandbox".');if(typeof r<"u"&&typeof r!="function")throw new Error("Expected PromisePonyfill to be a function.")}var p=new Map,v={root:"[data-freeform-paypal-buttons]",orderInput:"[data-freeform-paypal-order]"},E={orders:"/freeform/payments/paypal/orders"},N=window.FREEFORM_DEBUG===!0;function c(...t){N&&console.error("PayPal:",...t)}function f(t,r){let n=t.closest('[data-field-type="paypal"]')||t.parentElement;if(!n)return;let e=n.querySelector("[data-ff-paypal-notice]");e||(e=document.createElement("div"),e.setAttribute("data-ff-paypal-notice","true"),e.style.marginTop="8px",e.style.color="#0a7",e.style.fontSize="0.95em",n.appendChild(e)),e.textContent=r}function y(t){let r=t.getAttribute("data-config");if(!r)return null;try{return JSON.parse(r)}catch{return null}}async function F(t,r,n){try{let e=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":r},credentials:"same-origin",body:JSON.stringify({values:n})});if(!e.ok){let o=await e.text();return c("Order creation failed",e.status,e.statusText,o),null}let a=await e.json();return a!=null&&a.id?{id:String(a.id),status:a.status,approve:a.approve}:null}catch(e){return c("Network error during order creation:",e),null}}async function k(t,r,n,e){try{let a=await fetch(`${t}/${n}/capture`,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":r},credentials:"same-origin",body:JSON.stringify(e)});if(!a.ok){let i=await a.text();return c("Order capture failed",a.status,a.statusText,i),null}let o=await a.json();return o!=null&&o.status&&(o!=null&&o.id)?{status:String(o.status),id:String(o.id)}:null}catch(a){return c("Network error during order capture:",a),null}}async function S(t,r,n){let e=`${t}-${r?"sandbox":"live"}-${n}`;if(p.has(e))return p.get(e);let a=await b({clientId:t,currency:(n||"USD").toUpperCase(),components:"buttons",intent:"capture",enableFunding:"venmo,paylater"});if(!a)throw new Error("PayPal SDK failed to load");return p.set(e,a),window.paypal||(window.paypal=a),a}async function A(t){let r=y(t);if(!r){c("Could not parse config from element",t);return}if(!r.clientId){c("No client ID provided");return}let n=t.closest("form");if(!n){c("Could not find form element");return}let e=n.querySelector(v.orderInput);if(!e){c("Could not find hidden order input");return}try{(await S(r.clientId,r.sandbox,r.currency||"USD")).Buttons({style:{layout:"vertical",color:"blue",shape:"rect",label:"paypal"},createOrder:async()=>{try{let o=new FormData(n),i={};o.forEach((d,u)=>{i[u]=d});let s=await F(E.orders,r.integration,i);if(!(s!=null&&s.id))throw c("Failed to create order or no order ID returned",s),new Error("Failed to create PayPal order");return e.value=s.id,s.id}catch(o){throw c("Error in createOrder:",o),o}},onApprove:async o=>{e.value=String(o.orderID||"");try{let i=new FormData(n),s={};i.forEach((u,l)=>{s[l]=u});let d=await k(E.orders,r.integration,String(o.orderID||""),{values:s});d&&d.status==="COMPLETED"?f(t,"Payment completed with PayPal. Click Submit to finish."):(c("Payment capture failed",d),f(t,"PayPal capture failed. Please try again."))}catch(i){c("Error during payment capture:",i),f(t,"PayPal capture error. Please try again.")}},onError:o=>{c("Payment error:",o)},onCancel:o=>{}}).render(t)}catch(a){c("Failed to initialize buttons:",a)}}document.addEventListener("DOMContentLoaded",async()=>{let t=document.querySelectorAll(v.root);if(t.length===0)return;let r=new Map;if(t.forEach(n=>{let e=y(n);e!=null&&e.clientId&&(r.has(e.clientId)||r.set(e.clientId,[]),r.get(e.clientId).push(n))}),r.size===0){c("No valid configurations found");return}r.forEach(async(n,e)=>{try{let a=y(n[0]);if(!a)return;await S(e,a.sandbox,a.currency||"USD"),n.forEach(o=>{A(o)})}catch(a){c(`Failed to load SDK for clientId ${e}:`,a)}})});})(); +(()=>{var ft={form:{ready:"freeform-ready",reset:"freeform-on-reset",submit:"freeform-on-submit",removeMessages:"freeform-remove-messages",fieldRemoveMessages:"freeform-remove-field-messages",renderSuccess:"freeform-render-success",renderFieldErrors:"freeform-render-field-errors",renderFormErrors:"freeform-render-form-errors",ajaxBeforeSuccess:"freeform-before-ajax-success",ajaxSuccess:"freeform-ajax-success",ajaxError:"freeform-ajax-error",ajaxBeforeSubmit:"freeform-ajax-before-submit",ajaxAfterSubmit:"freeform-ajax-after-submit",afterFailedSubmit:"freeform-after-failed-submit",handleActions:"freeform-handle-actions"},rules:{applied:"freeform-rules-applied"},table:{onAddRow:"freeform-field-table-on-add-row",afterRowAdded:"freeform-field-table-after-row-added",onRemoveRow:"freeform-field-table-on-remove-row",afterRemoveRow:"freeform-field-table-after-remove-row"},dragAndDrop:{renderPreview:"freeform-field-dnd-on-render-preview",renderPreviewRemoveButton:"freeform-field-dnd-on-render-preview-remove-button",renderErrorContainer:"freeform-field-dnd-render-error-container",showGlobalMessage:"freeform-field-dnd-show-global-message",appendErrors:"freeform-field-dnd-append-errors",clearErrors:"freeform-field-dnd-clear-errors",afterErrors:"freeform-field-dnd-after-errors",onChange:"freeform-field-dnd-on-change",onUploadProgress:"freeform-field-dnd-on-upload-progress"},saveAndContinue:{saveFormhandleToken:"freeform-save-form-handle-token"},scripts:{beforeLoad:"freeform-script-before-load",afterLoad:"freeform-script-after-load"},stylesheets:{beforeLoad:"freeform-stylesheet-before-load",afterLoad:"freeform-stylesheet-after-load"}},m=ft;var z=class{constructor(e){this.reload=()=>{let e=this.form.querySelectorAll(`*[name=${F._BACK_BUTTON_NAME}]`);for(let t=0;t{let n=document.createElement("input");n.type="hidden",n.name=F._BACK_BUTTON_NAME,n.value="",this.form.appendChild(n)})};this.form=e.form,this.reload()}},be=z;var W=class{constructor(e){this.reload=()=>{this.freeform.form.querySelectorAll('*[data-field-type="cards"]').forEach(t=>{let r=t.dataset.maxValues;if(r===void 0)return;let n=Array.from(t.querySelectorAll('input[type="checkbox"]')),s=parseInt(r,10);s===1?this.handleSingleValue(n):s>1&&this.handleMultipleValues(n,s)})};this.handleMultipleValues=(e,t)=>{e.forEach(r=>{r.addEventListener("change",()=>{e.filter(s=>s.checked).length>t&&r.checked&&(r.checked=!1)})})};this.handleSingleValue=e=>{e.forEach(t=>{t.addEventListener("change",()=>{let r=t.checked,s=e.filter(a=>a!==t).filter(a=>a.checked);r&&s.length>0&&s.forEach(a=>{a.checked=!1})})})};this.freeform=e,this.reload()}},ye=W;var K=new Map,G=new Map,x=(o,e={})=>{let{cacheKey:t,async:r,defer:n,onLoad:s,parent:a}=e,i=t||o;if(!K.has(i)){let l=document.createElement("script"),c=Te(o);if(!c)throw new Error(`Unsafe script URL: ${o}`);l.src=c,l.async=r!=null?r:!1,l.defer=n!=null?n:!1,l.addEventListener("load",()=>{s&&s(l),document.dispatchEvent(new CustomEvent(m.scripts.afterLoad,{detail:{src:o,script:l}}))}),document.dispatchEvent(new CustomEvent(m.scripts.beforeLoad,{detail:{src:o,script:l}})),(a||document.body).appendChild(l),K.set(i,l)}return K.get(i)},Le=(o,e={})=>{let{cacheKey:t,parent:r,onLoad:n}=e,s=t||o;if(!G.has(s)){let a=document.createElement("link"),i=Te(o);if(!i)throw new Error(`Unsafe stylesheet URL: ${o}`);a.rel="stylesheet",a.href=i,a.addEventListener("load",()=>{n&&n(a),document.dispatchEvent(new CustomEvent(m.stylesheets.afterLoad,{detail:{href:o,link:a}}))}),document.dispatchEvent(new CustomEvent(m.stylesheets.beforeLoad,{detail:{href:o,link:a}})),(r||document.body).appendChild(a),G.set(s,a)}return G.get(s)},Te=o=>{try{let e=new URL(o,window.location.href);return e.protocol!=="http:"&&e.protocol!=="https:"?"":e.toString()}catch{}return""};var V=()=>{let o=window.flatpickr;return typeof o=="function"?o:null},X=()=>V()!==null,we=o=>!!o._flatpickr;var C=class C{constructor(e){this.loadedLocales=C.loadedLocales;this.waitForFlatpickrThenReload=(e=40,t=50)=>{if(X()){this.reload();return}e<=0||setTimeout(()=>this.waitForFlatpickrThenReload(e-1,t),t)};this.reload=()=>{if(!this.freeform.has("data-scripts-datepicker"))return;let e=V();if(!e)return;this.freeform.form.querySelectorAll("*[data-datepicker][data-datepicker-enabled]").forEach(r=>{let n=r.getAttribute("data-datepicker-enabled");if(n==="0"||n==="false"||we(r))return;let s=r.getAttribute("data-datepicker-locale")||"default",a={disableMobile:!0,allowInput:!0,dateFormat:r.getAttribute("data-datepicker-format"),enableTime:r.getAttribute("data-datepicker-enabletime")!==null,noCalendar:r.getAttribute("data-datepicker-enabledate")===null,time_24hr:r.getAttribute("data-datepicker-clock_24h")!==null,minDate:r.getAttribute("data-datepicker-min-date"),maxDate:r.getAttribute("data-datepicker-max-date"),minuteIncrement:1,hourIncrement:1,static:r.getAttribute("data-datepicker-static")!==null},i=this.freeform._dispatchEvent("flatpickr-before-init",{detail:a,options:a}),l={...i.detail,...i.options},c=e(r,l);r.setAttribute("autocomplete","off"),this.freeform._dispatchEvent("flatpickr-ready",{detail:c,flatpickr:c}),this.loadedLocales[s]?(this.loadedLocales[s].addEventListener("load",()=>{c.set("locale",s),this.loadedLocales[s].dataset.loaded="true"}),this.loadedLocales[s].dataset.loaded==="true"&&c.set("locale",s)):x(`//cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.13/l10n/${s}.js`,{onLoad:d=>{c.set("locale",s),d.dataset.loaded="true",this.loadedLocales[s]=d}})})};if(this.freeform=e,!!this.freeform.has("data-scripts-datepicker")){if(Le("//cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.13/flatpickr.min.css"),X()){this.reload();return}if(C.flatpickrLoading){this.waitForFlatpickrThenReload();return}C.flatpickrLoading=!0,x("//cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.13/flatpickr.min.js",{onLoad:()=>{C.flatpickrLoading=!1,this.reload()}}),this.waitForFlatpickrThenReload()}}};C.flatpickrLoading=!1,C.loadedLocales={};var J=C,Fe=J;var M=(o,e,t)=>{let{bubbles:r=!1,cancelable:n=!0,...s}=e||{},a=ut(o,r,n);return Object.assign(a,s),t&&(t instanceof HTMLElement?t.dispatchEvent(a):Array.from(t).forEach(i=>{i.dispatchEvent(a)})),a},ut=(o,e=!0,t=!0)=>new Event(o,{bubbles:e,cancelable:t});var Se="freeform-file-dnd",pt=(o,...e)=>{o.classList.add(e.join("__"))},ht=(o,...e)=>{o.classList.remove(e.join("__"))},v=(o,...e)=>{pt(o,Se,...e)},Ce=(o,...e)=>{ht(o,Se,...e)},_=o=>(typeof o=="string"&&(o=o.split(" ")),o.map(e=>`.${e}`).join(""));var Me=o=>{let e=document.createElement("div");return e.innerText="!",e.setAttribute("data-errors",""),v(e,"preview-zone","file-preview","thumbnail","errors"),o._dispatchEvent(m.dragAndDrop.renderErrorContainer,{container:e},e).container};var He=(o,e,t,r)=>{if(r._dispatchEvent(m.dragAndDrop.clearErrors,{},o).defaultPrevented)return;let s=e.querySelector("[data-errors]");e.setAttribute("data-has-errors",""),s.setAttribute("aria-label",t.join("; ")),s.setAttribute("title",t.join(". "))},xe=o=>{let e=o.messages,t=o.container;e&&e.length>0&&o.freeform.disableSubmit(`file-upload-errors-${Ae(t)}`)},ke=(o,e)=>{let t=o.container;t.querySelectorAll("[data-has-errors]").length===0&&e.enableSubmit(`file-upload-errors-${Ae(t)}`)},Ae=o=>o.dataset.freeformFileUpload||"unknown";var Y;var P=async()=>{try{let o=document.querySelector("form[data-csrf-refresh]");if(!o)return Et();switch(o.dataset.csrfRefresh){case"once":return Y===void 0&&(Y=await Re()),Y;case"always":return await Re();default:return null}}catch{}return null},Et=()=>{var r;let o=document.querySelector("form[data-csrf-name]");if(!o)return null;let e=o.dataset.csrfName,t=(r=o.querySelector(`input[name="${e}"]`))==null?void 0:r.value;return!e||!t?null:{name:e,value:t}},Re=async()=>{let e=await fetch("/freeform/tokens",{headers:{Accept:"application/json"}}).then(t=>t.json());return e.csrf!==void 0?{name:e.csrf.name,value:e.csrf.value}:null};var q=class{cancel(){this.cancelFn&&(this.cancelFn(),this.cancelFn=null)}_setCancelFn(e){this.cancelFn=e}},B=class o extends Error{constructor(e,t,r){super(e),this.response={...t,data:r},this.status=t.status,Object.setPrototypeOf(this,o.prototype)}};var D=async(o,e,t,r,n)=>{let s=new URL(e,window.location.origin);n!=null&&n.queryParams&&n.queryParams.forEach((l,c)=>{s.searchParams.set(c,l)});let a=n.request||new XMLHttpRequest;a.open(o,s),a.setRequestHeader("Cache-Control","no-cache"),a.setRequestHeader("X-Requested-With","XMLHttpRequest"),a.setRequestHeader("HTTP_X_REQUESTED_WITH","XMLHttpRequest");let i=await P();return i&&a.setRequestHeader("X-CSRF-Token",i.value),gt(a,n==null?void 0:n.headers),a.onload=()=>{let l=a.response;try{l=JSON.parse(a.response)}catch{}let c=a.status;if(c<200||c>=300){r(new B(`Request failed with status ${a.statusText}`,a,l));return}t({status:a.status,data:l,request:a})},a.onerror=()=>{r(new Error("Network error"))},a.onabort=()=>{r(new Error("Request aborted"))},n.onUploadProgress&&(a.upload.onprogress=l=>{n.onUploadProgress(l)}),n.cancelToken&&n.cancelToken._setCancelFn(()=>{a.abort()}),a},gt=(o,e)=>{e&&Object.entries(e).forEach(([t,r])=>{o.setRequestHeader(t,String(r))})};var vt=async(o,e={})=>new Promise((t,r)=>{D("GET",o,t,r,e).then(n=>{n.open("GET",o),n.send()})}),bt=async(o,e,t={})=>new Promise((r,n)=>{D("POST",o,r,n,t).then(s=>{e instanceof FormData?s.send(e):(s.setRequestHeader("Content-Type","application/json"),s.send(JSON.stringify(e)))})}),L=(o,e)=>new Promise((t,r)=>{D((e==null?void 0:e.method)||"GET",o,t,r,e).then(n=>{let s=e==null?void 0:e.data;s instanceof FormData?n.send(s):(n.setRequestHeader("Content-Type","application/json"),n.send(JSON.stringify(s)))})});L.get=vt;L.post=bt;var Oe=o=>{let e=o.dataset.confirmMessage,t=o.dataset.dialogSelector,r=t!==void 0,n;return r&&(t&&(n=document.querySelector(t)),n||(n=yt(e))),new Promise(a=>{if(!r)return a(confirm(e));n.showModal();let i=()=>{a(n.returnValue==="ok"),n.removeEventListener("close",i)};n.addEventListener("close",i)})},Q="freeform-file-upload-confirm-dialog",yt=o=>{if(document.getElementById(Q))return document.getElementById(Q);let e=document.createElement("dialog");return e.id=Q,e.innerHTML=` +
+

${o}

+ + + + +
+ `,document.body.appendChild(e),e};var Ie=(o,e=50,t="\u2026",r=3)=>o.length>e?o.substr(0,e-r)+t:o;var Lt=({name:o,extension:e,size:t})=>{let r=document.createElement("div");r.setAttribute("data-file-preview",""),v(r,"preview-zone","file-preview");let n=document.createElement("span");n.setAttribute("data-extension-label",""),n.innerText=e.toUpperCase(),v(n,"preview-zone","file-preview","thumbnail","extension-label");let s=document.createElement("div");s.setAttribute("data-thumbnail",""),s.appendChild(n),v(s,"preview-zone","file-preview","thumbnail");let a=document.createElement("span");a.setAttribute("data-filename",""),a.innerText=Ie(o,14),a.title=o,v(a,"preview-zone","file-preview","filename");let i=document.createElement("span");return i.setAttribute("data-filesize",""),i.innerText=t,v(i,"preview-zone","file-preview","filesize"),r.appendChild(s),r.appendChild(a),r.appendChild(i),[r,s,a,i]},Tt=o=>{let e=document.createElement("button");return e.type="button",e.setAttribute("data-remove-button",""),e.setAttribute("title","Remove file?"),e.setAttribute("aria-label","Remove file?"),e.innerHTML='',v(e,"preview-zone","file-preview","thumbnail","remove-button"),o._dispatchEvent(m.dragAndDrop.renderPreviewRemoveButton,{button:e}).button},wt=()=>{let o=document.createElement("div");return o.setAttribute("data-progress",""),v(o,"preview-zone","file-preview","thumbnail","progress"),o},Z=(o,e)=>{let[t,r]=Lt(o);o.url&&(r.style.backgroundImage=`url(${o.url})`);let n=Tt(e),s=Me(e),a=wt();r.appendChild(n),r.appendChild(s),r.appendChild(a);let i=e._dispatchEvent(m.dragAndDrop.renderPreview,{metadata:o,container:t});return v(t,"preview-zone","file-preview","animation-enter"),setTimeout(()=>{Ce(t,"preview-zone","file-preview","animation-enter")},10),i.container.addEventListener("click",l=>l.stopPropagation()),i.container},ee=(o,{id:e})=>{let t=document.createElement("input");return t.type="hidden",t.value=e,t.name=`${o}[]`,t};var Ft=["png","jpg","jpeg","gif"],te=o=>Ft.includes(o.toLowerCase());var j=(o,e)=>{let t=new URL(o,window.location.origin);return t.pathname=`${t.pathname.replace(/\/$/,"")}${e}`,t.toString()},_e=(o,e)=>{if(parseInt(o.dataset.fileCount||"0",10)){let r=o.querySelector("[data-preview-zone]"),{freeformFileUpload:n}=o.dataset,s=new FormData(e.form);s.delete("action"),s.append("handle",n);let a=o.getAttribute("data-base-url")||"";L.post(j(a,"/files"),s,{headers:{"Freeform-Preflight":!0}}).then(({data:i})=>{i.forEach(l=>{let c=Z(l,e);te(l.extension)&&c.querySelector("[data-thumbnail]").setAttribute("data-has-preview","");let d=new FormData(e.form);d.delete("action"),d.append("handle",n),d.append("id",l.id),c.querySelector("[data-remove-button]").addEventListener("click",()=>{confirm("Are you sure?")&&L.post(j(a,"/files/delete"),d).then(()=>{r.removeChild(c),A(o,e)}).catch(f=>{alert(f.message)})}),c.appendChild(ee(n,l)),c.setAttribute("data-completed",""),r.appendChild(c)}),A(o,e)}).catch(console.error)}},Pe=(o,e,t,r,n)=>{let s=new q,a=()=>{s.cancel()},i=o.name.match(/.(\w+)$/i),l=o.name,c=St(o.size),d=i!==null?i[1].toLowerCase():"n/a",u=Z({name:l,extension:d,size:c},n),f=u.querySelector("[data-thumbnail]"),p=u.querySelector("[data-remove-button]");if(te(d)){let h=new FileReader;h.readAsDataURL(o),h.onloadend=()=>{f.setAttribute("data-has-preview",""),f.style.backgroundImage=`url(${h.result.toString()})`}}r.appendChild(u),p.addEventListener("click",a),A(t,n);let g=new FormData(n.form);g.delete("action"),g.append("handle",e),g.append(e,o);let T=t.getAttribute("data-base-url")||"";return L.post(j(T,"/files/upload"),g,{cancelToken:s,onUploadProgress:h=>{let{total:w,loaded:S}=h,b=Math.ceil(S/(w/100));n._dispatchEvent(m.dragAndDrop.onUploadProgress,{total:w,loaded:S,percent:b},t),u.style.setProperty("--progress",`${b}%`),b>=98&&p.removeEventListener("click",a)}}).then(h=>{let w=new FormData(n.form);w.delete("action"),w.append("handle",e),w.append("id",h.data.id),p.removeEventListener("click",a),p.addEventListener("click",async()=>{await Oe(t)&&L.post(j(T,"/files/delete"),w).then(()=>{r.removeChild(u),A(t,n)}).catch(b=>{alert(b.message)})}),u.appendChild(ee(e,h.data)),u.setAttribute("data-completed","")}).catch(h=>{var S,b,U;if(h.message==="Request aborted"){r.removeChild(u),A(t,n);return}p.removeEventListener("click",a),p.addEventListener("click",()=>{r.removeChild(u),A(t,n)});let w;if(((b=(S=h==null?void 0:h.response)==null?void 0:S.data)==null?void 0:b.type)==="field-error"){let{messages:ve}=(U=h==null?void 0:h.response)==null?void 0:U.data;w=ve,He(t,u,ve,n)}else console.warn(h);n._dispatchEvent(m.dragAndDrop.afterErrors,{container:t,messages:w},t)})},A=(o,e)=>{e._dispatchEvent(m.dragAndDrop.onChange,{freeform:e,container:o},o)},St=o=>{let e=["B","KB","MB","GB","TB"];if(o<1024)return`${o} B`;let t=o,r=0;for(;t>=1024&&r{let n=document.createElement("li");n.setAttribute("data-error",""),n.innerText=e,v(n,"messages","message"),v(n,"messages","message","error");let s=t._dispatchEvent(m.dragAndDrop.showGlobalMessage,{messageItem:n},o);Ht(o,s.messageItem,r)},Ht=(o,e,t)=>{let r=o.querySelector("[data-messages]");r&&(r.appendChild(e),setTimeout(()=>{e.setAttribute("data-animate-fade-out","")},t),setTimeout(()=>{r.removeChild(e)},t+Mt))};var ne=class{constructor(e){this.currentFileUploads=0;this.isFormLocked=!1;this.reload=()=>{let e=this.freeform.form;this.freeform.form.querySelectorAll("[data-freeform-file-upload]").forEach(r=>{r.style.setProperty("--accent",r.dataset.accent),r.addEventListener("dragenter",this.handleDrag(r)),r.addEventListener("dragleave",this.handleDragLeave(r)),r.addEventListener("dragover",this.handleDrag(r)),r.addEventListener("drop",this.handleDrop(r)),r.addEventListener("click",this.handleClick(r)),r.addEventListener(m.dragAndDrop.onChange,this.handleChanges),r.addEventListener(m.dragAndDrop.onChange,n=>{ke(n,this.freeform)}),r.addEventListener(m.dragAndDrop.afterErrors,xe),_e(r,this.freeform),e.addEventListener(m.form.reset,this.handleReset(r)),r.querySelector("input[type=file]").addEventListener("change",this.handleManualUpload(r))})};this.handleChanges=({container:e})=>{e.querySelector("[data-preview-zone]").querySelectorAll("[data-file-preview]").length>0?e.setAttribute("data-contains-files",""):e.removeAttribute("data-contains-files")};this.attachDragState=e=>{e instanceof HTMLElement&&(e.dataset.dragging="")};this.detachDragState=e=>{e instanceof HTMLElement&&delete e.dataset.dragging};this.handleDrag=e=>t=>{t.preventDefault(),t.stopPropagation(),this.attachDragState(e)};this.handleDragLeave=e=>t=>{t.preventDefault(),t.stopPropagation(),this.detachDragState(e)};this.handleDrop=e=>t=>{t.preventDefault(),t.stopPropagation(),this.detachDragState(e);let n=t.dataTransfer.files;this.initFileUpload(n,e)};this.handleClick=e=>()=>{let t=e.querySelector('input[type="file"]');if(!t)throw new Error("File upload corrupted");t.click()};this.handleManualUpload=e=>t=>{let r=t.target,{files:n}=r;this.initFileUpload(n,e),r.value=null};this.initFileUpload=(e,t)=>{let{freeformFileUpload:r,maxFiles:n,maxSize:s}=t.dataset,{messageSize:a,messageFiles:i}=t.dataset,l=t.querySelector("[data-preview-zone]"),c=t.querySelectorAll("[data-file-preview]:not([data-has-errors])").length;for(let d=0;d=parseInt(n,10)){re(t,i,this.freeform);break}let u=e.item(d);if(u.size>parseInt(s,10)){re(t,a,this.freeform);continue}this.currentFileUploads++,Pe(u,r,t,l,this.freeform).finally(()=>{this.currentFileUploads--,this.handleUploadLockdown()}),c++,this.handleUploadLockdown()}};this.handleReset=e=>()=>{e.querySelectorAll("[data-file-preview]").forEach(r=>{r.parentNode.removeChild(r)}),M(m.dragAndDrop.onChange,{container:e},e)};this.handleUploadLockdown=()=>{this.currentFileUploads>0?this.isFormLocked||(this.isFormLocked=!0,this.freeform.lockSubmit("file-upload")):(this.freeform.unlockSubmit("file-upload"),this.isFormLocked=!1)};this.freeform=e,this.reload()}},qe=ne;var oe=class{constructor(e){this.reload=()=>{if(!this.freeform.has("data-scripts-js-mask"))return;this.freeform.form.querySelectorAll("*[data-masked-input]").forEach(t=>{let r=t.getAttribute("data-pattern");r&&new IMask(t,{mask:r})})};this.freeform=e,this.freeform.has("data-scripts-js-mask")&&x("https://cdnjs.cloudflare.com/ajax/libs/imask/6.0.7/imask.min.js",{onLoad:()=>this.reload()})}},Be=oe;var se=class{constructor(e){this.reload=()=>{this.freeform.form.querySelectorAll('[data-field-type="rating"]').forEach(t=>{let{colorIdle:r,colorHover:n,colorSelected:s}=t.dataset;t.style.setProperty("--ff-rating-color-idle",r),t.style.setProperty("--ff-rating-color-hover",n),t.style.setProperty("--ff-rating-color-selected",s)})};this.freeform=e,this.reload()}},De=se;var ae=class{constructor(e){this.reload=()=>{if(!this.freeform.has("data-scripts-signature"))return;this.freeform.form.querySelectorAll("canvas[data-signature-field]").forEach(t=>{let r=()=>{l.value=u.toDataURL()},{borderColor:n,backgroundColor:s,penColor:a,dotSize:i}=t.dataset;t.style.borderWidth="1px",t.style.borderStyle="solid",t.style.borderColor=n;let l=t.previousSibling,c=t.parentNode.querySelector("[data-signature-clear]"),d=l.value,u=new SignaturePad(t,{onEnd:r,backgroundColor:s,penColor:a,dotSize:i,maxWidth:i,throttle:5});if(c&&c.addEventListener("click",()=>{u.clear(),l.value=""}),d){let f=new Image;u.clear(),f.src=d,f.onload=()=>{t.getContext("2d").drawImage(f,0,0,t.width,t.height)}}})};this.freeform=e,this.freeform.has("data-scripts-signature")&&x("//cdn.jsdelivr.net/npm/signature_pad@2.3.2/dist/signature_pad.min.js",{onLoad:this.reload})}},je=ae;var ie=/([^[]+)\[(\d+)\](\[\d+\](?:\[\])?)$/g,Ne=/^(labeled-.*)-(\d+)-(\d+)-(\d+)$/g,$e=o=>{let e;o.form.querySelectorAll("[data-freeform-table]").forEach(r=>{if(e=r.parentNode.querySelector("[data-freeform-table-add-row]"),le(r,e),e){o.form.addEventListener(m.table.afterRemoveRow,()=>{le(r,e)});let n=()=>{let s=r.querySelectorAll("textarea, input, select"),a=0;for(let i=0;i{let s=r.querySelector("tbody > tr:last-child");if(s){let a=s.cloneNode(!0),i=a.querySelectorAll("textarea, input, select"),l=n();for(let d=0;d{if(!e)return;let t=o.querySelectorAll("tbody > tr").length,r=o.getAttribute("data-exact-rows"),n=o.getAttribute("data-max-rows");if(r){let s=parseInt(r,10);e.style.display=t>=s?"none":"block";return}if(n){let s=parseInt(n,10);e.style.display=t>=s?"none":"block"}};var R=o=>(typeof o=="string"&&(o=o.split(" ")),o),H=(o,e)=>{R(e).map(t=>o.classList.add(t))},N=(o,e)=>{R(e).map(t=>o.classList.remove(t))};function k(o){var e;o!==void 0&&(o instanceof HTMLElement&&((e=o.parentElement)==null||e.removeChild(o)),(o instanceof HTMLCollection||o instanceof NodeList)&&Array.from(o).forEach(t=>{var r;(r=t.parentElement)==null||r.removeChild(t)}))}var Ue=!1,We=o=>{o.form.querySelectorAll("[data-freeform-table]").forEach(t=>{let r=t.querySelectorAll("[data-freeform-table-remove-row]");for(let n=0;n{let n=t.row.querySelector("[data-freeform-table-remove-row]");n&&n.addEventListener("click",ze(o))}))},ze=o=>e=>{let t=e.target,r=t.closest("tbody"),n=t.closest("table"),s=t.closest("tr");if(!r||!n||!s)return;let a=r.querySelectorAll("tr").length;if(a<=1||n.getAttribute("data-exact-rows"))return;let l=n.getAttribute("data-min-rows");if(l){let c=parseInt(l,10);if(a-1{o.form.addEventListener(m.form.renderFieldErrors,xt)},xt=o=>{let t=o.form.querySelectorAll("[data-freeform-table]"),r=o.freeform.options.errorClassField;t.forEach(n=>{let s=n.querySelectorAll("thead th[data-column-required]"),a=Array.from(s).map(l=>l.cellIndex);n.querySelectorAll("tbody tr").forEach(l=>{let c=l.querySelectorAll("td");a.forEach(d=>{var g;let f=c[d].querySelector("input, textarea, select"),p=!!(f!=null&&f.value);["radio","checkbox"].includes((f==null?void 0:f.type)||"")&&(p=!!(f!=null&&f.checked)),(f==null?void 0:f.type)==="file"&&(p=!!((g=f.files)!=null&&g.length)),!f||!p?(f==null?void 0:f.type)==="radio"?f.parentElement.parentElement.querySelectorAll("input").forEach(T=>{H(T,r)}):H(f,r):N(f,r)})})})};var ce=class{constructor(e){this.reload=()=>{$e(this.freeform),We(this.freeform),Ke(this.freeform)};this.freeform=e,this.reload()}},Ge=ce;var de=class{constructor(e){this.reload=()=>{let e=this.getSessionId();e&&this.form.querySelectorAll("input, select, textarea").forEach(t=>{t.addEventListener("blur",()=>{L.post("/freeform/ab-test/tracker",{sessionId:e,fieldName:t.name})})})};this.getSessionId=()=>{let e=this.form;return e.hasAttribute("data-ab-test")?e.getAttribute("data-ab-test"):!1};this.freeform=e,this.form=e.form,this.reload()}},Ve=de;var kt="freeform-gtm-data-layer-push",me=class{constructor(e){this.reload=()=>{};if(window.dataLayer=window.dataLayer||[],this.freeform=e,this.form=e.form,!this.freeform.has("data-gtm"))return;let t=this.form.dataset.gtmEventName||"form-submission",r=this.form.dataset.handle;this.form.addEventListener(m.form.ajaxSuccess,n=>{let s=n.response,a=e._dispatchEvent(kt,{payload:{},response:s}),i={event:t,form:r,submission:{id:s.submissionId,token:s.submissionToken},...a.payload};window.dataLayer.push(i)})}},Xe=me;var Je="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",At=Je.length;function fe(o,e="-"){if(Array.isArray(o))return o.map(r=>fe(r)).join(e);let t="";for(let r=0;r{if(!this.form.hasAttribute("data-idempotency"))return;let e=document.createElement("input");e.type="hidden",e.name="idempotencyKey",e.value=fe([6,20,20]),this.form.appendChild(e)};this.freeform=e,this.form=e.form,this.reload()}},Ye=ue;var O=(o,e)=>{if(o===e)return!0;if(o==null||e==null)return o===e;if(Number.isNaN(o)&&Number.isNaN(e))return!0;if(typeof o!=typeof e)return!1;if(Array.isArray(o)&&Array.isArray(e))return o.length!==e.length?!1:o.every((t,r)=>O(t,e[r]));if(typeof o=="object"&&typeof e=="object"){let t=Object.keys(o),r=Object.keys(e);return t.length!==r.length?!1:t.every(n=>Object.prototype.hasOwnProperty.call(e,n)&&O(o[n],e[n]))}return!1};var Qe=o=>e=>e.conditions.some(t=>{let r=o.name,n=t.field;return n===r||`${n}[]`===r}),pe=class{constructor(e){this.reload=()=>{let e=this.form.querySelector("[data-rules-json]");if(!e)return;let{rules:t,values:r}=JSON.parse(e.dataset.rulesJson);this.values=r,!(t.fields.length===0&&t.buttons.length===0)&&(Array.from(this.form.elements).forEach(n=>{let s=t.fields.filter(Qe(n)),a=t.buttons.filter(Qe(n)),i=[...s,...a];if(i.length===0)return;let l;switch(n.tagName){case"TEXTAREA":case"INPUT":{let f=n;if(f.type==="hidden")return;switch(f.type){case"radio":case"checkbox":l="change";break;case"number":l=["keyup","change"];break;default:l="keyup";break}break}case"SELECT":l="change";break}if(!l)return;let c=new Set(s),d=()=>{i.forEach(f=>{this.applyRule(f)}),t.fields.forEach(f=>{c.has(f)||this.applyRule(f)})};(Array.isArray(l)?l:[l]).forEach(f=>{n.addEventListener(f,d)})}),Rt(this.form,()=>{t.fields.forEach(n=>{this.applyRule(n,!1)}),t.buttons.forEach(n=>{this.applyRule(n,!1)})}))};this.applyRule=(e,t=!0)=>{let r="field"in e?`[data-field-container="${e.field}"]`:`[data-button-container="${e.button}"]`,n=this.form.querySelector(r);if(!n)return;let{display:s,combinator:a,conditions:i}=e,l=a==="and"?i.every(this.verifyCondition):i.some(this.verifyCondition),c=n.style.display||"",d=n.dataset.hidden!==void 0,u="",f=!1;return s==="show"?(u=l?"":"none",f=!l):(u=l?"none":"",f=l),c!==u||d!==f?(n.style.display=u,f?n.dataset.hidden="":delete n.dataset.hidden,t&&M(m.rules.applied,{rule:e},n),!0):!1};this.verifyCondition=e=>{let t=null,r=document.querySelector(`[data-field-container="${e.field}"]`);if(r){let n=this.form[e.field]||this.form[`${e.field}[]`],s=r.getAttribute("data-field-type")==="checkbox",a=r.getAttribute("data-field-type")==="checkboxes";r.dataset.hidden!==void 0?t=null:s?t=n[1].checked?"1":"":a?t=Array.from(n).filter(l=>l.checked).map(l=>l.value):n instanceof HTMLSelectElement&&n.multiple?t=Array.from(n.options).filter(l=>l.selected).map(l=>l.value):n instanceof RadioNodeList?(t=Array.from(n).filter(l=>l.checked).map(l=>l.value),t=t.length>0?t[0]:""):t=n.value}else{let n=this.values[e.field]||"";typeof n=="boolean"?t=n?"1":"":typeof n=="number"?t=`${n}`:t=n}if(typeof t=="object")switch(e.operator){case"equals":return O(t,[e.value]);case"notEquals":return!O(t,[e.value]);case"contains":return t==null?void 0:t.includes(e.value);case"notContains":return!(t!=null&&t.includes(e.value));case"isEmpty":return t===null||t.length===0;case"isNotEmpty":return(t==null?void 0:t.length)>0;case"isOneOf":case"isNotOneOf":{let n=e.operator==="isOneOf",s=(e.value?JSON.parse(e.value):[]).map(i=>i.toLowerCase()),a=t==null?void 0:t.some(i=>s.includes(i.toLowerCase()));return s.length===0?n?t.length!==0:t.length===0:n?a:!a}default:return!1}switch(e.operator){case"equals":return`${t}`.toLowerCase()===`${e.value}`.toLowerCase();case"notEquals":return`${t}`.toLowerCase()!==`${e.value}`.toLowerCase();case"greaterThan":return parseFloat(t)>parseFloat(e.value);case"greaterThanOrEquals":return parseFloat(t)>=parseFloat(e.value);case"lessThan":return parseFloat(t)0;case"isOneOf":case"isNotOneOf":{let n=e.operator==="isOneOf",s=(e.value?JSON.parse(e.value):[]).map(i=>i.toLowerCase()),a=s.includes(t.toLowerCase());return s.length===0?n?t.length===0:t.length!==0:n?a:!a}default:return!1}};this.freeform=e,this.form=e.form,this.reload()}},Ze=pe,Rt=(o,e)=>{let t,r={},n=0,s=10;do t={...r},e(),r=Ot(o),n++;while(JSON.stringify(t)!==JSON.stringify(r)&&n{let e={};return o.querySelectorAll("[data-field-container], [data-button-container]").forEach(t=>{let r=t.getAttribute("data-field-container")||t.getAttribute("data-button-container");e[r]=t.style.display||""}),e};var he=class{constructor(e){this.reload=()=>{};this.freeform=e,this.form=e.form,this.form.addEventListener(m.form.handleActions,t=>{let{actions:r}=t,n=r.find(c=>c.name==="save-form");if(!n)return;let{key:s,token:a,url:i}=n.metadata,l=M(m.saveAndContinue.saveFormhandleToken,{key:s,token:a,url:i},this.form);l.defaultPrevented||(window.location.href=l.url)})}},et=he;var tt=()=>navigator.userAgent.indexOf("Safari")>-1;var y=class y{constructor(e){this.options={ajax:!1,disableReset:!1,disableSubmit:!1,autoScroll:!1,scrollToAnchor:!1,scrollOffset:0,scrollElement:window,showProcessingSpinner:!1,showProcessingText:!1,processingText:null,prevButtonName:"form_previous_page_button",skipHtmlReload:!1,successBannerMessage:"Form has been submitted successfully!",errorBannerMessage:"Sorry, there was an error submitting the form. Please try again.",errorClassBanner:"freeform-form-errors",errorClassList:"freeform-errors",errorClassField:"freeform-has-errors",successClassBanner:"freeform-form-success",removeMessages:null,renderSuccess:null,renderFormErrors:null,renderFieldErrors:null};this._initializedHandlers=[];this._handlers=[Ye,Ve,be,Ze,Fe,Be,De,je,Ge,Xe,qe,et,ye];this._lockList=new Set;this._disableList=new Set;this._scrollToForm=()=>{let{scrollOffset:e,scrollElement:t}=this.options,r=this.form.getBoundingClientRect().top+window.scrollY+e;t.scrollTo({top:r,behavior:this._isReducedMotion()?"instant":"smooth"})};this._isReducedMotion=()=>{let e=window.matchMedia("(prefers-reduced-motion: reduce)");return!e||e.matches};this._setUp=()=>{this._attachListeners(),this._getSubmitButtons().forEach(t=>{t.dataset.originalText=t.innerHTML,t.dataset.processingText=this.options.processingText})};this._initHandlers=()=>{this._handlers.forEach(e=>{this._initializedHandlers.push(new e(this))})};this._resetHandlers=()=>{this._initializedHandlers.forEach(e=>{e.reload&&e.reload()})};this.has=e=>this.form.getAttribute(e)!==null;this.setOption=(e,t)=>{this.options[e]=t};this.disableForm=()=>{this.form.dataset.freeformDisabled=""};this.enableForm=()=>{delete this.form.dataset.freeformDisabled};this.disableSubmit=(e="freeform")=>{this._disableList.add(e);let t=Array.from(this._getSubmitButtons());for(let r of t)r.disabled=!0,r.ariaDisabled="true",r.dataset.disabled="true"};this.enableSubmit=(e="freeform")=>{if(this._disableList.delete(e),this._disableList.size>0)return;let t=Array.from(this._getSubmitButtons());for(let r of t)r.disabled=!1,r.ariaDisabled=void 0,delete r.dataset.disabled};this.lockSubmit=(e="freeform")=>{if(this._lockList.add(e),this._lockList.size>1)return;let{disableSubmit:t,showProcessingSpinner:r,showProcessingText:n}=this.options;t&&this.disableSubmit(e);let s=this._lastButtonPressed;s||(s=this._getSubmitButtons()[0]||void 0),s&&(r&&s.classList.add("freeform-processing"),n&&(s.innerHTML=s.dataset.processingText))};this.unlockSubmit=(e="freeform")=>{this._lockList.delete(e),!(this._lockList.size>0)&&this._unlockSubmitButtons(e)};this.forceUnlockSubmit=()=>{this._lockList.clear(),this._unlockSubmitButtons()};this.triggerResubmit=()=>{this.unlockSubmit(),this._lastButtonPressed?this._lastButtonPressed.click():this.triggerSubmit()};this.triggerSubmit=()=>{this.unlockSubmit();let e=this._getMainSubmitButton();e&&e.click()};this._unlockSubmitButtons=e=>{let{disableSubmit:t,showProcessingSpinner:r,showProcessingText:n}=this.options;t&&this.enableSubmit(e);let s=this._getSubmitButtons();for(let a=0;a{let{form:e}=this;y.instances.set(e,this),e.freeform=this};this._attachListeners=()=>{let e=this.form,t=this.form.querySelector("input[name=freeform-action]");t&&e.querySelectorAll("[data-freeform-action]").forEach(s=>{s.addEventListener("click",()=>{this._lastButtonPressed=s,t.value=s.getAttribute("data-freeform-action")})}),e.querySelectorAll("input, select, textarea").forEach(n=>{n.addEventListener("change",s=>{this._removeMessageFrom(s.target)})}),y.instantiatedForms.has(e)||(y.instantiatedForms.set(e,!0),e.addEventListener(m.form.ajaxAfterSubmit,n=>{let s=n.form.querySelector("input[name=freeform-action]");s&&(s.value="submit")}),e.addEventListener("submit",this._onSubmit),e.addEventListener("keydown",n=>{let s=n.key==="Enter"&&!n.shiftKey&&!n.ctrlKey&&!n.metaKey,a=n.target instanceof HTMLInputElement;s&&a&&(n.preventDefault(),n.stopPropagation(),this._getMainSubmitButton()&&this.triggerSubmit())}))};this._onSubmit=async e=>{this.lockSubmit(),e.preventDefault(),e.stopPropagation();let{options:{ajax:t}}=this,r=e.submitter,n=!1;(r==null?void 0:r.name)===y._BACK_BUTTON_NAME&&(n=!0);let s={};if(this._dispatchEvent(m.form.submit,{isBackButtonPressed:n,cancelable:!0,addCallback:(c,d=0)=>{s[d]===void 0&&(s[d]=[]),s[d].push(c)}}).defaultPrevented)return this.forceUnlockSubmit(),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),!1;let i=Object.entries(s).sort(([c],[d])=>Number(c)-Number(d)).flatMap(([,c])=>c);for(let c of i)if(await c()===!1)return this.forceUnlockSubmit(),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),!1;if(t)return this._onSubmitAjax(e),!1;let l=await P();if(l){let c=this.form.querySelector(`input[name="${l.name}"]`);c||(c=document.createElement("input"),c.type="hidden",c.name=l.name,this.form.appendChild(c)),c.value=l.value}this.form.submit()};this._removeMessages=()=>{if(this._dispatchEvent(m.form.removeMessages).defaultPrevented)return;if(typeof this.options.removeMessages=="function"){this.options.removeMessages=this.options.removeMessages.bind(this),this.options.removeMessages();return}let{form:t,options:r}=this,{successClassBanner:n,errorClassBanner:s,errorClassList:a,errorClassField:i}=r;k(t.querySelectorAll(`.${R(a).join(".")}`)),t.querySelectorAll(`.${R(i).join(".")}`).forEach(c=>{this._removeMessageFrom(c)}),k(t.querySelectorAll(_(n))),k(document.querySelectorAll(_(s)))};this._removeMessageFrom=e=>{if(this._dispatchEvent(m.form.fieldRemoveMessages,{field:e}).defaultPrevented)return;let{options:r}=this,{errorClassList:n,errorClassField:s}=r,a=e.parentNode;e.type&&(e.type==="radio"||e.type==="checkbox"&&/\[]$/.test(e.name))&&(a=e.parentNode.parentNode),k(a.querySelector(_(n)));let i=a.querySelectorAll("input, select, textarea");for(let l=0;l{if(this._dispatchEvent(m.form.renderSuccess).defaultPrevented)return;if(typeof this.options.renderSuccess=="function"){this.options.renderSuccess=this.options.renderSuccess.bind(this),this.options.renderSuccess();return}let{form:t,options:r}=this,{successBannerMessage:n,successClassBanner:s}=r,a=document.createElement("div");H(a,s);let i=document.createElement("p");i.appendChild(document.createTextNode(n)),a.appendChild(i),t.insertBefore(a,t.childNodes[0])};this._renderFieldErrors=e=>{if(this._dispatchEvent(m.form.renderFieldErrors,{errors:e}).defaultPrevented)return!1;if(typeof this.options.renderFieldErrors=="function")return this.options.renderFieldErrors=this.options.renderFieldErrors.bind(this),this.options.renderFieldErrors(e);let{form:r,options:n}=this,{errorClassList:s,errorClassField:a}=n;for(let i in e){let l=e[i],c=document.createElement("ul");c.setAttribute("data-field-errors",""),H(c,s);for(let p=0;p{if(this._dispatchEvent(m.form.renderFormErrors,{errors:e}).defaultPrevented)return!1;if(typeof this.options.renderFormErrors=="function")return this.options.renderFormErrors=this.options.renderFormErrors.bind(this),this.options.renderFormErrors(e);let{form:r,options:n}=this,{errorClassBanner:s,errorBannerMessage:a}=n,i=document.createElement("div");H(i,s);let l=document.createElement("p");if(l.appendChild(document.createTextNode(a)),i.appendChild(l),e.length){let c=document.createElement("ul");for(let d=0;d{let{form:e}=this,t=new FormData(e);if(tt())for(let r=0;r{var i;let{form:r}=this,n=this._prepareFormData();n.set("action","freeform/submit/quick-save"),n.set("storage-secret",e),t&&n.set("token",t);let s;try{s=await L(r.getAttribute("action")||window.location.href,{method:r.getAttribute("method"),data:n})}catch(l){if(((i=l==null?void 0:l.response)==null?void 0:i.status)===417)return this.unlockSubmit(),!1}this._removeMessages();let a=s.data;if(s.status===200){let{success:l,errors:c,formErrors:d,storageToken:u}=a;if(l)return u;(c||d)&&(this._dispatchEvent(m.form.ajaxError,{request:s,response:a,errors:c,formErrors:d}),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),this._renderFieldErrors(c),this._renderFormErrors(d)),this.options.autoScroll&&this._scrollToForm()}else this._dispatchEvent(m.form.ajaxError,{request:s,response:a}),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1});this.unlockSubmit()};this._onSubmitAjax=e=>{let{form:t}=this,r=this._prepareFormData(),n=new XMLHttpRequest,s=e.submitter;s!=null&&s.name&&r.append(s.name,"1");let a=t.getAttribute("method")||"POST",i=t.getAttribute("action")||window.location.href;this._dispatchEvent(m.form.ajaxBeforeSubmit,{data:r,request:n}).defaultPrevented||L(i,{data:r,method:a,request:n}).then(c=>{if(this._removeMessages(),c.status===200){let d=c.data,{success:u,finished:f,actions:p=[],errors:g,formErrors:T,returnUrl:h}=d;if(this._dispatchEvent(m.form.ajaxBeforeSuccess,{request:n,response:d}).defaultPrevented)return;if(p.length)this._dispatchEvent(m.form.handleActions,{response:d,actions:p,cancelable:!1});else if(u){let b=["redirect-return-url","redirect-entry"].includes(d.onSuccess);if(f&&b&&h){if(this._dispatchEvent(m.form.ajaxSuccess,{request:n,response:d}).defaultPrevented)return;window.location.href=h;return}d.html!==null&&!this.options.skipHtmlReload&&(t.innerHTML=d.html.replace(/]*>/,"").replace("","")),this.options.skipHtmlReload||(this._resetHandlers(),this._setUp()),f&&(this.options.disableReset||(t.reset(),this._dispatchEvent(m.form.reset)),d.onSuccess==="reload"&&this._renderSuccessBanner()),this._dispatchEvent(m.form.ajaxSuccess,{request:n,response:d})}else(g||T)&&(this._dispatchEvent(m.form.ajaxError,{request:n,response:d,errors:g,formErrors:T}),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),this._renderFieldErrors(g),this._renderFormErrors(T));let S=d==null?void 0:d.freeform_payload;if(S){let b=t.querySelector("input[name^=freeform_payload]");b&&(b.value=S)}this._dispatchEvent(m.form.ajaxAfterSubmit,{data:r,request:n,response:d,cancelable:!1}),this.options.autoScroll&&this._scrollToForm()}else{let d=n.response;this._dispatchEvent(m.form.ajaxError,{request:n,response:d})}this.unlockSubmit()}).catch(c=>{console.error("Error submitting form:",c),this.unlockSubmit(),this._dispatchEvent(m.form.ajaxError,{request:n,response:c})})};this._getMainSubmitButton=()=>this.form.querySelector('*[type=submit][data-freeform-action="submit"]');this._getSubmitButtons=()=>{let e=this.form.querySelectorAll("*[type=submit][data-freeform-action]");return e.length?e:this.form.querySelectorAll("*[type=submit]")};this._getBackButtons=()=>this.form.querySelectorAll('*[type=submit][data-freeform-action="back"]');this._dispatchEvent=(e,t,r)=>{let n=M(e,{...t,form:this.form,freeform:this},r);return document.dispatchEvent(n),this.form.dispatchEvent(n),n};if(y.instances.get(e))return y.instances.get(e);this.id=e.dataset.id,this.form=e,this._setInstances();let t={ajax:e.getAttribute("data-ajax")!==null,disableReset:e.getAttribute("data-disable-reset")!==null,scrollToAnchor:e.getAttribute("data-scroll-to-anchor")!==null,autoScroll:e.getAttribute("data-auto-scroll")!==null,disableSubmit:e.getAttribute("data-disable-submit")!==null,showProcessingSpinner:e.getAttribute("data-show-processing-spinner")!==null,showProcessingText:e.getAttribute("data-show-processing-text")!==null,processingText:e.getAttribute("data-processing-text"),successBannerMessage:e.getAttribute("data-success-message"),errorBannerMessage:e.getAttribute("data-error-message"),skipHtmlReload:e.getAttribute("data-skip-html-reload")!==null};this.options={...this.options,...t},this.disableSubmit("init");let r=setInterval(async()=>{if(document.readyState==="complete"){clearInterval(r);let n=this._dispatchEvent(m.form.ready,{options:{}});this.options={...this.options,...n.options},this._setUp(),this._initHandlers(),this.enableSubmit("init");let{scrollToAnchor:s}=this.options;s&&this._scrollToForm()}},50)}};y._BACK_BUTTON_NAME="form_previous_page_button",y.instances=new WeakMap,y.instantiatedForms=new WeakMap,y.getInstance=e=>y.instances.get(e);var F=y,It=document.querySelectorAll("form[data-freeform]");It.forEach(o=>{new F(o)});var nt=o=>{var e;o.nodeName==="FORM"&&((e=o.dataset)==null?void 0:e.freeform)!==void 0&&new F(o),o==null||o.childNodes.forEach(nt)},_t=new MutationObserver(o=>{o.forEach(e=>{e.type==="childList"&&e.addedNodes.forEach(t=>{nt(t)})})}),rt=0,$,ot=()=>{if(rt>25)return console.warn("Freeform observer timed out"),clearTimeout($);document.body?_t.observe(document.body,{childList:!0,subtree:!0}):(rt++,$&&clearTimeout($),$=setTimeout(ot,50))};ot();function Pt(o,e){var t={};for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&e.indexOf(r)<0&&(t[r]=o[r]);if(o!=null&&typeof Object.getOwnPropertySymbols=="function")for(var n=0,r=Object.getOwnPropertySymbols(o);n"u")return e.resolve(null);var t=Dt(o),r=t.url,n=t.attributes,s=n["data-namespace"]||"paypal",a=st(s);return n["data-js-sdk-library"]||(n["data-js-sdk-library"]="paypal-js"),qt(r,n)&&a?e.resolve(a):Ut({url:r,attributes:n},e).then(function(){var i=st(s);if(i)return i;throw new Error("The window.".concat(s," global variable is not available."))})}function Ut(o,e){e===void 0&&(e=Promise),lt(o,e);var t=o.url,r=o.attributes;if(typeof t!="string"||t.length===0)throw new Error("Invalid url.");if(typeof r<"u"&&typeof r!="object")throw new Error("Expected attributes to be an object.");return new e(function(n,s){if(typeof document>"u")return n();Bt({url:t,attributes:r,onSuccess:function(){return n()},onError:function(){var a=new Error('The script "'.concat(t,'" failed to load. Check the HTTP status code and response body in DevTools to learn more.'));return s(a)}})})}function st(o){return window[o]}function lt(o,e){if(typeof o!="object"||o===null)throw new Error("Expected an options object.");var t=o.environment;if(t&&t!=="production"&&t!=="sandbox")throw new Error('The `environment` option must be either "production" or "sandbox".');if(typeof e<"u"&&typeof e!="function")throw new Error("Expected PromisePonyfill to be a function.")}var Ee=new Map,dt={root:"[data-freeform-paypal-buttons]",orderInput:"[data-freeform-paypal-order]"},ct={orders:"/freeform/payments/paypal/orders"},zt=window.FREEFORM_DEBUG===!0;function E(...o){zt&&console.error("PayPal:",...o)}function I(o,e,t="success"){let r=o.closest('[data-field-type="paypal"]')||o.parentElement;if(!r)return;let n=r.querySelector("[data-ff-paypal-notice]");n||(n=document.createElement("div"),n.setAttribute("data-ff-paypal-notice","true"),n.style.marginTop="8px",n.style.fontSize="0.95em",r.appendChild(n));let s={muted:"#555",success:"#0a7",error:"#b00020"};n.style.color=s[t],n.textContent=e}function ge(o){let e=o.getAttribute("data-config");if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Wt(o,e,t){try{let r=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":e},credentials:"same-origin",body:JSON.stringify({values:t})});if(!r.ok){let s=await r.text();return E("Order creation failed",r.status,r.statusText,s),null}let n=await r.json();return n!=null&&n.id?{id:String(n.id),status:n.status,approve:n.approve}:null}catch(r){return E("Network error during order creation:",r),null}}async function Kt(o,e,t,r){try{let n=await fetch(`${o}/${t}/capture`,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":e},credentials:"same-origin",body:JSON.stringify(r)});if(!n.ok){let a=await n.text();return E("Order capture failed",n.status,n.statusText,a),null}let s=await n.json();return s!=null&&s.status&&(s!=null&&s.id)?{status:String(s.status),id:String(s.id)}:null}catch(n){return E("Network error during order capture:",n),null}}async function mt(o,e,t){let r=`${o}-${e?"sandbox":"live"}-${t}`;if(Ee.has(r))return Ee.get(r);let n=await it({clientId:o,currency:(t||"USD").toUpperCase(),components:"buttons",intent:"capture",enableFunding:"venmo,paylater"});if(!n)throw new Error("PayPal SDK failed to load");return Ee.set(r,n),window.paypal||(window.paypal=n),n}async function Gt(o){let e=ge(o);if(!e){E("Could not parse config from element",o);return}if(!e.clientId){E("No client ID provided");return}let t=o.closest("form");if(!t){E("Could not find form element");return}let r=t.querySelector(dt.orderInput);if(!r){E("Could not find hidden order input");return}try{(await mt(e.clientId,e.sandbox,e.currency||"USD")).Buttons({style:{layout:"vertical",color:"blue",shape:"rect",label:"paypal"},createOrder:async()=>{try{let s=new FormData(t),a={};s.forEach((l,c)=>{a[c]=l});let i=await Wt(ct.orders,e.integration,a);if(!(i!=null&&i.id))throw E("Failed to create order or no order ID returned",i),new Error("Failed to create PayPal order");return r.value=i.id,i.id}catch(s){throw E("Error in createOrder:",s),s}},onApprove:async s=>{r.value=String(s.orderID||""),I(o,"Processing your payment\u2026","muted");try{let a=new FormData(t),i={};a.forEach((c,d)=>{i[d]=c});let l=await Kt(ct.orders,e.integration,String(s.orderID||""),{values:i});if(l&&l.status==="COMPLETED"){let c=F.getInstance(t);c?(I(o,"Payment complete. Your form is being submitted automatically.","success"),c.triggerSubmit()):I(o,"Payment completed with PayPal. Click Submit to finish.","success")}else E("Payment capture failed",l),I(o,"PayPal capture failed. Please try again.","error")}catch(a){E("Error during payment capture:",a),I(o,"PayPal capture error. Please try again.","error")}},onError:s=>{E("Payment error:",s)},onCancel:s=>{}}).render(o)}catch(n){E("Failed to initialize buttons:",n)}}document.addEventListener("DOMContentLoaded",async()=>{let o=document.querySelectorAll(dt.root);if(o.length===0)return;let e=new Map;if(o.forEach(t=>{let r=ge(t);r!=null&&r.clientId&&(e.has(r.clientId)||e.set(r.clientId,[]),e.get(r.clientId).push(t))}),e.size===0){E("No valid configurations found");return}e.forEach(async(t,r)=>{try{let n=ge(t[0]);if(!n)return;await mt(r,n.sandbox,n.currency||"USD"),t.forEach(s=>{Gt(s)})}catch(n){E(`Failed to load SDK for clientId ${r}:`,n)}})});})(); diff --git a/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js b/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js index 78a7eeb0c..e3bb68398 100644 --- a/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js +++ b/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js @@ -1,4 +1,4 @@ -(()=>{var Re=Object.create;var Y=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var He=Object.getPrototypeOf,Pe=Object.prototype.hasOwnProperty;var Z=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ce=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fe(e))!Pe.call(t,n)&&n!==r&&Y(t,n,{get:()=>e[n],enumerable:!(o=Me(e,n))||o.enumerable});return t};var Ae=(t,e,r)=>(r=t!=null?Re(He(t)):{},Ce(e||!t||!t.__esModule?Y(r,"default",{value:t,enumerable:!0}):r,t));var ce=Z(G=>{"use strict";Object.defineProperty(G,"__esModule",{value:!0});function H(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(e){return typeof e}:H=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(t)}var se="clover",qe=function(e){return e===3?"v3":e},ae="https://js.stripe.com",ke="".concat(ae,"/").concat(se,"/stripe.js"),De=/^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/,Ne=/^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/,re="loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used",Ue=function(e){return De.test(e)||Ne.test(e)},_e=function(){for(var e=document.querySelectorAll('script[src^="'.concat(ae,'"]')),r=0;r element.");return n.appendChild(o),o},Xe=function(e,r){!e||!e._registerWrapper||e._registerWrapper({name:"stripe-js",version:"8.11.0",startTime:r})},F=null,C=null,A=null,Ge=function(e){return function(r){e(new Error("Failed to load Stripe.js",{cause:r}))}},We=function(e,r){return function(){window.Stripe?e(window.Stripe):r(new Error("Stripe.js not available"))}},Be=function(e){return F!==null?F:(F=new Promise(function(r,o){if(typeof window>"u"||typeof document>"u"){r(null);return}if(window.Stripe&&e&&console.warn(re),window.Stripe){r(window.Stripe);return}try{var n=_e();if(n&&e)console.warn(re);else if(!n)n=ne(e);else if(n&&A!==null&&C!==null){var a;n.removeEventListener("load",A),n.removeEventListener("error",C),(a=n.parentNode)===null||a===void 0||a.removeChild(n),n=ne(e)}A=We(r,o),C=Ge(o),n.addEventListener("load",A),n.addEventListener("error",C)}catch(s){o(s);return}}),F.catch(function(r){return F=null,Promise.reject(r)}))},Je=function(e,r,o){if(e===null)return null;var n=r[0];if(typeof n!="string")throw new Error("Expected publishable key to be of type string, got type ".concat(H(n)," instead."));var a=n.match(/^pk_test/),s=qe(e.version),l=se;a&&s!==l&&console.warn("Stripe.js@".concat(s," was loaded on the page, but @stripe/stripe-js@").concat("8.11.0"," expected Stripe.js@").concat(l,". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning"));var i=e.apply(void 0,r);return Xe(i,o),i},oe=function(e){var r=`invalid load parameters; expected object of shape +(()=>{var Re=Object.create;var Y=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var He=Object.getPrototypeOf,Pe=Object.prototype.hasOwnProperty;var Z=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ce=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fe(e))!Pe.call(t,n)&&n!==r&&Y(t,n,{get:()=>e[n],enumerable:!(o=Me(e,n))||o.enumerable});return t};var Ae=(t,e,r)=>(r=t!=null?Re(He(t)):{},Ce(e||!t||!t.__esModule?Y(r,"default",{value:t,enumerable:!0}):r,t));var ce=Z(G=>{"use strict";Object.defineProperty(G,"__esModule",{value:!0});function H(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(e){return typeof e}:H=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(t)}var se="dahlia",qe=function(e){return e===3?"v3":e},ae="https://js.stripe.com",ke="".concat(ae,"/").concat(se,"/stripe.js"),De=/^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/,Ne=/^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/,re="loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used",Ue=function(e){return De.test(e)||Ne.test(e)},_e=function(){for(var e=document.querySelectorAll('script[src^="'.concat(ae,'"]')),r=0;r element.");return n.appendChild(o),o},Xe=function(e,r){!e||!e._registerWrapper||e._registerWrapper({name:"stripe-js",version:"9.1.0",startTime:r})},F=null,C=null,A=null,Ge=function(e){return function(r){e(new Error("Failed to load Stripe.js",{cause:r}))}},We=function(e,r){return function(){window.Stripe?e(window.Stripe):r(new Error("Stripe.js not available"))}},Be=function(e){return F!==null?F:(F=new Promise(function(r,o){if(typeof window>"u"||typeof document>"u"){r(null);return}if(window.Stripe&&e&&console.warn(re),window.Stripe){r(window.Stripe);return}try{var n=_e();if(n&&e)console.warn(re);else if(!n)n=ne(e);else if(n&&A!==null&&C!==null){var a;n.removeEventListener("load",A),n.removeEventListener("error",C),(a=n.parentNode)===null||a===void 0||a.removeChild(n),n=ne(e)}A=We(r,o),C=Ge(o),n.addEventListener("load",A),n.addEventListener("error",C)}catch(s){o(s);return}}),F.catch(function(r){return F=null,Promise.reject(r)}))},Je=function(e,r,o){if(e===null)return null;var n=r[0];if(typeof n!="string")throw new Error("Expected publishable key to be of type string, got type ".concat(H(n)," instead."));var a=n.match(/^pk_test/),s=qe(e.version),l=se;a&&s!==l&&console.warn("Stripe.js@".concat(s," was loaded on the page, but @stripe/stripe-js@").concat("9.1.0"," expected Stripe.js@").concat(l,". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning"));var i=e.apply(void 0,r);return Xe(i,o),i},oe=function(e){var r=`invalid load parameters; expected object of shape {advancedFraudSignals: boolean} diff --git a/packages/scripts/src/components/front-end/payments/paypal/buttons.ts b/packages/scripts/src/components/front-end/payments/paypal/buttons.ts index 9391451b0..d60d0a50b 100644 --- a/packages/scripts/src/components/front-end/payments/paypal/buttons.ts +++ b/packages/scripts/src/components/front-end/payments/paypal/buttons.ts @@ -1,4 +1,5 @@ // PayPal SDK integration for Freeform +import Freeform from "@components/front-end/plugin/freeform"; import { loadScript, type PayPalNamespace as PayPalSDK, @@ -41,7 +42,11 @@ function logError(...args: unknown[]) { } } -function showNotice(root: Element, text: string) { +function showNotice( + root: Element, + text: string, + tone: "muted" | "success" | "error" = "success", +) { const container = root.closest('[data-field-type="paypal"]') || root.parentElement; if (!container) return; @@ -52,10 +57,11 @@ function showNotice(root: Element, text: string) { notice = document.createElement("div"); notice.setAttribute("data-ff-paypal-notice", "true"); notice.style.marginTop = "8px"; - notice.style.color = "#0a7"; notice.style.fontSize = "0.95em"; container.appendChild(notice); } + const colors = { muted: "#555", success: "#0a7", error: "#b00020" }; + notice.style.color = colors[tone]; notice.textContent = text; } @@ -259,8 +265,9 @@ async function initializePayPalButtons(root: HTMLElement) { } }, onApprove: async (data: { orderID: string }) => { - // Order approved: immediately capture, but do NOT auto-submit + // Order approved: capture, then submit the form via Freeform (no extra click). hiddenInput.value = String(data.orderID || ""); + showNotice(root, "Processing your payment…", "muted"); try { const formData = new FormData(form); const values: Values = {}; @@ -276,17 +283,36 @@ async function initializePayPalButtons(root: HTMLElement) { }, ); if (captureResult && captureResult.status === "COMPLETED") { + const runtime = Freeform.getInstance(form); + if (runtime) { + showNotice( + root, + "Payment complete. Your form is being submitted automatically.", + "success", + ); + runtime.triggerSubmit(); + } else { + showNotice( + root, + "Payment completed with PayPal. Click Submit to finish.", + "success", + ); + } + } else { + logError("Payment capture failed", captureResult); showNotice( root, - "Payment completed with PayPal. Click Submit to finish.", + "PayPal capture failed. Please try again.", + "error", ); - } else { - logError("Payment capture failed", captureResult); - showNotice(root, "PayPal capture failed. Please try again."); } } catch (error) { logError("Error during payment capture:", error); - showNotice(root, "PayPal capture error. Please try again."); + showNotice( + root, + "PayPal capture error. Please try again.", + "error", + ); } }, onError: (err: unknown) => { From c752ed70f579a1ef4bb22ade016e1ca35c4ad62f Mon Sep 17 00:00:00 2001 From: thejahid Date: Mon, 18 May 2026 11:24:06 +0600 Subject: [PATCH 2/2] refactor(SFT-2764): streamline PayPal button integration and enhance runtime API access --- .../front-end/payments/paypal/buttons.js | 18 +----------------- .../front-end/payments/stripe/elements.js | 2 +- .../front-end/payments/paypal/buttons.ts | 13 +++++++++++-- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js b/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js index f5ea0b568..3bfd40e72 100644 --- a/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js +++ b/packages/plugin/src/Resources/js/scripts/front-end/payments/paypal/buttons.js @@ -1,17 +1 @@ -(()=>{var ft={form:{ready:"freeform-ready",reset:"freeform-on-reset",submit:"freeform-on-submit",removeMessages:"freeform-remove-messages",fieldRemoveMessages:"freeform-remove-field-messages",renderSuccess:"freeform-render-success",renderFieldErrors:"freeform-render-field-errors",renderFormErrors:"freeform-render-form-errors",ajaxBeforeSuccess:"freeform-before-ajax-success",ajaxSuccess:"freeform-ajax-success",ajaxError:"freeform-ajax-error",ajaxBeforeSubmit:"freeform-ajax-before-submit",ajaxAfterSubmit:"freeform-ajax-after-submit",afterFailedSubmit:"freeform-after-failed-submit",handleActions:"freeform-handle-actions"},rules:{applied:"freeform-rules-applied"},table:{onAddRow:"freeform-field-table-on-add-row",afterRowAdded:"freeform-field-table-after-row-added",onRemoveRow:"freeform-field-table-on-remove-row",afterRemoveRow:"freeform-field-table-after-remove-row"},dragAndDrop:{renderPreview:"freeform-field-dnd-on-render-preview",renderPreviewRemoveButton:"freeform-field-dnd-on-render-preview-remove-button",renderErrorContainer:"freeform-field-dnd-render-error-container",showGlobalMessage:"freeform-field-dnd-show-global-message",appendErrors:"freeform-field-dnd-append-errors",clearErrors:"freeform-field-dnd-clear-errors",afterErrors:"freeform-field-dnd-after-errors",onChange:"freeform-field-dnd-on-change",onUploadProgress:"freeform-field-dnd-on-upload-progress"},saveAndContinue:{saveFormhandleToken:"freeform-save-form-handle-token"},scripts:{beforeLoad:"freeform-script-before-load",afterLoad:"freeform-script-after-load"},stylesheets:{beforeLoad:"freeform-stylesheet-before-load",afterLoad:"freeform-stylesheet-after-load"}},m=ft;var z=class{constructor(e){this.reload=()=>{let e=this.form.querySelectorAll(`*[name=${F._BACK_BUTTON_NAME}]`);for(let t=0;t{let n=document.createElement("input");n.type="hidden",n.name=F._BACK_BUTTON_NAME,n.value="",this.form.appendChild(n)})};this.form=e.form,this.reload()}},be=z;var W=class{constructor(e){this.reload=()=>{this.freeform.form.querySelectorAll('*[data-field-type="cards"]').forEach(t=>{let r=t.dataset.maxValues;if(r===void 0)return;let n=Array.from(t.querySelectorAll('input[type="checkbox"]')),s=parseInt(r,10);s===1?this.handleSingleValue(n):s>1&&this.handleMultipleValues(n,s)})};this.handleMultipleValues=(e,t)=>{e.forEach(r=>{r.addEventListener("change",()=>{e.filter(s=>s.checked).length>t&&r.checked&&(r.checked=!1)})})};this.handleSingleValue=e=>{e.forEach(t=>{t.addEventListener("change",()=>{let r=t.checked,s=e.filter(a=>a!==t).filter(a=>a.checked);r&&s.length>0&&s.forEach(a=>{a.checked=!1})})})};this.freeform=e,this.reload()}},ye=W;var K=new Map,G=new Map,x=(o,e={})=>{let{cacheKey:t,async:r,defer:n,onLoad:s,parent:a}=e,i=t||o;if(!K.has(i)){let l=document.createElement("script"),c=Te(o);if(!c)throw new Error(`Unsafe script URL: ${o}`);l.src=c,l.async=r!=null?r:!1,l.defer=n!=null?n:!1,l.addEventListener("load",()=>{s&&s(l),document.dispatchEvent(new CustomEvent(m.scripts.afterLoad,{detail:{src:o,script:l}}))}),document.dispatchEvent(new CustomEvent(m.scripts.beforeLoad,{detail:{src:o,script:l}})),(a||document.body).appendChild(l),K.set(i,l)}return K.get(i)},Le=(o,e={})=>{let{cacheKey:t,parent:r,onLoad:n}=e,s=t||o;if(!G.has(s)){let a=document.createElement("link"),i=Te(o);if(!i)throw new Error(`Unsafe stylesheet URL: ${o}`);a.rel="stylesheet",a.href=i,a.addEventListener("load",()=>{n&&n(a),document.dispatchEvent(new CustomEvent(m.stylesheets.afterLoad,{detail:{href:o,link:a}}))}),document.dispatchEvent(new CustomEvent(m.stylesheets.beforeLoad,{detail:{href:o,link:a}})),(r||document.body).appendChild(a),G.set(s,a)}return G.get(s)},Te=o=>{try{let e=new URL(o,window.location.href);return e.protocol!=="http:"&&e.protocol!=="https:"?"":e.toString()}catch{}return""};var V=()=>{let o=window.flatpickr;return typeof o=="function"?o:null},X=()=>V()!==null,we=o=>!!o._flatpickr;var C=class C{constructor(e){this.loadedLocales=C.loadedLocales;this.waitForFlatpickrThenReload=(e=40,t=50)=>{if(X()){this.reload();return}e<=0||setTimeout(()=>this.waitForFlatpickrThenReload(e-1,t),t)};this.reload=()=>{if(!this.freeform.has("data-scripts-datepicker"))return;let e=V();if(!e)return;this.freeform.form.querySelectorAll("*[data-datepicker][data-datepicker-enabled]").forEach(r=>{let n=r.getAttribute("data-datepicker-enabled");if(n==="0"||n==="false"||we(r))return;let s=r.getAttribute("data-datepicker-locale")||"default",a={disableMobile:!0,allowInput:!0,dateFormat:r.getAttribute("data-datepicker-format"),enableTime:r.getAttribute("data-datepicker-enabletime")!==null,noCalendar:r.getAttribute("data-datepicker-enabledate")===null,time_24hr:r.getAttribute("data-datepicker-clock_24h")!==null,minDate:r.getAttribute("data-datepicker-min-date"),maxDate:r.getAttribute("data-datepicker-max-date"),minuteIncrement:1,hourIncrement:1,static:r.getAttribute("data-datepicker-static")!==null},i=this.freeform._dispatchEvent("flatpickr-before-init",{detail:a,options:a}),l={...i.detail,...i.options},c=e(r,l);r.setAttribute("autocomplete","off"),this.freeform._dispatchEvent("flatpickr-ready",{detail:c,flatpickr:c}),this.loadedLocales[s]?(this.loadedLocales[s].addEventListener("load",()=>{c.set("locale",s),this.loadedLocales[s].dataset.loaded="true"}),this.loadedLocales[s].dataset.loaded==="true"&&c.set("locale",s)):x(`//cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.13/l10n/${s}.js`,{onLoad:d=>{c.set("locale",s),d.dataset.loaded="true",this.loadedLocales[s]=d}})})};if(this.freeform=e,!!this.freeform.has("data-scripts-datepicker")){if(Le("//cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.13/flatpickr.min.css"),X()){this.reload();return}if(C.flatpickrLoading){this.waitForFlatpickrThenReload();return}C.flatpickrLoading=!0,x("//cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.13/flatpickr.min.js",{onLoad:()=>{C.flatpickrLoading=!1,this.reload()}}),this.waitForFlatpickrThenReload()}}};C.flatpickrLoading=!1,C.loadedLocales={};var J=C,Fe=J;var M=(o,e,t)=>{let{bubbles:r=!1,cancelable:n=!0,...s}=e||{},a=ut(o,r,n);return Object.assign(a,s),t&&(t instanceof HTMLElement?t.dispatchEvent(a):Array.from(t).forEach(i=>{i.dispatchEvent(a)})),a},ut=(o,e=!0,t=!0)=>new Event(o,{bubbles:e,cancelable:t});var Se="freeform-file-dnd",pt=(o,...e)=>{o.classList.add(e.join("__"))},ht=(o,...e)=>{o.classList.remove(e.join("__"))},v=(o,...e)=>{pt(o,Se,...e)},Ce=(o,...e)=>{ht(o,Se,...e)},_=o=>(typeof o=="string"&&(o=o.split(" ")),o.map(e=>`.${e}`).join(""));var Me=o=>{let e=document.createElement("div");return e.innerText="!",e.setAttribute("data-errors",""),v(e,"preview-zone","file-preview","thumbnail","errors"),o._dispatchEvent(m.dragAndDrop.renderErrorContainer,{container:e},e).container};var He=(o,e,t,r)=>{if(r._dispatchEvent(m.dragAndDrop.clearErrors,{},o).defaultPrevented)return;let s=e.querySelector("[data-errors]");e.setAttribute("data-has-errors",""),s.setAttribute("aria-label",t.join("; ")),s.setAttribute("title",t.join(". "))},xe=o=>{let e=o.messages,t=o.container;e&&e.length>0&&o.freeform.disableSubmit(`file-upload-errors-${Ae(t)}`)},ke=(o,e)=>{let t=o.container;t.querySelectorAll("[data-has-errors]").length===0&&e.enableSubmit(`file-upload-errors-${Ae(t)}`)},Ae=o=>o.dataset.freeformFileUpload||"unknown";var Y;var P=async()=>{try{let o=document.querySelector("form[data-csrf-refresh]");if(!o)return Et();switch(o.dataset.csrfRefresh){case"once":return Y===void 0&&(Y=await Re()),Y;case"always":return await Re();default:return null}}catch{}return null},Et=()=>{var r;let o=document.querySelector("form[data-csrf-name]");if(!o)return null;let e=o.dataset.csrfName,t=(r=o.querySelector(`input[name="${e}"]`))==null?void 0:r.value;return!e||!t?null:{name:e,value:t}},Re=async()=>{let e=await fetch("/freeform/tokens",{headers:{Accept:"application/json"}}).then(t=>t.json());return e.csrf!==void 0?{name:e.csrf.name,value:e.csrf.value}:null};var q=class{cancel(){this.cancelFn&&(this.cancelFn(),this.cancelFn=null)}_setCancelFn(e){this.cancelFn=e}},B=class o extends Error{constructor(e,t,r){super(e),this.response={...t,data:r},this.status=t.status,Object.setPrototypeOf(this,o.prototype)}};var D=async(o,e,t,r,n)=>{let s=new URL(e,window.location.origin);n!=null&&n.queryParams&&n.queryParams.forEach((l,c)=>{s.searchParams.set(c,l)});let a=n.request||new XMLHttpRequest;a.open(o,s),a.setRequestHeader("Cache-Control","no-cache"),a.setRequestHeader("X-Requested-With","XMLHttpRequest"),a.setRequestHeader("HTTP_X_REQUESTED_WITH","XMLHttpRequest");let i=await P();return i&&a.setRequestHeader("X-CSRF-Token",i.value),gt(a,n==null?void 0:n.headers),a.onload=()=>{let l=a.response;try{l=JSON.parse(a.response)}catch{}let c=a.status;if(c<200||c>=300){r(new B(`Request failed with status ${a.statusText}`,a,l));return}t({status:a.status,data:l,request:a})},a.onerror=()=>{r(new Error("Network error"))},a.onabort=()=>{r(new Error("Request aborted"))},n.onUploadProgress&&(a.upload.onprogress=l=>{n.onUploadProgress(l)}),n.cancelToken&&n.cancelToken._setCancelFn(()=>{a.abort()}),a},gt=(o,e)=>{e&&Object.entries(e).forEach(([t,r])=>{o.setRequestHeader(t,String(r))})};var vt=async(o,e={})=>new Promise((t,r)=>{D("GET",o,t,r,e).then(n=>{n.open("GET",o),n.send()})}),bt=async(o,e,t={})=>new Promise((r,n)=>{D("POST",o,r,n,t).then(s=>{e instanceof FormData?s.send(e):(s.setRequestHeader("Content-Type","application/json"),s.send(JSON.stringify(e)))})}),L=(o,e)=>new Promise((t,r)=>{D((e==null?void 0:e.method)||"GET",o,t,r,e).then(n=>{let s=e==null?void 0:e.data;s instanceof FormData?n.send(s):(n.setRequestHeader("Content-Type","application/json"),n.send(JSON.stringify(s)))})});L.get=vt;L.post=bt;var Oe=o=>{let e=o.dataset.confirmMessage,t=o.dataset.dialogSelector,r=t!==void 0,n;return r&&(t&&(n=document.querySelector(t)),n||(n=yt(e))),new Promise(a=>{if(!r)return a(confirm(e));n.showModal();let i=()=>{a(n.returnValue==="ok"),n.removeEventListener("close",i)};n.addEventListener("close",i)})},Q="freeform-file-upload-confirm-dialog",yt=o=>{if(document.getElementById(Q))return document.getElementById(Q);let e=document.createElement("dialog");return e.id=Q,e.innerHTML=` -
-

${o}

- - - - -
- `,document.body.appendChild(e),e};var Ie=(o,e=50,t="\u2026",r=3)=>o.length>e?o.substr(0,e-r)+t:o;var Lt=({name:o,extension:e,size:t})=>{let r=document.createElement("div");r.setAttribute("data-file-preview",""),v(r,"preview-zone","file-preview");let n=document.createElement("span");n.setAttribute("data-extension-label",""),n.innerText=e.toUpperCase(),v(n,"preview-zone","file-preview","thumbnail","extension-label");let s=document.createElement("div");s.setAttribute("data-thumbnail",""),s.appendChild(n),v(s,"preview-zone","file-preview","thumbnail");let a=document.createElement("span");a.setAttribute("data-filename",""),a.innerText=Ie(o,14),a.title=o,v(a,"preview-zone","file-preview","filename");let i=document.createElement("span");return i.setAttribute("data-filesize",""),i.innerText=t,v(i,"preview-zone","file-preview","filesize"),r.appendChild(s),r.appendChild(a),r.appendChild(i),[r,s,a,i]},Tt=o=>{let e=document.createElement("button");return e.type="button",e.setAttribute("data-remove-button",""),e.setAttribute("title","Remove file?"),e.setAttribute("aria-label","Remove file?"),e.innerHTML='',v(e,"preview-zone","file-preview","thumbnail","remove-button"),o._dispatchEvent(m.dragAndDrop.renderPreviewRemoveButton,{button:e}).button},wt=()=>{let o=document.createElement("div");return o.setAttribute("data-progress",""),v(o,"preview-zone","file-preview","thumbnail","progress"),o},Z=(o,e)=>{let[t,r]=Lt(o);o.url&&(r.style.backgroundImage=`url(${o.url})`);let n=Tt(e),s=Me(e),a=wt();r.appendChild(n),r.appendChild(s),r.appendChild(a);let i=e._dispatchEvent(m.dragAndDrop.renderPreview,{metadata:o,container:t});return v(t,"preview-zone","file-preview","animation-enter"),setTimeout(()=>{Ce(t,"preview-zone","file-preview","animation-enter")},10),i.container.addEventListener("click",l=>l.stopPropagation()),i.container},ee=(o,{id:e})=>{let t=document.createElement("input");return t.type="hidden",t.value=e,t.name=`${o}[]`,t};var Ft=["png","jpg","jpeg","gif"],te=o=>Ft.includes(o.toLowerCase());var j=(o,e)=>{let t=new URL(o,window.location.origin);return t.pathname=`${t.pathname.replace(/\/$/,"")}${e}`,t.toString()},_e=(o,e)=>{if(parseInt(o.dataset.fileCount||"0",10)){let r=o.querySelector("[data-preview-zone]"),{freeformFileUpload:n}=o.dataset,s=new FormData(e.form);s.delete("action"),s.append("handle",n);let a=o.getAttribute("data-base-url")||"";L.post(j(a,"/files"),s,{headers:{"Freeform-Preflight":!0}}).then(({data:i})=>{i.forEach(l=>{let c=Z(l,e);te(l.extension)&&c.querySelector("[data-thumbnail]").setAttribute("data-has-preview","");let d=new FormData(e.form);d.delete("action"),d.append("handle",n),d.append("id",l.id),c.querySelector("[data-remove-button]").addEventListener("click",()=>{confirm("Are you sure?")&&L.post(j(a,"/files/delete"),d).then(()=>{r.removeChild(c),A(o,e)}).catch(f=>{alert(f.message)})}),c.appendChild(ee(n,l)),c.setAttribute("data-completed",""),r.appendChild(c)}),A(o,e)}).catch(console.error)}},Pe=(o,e,t,r,n)=>{let s=new q,a=()=>{s.cancel()},i=o.name.match(/.(\w+)$/i),l=o.name,c=St(o.size),d=i!==null?i[1].toLowerCase():"n/a",u=Z({name:l,extension:d,size:c},n),f=u.querySelector("[data-thumbnail]"),p=u.querySelector("[data-remove-button]");if(te(d)){let h=new FileReader;h.readAsDataURL(o),h.onloadend=()=>{f.setAttribute("data-has-preview",""),f.style.backgroundImage=`url(${h.result.toString()})`}}r.appendChild(u),p.addEventListener("click",a),A(t,n);let g=new FormData(n.form);g.delete("action"),g.append("handle",e),g.append(e,o);let T=t.getAttribute("data-base-url")||"";return L.post(j(T,"/files/upload"),g,{cancelToken:s,onUploadProgress:h=>{let{total:w,loaded:S}=h,b=Math.ceil(S/(w/100));n._dispatchEvent(m.dragAndDrop.onUploadProgress,{total:w,loaded:S,percent:b},t),u.style.setProperty("--progress",`${b}%`),b>=98&&p.removeEventListener("click",a)}}).then(h=>{let w=new FormData(n.form);w.delete("action"),w.append("handle",e),w.append("id",h.data.id),p.removeEventListener("click",a),p.addEventListener("click",async()=>{await Oe(t)&&L.post(j(T,"/files/delete"),w).then(()=>{r.removeChild(u),A(t,n)}).catch(b=>{alert(b.message)})}),u.appendChild(ee(e,h.data)),u.setAttribute("data-completed","")}).catch(h=>{var S,b,U;if(h.message==="Request aborted"){r.removeChild(u),A(t,n);return}p.removeEventListener("click",a),p.addEventListener("click",()=>{r.removeChild(u),A(t,n)});let w;if(((b=(S=h==null?void 0:h.response)==null?void 0:S.data)==null?void 0:b.type)==="field-error"){let{messages:ve}=(U=h==null?void 0:h.response)==null?void 0:U.data;w=ve,He(t,u,ve,n)}else console.warn(h);n._dispatchEvent(m.dragAndDrop.afterErrors,{container:t,messages:w},t)})},A=(o,e)=>{e._dispatchEvent(m.dragAndDrop.onChange,{freeform:e,container:o},o)},St=o=>{let e=["B","KB","MB","GB","TB"];if(o<1024)return`${o} B`;let t=o,r=0;for(;t>=1024&&r{let n=document.createElement("li");n.setAttribute("data-error",""),n.innerText=e,v(n,"messages","message"),v(n,"messages","message","error");let s=t._dispatchEvent(m.dragAndDrop.showGlobalMessage,{messageItem:n},o);Ht(o,s.messageItem,r)},Ht=(o,e,t)=>{let r=o.querySelector("[data-messages]");r&&(r.appendChild(e),setTimeout(()=>{e.setAttribute("data-animate-fade-out","")},t),setTimeout(()=>{r.removeChild(e)},t+Mt))};var ne=class{constructor(e){this.currentFileUploads=0;this.isFormLocked=!1;this.reload=()=>{let e=this.freeform.form;this.freeform.form.querySelectorAll("[data-freeform-file-upload]").forEach(r=>{r.style.setProperty("--accent",r.dataset.accent),r.addEventListener("dragenter",this.handleDrag(r)),r.addEventListener("dragleave",this.handleDragLeave(r)),r.addEventListener("dragover",this.handleDrag(r)),r.addEventListener("drop",this.handleDrop(r)),r.addEventListener("click",this.handleClick(r)),r.addEventListener(m.dragAndDrop.onChange,this.handleChanges),r.addEventListener(m.dragAndDrop.onChange,n=>{ke(n,this.freeform)}),r.addEventListener(m.dragAndDrop.afterErrors,xe),_e(r,this.freeform),e.addEventListener(m.form.reset,this.handleReset(r)),r.querySelector("input[type=file]").addEventListener("change",this.handleManualUpload(r))})};this.handleChanges=({container:e})=>{e.querySelector("[data-preview-zone]").querySelectorAll("[data-file-preview]").length>0?e.setAttribute("data-contains-files",""):e.removeAttribute("data-contains-files")};this.attachDragState=e=>{e instanceof HTMLElement&&(e.dataset.dragging="")};this.detachDragState=e=>{e instanceof HTMLElement&&delete e.dataset.dragging};this.handleDrag=e=>t=>{t.preventDefault(),t.stopPropagation(),this.attachDragState(e)};this.handleDragLeave=e=>t=>{t.preventDefault(),t.stopPropagation(),this.detachDragState(e)};this.handleDrop=e=>t=>{t.preventDefault(),t.stopPropagation(),this.detachDragState(e);let n=t.dataTransfer.files;this.initFileUpload(n,e)};this.handleClick=e=>()=>{let t=e.querySelector('input[type="file"]');if(!t)throw new Error("File upload corrupted");t.click()};this.handleManualUpload=e=>t=>{let r=t.target,{files:n}=r;this.initFileUpload(n,e),r.value=null};this.initFileUpload=(e,t)=>{let{freeformFileUpload:r,maxFiles:n,maxSize:s}=t.dataset,{messageSize:a,messageFiles:i}=t.dataset,l=t.querySelector("[data-preview-zone]"),c=t.querySelectorAll("[data-file-preview]:not([data-has-errors])").length;for(let d=0;d=parseInt(n,10)){re(t,i,this.freeform);break}let u=e.item(d);if(u.size>parseInt(s,10)){re(t,a,this.freeform);continue}this.currentFileUploads++,Pe(u,r,t,l,this.freeform).finally(()=>{this.currentFileUploads--,this.handleUploadLockdown()}),c++,this.handleUploadLockdown()}};this.handleReset=e=>()=>{e.querySelectorAll("[data-file-preview]").forEach(r=>{r.parentNode.removeChild(r)}),M(m.dragAndDrop.onChange,{container:e},e)};this.handleUploadLockdown=()=>{this.currentFileUploads>0?this.isFormLocked||(this.isFormLocked=!0,this.freeform.lockSubmit("file-upload")):(this.freeform.unlockSubmit("file-upload"),this.isFormLocked=!1)};this.freeform=e,this.reload()}},qe=ne;var oe=class{constructor(e){this.reload=()=>{if(!this.freeform.has("data-scripts-js-mask"))return;this.freeform.form.querySelectorAll("*[data-masked-input]").forEach(t=>{let r=t.getAttribute("data-pattern");r&&new IMask(t,{mask:r})})};this.freeform=e,this.freeform.has("data-scripts-js-mask")&&x("https://cdnjs.cloudflare.com/ajax/libs/imask/6.0.7/imask.min.js",{onLoad:()=>this.reload()})}},Be=oe;var se=class{constructor(e){this.reload=()=>{this.freeform.form.querySelectorAll('[data-field-type="rating"]').forEach(t=>{let{colorIdle:r,colorHover:n,colorSelected:s}=t.dataset;t.style.setProperty("--ff-rating-color-idle",r),t.style.setProperty("--ff-rating-color-hover",n),t.style.setProperty("--ff-rating-color-selected",s)})};this.freeform=e,this.reload()}},De=se;var ae=class{constructor(e){this.reload=()=>{if(!this.freeform.has("data-scripts-signature"))return;this.freeform.form.querySelectorAll("canvas[data-signature-field]").forEach(t=>{let r=()=>{l.value=u.toDataURL()},{borderColor:n,backgroundColor:s,penColor:a,dotSize:i}=t.dataset;t.style.borderWidth="1px",t.style.borderStyle="solid",t.style.borderColor=n;let l=t.previousSibling,c=t.parentNode.querySelector("[data-signature-clear]"),d=l.value,u=new SignaturePad(t,{onEnd:r,backgroundColor:s,penColor:a,dotSize:i,maxWidth:i,throttle:5});if(c&&c.addEventListener("click",()=>{u.clear(),l.value=""}),d){let f=new Image;u.clear(),f.src=d,f.onload=()=>{t.getContext("2d").drawImage(f,0,0,t.width,t.height)}}})};this.freeform=e,this.freeform.has("data-scripts-signature")&&x("//cdn.jsdelivr.net/npm/signature_pad@2.3.2/dist/signature_pad.min.js",{onLoad:this.reload})}},je=ae;var ie=/([^[]+)\[(\d+)\](\[\d+\](?:\[\])?)$/g,Ne=/^(labeled-.*)-(\d+)-(\d+)-(\d+)$/g,$e=o=>{let e;o.form.querySelectorAll("[data-freeform-table]").forEach(r=>{if(e=r.parentNode.querySelector("[data-freeform-table-add-row]"),le(r,e),e){o.form.addEventListener(m.table.afterRemoveRow,()=>{le(r,e)});let n=()=>{let s=r.querySelectorAll("textarea, input, select"),a=0;for(let i=0;i{let s=r.querySelector("tbody > tr:last-child");if(s){let a=s.cloneNode(!0),i=a.querySelectorAll("textarea, input, select"),l=n();for(let d=0;d{if(!e)return;let t=o.querySelectorAll("tbody > tr").length,r=o.getAttribute("data-exact-rows"),n=o.getAttribute("data-max-rows");if(r){let s=parseInt(r,10);e.style.display=t>=s?"none":"block";return}if(n){let s=parseInt(n,10);e.style.display=t>=s?"none":"block"}};var R=o=>(typeof o=="string"&&(o=o.split(" ")),o),H=(o,e)=>{R(e).map(t=>o.classList.add(t))},N=(o,e)=>{R(e).map(t=>o.classList.remove(t))};function k(o){var e;o!==void 0&&(o instanceof HTMLElement&&((e=o.parentElement)==null||e.removeChild(o)),(o instanceof HTMLCollection||o instanceof NodeList)&&Array.from(o).forEach(t=>{var r;(r=t.parentElement)==null||r.removeChild(t)}))}var Ue=!1,We=o=>{o.form.querySelectorAll("[data-freeform-table]").forEach(t=>{let r=t.querySelectorAll("[data-freeform-table-remove-row]");for(let n=0;n{let n=t.row.querySelector("[data-freeform-table-remove-row]");n&&n.addEventListener("click",ze(o))}))},ze=o=>e=>{let t=e.target,r=t.closest("tbody"),n=t.closest("table"),s=t.closest("tr");if(!r||!n||!s)return;let a=r.querySelectorAll("tr").length;if(a<=1||n.getAttribute("data-exact-rows"))return;let l=n.getAttribute("data-min-rows");if(l){let c=parseInt(l,10);if(a-1{o.form.addEventListener(m.form.renderFieldErrors,xt)},xt=o=>{let t=o.form.querySelectorAll("[data-freeform-table]"),r=o.freeform.options.errorClassField;t.forEach(n=>{let s=n.querySelectorAll("thead th[data-column-required]"),a=Array.from(s).map(l=>l.cellIndex);n.querySelectorAll("tbody tr").forEach(l=>{let c=l.querySelectorAll("td");a.forEach(d=>{var g;let f=c[d].querySelector("input, textarea, select"),p=!!(f!=null&&f.value);["radio","checkbox"].includes((f==null?void 0:f.type)||"")&&(p=!!(f!=null&&f.checked)),(f==null?void 0:f.type)==="file"&&(p=!!((g=f.files)!=null&&g.length)),!f||!p?(f==null?void 0:f.type)==="radio"?f.parentElement.parentElement.querySelectorAll("input").forEach(T=>{H(T,r)}):H(f,r):N(f,r)})})})};var ce=class{constructor(e){this.reload=()=>{$e(this.freeform),We(this.freeform),Ke(this.freeform)};this.freeform=e,this.reload()}},Ge=ce;var de=class{constructor(e){this.reload=()=>{let e=this.getSessionId();e&&this.form.querySelectorAll("input, select, textarea").forEach(t=>{t.addEventListener("blur",()=>{L.post("/freeform/ab-test/tracker",{sessionId:e,fieldName:t.name})})})};this.getSessionId=()=>{let e=this.form;return e.hasAttribute("data-ab-test")?e.getAttribute("data-ab-test"):!1};this.freeform=e,this.form=e.form,this.reload()}},Ve=de;var kt="freeform-gtm-data-layer-push",me=class{constructor(e){this.reload=()=>{};if(window.dataLayer=window.dataLayer||[],this.freeform=e,this.form=e.form,!this.freeform.has("data-gtm"))return;let t=this.form.dataset.gtmEventName||"form-submission",r=this.form.dataset.handle;this.form.addEventListener(m.form.ajaxSuccess,n=>{let s=n.response,a=e._dispatchEvent(kt,{payload:{},response:s}),i={event:t,form:r,submission:{id:s.submissionId,token:s.submissionToken},...a.payload};window.dataLayer.push(i)})}},Xe=me;var Je="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",At=Je.length;function fe(o,e="-"){if(Array.isArray(o))return o.map(r=>fe(r)).join(e);let t="";for(let r=0;r{if(!this.form.hasAttribute("data-idempotency"))return;let e=document.createElement("input");e.type="hidden",e.name="idempotencyKey",e.value=fe([6,20,20]),this.form.appendChild(e)};this.freeform=e,this.form=e.form,this.reload()}},Ye=ue;var O=(o,e)=>{if(o===e)return!0;if(o==null||e==null)return o===e;if(Number.isNaN(o)&&Number.isNaN(e))return!0;if(typeof o!=typeof e)return!1;if(Array.isArray(o)&&Array.isArray(e))return o.length!==e.length?!1:o.every((t,r)=>O(t,e[r]));if(typeof o=="object"&&typeof e=="object"){let t=Object.keys(o),r=Object.keys(e);return t.length!==r.length?!1:t.every(n=>Object.prototype.hasOwnProperty.call(e,n)&&O(o[n],e[n]))}return!1};var Qe=o=>e=>e.conditions.some(t=>{let r=o.name,n=t.field;return n===r||`${n}[]`===r}),pe=class{constructor(e){this.reload=()=>{let e=this.form.querySelector("[data-rules-json]");if(!e)return;let{rules:t,values:r}=JSON.parse(e.dataset.rulesJson);this.values=r,!(t.fields.length===0&&t.buttons.length===0)&&(Array.from(this.form.elements).forEach(n=>{let s=t.fields.filter(Qe(n)),a=t.buttons.filter(Qe(n)),i=[...s,...a];if(i.length===0)return;let l;switch(n.tagName){case"TEXTAREA":case"INPUT":{let f=n;if(f.type==="hidden")return;switch(f.type){case"radio":case"checkbox":l="change";break;case"number":l=["keyup","change"];break;default:l="keyup";break}break}case"SELECT":l="change";break}if(!l)return;let c=new Set(s),d=()=>{i.forEach(f=>{this.applyRule(f)}),t.fields.forEach(f=>{c.has(f)||this.applyRule(f)})};(Array.isArray(l)?l:[l]).forEach(f=>{n.addEventListener(f,d)})}),Rt(this.form,()=>{t.fields.forEach(n=>{this.applyRule(n,!1)}),t.buttons.forEach(n=>{this.applyRule(n,!1)})}))};this.applyRule=(e,t=!0)=>{let r="field"in e?`[data-field-container="${e.field}"]`:`[data-button-container="${e.button}"]`,n=this.form.querySelector(r);if(!n)return;let{display:s,combinator:a,conditions:i}=e,l=a==="and"?i.every(this.verifyCondition):i.some(this.verifyCondition),c=n.style.display||"",d=n.dataset.hidden!==void 0,u="",f=!1;return s==="show"?(u=l?"":"none",f=!l):(u=l?"none":"",f=l),c!==u||d!==f?(n.style.display=u,f?n.dataset.hidden="":delete n.dataset.hidden,t&&M(m.rules.applied,{rule:e},n),!0):!1};this.verifyCondition=e=>{let t=null,r=document.querySelector(`[data-field-container="${e.field}"]`);if(r){let n=this.form[e.field]||this.form[`${e.field}[]`],s=r.getAttribute("data-field-type")==="checkbox",a=r.getAttribute("data-field-type")==="checkboxes";r.dataset.hidden!==void 0?t=null:s?t=n[1].checked?"1":"":a?t=Array.from(n).filter(l=>l.checked).map(l=>l.value):n instanceof HTMLSelectElement&&n.multiple?t=Array.from(n.options).filter(l=>l.selected).map(l=>l.value):n instanceof RadioNodeList?(t=Array.from(n).filter(l=>l.checked).map(l=>l.value),t=t.length>0?t[0]:""):t=n.value}else{let n=this.values[e.field]||"";typeof n=="boolean"?t=n?"1":"":typeof n=="number"?t=`${n}`:t=n}if(typeof t=="object")switch(e.operator){case"equals":return O(t,[e.value]);case"notEquals":return!O(t,[e.value]);case"contains":return t==null?void 0:t.includes(e.value);case"notContains":return!(t!=null&&t.includes(e.value));case"isEmpty":return t===null||t.length===0;case"isNotEmpty":return(t==null?void 0:t.length)>0;case"isOneOf":case"isNotOneOf":{let n=e.operator==="isOneOf",s=(e.value?JSON.parse(e.value):[]).map(i=>i.toLowerCase()),a=t==null?void 0:t.some(i=>s.includes(i.toLowerCase()));return s.length===0?n?t.length!==0:t.length===0:n?a:!a}default:return!1}switch(e.operator){case"equals":return`${t}`.toLowerCase()===`${e.value}`.toLowerCase();case"notEquals":return`${t}`.toLowerCase()!==`${e.value}`.toLowerCase();case"greaterThan":return parseFloat(t)>parseFloat(e.value);case"greaterThanOrEquals":return parseFloat(t)>=parseFloat(e.value);case"lessThan":return parseFloat(t)0;case"isOneOf":case"isNotOneOf":{let n=e.operator==="isOneOf",s=(e.value?JSON.parse(e.value):[]).map(i=>i.toLowerCase()),a=s.includes(t.toLowerCase());return s.length===0?n?t.length===0:t.length!==0:n?a:!a}default:return!1}};this.freeform=e,this.form=e.form,this.reload()}},Ze=pe,Rt=(o,e)=>{let t,r={},n=0,s=10;do t={...r},e(),r=Ot(o),n++;while(JSON.stringify(t)!==JSON.stringify(r)&&n{let e={};return o.querySelectorAll("[data-field-container], [data-button-container]").forEach(t=>{let r=t.getAttribute("data-field-container")||t.getAttribute("data-button-container");e[r]=t.style.display||""}),e};var he=class{constructor(e){this.reload=()=>{};this.freeform=e,this.form=e.form,this.form.addEventListener(m.form.handleActions,t=>{let{actions:r}=t,n=r.find(c=>c.name==="save-form");if(!n)return;let{key:s,token:a,url:i}=n.metadata,l=M(m.saveAndContinue.saveFormhandleToken,{key:s,token:a,url:i},this.form);l.defaultPrevented||(window.location.href=l.url)})}},et=he;var tt=()=>navigator.userAgent.indexOf("Safari")>-1;var y=class y{constructor(e){this.options={ajax:!1,disableReset:!1,disableSubmit:!1,autoScroll:!1,scrollToAnchor:!1,scrollOffset:0,scrollElement:window,showProcessingSpinner:!1,showProcessingText:!1,processingText:null,prevButtonName:"form_previous_page_button",skipHtmlReload:!1,successBannerMessage:"Form has been submitted successfully!",errorBannerMessage:"Sorry, there was an error submitting the form. Please try again.",errorClassBanner:"freeform-form-errors",errorClassList:"freeform-errors",errorClassField:"freeform-has-errors",successClassBanner:"freeform-form-success",removeMessages:null,renderSuccess:null,renderFormErrors:null,renderFieldErrors:null};this._initializedHandlers=[];this._handlers=[Ye,Ve,be,Ze,Fe,Be,De,je,Ge,Xe,qe,et,ye];this._lockList=new Set;this._disableList=new Set;this._scrollToForm=()=>{let{scrollOffset:e,scrollElement:t}=this.options,r=this.form.getBoundingClientRect().top+window.scrollY+e;t.scrollTo({top:r,behavior:this._isReducedMotion()?"instant":"smooth"})};this._isReducedMotion=()=>{let e=window.matchMedia("(prefers-reduced-motion: reduce)");return!e||e.matches};this._setUp=()=>{this._attachListeners(),this._getSubmitButtons().forEach(t=>{t.dataset.originalText=t.innerHTML,t.dataset.processingText=this.options.processingText})};this._initHandlers=()=>{this._handlers.forEach(e=>{this._initializedHandlers.push(new e(this))})};this._resetHandlers=()=>{this._initializedHandlers.forEach(e=>{e.reload&&e.reload()})};this.has=e=>this.form.getAttribute(e)!==null;this.setOption=(e,t)=>{this.options[e]=t};this.disableForm=()=>{this.form.dataset.freeformDisabled=""};this.enableForm=()=>{delete this.form.dataset.freeformDisabled};this.disableSubmit=(e="freeform")=>{this._disableList.add(e);let t=Array.from(this._getSubmitButtons());for(let r of t)r.disabled=!0,r.ariaDisabled="true",r.dataset.disabled="true"};this.enableSubmit=(e="freeform")=>{if(this._disableList.delete(e),this._disableList.size>0)return;let t=Array.from(this._getSubmitButtons());for(let r of t)r.disabled=!1,r.ariaDisabled=void 0,delete r.dataset.disabled};this.lockSubmit=(e="freeform")=>{if(this._lockList.add(e),this._lockList.size>1)return;let{disableSubmit:t,showProcessingSpinner:r,showProcessingText:n}=this.options;t&&this.disableSubmit(e);let s=this._lastButtonPressed;s||(s=this._getSubmitButtons()[0]||void 0),s&&(r&&s.classList.add("freeform-processing"),n&&(s.innerHTML=s.dataset.processingText))};this.unlockSubmit=(e="freeform")=>{this._lockList.delete(e),!(this._lockList.size>0)&&this._unlockSubmitButtons(e)};this.forceUnlockSubmit=()=>{this._lockList.clear(),this._unlockSubmitButtons()};this.triggerResubmit=()=>{this.unlockSubmit(),this._lastButtonPressed?this._lastButtonPressed.click():this.triggerSubmit()};this.triggerSubmit=()=>{this.unlockSubmit();let e=this._getMainSubmitButton();e&&e.click()};this._unlockSubmitButtons=e=>{let{disableSubmit:t,showProcessingSpinner:r,showProcessingText:n}=this.options;t&&this.enableSubmit(e);let s=this._getSubmitButtons();for(let a=0;a{let{form:e}=this;y.instances.set(e,this),e.freeform=this};this._attachListeners=()=>{let e=this.form,t=this.form.querySelector("input[name=freeform-action]");t&&e.querySelectorAll("[data-freeform-action]").forEach(s=>{s.addEventListener("click",()=>{this._lastButtonPressed=s,t.value=s.getAttribute("data-freeform-action")})}),e.querySelectorAll("input, select, textarea").forEach(n=>{n.addEventListener("change",s=>{this._removeMessageFrom(s.target)})}),y.instantiatedForms.has(e)||(y.instantiatedForms.set(e,!0),e.addEventListener(m.form.ajaxAfterSubmit,n=>{let s=n.form.querySelector("input[name=freeform-action]");s&&(s.value="submit")}),e.addEventListener("submit",this._onSubmit),e.addEventListener("keydown",n=>{let s=n.key==="Enter"&&!n.shiftKey&&!n.ctrlKey&&!n.metaKey,a=n.target instanceof HTMLInputElement;s&&a&&(n.preventDefault(),n.stopPropagation(),this._getMainSubmitButton()&&this.triggerSubmit())}))};this._onSubmit=async e=>{this.lockSubmit(),e.preventDefault(),e.stopPropagation();let{options:{ajax:t}}=this,r=e.submitter,n=!1;(r==null?void 0:r.name)===y._BACK_BUTTON_NAME&&(n=!0);let s={};if(this._dispatchEvent(m.form.submit,{isBackButtonPressed:n,cancelable:!0,addCallback:(c,d=0)=>{s[d]===void 0&&(s[d]=[]),s[d].push(c)}}).defaultPrevented)return this.forceUnlockSubmit(),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),!1;let i=Object.entries(s).sort(([c],[d])=>Number(c)-Number(d)).flatMap(([,c])=>c);for(let c of i)if(await c()===!1)return this.forceUnlockSubmit(),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),!1;if(t)return this._onSubmitAjax(e),!1;let l=await P();if(l){let c=this.form.querySelector(`input[name="${l.name}"]`);c||(c=document.createElement("input"),c.type="hidden",c.name=l.name,this.form.appendChild(c)),c.value=l.value}this.form.submit()};this._removeMessages=()=>{if(this._dispatchEvent(m.form.removeMessages).defaultPrevented)return;if(typeof this.options.removeMessages=="function"){this.options.removeMessages=this.options.removeMessages.bind(this),this.options.removeMessages();return}let{form:t,options:r}=this,{successClassBanner:n,errorClassBanner:s,errorClassList:a,errorClassField:i}=r;k(t.querySelectorAll(`.${R(a).join(".")}`)),t.querySelectorAll(`.${R(i).join(".")}`).forEach(c=>{this._removeMessageFrom(c)}),k(t.querySelectorAll(_(n))),k(document.querySelectorAll(_(s)))};this._removeMessageFrom=e=>{if(this._dispatchEvent(m.form.fieldRemoveMessages,{field:e}).defaultPrevented)return;let{options:r}=this,{errorClassList:n,errorClassField:s}=r,a=e.parentNode;e.type&&(e.type==="radio"||e.type==="checkbox"&&/\[]$/.test(e.name))&&(a=e.parentNode.parentNode),k(a.querySelector(_(n)));let i=a.querySelectorAll("input, select, textarea");for(let l=0;l{if(this._dispatchEvent(m.form.renderSuccess).defaultPrevented)return;if(typeof this.options.renderSuccess=="function"){this.options.renderSuccess=this.options.renderSuccess.bind(this),this.options.renderSuccess();return}let{form:t,options:r}=this,{successBannerMessage:n,successClassBanner:s}=r,a=document.createElement("div");H(a,s);let i=document.createElement("p");i.appendChild(document.createTextNode(n)),a.appendChild(i),t.insertBefore(a,t.childNodes[0])};this._renderFieldErrors=e=>{if(this._dispatchEvent(m.form.renderFieldErrors,{errors:e}).defaultPrevented)return!1;if(typeof this.options.renderFieldErrors=="function")return this.options.renderFieldErrors=this.options.renderFieldErrors.bind(this),this.options.renderFieldErrors(e);let{form:r,options:n}=this,{errorClassList:s,errorClassField:a}=n;for(let i in e){let l=e[i],c=document.createElement("ul");c.setAttribute("data-field-errors",""),H(c,s);for(let p=0;p{if(this._dispatchEvent(m.form.renderFormErrors,{errors:e}).defaultPrevented)return!1;if(typeof this.options.renderFormErrors=="function")return this.options.renderFormErrors=this.options.renderFormErrors.bind(this),this.options.renderFormErrors(e);let{form:r,options:n}=this,{errorClassBanner:s,errorBannerMessage:a}=n,i=document.createElement("div");H(i,s);let l=document.createElement("p");if(l.appendChild(document.createTextNode(a)),i.appendChild(l),e.length){let c=document.createElement("ul");for(let d=0;d{let{form:e}=this,t=new FormData(e);if(tt())for(let r=0;r{var i;let{form:r}=this,n=this._prepareFormData();n.set("action","freeform/submit/quick-save"),n.set("storage-secret",e),t&&n.set("token",t);let s;try{s=await L(r.getAttribute("action")||window.location.href,{method:r.getAttribute("method"),data:n})}catch(l){if(((i=l==null?void 0:l.response)==null?void 0:i.status)===417)return this.unlockSubmit(),!1}this._removeMessages();let a=s.data;if(s.status===200){let{success:l,errors:c,formErrors:d,storageToken:u}=a;if(l)return u;(c||d)&&(this._dispatchEvent(m.form.ajaxError,{request:s,response:a,errors:c,formErrors:d}),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),this._renderFieldErrors(c),this._renderFormErrors(d)),this.options.autoScroll&&this._scrollToForm()}else this._dispatchEvent(m.form.ajaxError,{request:s,response:a}),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1});this.unlockSubmit()};this._onSubmitAjax=e=>{let{form:t}=this,r=this._prepareFormData(),n=new XMLHttpRequest,s=e.submitter;s!=null&&s.name&&r.append(s.name,"1");let a=t.getAttribute("method")||"POST",i=t.getAttribute("action")||window.location.href;this._dispatchEvent(m.form.ajaxBeforeSubmit,{data:r,request:n}).defaultPrevented||L(i,{data:r,method:a,request:n}).then(c=>{if(this._removeMessages(),c.status===200){let d=c.data,{success:u,finished:f,actions:p=[],errors:g,formErrors:T,returnUrl:h}=d;if(this._dispatchEvent(m.form.ajaxBeforeSuccess,{request:n,response:d}).defaultPrevented)return;if(p.length)this._dispatchEvent(m.form.handleActions,{response:d,actions:p,cancelable:!1});else if(u){let b=["redirect-return-url","redirect-entry"].includes(d.onSuccess);if(f&&b&&h){if(this._dispatchEvent(m.form.ajaxSuccess,{request:n,response:d}).defaultPrevented)return;window.location.href=h;return}d.html!==null&&!this.options.skipHtmlReload&&(t.innerHTML=d.html.replace(/]*>/,"").replace("","")),this.options.skipHtmlReload||(this._resetHandlers(),this._setUp()),f&&(this.options.disableReset||(t.reset(),this._dispatchEvent(m.form.reset)),d.onSuccess==="reload"&&this._renderSuccessBanner()),this._dispatchEvent(m.form.ajaxSuccess,{request:n,response:d})}else(g||T)&&(this._dispatchEvent(m.form.ajaxError,{request:n,response:d,errors:g,formErrors:T}),this._dispatchEvent(m.form.afterFailedSubmit,{cancelable:!1}),this._renderFieldErrors(g),this._renderFormErrors(T));let S=d==null?void 0:d.freeform_payload;if(S){let b=t.querySelector("input[name^=freeform_payload]");b&&(b.value=S)}this._dispatchEvent(m.form.ajaxAfterSubmit,{data:r,request:n,response:d,cancelable:!1}),this.options.autoScroll&&this._scrollToForm()}else{let d=n.response;this._dispatchEvent(m.form.ajaxError,{request:n,response:d})}this.unlockSubmit()}).catch(c=>{console.error("Error submitting form:",c),this.unlockSubmit(),this._dispatchEvent(m.form.ajaxError,{request:n,response:c})})};this._getMainSubmitButton=()=>this.form.querySelector('*[type=submit][data-freeform-action="submit"]');this._getSubmitButtons=()=>{let e=this.form.querySelectorAll("*[type=submit][data-freeform-action]");return e.length?e:this.form.querySelectorAll("*[type=submit]")};this._getBackButtons=()=>this.form.querySelectorAll('*[type=submit][data-freeform-action="back"]');this._dispatchEvent=(e,t,r)=>{let n=M(e,{...t,form:this.form,freeform:this},r);return document.dispatchEvent(n),this.form.dispatchEvent(n),n};if(y.instances.get(e))return y.instances.get(e);this.id=e.dataset.id,this.form=e,this._setInstances();let t={ajax:e.getAttribute("data-ajax")!==null,disableReset:e.getAttribute("data-disable-reset")!==null,scrollToAnchor:e.getAttribute("data-scroll-to-anchor")!==null,autoScroll:e.getAttribute("data-auto-scroll")!==null,disableSubmit:e.getAttribute("data-disable-submit")!==null,showProcessingSpinner:e.getAttribute("data-show-processing-spinner")!==null,showProcessingText:e.getAttribute("data-show-processing-text")!==null,processingText:e.getAttribute("data-processing-text"),successBannerMessage:e.getAttribute("data-success-message"),errorBannerMessage:e.getAttribute("data-error-message"),skipHtmlReload:e.getAttribute("data-skip-html-reload")!==null};this.options={...this.options,...t},this.disableSubmit("init");let r=setInterval(async()=>{if(document.readyState==="complete"){clearInterval(r);let n=this._dispatchEvent(m.form.ready,{options:{}});this.options={...this.options,...n.options},this._setUp(),this._initHandlers(),this.enableSubmit("init");let{scrollToAnchor:s}=this.options;s&&this._scrollToForm()}},50)}};y._BACK_BUTTON_NAME="form_previous_page_button",y.instances=new WeakMap,y.instantiatedForms=new WeakMap,y.getInstance=e=>y.instances.get(e);var F=y,It=document.querySelectorAll("form[data-freeform]");It.forEach(o=>{new F(o)});var nt=o=>{var e;o.nodeName==="FORM"&&((e=o.dataset)==null?void 0:e.freeform)!==void 0&&new F(o),o==null||o.childNodes.forEach(nt)},_t=new MutationObserver(o=>{o.forEach(e=>{e.type==="childList"&&e.addedNodes.forEach(t=>{nt(t)})})}),rt=0,$,ot=()=>{if(rt>25)return console.warn("Freeform observer timed out"),clearTimeout($);document.body?_t.observe(document.body,{childList:!0,subtree:!0}):(rt++,$&&clearTimeout($),$=setTimeout(ot,50))};ot();function Pt(o,e){var t={};for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&e.indexOf(r)<0&&(t[r]=o[r]);if(o!=null&&typeof Object.getOwnPropertySymbols=="function")for(var n=0,r=Object.getOwnPropertySymbols(o);n"u")return e.resolve(null);var t=Dt(o),r=t.url,n=t.attributes,s=n["data-namespace"]||"paypal",a=st(s);return n["data-js-sdk-library"]||(n["data-js-sdk-library"]="paypal-js"),qt(r,n)&&a?e.resolve(a):Ut({url:r,attributes:n},e).then(function(){var i=st(s);if(i)return i;throw new Error("The window.".concat(s," global variable is not available."))})}function Ut(o,e){e===void 0&&(e=Promise),lt(o,e);var t=o.url,r=o.attributes;if(typeof t!="string"||t.length===0)throw new Error("Invalid url.");if(typeof r<"u"&&typeof r!="object")throw new Error("Expected attributes to be an object.");return new e(function(n,s){if(typeof document>"u")return n();Bt({url:t,attributes:r,onSuccess:function(){return n()},onError:function(){var a=new Error('The script "'.concat(t,'" failed to load. Check the HTTP status code and response body in DevTools to learn more.'));return s(a)}})})}function st(o){return window[o]}function lt(o,e){if(typeof o!="object"||o===null)throw new Error("Expected an options object.");var t=o.environment;if(t&&t!=="production"&&t!=="sandbox")throw new Error('The `environment` option must be either "production" or "sandbox".');if(typeof e<"u"&&typeof e!="function")throw new Error("Expected PromisePonyfill to be a function.")}var Ee=new Map,dt={root:"[data-freeform-paypal-buttons]",orderInput:"[data-freeform-paypal-order]"},ct={orders:"/freeform/payments/paypal/orders"},zt=window.FREEFORM_DEBUG===!0;function E(...o){zt&&console.error("PayPal:",...o)}function I(o,e,t="success"){let r=o.closest('[data-field-type="paypal"]')||o.parentElement;if(!r)return;let n=r.querySelector("[data-ff-paypal-notice]");n||(n=document.createElement("div"),n.setAttribute("data-ff-paypal-notice","true"),n.style.marginTop="8px",n.style.fontSize="0.95em",r.appendChild(n));let s={muted:"#555",success:"#0a7",error:"#b00020"};n.style.color=s[t],n.textContent=e}function ge(o){let e=o.getAttribute("data-config");if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Wt(o,e,t){try{let r=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":e},credentials:"same-origin",body:JSON.stringify({values:t})});if(!r.ok){let s=await r.text();return E("Order creation failed",r.status,r.statusText,s),null}let n=await r.json();return n!=null&&n.id?{id:String(n.id),status:n.status,approve:n.approve}:null}catch(r){return E("Network error during order creation:",r),null}}async function Kt(o,e,t,r){try{let n=await fetch(`${o}/${t}/capture`,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":e},credentials:"same-origin",body:JSON.stringify(r)});if(!n.ok){let a=await n.text();return E("Order capture failed",n.status,n.statusText,a),null}let s=await n.json();return s!=null&&s.status&&(s!=null&&s.id)?{status:String(s.status),id:String(s.id)}:null}catch(n){return E("Network error during order capture:",n),null}}async function mt(o,e,t){let r=`${o}-${e?"sandbox":"live"}-${t}`;if(Ee.has(r))return Ee.get(r);let n=await it({clientId:o,currency:(t||"USD").toUpperCase(),components:"buttons",intent:"capture",enableFunding:"venmo,paylater"});if(!n)throw new Error("PayPal SDK failed to load");return Ee.set(r,n),window.paypal||(window.paypal=n),n}async function Gt(o){let e=ge(o);if(!e){E("Could not parse config from element",o);return}if(!e.clientId){E("No client ID provided");return}let t=o.closest("form");if(!t){E("Could not find form element");return}let r=t.querySelector(dt.orderInput);if(!r){E("Could not find hidden order input");return}try{(await mt(e.clientId,e.sandbox,e.currency||"USD")).Buttons({style:{layout:"vertical",color:"blue",shape:"rect",label:"paypal"},createOrder:async()=>{try{let s=new FormData(t),a={};s.forEach((l,c)=>{a[c]=l});let i=await Wt(ct.orders,e.integration,a);if(!(i!=null&&i.id))throw E("Failed to create order or no order ID returned",i),new Error("Failed to create PayPal order");return r.value=i.id,i.id}catch(s){throw E("Error in createOrder:",s),s}},onApprove:async s=>{r.value=String(s.orderID||""),I(o,"Processing your payment\u2026","muted");try{let a=new FormData(t),i={};a.forEach((c,d)=>{i[d]=c});let l=await Kt(ct.orders,e.integration,String(s.orderID||""),{values:i});if(l&&l.status==="COMPLETED"){let c=F.getInstance(t);c?(I(o,"Payment complete. Your form is being submitted automatically.","success"),c.triggerSubmit()):I(o,"Payment completed with PayPal. Click Submit to finish.","success")}else E("Payment capture failed",l),I(o,"PayPal capture failed. Please try again.","error")}catch(a){E("Error during payment capture:",a),I(o,"PayPal capture error. Please try again.","error")}},onError:s=>{E("Payment error:",s)},onCancel:s=>{}}).render(o)}catch(n){E("Failed to initialize buttons:",n)}}document.addEventListener("DOMContentLoaded",async()=>{let o=document.querySelectorAll(dt.root);if(o.length===0)return;let e=new Map;if(o.forEach(t=>{let r=ge(t);r!=null&&r.clientId&&(e.has(r.clientId)||e.set(r.clientId,[]),e.get(r.clientId).push(t))}),e.size===0){E("No valid configurations found");return}e.forEach(async(t,r)=>{try{let n=ge(t[0]);if(!n)return;await mt(r,n.sandbox,n.currency||"USD"),t.forEach(s=>{Gt(s)})}catch(n){E(`Failed to load SDK for clientId ${r}:`,n)}})});})(); +(()=>{function O(e,t){var a={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(a[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var n=0,r=Object.getOwnPropertySymbols(e);n"u")return t.resolve(null);var a=C(e),r=a.url,n=a.attributes,o=n["data-namespace"]||"paypal",i=g(o);return n["data-js-sdk-library"]||(n["data-js-sdk-library"]="paypal-js"),P(r,n)&&i?t.resolve(i):I({url:r,attributes:n},t).then(function(){var s=g(o);if(s)return s;throw new Error("The window.".concat(o," global variable is not available."))})}function I(e,t){t===void 0&&(t=Promise),h(e,t);var a=e.url,r=e.attributes;if(typeof a!="string"||a.length===0)throw new Error("Invalid url.");if(typeof r<"u"&&typeof r!="object")throw new Error("Expected attributes to be an object.");return new t(function(n,o){if(typeof document>"u")return n();T({url:a,attributes:r,onSuccess:function(){return n()},onError:function(){var i=new Error('The script "'.concat(a,'" failed to load. Check the HTTP status code and response body in DevTools to learn more.'));return o(i)}})})}function g(e){return window[e]}function h(e,t){if(typeof e!="object"||e===null)throw new Error("Expected an options object.");var a=e.environment;if(a&&a!=="production"&&a!=="sandbox")throw new Error('The `environment` option must be either "production" or "sandbox".');if(typeof t<"u"&&typeof t!="function")throw new Error("Expected PromisePonyfill to be a function.")}var p=new Map,v={root:"[data-freeform-paypal-buttons]",orderInput:"[data-freeform-paypal-order]"},E={orders:"/freeform/payments/paypal/orders"},F=window.FREEFORM_DEBUG===!0;function c(...e){F&&console.error("PayPal:",...e)}function f(e,t,a="success"){let r=e.closest('[data-field-type="paypal"]')||e.parentElement;if(!r)return;let n=r.querySelector("[data-ff-paypal-notice]");n||(n=document.createElement("div"),n.setAttribute("data-ff-paypal-notice","true"),n.style.marginTop="8px",n.style.fontSize="0.95em",r.appendChild(n));let o={muted:"#555",success:"#0a7",error:"#b00020"};n.style.color=o[a],n.textContent=t}function N(e){var t;return(t=e.freeform)!=null?t:null}function m(e){let t=e.getAttribute("data-config");if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function A(e,t,a){try{let r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":t},credentials:"same-origin",body:JSON.stringify({values:a})});if(!r.ok){let o=await r.text();return c("Order creation failed",r.status,r.statusText,o),null}let n=await r.json();return n!=null&&n.id?{id:String(n.id),status:n.status,approve:n.approve}:null}catch(r){return c("Network error during order creation:",r),null}}async function k(e,t,a,r){try{let n=await fetch(`${e}/${a}/capture`,{method:"POST",headers:{"Content-Type":"application/json","FF-PAYPAL-INTEGRATION":t},credentials:"same-origin",body:JSON.stringify(r)});if(!n.ok){let i=await n.text();return c("Order capture failed",n.status,n.statusText,i),null}let o=await n.json();return o!=null&&o.status&&(o!=null&&o.id)?{status:String(o.status),id:String(o.id)}:null}catch(n){return c("Network error during order capture:",n),null}}async function S(e,t,a){let r=`${e}-${t?"sandbox":"live"}-${a}`;if(p.has(r))return p.get(r);let n=await w({clientId:e,currency:(a||"USD").toUpperCase(),components:"buttons",intent:"capture",enableFunding:"venmo,paylater"});if(!n)throw new Error("PayPal SDK failed to load");return p.set(r,n),window.paypal||(window.paypal=n),n}async function R(e){let t=m(e);if(!t){c("Could not parse config from element",e);return}if(!t.clientId){c("No client ID provided");return}let a=e.closest("form");if(!a){c("Could not find form element");return}let r=a.querySelector(v.orderInput);if(!r){c("Could not find hidden order input");return}try{(await S(t.clientId,t.sandbox,t.currency||"USD")).Buttons({style:{layout:"vertical",color:"blue",shape:"rect",label:"paypal"},createOrder:async()=>{try{let o=new FormData(a),i={};o.forEach((d,u)=>{i[u]=d});let s=await A(E.orders,t.integration,i);if(!(s!=null&&s.id))throw c("Failed to create order or no order ID returned",s),new Error("Failed to create PayPal order");return r.value=s.id,s.id}catch(o){throw c("Error in createOrder:",o),o}},onApprove:async o=>{r.value=String(o.orderID||""),f(e,"Processing your payment\u2026","muted");try{let i=new FormData(a),s={};i.forEach((u,l)=>{s[l]=u});let d=await k(E.orders,t.integration,String(o.orderID||""),{values:s});if(d&&d.status==="COMPLETED"){let u=N(a);u?(f(e,"Payment complete. Your form is being submitted automatically.","success"),u.triggerSubmit()):f(e,"Payment completed with PayPal. Click Submit to finish.","success")}else c("Payment capture failed",d),f(e,"PayPal capture failed. Please try again.","error")}catch(i){c("Error during payment capture:",i),f(e,"PayPal capture error. Please try again.","error")}},onError:o=>{c("Payment error:",o)},onCancel:o=>{}}).render(e)}catch(n){c("Failed to initialize buttons:",n)}}document.addEventListener("DOMContentLoaded",async()=>{let e=document.querySelectorAll(v.root);if(e.length===0)return;let t=new Map;if(e.forEach(a=>{let r=m(a);r!=null&&r.clientId&&(t.has(r.clientId)||t.set(r.clientId,[]),t.get(r.clientId).push(a))}),t.size===0){c("No valid configurations found");return}t.forEach(async(a,r)=>{try{let n=m(a[0]);if(!n)return;await S(r,n.sandbox,n.currency||"USD"),a.forEach(o=>{R(o)})}catch(n){c(`Failed to load SDK for clientId ${r}:`,n)}})});})(); diff --git a/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js b/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js index e3bb68398..78a7eeb0c 100644 --- a/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js +++ b/packages/plugin/src/Resources/js/scripts/front-end/payments/stripe/elements.js @@ -1,4 +1,4 @@ -(()=>{var Re=Object.create;var Y=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var He=Object.getPrototypeOf,Pe=Object.prototype.hasOwnProperty;var Z=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ce=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fe(e))!Pe.call(t,n)&&n!==r&&Y(t,n,{get:()=>e[n],enumerable:!(o=Me(e,n))||o.enumerable});return t};var Ae=(t,e,r)=>(r=t!=null?Re(He(t)):{},Ce(e||!t||!t.__esModule?Y(r,"default",{value:t,enumerable:!0}):r,t));var ce=Z(G=>{"use strict";Object.defineProperty(G,"__esModule",{value:!0});function H(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(e){return typeof e}:H=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(t)}var se="dahlia",qe=function(e){return e===3?"v3":e},ae="https://js.stripe.com",ke="".concat(ae,"/").concat(se,"/stripe.js"),De=/^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/,Ne=/^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/,re="loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used",Ue=function(e){return De.test(e)||Ne.test(e)},_e=function(){for(var e=document.querySelectorAll('script[src^="'.concat(ae,'"]')),r=0;r element.");return n.appendChild(o),o},Xe=function(e,r){!e||!e._registerWrapper||e._registerWrapper({name:"stripe-js",version:"9.1.0",startTime:r})},F=null,C=null,A=null,Ge=function(e){return function(r){e(new Error("Failed to load Stripe.js",{cause:r}))}},We=function(e,r){return function(){window.Stripe?e(window.Stripe):r(new Error("Stripe.js not available"))}},Be=function(e){return F!==null?F:(F=new Promise(function(r,o){if(typeof window>"u"||typeof document>"u"){r(null);return}if(window.Stripe&&e&&console.warn(re),window.Stripe){r(window.Stripe);return}try{var n=_e();if(n&&e)console.warn(re);else if(!n)n=ne(e);else if(n&&A!==null&&C!==null){var a;n.removeEventListener("load",A),n.removeEventListener("error",C),(a=n.parentNode)===null||a===void 0||a.removeChild(n),n=ne(e)}A=We(r,o),C=Ge(o),n.addEventListener("load",A),n.addEventListener("error",C)}catch(s){o(s);return}}),F.catch(function(r){return F=null,Promise.reject(r)}))},Je=function(e,r,o){if(e===null)return null;var n=r[0];if(typeof n!="string")throw new Error("Expected publishable key to be of type string, got type ".concat(H(n)," instead."));var a=n.match(/^pk_test/),s=qe(e.version),l=se;a&&s!==l&&console.warn("Stripe.js@".concat(s," was loaded on the page, but @stripe/stripe-js@").concat("9.1.0"," expected Stripe.js@").concat(l,". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning"));var i=e.apply(void 0,r);return Xe(i,o),i},oe=function(e){var r=`invalid load parameters; expected object of shape +(()=>{var Re=Object.create;var Y=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var He=Object.getPrototypeOf,Pe=Object.prototype.hasOwnProperty;var Z=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ce=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fe(e))!Pe.call(t,n)&&n!==r&&Y(t,n,{get:()=>e[n],enumerable:!(o=Me(e,n))||o.enumerable});return t};var Ae=(t,e,r)=>(r=t!=null?Re(He(t)):{},Ce(e||!t||!t.__esModule?Y(r,"default",{value:t,enumerable:!0}):r,t));var ce=Z(G=>{"use strict";Object.defineProperty(G,"__esModule",{value:!0});function H(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(e){return typeof e}:H=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(t)}var se="clover",qe=function(e){return e===3?"v3":e},ae="https://js.stripe.com",ke="".concat(ae,"/").concat(se,"/stripe.js"),De=/^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/,Ne=/^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/,re="loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used",Ue=function(e){return De.test(e)||Ne.test(e)},_e=function(){for(var e=document.querySelectorAll('script[src^="'.concat(ae,'"]')),r=0;r element.");return n.appendChild(o),o},Xe=function(e,r){!e||!e._registerWrapper||e._registerWrapper({name:"stripe-js",version:"8.11.0",startTime:r})},F=null,C=null,A=null,Ge=function(e){return function(r){e(new Error("Failed to load Stripe.js",{cause:r}))}},We=function(e,r){return function(){window.Stripe?e(window.Stripe):r(new Error("Stripe.js not available"))}},Be=function(e){return F!==null?F:(F=new Promise(function(r,o){if(typeof window>"u"||typeof document>"u"){r(null);return}if(window.Stripe&&e&&console.warn(re),window.Stripe){r(window.Stripe);return}try{var n=_e();if(n&&e)console.warn(re);else if(!n)n=ne(e);else if(n&&A!==null&&C!==null){var a;n.removeEventListener("load",A),n.removeEventListener("error",C),(a=n.parentNode)===null||a===void 0||a.removeChild(n),n=ne(e)}A=We(r,o),C=Ge(o),n.addEventListener("load",A),n.addEventListener("error",C)}catch(s){o(s);return}}),F.catch(function(r){return F=null,Promise.reject(r)}))},Je=function(e,r,o){if(e===null)return null;var n=r[0];if(typeof n!="string")throw new Error("Expected publishable key to be of type string, got type ".concat(H(n)," instead."));var a=n.match(/^pk_test/),s=qe(e.version),l=se;a&&s!==l&&console.warn("Stripe.js@".concat(s," was loaded on the page, but @stripe/stripe-js@").concat("8.11.0"," expected Stripe.js@").concat(l,". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning"));var i=e.apply(void 0,r);return Xe(i,o),i},oe=function(e){var r=`invalid load parameters; expected object of shape {advancedFraudSignals: boolean} diff --git a/packages/scripts/src/components/front-end/payments/paypal/buttons.ts b/packages/scripts/src/components/front-end/payments/paypal/buttons.ts index d60d0a50b..6621dd06e 100644 --- a/packages/scripts/src/components/front-end/payments/paypal/buttons.ts +++ b/packages/scripts/src/components/front-end/payments/paypal/buttons.ts @@ -1,5 +1,4 @@ // PayPal SDK integration for Freeform -import Freeform from "@components/front-end/plugin/freeform"; import { loadScript, type PayPalNamespace as PayPalSDK, @@ -25,6 +24,10 @@ type Config = { finalizeOnSubmit?: boolean; }; +type FreeformRuntimeApi = { + triggerSubmit: () => void; +}; + const SELECTORS = { root: "[data-freeform-paypal-buttons]", orderInput: "[data-freeform-paypal-order]", @@ -65,6 +68,12 @@ function showNotice( notice.textContent = text; } +function getFreeformRuntime(form: HTMLFormElement): FreeformRuntimeApi | null { + return ( + (form as unknown as { freeform?: FreeformRuntimeApi }).freeform ?? null + ); +} + function parseConfig(el: Element): Config | null { const attr = el.getAttribute("data-config"); if (!attr) return null; @@ -283,7 +292,7 @@ async function initializePayPalButtons(root: HTMLElement) { }, ); if (captureResult && captureResult.status === "COMPLETED") { - const runtime = Freeform.getInstance(form); + const runtime = getFreeformRuntime(form); if (runtime) { showNotice( root,