Plugin Directory

Changeset 3389352


Ignore:
Timestamp:
11/04/2025 06:22:56 AM (6 weeks ago)
Author:
coolplugins
Message:

Update to version 2.5.5 from GitHub

Location:
extensions-for-elementor-form
Files:
12 edited
1 copied

Legend:

Unmodified
Added
Removed
  • extensions-for-elementor-form/tags/2.5.5/assets/addons/js/country-code-script.js

    r3329586 r3389352  
    1313                inputTelTextArea: 'textarea.ccfef_country_code_data_js',
    1414                intlInputSpan: '.ccfef-editor-intl-input',
    15                 submitButton: 'div.cool-form__submit-group button'
     15                submitButton: 'div.cool-form__submit-group button',
     16                form: '.cool-form',
     17
    1618            },
    1719        };
     
    2830            $intlSpanElement: this.$element.find(selectors.intlInputSpan),
    2931            $submitButton: this.$element.find(selectors.submitButton),
     32            $form: this.$element.find(selectors.form),
     33
    3034        };
    3135    }
     
    215219                }
    216220
    217                 this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
    218                 previousCode = currentCode;
     221                if(e.currentTarget.value.startsWith(currentCode.replace('+',''))){
     222                    this.updateCountryCodeHandler(e.currentTarget, '+', previousCode, this.dialCodeVisibility[key]);
     223                }else{
     224                    this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
     225                    previousCode = currentCode;
     226                }
    219227            };
    220228
     
    442450            element.value = dialCodeVisibility === 'separate' || dialCodeVisibility === 'hide' ? value : currentCode + value;
    443451        }
     452
     453        else if (value.length > 12) {
     454            const plainCode = currentCode.replace('+', '');
     455            const doublePrefix = `+${plainCode}${plainCode}`;
     456
     457            if (value.startsWith(doublePrefix)) {
     458                element.value = `+${value.slice(currentCode.length)}`;
     459            }
     460        }
    444461    }
    445462
     
    542559    }
    543560
     561    // Helper: Validate all telephone fields
     562    validateTelInputs(e, trigger = 'submit') {
     563
     564        const itiArr = this.iti;
     565
     566        if (Object.keys(itiArr).length > 0) {
     567            Object.keys(itiArr).forEach(data => {
     568                const iti = itiArr[data];
     569             
     570                const inputTelElement = iti.telInput;                   
     571
     572                let mainField = inputTelElement.closest('label')
     573                let mdcField = mdc.textfield.MDCTextField.attachTo(mainField);
     574
     575                if('' !== inputTelElement.value){
     576                    inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
     577
     578                    // Always ensure dial code is present in the value before validation
     579                    const currentCountryData = iti.getSelectedCountryData();
     580                    const dialCode = `+${currentCountryData.dialCode}`;
     581                       
     582                    // If using separate or hide mode, ensure dial code is in the value
     583                    if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     584                        if (!inputTelElement.value.startsWith('+')) {
     585                            inputTelElement.value = dialCode + inputTelElement.value;
     586                        }
     587                    }
     588                }
     589
     590                const parentWrp = inputTelElement.closest('.cool-form__field-group');
     591                const telContainer=parentWrp.querySelector('.cfefp-intl-container');
     592
     593                if (telContainer && inputTelElement.offsetHeight) {
     594                    telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
     595                }
     596
     597                const errorContainer = jQuery(inputTelElement).parent();
     598                errorContainer.find('span.elementor-message').remove();
     599
     600                const errorMap = CCFEFCustomData.errorMap;
     601                let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
     602                if('' === inputTelElement.value){
     603                    return;
     604                };
     605                   
     606                if (iti.isValidNumber()) {
     607                    jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
     608
     609                    mdcField.valid = true;
     610                    mdcField.trailingIcon.root.style.display = 'none';
     611                    mdcField.helperText.foundation.adapter.setContent('');
     612
     613                    const $visibleFlexErrors = this.elements.$form.find('.mask-error').filter(function() {
     614                        return jQuery(this).css('display') === 'flex';
     615                    });
     616
     617                    if($visibleFlexErrors.length === 0){
     618
     619                        this.elements.$form[0].classList.remove('elementor-form-waiting');
     620                    }
     621                } else {
     622                    const errorType = iti.getValidationError();
     623                    if (errorType !== undefined && errorMap[errorType]) {
     624                        // Remove dial code from input field if validation fails
     625                        if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     626                            const currentCountryData = iti.getSelectedCountryData();
     627                            const dialCode = `+${currentCountryData.dialCode}`;
     628                            if (inputTelElement.value.startsWith(dialCode)) {
     629                                inputTelElement.value = inputTelElement.value.substring(dialCode.length);
     630                            }
     631                        }
     632                        errorMsgHtml += errorMap[errorType] + '</span>';
     633                        jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
     634
     635                        mdcField.valid = false;
     636                        mdcField.trailingIcon.root.style.display = 'initial';
     637                        mdcField.helperText.foundation.adapter.setContent(errorMap[errorType]);
     638
     639                        // jQuery(inputTelElement).after(errorMsgHtml);
     640                        e.preventDefault();
     641                        if(this.elements.$form.find('.is-field-type-recaptcha_v3').length > 0){
     642                            e.stopImmediatePropagation()
     643                        }
     644                        if (trigger === 'submit') {
     645                            this.elements.$form[0].classList.add('elementor-form-waiting');
     646                        }
     647                    }
     648                }
     649            });
     650        }
     651
     652    }
    544653
    545654
     
    549658     */
    550659    intlInputValidation() {
     660
    551661        this.elements.$submitButton.on('click', (e) => {
    552             const itiArr = this.iti;
    553 
    554             if (Object.keys(itiArr).length > 0) {
    555                 Object.keys(itiArr).forEach(data => {
    556                     const iti = itiArr[data];
    557              
    558                     const inputTelElement = iti.telInput;                   
    559 
    560                     let mainField = inputTelElement.closest('label')
    561                     let mdcField = mdc.textfield.MDCTextField.attachTo(mainField);
    562 
    563                     if('' !== inputTelElement.value){
    564                         inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
    565 
    566                         // Always ensure dial code is present in the value before validation
    567                         const currentCountryData = iti.getSelectedCountryData();
    568                         const dialCode = `+${currentCountryData.dialCode}`;
    569                        
    570                         // If using separate or hide mode, ensure dial code is in the value
    571                         if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    572                             if (!inputTelElement.value.startsWith('+')) {
    573                                 inputTelElement.value = dialCode + inputTelElement.value;
    574                             }
    575                         }
    576                     }
    577 
    578                     const parentWrp = inputTelElement.closest('.cool-form__field-group');
    579                     const telContainer=parentWrp.querySelector('.cfefp-intl-container');
    580 
    581                     if (telContainer && inputTelElement.offsetHeight) {
    582                         telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
    583                     }
    584 
    585                     const errorContainer = jQuery(inputTelElement).parent();
    586                     errorContainer.find('span.elementor-message').remove();
    587 
    588                     const errorMap = CCFEFCustomData.errorMap;
    589                     let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
    590                     if('' === inputTelElement.value){
    591                         return;
    592                     };
    593                    
    594                     if (iti.isValidNumber()) {
    595                         jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
    596 
    597                         mdcField.valid = true;
    598                         mdcField.trailingIcon.root.style.display = 'none';
    599                         mdcField.helperText.foundation.adapter.setContent('');
    600                     } else {
    601                         const errorType = iti.getValidationError();
    602                         if (errorType !== undefined && errorMap[errorType]) {
    603                             // Remove dial code from input field if validation fails
    604                             if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    605                                 const currentCountryData = iti.getSelectedCountryData();
    606                                 const dialCode = `+${currentCountryData.dialCode}`;
    607                                 if (inputTelElement.value.startsWith(dialCode)) {
    608                                     inputTelElement.value = inputTelElement.value.substring(dialCode.length);
    609                                 }
    610                             }
    611                             errorMsgHtml += errorMap[errorType] + '</span>';
    612                             jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
    613 
    614                             mdcField.valid = false;
    615                             mdcField.trailingIcon.root.style.display = 'initial';
    616                             mdcField.helperText.foundation.adapter.setContent(errorMap[errorType]);
    617 
    618                             // jQuery(inputTelElement).after(errorMsgHtml);
    619                             e.preventDefault();
    620                         }
    621                     }
    622                 });
    623             }
     662            this.validateTelInputs(e, 'button');
     663        });
     664
     665        this.elements.$form.on('submit', (e) => {
     666            this.validateTelInputs(e, 'submit');
    624667        });
    625668    }
  • extensions-for-elementor-form/tags/2.5.5/assets/addons/js/country-code-script.min.js

    r3270292 r3389352  
    1 class CCFEF extends elementorModules.frontend.handlers.Base{getDefaultSettings(){return{selectors:{inputTelTextArea:"textarea.ccfef_country_code_data_js",intlInputSpan:".ccfef-editor-intl-input",submitButton:"div.elementor-field-type-submit button"}}}getDefaultElements(){const selectors=this.getSettings("selectors");return{$textArea:this.$element.find(selectors.inputTelTextArea),$intlSpanElement:this.$element.find(selectors.intlInputSpan),$submitButton:this.$element.find(selectors.submitButton)}}bindEvents(){this.telId=new Array,this.includeCountries={},this.excludeCountries={},this.defaultCountry={},this.commonCountries={},this.iti={},this.getIntlUserData(),this.appendCountryCodeHandler(),this.addCountryCodeInputHandler(),this.customFlags(),this.removeInputTelSpanEle(),this.intlInputValidation()}appendCountryCodeHandler(){this.telId.forEach(data=>{this.addCountryCodeIconHandler(data.formId,data.fieldId,data.customId)})}addCountryCodeInputHandler(){const itiArr=this.iti;Object.keys(itiArr).forEach(key=>{const iti=itiArr[key],inputElement=iti.telInput;let previousCountryData=iti.getSelectedCountryData(),previousCode=`+${previousCountryData.dialCode}`,keyUpEvent=!1;const resetKeyUpEventStatus=()=>{keyUpEvent=!1},handleCountryChange=e=>{this.customFlags();const currentCountryData=iti.getSelectedCountryData(),currentCode=`+${currentCountryData.dialCode}`;if("keydown"===e.type||"input"===e.type)keyUpEvent=!0,clearTimeout(resetKeyUpEventStatus),setTimeout(resetKeyUpEventStatus,400),previousCountryData.dialCode!==currentCountryData.dialCode?previousCountryData=currentCountryData:previousCountryData.dialCode===currentCountryData.dialCode&&previousCountryData.iso2!==currentCountryData.iso2&&iti.setCountry(previousCountryData.iso2);else if("countrychange"===e.type){if(keyUpEvent)return;previousCountryData=currentCountryData}this.updateCountryCodeHandler(e.currentTarget,currentCode,previousCode),previousCode=currentCode};inputElement.addEventListener("keydown",handleCountryChange),inputElement.addEventListener("input",handleCountryChange),inputElement.addEventListener("countrychange",handleCountryChange)})}addCountryCodeIconHandler(formId,widgetId,inputId){const utilsPath=CCFEFCustomData.pluginDir+"assets/intl-tel-input/js/utils.min.js",telFIeld=jQuery(`.elementor-widget.elementor-widget-form[data-id="${formId}"] .elementor-field-type-tel.elementor-field-group input[type="tel"]#${inputId}`)[0];if(void 0!==telFIeld){let includeCountries=[],excludeCountries=[],defaultCountry="in";const defaultCoutiresArr=["in","us","gb","ru","fr","de","br","cn","jp","it"],uniqueId=`${formId}${widgetId}`;if(this.includeCountries.hasOwnProperty(uniqueId)&&this.includeCountries[uniqueId].length>0&&(defaultCountry=this.includeCountries[uniqueId][0],includeCountries=[...this.includeCountries[uniqueId]]),this.excludeCountries.hasOwnProperty(uniqueId)&&this.excludeCountries[uniqueId].length>0){let uniqueValue;defaultCountry=defaultCoutiresArr.filter(value=>!this.excludeCountries[uniqueId].includes(value))[0],excludeCountries=[...this.excludeCountries[uniqueId]]}this.defaultCountry[uniqueId]&&""!==this.defaultCountry[uniqueId]&&(defaultCountry=this.defaultCountry[uniqueId]);const iti=window.intlTelInput(telFIeld,{initialCountry:defaultCountry,utilsScript:utilsPath,formatOnDisplay:!1,formatAsYouType:!0,autoFormat:!1,containerClass:"cfefp-intl-container",useFullscreenPopup:!1,onlyCountries:includeCountries,excludeCountries:excludeCountries,customPlaceholder:(selectedCountryPlaceholder,selectedCountryData)=>{if(this.commonCountries[uniqueId])return"No country found";if(!selectedCountryData||!selectedCountryPlaceholder||!selectedCountryData.dialCode)return"No country found";let placeHolder=selectedCountryPlaceholder;"in"===selectedCountryData.iso2&&(placeHolder=selectedCountryPlaceholder.replace(/^0+/,""));const placeholderText=`+${selectedCountryData.dialCode} ${placeHolder}`;return placeholderText.replace(/\s/g,"")}}),intlSpan=document.querySelector(`.elementor-widget.elementor-widget-form[data-id="${formId}"] .ccfef-editor-intl-input[data-field-id="${widgetId}"]`),commonAttr=intlSpan?intlSpan.getAttribute("data-common-countries"):"";if("same"===commonAttr&&this.commonCountries[uniqueId]&&""!==includeCountries&&""!==excludeCountries){const countryList=iti.countryList;countryList&&countryList.classList.contains("iti__country-list")&&(countryList.style.display="none")}else{const countryList=iti.countryList;if(countryList&&countryList.classList.contains("iti__country-list")){const countryItems=countryList.querySelectorAll(".iti__country");countryItems.forEach((function(item){const countryCode=item.getAttribute("data-country-code");excludeCountries.includes(countryCode)&&(item.style.display="none")}));const visibleCountries=Array.from(countryItems).filter(item=>"none"!==item.style.display),includedVisibleCountries=visibleCountries.filter(item=>{const countryCode=item.getAttribute("data-country-code");return includeCountries.includes(countryCode)});if(includedVisibleCountries.length>0){const selectedItem=includedVisibleCountries.find(item=>"true"===item.getAttribute("aria-selected"));if(!selectedItem){const firstItem=includedVisibleCountries[0];firstItem.setAttribute("aria-selected","true");const newCountryCode=firstItem.getAttribute("data-country-code");iti.setCountry(newCountryCode)}}}}telFIeld.removeAttribute("pattern"),this.iti[formId+widgetId]=iti}}updateCountryCodeHandler(element,currentCode,previousCode){let value=element.value;currentCode&&"+undefined"===currentCode||["","+"].includes(value)||(currentCode!==previousCode&&(value=value.replace(new RegExp(`^\\${previousCode}`),"")),value.startsWith(currentCode)||(value=value.replace(/\+/g,""),element.value=currentCode+value))}customFlags(){const selectedCountries=this.$element.find(".cfefp-intl-container .iti__country-container .iti__flag:not(.iti__globe)");selectedCountries.each((function(){const selectedCountry=this,classList=selectedCountry.className.split(" ");if(classList[1]){const selectedCountryFlag=classList[1].split("__")[1],svgFlagPath=CCFEFCustomData.pluginDir+`assets/flags/${selectedCountryFlag}.svg`;selectedCountry.style.backgroundImage=`url('${svgFlagPath}')`}}))}removeInputTelSpanEle(){this.$element.find("span.ccfef-editor-intl-input").remove()}getIntlUserData(){const intelInputElement=this.elements.$intlSpanElement,previousIds=[];intelInputElement.each((_,ele)=>{const element=jQuery(ele),includeCountries=element.data("include-countries"),excludeCountries=element.data("exclude-countries"),defaultCountry=element.data("defaultCountry"),commonAttr=element.data("common-countries"),inputId=element.data("id"),fieldId=element.data("field-id"),formId=element.closest(".elementor-element.elementor-widget-form").data("id"),currentId=`${formId}${fieldId}`;if("same"===commonAttr&&""===includeCountries&&""!==excludeCountries)this.commonCountries[currentId]=!0;else{if(""!==includeCountries&&isNaN(includeCountries)){const splitIncludeCountries=includeCountries.split(",");this.includeCountries[currentId]=splitIncludeCountries}if(""!==excludeCountries&&isNaN(excludeCountries)){const splitExcludeCountries=excludeCountries.split(",");this.excludeCountries[currentId]=splitExcludeCountries}if("same"!==commonAttr&&""!==includeCountries&&""!==excludeCountries&&isNaN(includeCountries)){const includeArray=includeCountries.split(",").map(item=>item.trim());if(isNaN(excludeCountries)){const excludeArray=excludeCountries.split(",").map(item=>item.trim()),allIncludedPresent=includeArray.every(country=>excludeArray.includes(country));allIncludedPresent&&(this.commonCountries[currentId]=!0)}}""!==defaultCountry&&(this.defaultCountry[currentId]=defaultCountry)}previousIds.includes(currentId)||(this.telId.push({formId:formId,fieldId:fieldId,customId:inputId}),previousIds.push(currentId))})}intlInputValidation(){this.elements.$submitButton.on("click",e=>{const itiArr=this.iti;Object.keys(itiArr).length>0&&Object.keys(itiArr).forEach(data=>{const iti=itiArr[data],inputTelElement=iti.telInput;""!==inputTelElement.value&&(inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g,""));const parentWrp=inputTelElement.closest(".elementor-field-group"),telContainer=parentWrp.querySelector(".cfefp-intl-container");telContainer&&inputTelElement.offsetHeight&&telContainer.style.setProperty("--cfefp-intl-tel-button-height",`${inputTelElement.offsetHeight}px`);const errorContainer=jQuery(inputTelElement).parent();errorContainer.find("span.elementor-message").remove();const errorMap=CCFEFCustomData.errorMap;let errorMsgHtml='<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';if(""!==inputTelElement.value)if(iti.isValidNumber())jQuery(inputTelElement).closest(".cfefp-intl-container").removeClass("elementor-error");else{const errorType=iti.getValidationError();void 0!==errorType&&errorMap[errorType]&&(errorMsgHtml+=errorMap[errorType]+"</span>",jQuery(inputTelElement).closest(".cfefp-intl-container").addClass("elementor-error"),jQuery(inputTelElement).after(errorMsgHtml),e.preventDefault())}})})}}jQuery(window).on("elementor/frontend/init",()=>{const addHandler=$element=>{elementorFrontend.elementsHandler.addHandler(CCFEF,{$element:$element})};elementorFrontend.hooks.addAction("frontend/element_ready/form.default",addHandler)});
     1class CoolFormCCFEF extends elementorModules.frontend.handlers.Base{getDefaultSettings(){return{selectors:{inputTelTextArea:"textarea.ccfef_country_code_data_js",intlInputSpan:".ccfef-editor-intl-input",submitButton:"div.cool-form__submit-group button",form:".cool-form"}}}getDefaultElements(){const t=this.getSettings("selectors");return{$textArea:this.$element.find(t.inputTelTextArea),$intlSpanElement:this.$element.find(t.intlInputSpan),$submitButton:this.$element.find(t.submitButton),$form:this.$element.find(t.form)}}bindEvents(){this.telId=new Array,this.includeCountries={},this.excludeCountries={},this.defaultCountry={},this.commonCountries={},this.dialCodeVisibility={},this.countryStrictMode={},this.iti={},this.getIntlUserData(),this.appendCountryCodeHandler(),this.addCountryCodeInputHandler(),this.customFlags(),this.removeInputTelSpanEle(),this.intlInputValidation()}handleTelWithMdcFields(t){function e(){const t=o.find(".iti__dropdown-content");o.nextAll(".cool-form__field-group").each(function(){t.hasClass("iti__hide")?this.style.zIndex="initial":this.style.zIndex="-1"})}const i=t.telInput,n=i.closest(".cool-form__field-group"),o=jQuery(n),s=o.find(".mdc-floating-label"),l=o.find("input"),r=o.find(".mdc-notched-outline__notch"),a=o.find(".mdc-notched-outline__leading");let d=l.eq(1).prev(".iti__country-container").find(".iti__selected-dial-code");if(d.css("visibility","hidden"),""!==l.eq(1).val()?d.css("visibility","visible"):d.css("visibility","hidden"),o.nextAll().length>0){const t=o.nextAll();if(t.length>0){const e=t[0],i=t[1],n=t=>t&&t.classList&&t.classList.contains("cool-form__submit-group"),s=o.hasClass("has-width-100")?n(e):n(e)||n(i);s&&(o.css({"margin-bottom":"25px"}),o.find(".iti__country-list").css({"max-height":"100px"}))}}s.css("left","57px"),l.eq(1).on("blur",()=>{""!==l.eq(1).val()?d.css("visibility","visible"):d.css("visibility","hidden")}),l.eq(1).on("focus",()=>{d.css("visibility","visible"),s.css({left:"57px","background-color":"white"});const t=getComputedStyle(r[0]).getPropertyValue("border-bottom");r.css({"border-top":t})}),o.on("click",t=>{e()}),l.eq(0).on("mouseover",()=>{const t=getComputedStyle(a[0]).getPropertyValue("border-bottom-width");r.css({"border-top-width":t,"border-top-color":"black"})}),o.on("mouseover",t=>{const i=getComputedStyle(a[0]).getPropertyValue("border-bottom-width");r.css({"border-top-width":i,"border-top-color":"black"}),e()}),o.on("mouseleave",t=>{const i=getComputedStyle(a[0]).getPropertyValue("border-bottom-width"),n=getComputedStyle(a[0]).getPropertyValue("border-right-color");r.css({"border-top-width":i,"border-top-color":n}),e()})}appendCountryCodeHandler(){this.telId.forEach(t=>{this.addCountryCodeIconHandler(t.formId,t.fieldId,t.customId)})}addCountryCodeInputHandler(){const t=this.iti;Object.keys(t).forEach(e=>{const i=t[e],n=i.telInput;this.handleTelWithMdcFields(i);let o=i.getSelectedCountryData(),s=`+${o.dialCode}`,l=!1;const r=()=>{l=!1},a=t=>{this.handleTelWithMdcFields(i),this.customFlags();const n=i.getSelectedCountryData(),a=`+${n.dialCode}`;if("keydown"===t.type||"input"===t.type)l=!0,clearTimeout(r),setTimeout(r,400),o.dialCode!==n.dialCode?o=n:o.dialCode===n.dialCode&&o.iso2!==n.iso2&&i.setCountry(o.iso2);else if("countrychange"===t.type){if(l)return;o=n}t.currentTarget.value.startsWith(a.replace("+",""))?this.updateCountryCodeHandler(t.currentTarget,"+",s,this.dialCodeVisibility[e]):(this.updateCountryCodeHandler(t.currentTarget,a,s,this.dialCodeVisibility[e]),s=a)};n.addEventListener("keydown",a),n.addEventListener("input",a),n.addEventListener("countrychange",a)})}addCountryCodeIconHandler(t,e,i){const n=CCFEFCustomData.pluginDir+"assets/addons/intl-tel-input/js/utils.min.js",o=jQuery(`.elementor-widget.elementor-widget-cool-form[data-id="${t}"] .is-field-type-tel.cool-form__field-group input[type="tel"]#${i}`)[0];if(void 0!==o){let i=[],s=[],l="in";const r=["in","us","gb","ru","fr","de","br","cn","jp","it"],a=`${t}${e}`;if(this.includeCountries.hasOwnProperty(a)&&this.includeCountries[a].length>0&&(l=this.includeCountries[a][0],i=[...this.includeCountries[a]]),this.excludeCountries.hasOwnProperty(a)&&this.excludeCountries[a].length>0){let t=r.filter(t=>!this.excludeCountries[a].includes(t));l=t[0],s=[...this.excludeCountries[a]]}this.defaultCountry[a]&&""!==this.defaultCountry[a]&&(l=this.defaultCountry[a]);const d=window.intlTelInput(o,{initialCountry:l,utilsScript:n,dialCodeVisibility:this.dialCodeVisibility[a],strictMode:"yes"===this.countryStrictMode[a],separateDialCode:"separate"===this.dialCodeVisibility[a],formatOnDisplay:!1,formatAsYouType:!0,autoFormat:!1,containerClass:"cfefp-intl-container",useFullscreenPopup:!1,onlyCountries:i,excludeCountries:s,customPlaceholder:(t,e)=>{if(this.commonCountries[a])return"No country found";if(!e||!t||!e.dialCode)return"No country found";let i=t;"in"===e.iso2&&(i=t.replace(/^0+/,""));const n="separate"===this.dialCodeVisibility[a]||"hide"===this.dialCodeVisibility[a]?`${i}`:`+${e.dialCode} ${i}`;return n}});if("separate"===this.dialCodeVisibility[a]){const t=document.createElement("style");t.textContent="\n                    .cfefp-intl-container .iti__selected-dial-code,\n                    .cfefp-intl-container .iti__selected-flag {\n                        color: var(--e-form-field-text-color, #7a7a7a) !important;\n                    }\n                    .cfefp-intl-container .iti__selected-dial-code {\n                        font-size: inherit !important;\n                        font-family: inherit !important;\n                        line-height: inherit !important;\n                    }\n                ",document.head.appendChild(t)}const c=document.querySelector(`.elementor-widget.elementor-widget-form[data-id="${t}"] .ccfef-editor-intl-input[data-field-id="${e}"]`),u=c?c.getAttribute("data-common-countries"):"";if("same"===u&&this.commonCountries[a]&&""!==i&&""!==s){const t=d.countryList;t&&t.classList.contains("iti__country-list")&&(t.style.display="none")}else{const t=d.countryList;if(t&&t.classList.contains("iti__country-list")){const e=t.querySelectorAll(".iti__country");e.forEach(function(t){const e=t.getAttribute("data-country-code");s.includes(e)&&(t.style.display="none")});const n=Array.from(e).filter(t=>"none"!==t.style.display),o=n.filter(t=>{const e=t.getAttribute("data-country-code");return i.includes(e)});if(o.length>0){const t=o.find(t=>"true"===t.getAttribute("aria-selected"));if(!t){const t=o[0];t.setAttribute("aria-selected","true");const e=t.getAttribute("data-country-code");d.setCountry(e)}}}}o.removeAttribute("pattern"),this.iti[t+e]=d,this.setInitialCountry(d,s,a,o)}}setInitialCountry(t,e,i,n){const o=this.defaultCountry[i]||"",s=["in","us","gb","ru","fr","de","br","cn","jp","it"],l=t.countries.map(t=>t.iso2);t.telInput;jQuery(n).closest(".elementor-field-type-country").hasClass("elementor-field-required")&&jQuery(n).closest(".elementor-field-type-country").hasClass("cfef-hidden")&&(""===o?(t.setCountry("us"),jQuery(n).val("United States"),jQuery(n).focus(),jQuery(n).trigger("change")):(t.setCountry(o),jQuery(n).val(o),jQuery(n).focus(),jQuery(n).trigger("change")));const r=i=>{if(l.length<=0)return;const n=isNaN(i)&&i?i.toLowerCase():"";if(n&&l.includes(n))t.setCountry(n);else if(o&&l.includes(o))t.setCountry(o);else{const i=s.filter(t=>!e.includes(t)&&l.includes(t)),n=i.length>0?i[0]:l[0];t.setCountry(n)}const r=t.getSelectedCountryData();r.hasOwnProperty("iso2")};o&&r(o)}updateCountryCodeHandler(t,e,i,n){let o=t.value;if(!(e&&"+undefined"===e||["","+"].includes(o)))if(e!==i&&(o=o.replace(new RegExp(`^\\${i}`),"")),o.startsWith(e)){if(o.length>12){const i=e.replace("+",""),n=`+${i}${i}`;o.startsWith(n)&&(t.value=`+${o.slice(e.length)}`)}}else o=o.replace(/\+/g,""),t.value="separate"===n||"hide"===n?o:e+o}customFlags(){const t=this.$element.find(".cfefp-intl-container .iti__country-container .iti__flag:not(.iti__globe)");t.each(function(){const t=this,e=t.className.split(" ");if(e[1]){const i=e[1].split("__")[1],n=CCFEFCustomData.pluginDir+`assets/addons/flags/${i}.svg`;t.style.backgroundImage=`url('${n}')`}})}removeInputTelSpanEle(){this.$element.find("span.ccfef-editor-intl-input").remove()}getIntlUserData(){const t=this.elements.$intlSpanElement,e=[];t.each((t,i)=>{const n=jQuery(i),o=n.data("include-countries"),s=n.data("exclude-countries"),l=n.data("defaultCountry"),r=n.data("common-countries"),a=n.data("id"),d=n.data("field-id"),c=n.data("dial-code-visibility"),u=n.data("strict-mode"),f=n.closest(".elementor-element.elementor-widget-cool-form").data("id"),h=`${f}${d}`;if("same"===r&&""===o&&""!==s)this.commonCountries[h]=!0;else{if(""!==o&&isNaN(o)){const t=o.split(",");this.includeCountries[h]=t}if(""!==s&&isNaN(s)){const t=s.split(",");this.excludeCountries[h]=t}if("same"!==r&&""!==o&&""!==s&&isNaN(o)){const t=o.split(",").map(t=>t.trim());if(isNaN(s)){const e=s.split(",").map(t=>t.trim()),i=t.every(t=>e.includes(t));i&&(this.commonCountries[h]=!0)}}""!==c&&(this.dialCodeVisibility[h]=c),""!==u&&(this.countryStrictMode[h]=u),""!==l&&(this.defaultCountry[h]=l)}e.includes(h)||(this.telId.push({formId:f,fieldId:d,customId:a}),e.push(h))})}validateTelInputs(t,e="submit"){const i=this.iti;Object.keys(i).length>0&&Object.keys(i).forEach(n=>{const o=i[n],s=o.telInput;let l=s.closest("label"),r=mdc.textfield.MDCTextField.attachTo(l);if(""!==s.value){s.value=s.value.replace(/[^0-9+]/g,"");const t=o.getSelectedCountryData(),e=`+${t.dialCode}`;"separate"!==this.dialCodeVisibility[n]&&"hide"!==this.dialCodeVisibility[n]||s.value.startsWith("+")||(s.value=e+s.value)}const a=s.closest(".cool-form__field-group"),d=a.querySelector(".cfefp-intl-container");d&&s.offsetHeight&&d.style.setProperty("--cfefp-intl-tel-button-height",`${s.offsetHeight}px`);const c=jQuery(s).parent();c.find("span.elementor-message").remove();const u=CCFEFCustomData.errorMap;let f='<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';if(""!==s.value)if(o.isValidNumber()){jQuery(s).closest(".cfefp-intl-container").removeClass("elementor-error"),r.valid=!0,r.trailingIcon.root.style.display="none",r.helperText.foundation.adapter.setContent("");const t=this.elements.$form.find(".mask-error").filter(function(){return"flex"===jQuery(this).css("display")});0===t.length&&this.elements.$form[0].classList.remove("elementor-form-waiting")}else{const i=o.getValidationError();if(void 0!==i&&u[i]){if("separate"===this.dialCodeVisibility[n]||"hide"===this.dialCodeVisibility[n]){const t=o.getSelectedCountryData(),e=`+${t.dialCode}`;s.value.startsWith(e)&&(s.value=s.value.substring(e.length))}f+=u[i]+"</span>",jQuery(s).closest(".cfefp-intl-container").addClass("elementor-error"),r.valid=!1,r.trailingIcon.root.style.display="initial",r.helperText.foundation.adapter.setContent(u[i]),t.preventDefault(),this.elements.$form.find(".is-field-type-recaptcha_v3").length>0&&t.stopImmediatePropagation(),"submit"===e&&this.elements.$form[0].classList.add("elementor-form-waiting")}}})}intlInputValidation(){this.elements.$submitButton.on("click",t=>{this.validateTelInputs(t,"button")}),this.elements.$form.on("submit",t=>{this.validateTelInputs(t,"submit")})}}jQuery(window).on("elementor/frontend/init",()=>{const t=t=>{elementorFrontend.elementsHandler.addHandler(CoolFormCCFEF,{$element:t})};elementorFrontend.hooks.addAction("frontend/element_ready/cool-form.default",t)});
  • extensions-for-elementor-form/tags/2.5.5/assets/helloplus-addons/js/helloplus-country-code-script.js

    r3329586 r3389352  
    114114                }
    115115
    116                 this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
    117                 previousCode = currentCode;
     116                if(e.currentTarget.value.startsWith(currentCode.replace('+',''))){
     117                    this.updateCountryCodeHandler(e.currentTarget, '+', previousCode, this.dialCodeVisibility[key]);
     118                }else{
     119                    this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
     120                    previousCode = currentCode;
     121                }
    118122            };
    119123
     
    340344            value = value.replace(/\+/g, '');
    341345            element.value = dialCodeVisibility === 'separate' || dialCodeVisibility === 'hide' ? value : currentCode + value;
     346        }
     347
     348        else if (value.length > 12) {
     349            const plainCode = currentCode.replace('+', '');
     350            const doublePrefix = `+${plainCode}${plainCode}`;
     351
     352            if (value.startsWith(doublePrefix)) {
     353                element.value = `+${value.slice(currentCode.length)}`;
     354            }
    342355        }
    343356    }
  • extensions-for-elementor-form/tags/2.5.5/assets/js/form-country-code-script.js

    r3378085 r3389352  
    116116                }
    117117
    118                 this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
    119                 previousCode = currentCode;
     118                if(e.currentTarget.value.startsWith(currentCode.replace('+',''))){
     119                    this.updateCountryCodeHandler(e.currentTarget, '+', previousCode, this.dialCodeVisibility[key]);
     120                }else{
     121                    this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
     122                    previousCode = currentCode;
     123                }
    120124            };
    121125
     
    343347            element.value = dialCodeVisibility === 'separate' || dialCodeVisibility === 'hide' ? value : currentCode + value;
    344348        }
     349
     350        else if (value.length > 12) {
     351            const plainCode = currentCode.replace('+', '');
     352            const doublePrefix = `+${plainCode}${plainCode}`;
     353
     354            if (value.startsWith(doublePrefix)) {
     355                element.value = `+${value.slice(currentCode.length)}`;
     356            }
     357        }
    345358    }
    346359
     
    444457
    445458
     459    // Helper: Validate all telephone fields
     460    validateTelInputs(e, trigger = 'submit') {
     461
     462        const itiArr = this.iti;
     463
     464        if (Object.keys(itiArr).length > 0) {
     465            Object.keys(itiArr).forEach(data => {
     466                const iti = itiArr[data];
     467             
     468                const inputTelElement = iti.telInput;
     469               
     470                if(jQuery(inputTelElement).closest('.elementor-field-type-tel').hasClass('cfef-hidden')){
     471
     472                    inputTelElement.value = '+1234567890';
     473
     474                    return;
     475                }
     476
     477                if('' !== inputTelElement.value){
     478                    inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
     479                                               
     480                    // Always ensure dial code is present in the value before validation
     481                    const currentCountryData = iti.getSelectedCountryData();
     482                    const dialCode = `+${currentCountryData.dialCode}`;
     483                       
     484                    // If using separate or hide mode, ensure dial code is in the value
     485                    if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     486                        if (!inputTelElement.value.startsWith('+')) {
     487                            inputTelElement.value = dialCode + inputTelElement.value;
     488                        }
     489                    }
     490                }
     491
     492                const parentWrp = inputTelElement.closest('.elementor-field-group');
     493                const telContainer=parentWrp.querySelector('.cfefp-intl-container');
     494
     495                if (telContainer && inputTelElement.offsetHeight) {
     496                    telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
     497                }
     498
     499                const errorContainer = jQuery(inputTelElement).parent();
     500                errorContainer.find('span.elementor-message').remove();
     501
     502                const errorMap = CCFEFCustomData.errorMap;
     503                let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
     504                if('' === inputTelElement.value){
     505                    return;
     506                };
     507                if (iti.isValidNumber()) {
     508                    jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
     509                    this.elements.$submitButton.removeClass('cfkef-prevent-submit');
     510                    const $visibleFlexErrors = this.elements.$form.find('.mask-error').filter(function() {
     511                        return jQuery(this).css('display') === 'flex';
     512                    });
     513
     514                    if($visibleFlexErrors.length === 0){
     515
     516                        this.elements.$form[0].classList.remove('elementor-form-waiting');
     517                    }
     518                } else {
     519                    this.elements.$submitButton.addClass('cfkef-prevent-submit')
     520
     521                    const errorType = iti.getValidationError();
     522                    if (errorType !== undefined && errorMap[errorType]) {
     523                        // Remove dial code from input field if validation fails
     524                        if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     525                            const currentCountryData = iti.getSelectedCountryData();
     526                            const dialCode = `+${currentCountryData.dialCode}`;
     527                            if (inputTelElement.value.startsWith(dialCode)) {
     528                                inputTelElement.value = inputTelElement.value.substring(dialCode.length);
     529                            }
     530                        }
     531                        errorMsgHtml += errorMap[errorType] + '</span>';
     532                        jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
     533                        jQuery(inputTelElement).after(errorMsgHtml);
     534                        e.preventDefault();
     535                        if (trigger === 'submit') {
     536                            this.elements.$form[0].classList.add('elementor-form-waiting');
     537                        }
     538                        if(this.elements.$form.find('.elementor-field-type-recaptcha_v3').length > 0){
     539                            e.stopImmediatePropagation()
     540                        }
     541                    }
     542                }
     543            });
     544        }
     545    }
     546
     547
    446548
    447549    /**
     
    450552     */
    451553    intlInputValidation() {
     554
    452555        this.elements.$submitButton.on('click', (e) => {
    453             const itiArr = this.iti;
    454 
    455             if (Object.keys(itiArr).length > 0) {
    456                 Object.keys(itiArr).forEach(data => {
    457                     const iti = itiArr[data];
    458              
    459                     const inputTelElement = iti.telInput;                   
    460 
    461                     if('' !== inputTelElement.value){
    462                         inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
    463                                                
    464                         // Always ensure dial code is present in the value before validation
    465                         const currentCountryData = iti.getSelectedCountryData();
    466                         const dialCode = `+${currentCountryData.dialCode}`;
    467                        
    468                         // If using separate or hide mode, ensure dial code is in the value
    469                         if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    470                             if (!inputTelElement.value.startsWith('+')) {
    471                                 inputTelElement.value = dialCode + inputTelElement.value;
    472                             }
    473                         }
    474                     }
    475 
    476                     const parentWrp = inputTelElement.closest('.elementor-field-group');
    477                     const telContainer=parentWrp.querySelector('.cfefp-intl-container');
    478 
    479                     if (telContainer && inputTelElement.offsetHeight) {
    480                         telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
    481                     }
    482 
    483                     const errorContainer = jQuery(inputTelElement).parent();
    484                     errorContainer.find('span.elementor-message').remove();
    485 
    486                     const errorMap = CCFEFCustomData.errorMap;
    487                     let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
    488                     if('' === inputTelElement.value){
    489                         return;
    490                     };
    491                     if (iti.isValidNumber()) {
    492                         jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
    493                         this.elements.$submitButton.removeClass('cfkef-prevent-submit')
    494                     } else {
    495                         this.elements.$submitButton.addClass('cfkef-prevent-submit')
    496 
    497                         const errorType = iti.getValidationError();
    498                         if (errorType !== undefined && errorMap[errorType]) {
    499                             // Remove dial code from input field if validation fails
    500                             if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    501                                 const currentCountryData = iti.getSelectedCountryData();
    502                                 const dialCode = `+${currentCountryData.dialCode}`;
    503                                 if (inputTelElement.value.startsWith(dialCode)) {
    504                                     inputTelElement.value = inputTelElement.value.substring(dialCode.length);
    505                                 }
    506                             }
    507                             errorMsgHtml += errorMap[errorType] + '</span>';
    508                             jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
    509                             jQuery(inputTelElement).after(errorMsgHtml);
    510                             e.preventDefault();
    511                             if(this.elements.$form.find('.elementor-field-type-recaptcha_v3').length > 0){
    512                                 e.stopImmediatePropagation()
    513                             }
    514                         }
    515                     }
    516                 });
    517             }
     556            this.validateTelInputs(e, 'button');
     557        });
     558
     559        this.elements.$form.on('submit', (e) => {
     560            this.validateTelInputs(e, 'submit');
    518561        });
    519562    }
  • extensions-for-elementor-form/tags/2.5.5/extensions-for-elementor-form.php

    r3378085 r3389352  
    88 * Author URI: https://coolplugins.net/?utm_source=cfkl_plugin&utm_medium=inside&utm_campaign=author_page&utm_content=plugins_list
    99 * Text Domain: extensions-for-elementor-form
    10  * Version: 2.5.4
     10 * Version: 2.5.5
    1111 * Requires at least: 6.2
    1212 * Requires PHP: 6.2
     
    1414 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
    1515 * Requires Plugins: elementor
    16  * Elementor tested up to: 3.32.4
     16 * Elementor tested up to: 3.32.5
    1717 * Elementor Pro tested up to: 3.32.2
    1818 */
     
    3232}
    3333
    34 define('CFL_VERSION','2.5.4');
     34define('CFL_VERSION','2.5.5');
    3535define('PHP_MINIMUM_VERSION','7.4');
    3636define('WP_MINIMUM_VERSION','5.5');
  • extensions-for-elementor-form/tags/2.5.5/readme.txt

    r3378085 r3389352  
    55Requires at least: 6.2
    66Tested up to: 6.8.2
    7 Stable tag: 2.5.4
     7Stable tag: 2.5.5
    88Requires PHP: 8.2
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
    11 Elementor tested up to: 3.32.4
     11Elementor tested up to: 3.32.5
    1212Elementor Pro tested up to: 3.32.2
    1313
     
    195195== Changelog ==
    196196
     197= 2.5.5 - 2025-11-04 =
     198* Fixed: Double country code issue.
     199
    197200= 2.5.4 - 2025-10-14 =
    198201* Fixed: Conditional navigation ensures hidden steps are skipped and users are routed correctly.
  • extensions-for-elementor-form/trunk/assets/addons/js/country-code-script.js

    r3329586 r3389352  
    1313                inputTelTextArea: 'textarea.ccfef_country_code_data_js',
    1414                intlInputSpan: '.ccfef-editor-intl-input',
    15                 submitButton: 'div.cool-form__submit-group button'
     15                submitButton: 'div.cool-form__submit-group button',
     16                form: '.cool-form',
     17
    1618            },
    1719        };
     
    2830            $intlSpanElement: this.$element.find(selectors.intlInputSpan),
    2931            $submitButton: this.$element.find(selectors.submitButton),
     32            $form: this.$element.find(selectors.form),
     33
    3034        };
    3135    }
     
    215219                }
    216220
    217                 this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
    218                 previousCode = currentCode;
     221                if(e.currentTarget.value.startsWith(currentCode.replace('+',''))){
     222                    this.updateCountryCodeHandler(e.currentTarget, '+', previousCode, this.dialCodeVisibility[key]);
     223                }else{
     224                    this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
     225                    previousCode = currentCode;
     226                }
    219227            };
    220228
     
    442450            element.value = dialCodeVisibility === 'separate' || dialCodeVisibility === 'hide' ? value : currentCode + value;
    443451        }
     452
     453        else if (value.length > 12) {
     454            const plainCode = currentCode.replace('+', '');
     455            const doublePrefix = `+${plainCode}${plainCode}`;
     456
     457            if (value.startsWith(doublePrefix)) {
     458                element.value = `+${value.slice(currentCode.length)}`;
     459            }
     460        }
    444461    }
    445462
     
    542559    }
    543560
     561    // Helper: Validate all telephone fields
     562    validateTelInputs(e, trigger = 'submit') {
     563
     564        const itiArr = this.iti;
     565
     566        if (Object.keys(itiArr).length > 0) {
     567            Object.keys(itiArr).forEach(data => {
     568                const iti = itiArr[data];
     569             
     570                const inputTelElement = iti.telInput;                   
     571
     572                let mainField = inputTelElement.closest('label')
     573                let mdcField = mdc.textfield.MDCTextField.attachTo(mainField);
     574
     575                if('' !== inputTelElement.value){
     576                    inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
     577
     578                    // Always ensure dial code is present in the value before validation
     579                    const currentCountryData = iti.getSelectedCountryData();
     580                    const dialCode = `+${currentCountryData.dialCode}`;
     581                       
     582                    // If using separate or hide mode, ensure dial code is in the value
     583                    if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     584                        if (!inputTelElement.value.startsWith('+')) {
     585                            inputTelElement.value = dialCode + inputTelElement.value;
     586                        }
     587                    }
     588                }
     589
     590                const parentWrp = inputTelElement.closest('.cool-form__field-group');
     591                const telContainer=parentWrp.querySelector('.cfefp-intl-container');
     592
     593                if (telContainer && inputTelElement.offsetHeight) {
     594                    telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
     595                }
     596
     597                const errorContainer = jQuery(inputTelElement).parent();
     598                errorContainer.find('span.elementor-message').remove();
     599
     600                const errorMap = CCFEFCustomData.errorMap;
     601                let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
     602                if('' === inputTelElement.value){
     603                    return;
     604                };
     605                   
     606                if (iti.isValidNumber()) {
     607                    jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
     608
     609                    mdcField.valid = true;
     610                    mdcField.trailingIcon.root.style.display = 'none';
     611                    mdcField.helperText.foundation.adapter.setContent('');
     612
     613                    const $visibleFlexErrors = this.elements.$form.find('.mask-error').filter(function() {
     614                        return jQuery(this).css('display') === 'flex';
     615                    });
     616
     617                    if($visibleFlexErrors.length === 0){
     618
     619                        this.elements.$form[0].classList.remove('elementor-form-waiting');
     620                    }
     621                } else {
     622                    const errorType = iti.getValidationError();
     623                    if (errorType !== undefined && errorMap[errorType]) {
     624                        // Remove dial code from input field if validation fails
     625                        if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     626                            const currentCountryData = iti.getSelectedCountryData();
     627                            const dialCode = `+${currentCountryData.dialCode}`;
     628                            if (inputTelElement.value.startsWith(dialCode)) {
     629                                inputTelElement.value = inputTelElement.value.substring(dialCode.length);
     630                            }
     631                        }
     632                        errorMsgHtml += errorMap[errorType] + '</span>';
     633                        jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
     634
     635                        mdcField.valid = false;
     636                        mdcField.trailingIcon.root.style.display = 'initial';
     637                        mdcField.helperText.foundation.adapter.setContent(errorMap[errorType]);
     638
     639                        // jQuery(inputTelElement).after(errorMsgHtml);
     640                        e.preventDefault();
     641                        if(this.elements.$form.find('.is-field-type-recaptcha_v3').length > 0){
     642                            e.stopImmediatePropagation()
     643                        }
     644                        if (trigger === 'submit') {
     645                            this.elements.$form[0].classList.add('elementor-form-waiting');
     646                        }
     647                    }
     648                }
     649            });
     650        }
     651
     652    }
    544653
    545654
     
    549658     */
    550659    intlInputValidation() {
     660
    551661        this.elements.$submitButton.on('click', (e) => {
    552             const itiArr = this.iti;
    553 
    554             if (Object.keys(itiArr).length > 0) {
    555                 Object.keys(itiArr).forEach(data => {
    556                     const iti = itiArr[data];
    557              
    558                     const inputTelElement = iti.telInput;                   
    559 
    560                     let mainField = inputTelElement.closest('label')
    561                     let mdcField = mdc.textfield.MDCTextField.attachTo(mainField);
    562 
    563                     if('' !== inputTelElement.value){
    564                         inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
    565 
    566                         // Always ensure dial code is present in the value before validation
    567                         const currentCountryData = iti.getSelectedCountryData();
    568                         const dialCode = `+${currentCountryData.dialCode}`;
    569                        
    570                         // If using separate or hide mode, ensure dial code is in the value
    571                         if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    572                             if (!inputTelElement.value.startsWith('+')) {
    573                                 inputTelElement.value = dialCode + inputTelElement.value;
    574                             }
    575                         }
    576                     }
    577 
    578                     const parentWrp = inputTelElement.closest('.cool-form__field-group');
    579                     const telContainer=parentWrp.querySelector('.cfefp-intl-container');
    580 
    581                     if (telContainer && inputTelElement.offsetHeight) {
    582                         telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
    583                     }
    584 
    585                     const errorContainer = jQuery(inputTelElement).parent();
    586                     errorContainer.find('span.elementor-message').remove();
    587 
    588                     const errorMap = CCFEFCustomData.errorMap;
    589                     let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
    590                     if('' === inputTelElement.value){
    591                         return;
    592                     };
    593                    
    594                     if (iti.isValidNumber()) {
    595                         jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
    596 
    597                         mdcField.valid = true;
    598                         mdcField.trailingIcon.root.style.display = 'none';
    599                         mdcField.helperText.foundation.adapter.setContent('');
    600                     } else {
    601                         const errorType = iti.getValidationError();
    602                         if (errorType !== undefined && errorMap[errorType]) {
    603                             // Remove dial code from input field if validation fails
    604                             if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    605                                 const currentCountryData = iti.getSelectedCountryData();
    606                                 const dialCode = `+${currentCountryData.dialCode}`;
    607                                 if (inputTelElement.value.startsWith(dialCode)) {
    608                                     inputTelElement.value = inputTelElement.value.substring(dialCode.length);
    609                                 }
    610                             }
    611                             errorMsgHtml += errorMap[errorType] + '</span>';
    612                             jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
    613 
    614                             mdcField.valid = false;
    615                             mdcField.trailingIcon.root.style.display = 'initial';
    616                             mdcField.helperText.foundation.adapter.setContent(errorMap[errorType]);
    617 
    618                             // jQuery(inputTelElement).after(errorMsgHtml);
    619                             e.preventDefault();
    620                         }
    621                     }
    622                 });
    623             }
     662            this.validateTelInputs(e, 'button');
     663        });
     664
     665        this.elements.$form.on('submit', (e) => {
     666            this.validateTelInputs(e, 'submit');
    624667        });
    625668    }
  • extensions-for-elementor-form/trunk/assets/addons/js/country-code-script.min.js

    r3270292 r3389352  
    1 class CCFEF extends elementorModules.frontend.handlers.Base{getDefaultSettings(){return{selectors:{inputTelTextArea:"textarea.ccfef_country_code_data_js",intlInputSpan:".ccfef-editor-intl-input",submitButton:"div.elementor-field-type-submit button"}}}getDefaultElements(){const selectors=this.getSettings("selectors");return{$textArea:this.$element.find(selectors.inputTelTextArea),$intlSpanElement:this.$element.find(selectors.intlInputSpan),$submitButton:this.$element.find(selectors.submitButton)}}bindEvents(){this.telId=new Array,this.includeCountries={},this.excludeCountries={},this.defaultCountry={},this.commonCountries={},this.iti={},this.getIntlUserData(),this.appendCountryCodeHandler(),this.addCountryCodeInputHandler(),this.customFlags(),this.removeInputTelSpanEle(),this.intlInputValidation()}appendCountryCodeHandler(){this.telId.forEach(data=>{this.addCountryCodeIconHandler(data.formId,data.fieldId,data.customId)})}addCountryCodeInputHandler(){const itiArr=this.iti;Object.keys(itiArr).forEach(key=>{const iti=itiArr[key],inputElement=iti.telInput;let previousCountryData=iti.getSelectedCountryData(),previousCode=`+${previousCountryData.dialCode}`,keyUpEvent=!1;const resetKeyUpEventStatus=()=>{keyUpEvent=!1},handleCountryChange=e=>{this.customFlags();const currentCountryData=iti.getSelectedCountryData(),currentCode=`+${currentCountryData.dialCode}`;if("keydown"===e.type||"input"===e.type)keyUpEvent=!0,clearTimeout(resetKeyUpEventStatus),setTimeout(resetKeyUpEventStatus,400),previousCountryData.dialCode!==currentCountryData.dialCode?previousCountryData=currentCountryData:previousCountryData.dialCode===currentCountryData.dialCode&&previousCountryData.iso2!==currentCountryData.iso2&&iti.setCountry(previousCountryData.iso2);else if("countrychange"===e.type){if(keyUpEvent)return;previousCountryData=currentCountryData}this.updateCountryCodeHandler(e.currentTarget,currentCode,previousCode),previousCode=currentCode};inputElement.addEventListener("keydown",handleCountryChange),inputElement.addEventListener("input",handleCountryChange),inputElement.addEventListener("countrychange",handleCountryChange)})}addCountryCodeIconHandler(formId,widgetId,inputId){const utilsPath=CCFEFCustomData.pluginDir+"assets/intl-tel-input/js/utils.min.js",telFIeld=jQuery(`.elementor-widget.elementor-widget-form[data-id="${formId}"] .elementor-field-type-tel.elementor-field-group input[type="tel"]#${inputId}`)[0];if(void 0!==telFIeld){let includeCountries=[],excludeCountries=[],defaultCountry="in";const defaultCoutiresArr=["in","us","gb","ru","fr","de","br","cn","jp","it"],uniqueId=`${formId}${widgetId}`;if(this.includeCountries.hasOwnProperty(uniqueId)&&this.includeCountries[uniqueId].length>0&&(defaultCountry=this.includeCountries[uniqueId][0],includeCountries=[...this.includeCountries[uniqueId]]),this.excludeCountries.hasOwnProperty(uniqueId)&&this.excludeCountries[uniqueId].length>0){let uniqueValue;defaultCountry=defaultCoutiresArr.filter(value=>!this.excludeCountries[uniqueId].includes(value))[0],excludeCountries=[...this.excludeCountries[uniqueId]]}this.defaultCountry[uniqueId]&&""!==this.defaultCountry[uniqueId]&&(defaultCountry=this.defaultCountry[uniqueId]);const iti=window.intlTelInput(telFIeld,{initialCountry:defaultCountry,utilsScript:utilsPath,formatOnDisplay:!1,formatAsYouType:!0,autoFormat:!1,containerClass:"cfefp-intl-container",useFullscreenPopup:!1,onlyCountries:includeCountries,excludeCountries:excludeCountries,customPlaceholder:(selectedCountryPlaceholder,selectedCountryData)=>{if(this.commonCountries[uniqueId])return"No country found";if(!selectedCountryData||!selectedCountryPlaceholder||!selectedCountryData.dialCode)return"No country found";let placeHolder=selectedCountryPlaceholder;"in"===selectedCountryData.iso2&&(placeHolder=selectedCountryPlaceholder.replace(/^0+/,""));const placeholderText=`+${selectedCountryData.dialCode} ${placeHolder}`;return placeholderText.replace(/\s/g,"")}}),intlSpan=document.querySelector(`.elementor-widget.elementor-widget-form[data-id="${formId}"] .ccfef-editor-intl-input[data-field-id="${widgetId}"]`),commonAttr=intlSpan?intlSpan.getAttribute("data-common-countries"):"";if("same"===commonAttr&&this.commonCountries[uniqueId]&&""!==includeCountries&&""!==excludeCountries){const countryList=iti.countryList;countryList&&countryList.classList.contains("iti__country-list")&&(countryList.style.display="none")}else{const countryList=iti.countryList;if(countryList&&countryList.classList.contains("iti__country-list")){const countryItems=countryList.querySelectorAll(".iti__country");countryItems.forEach((function(item){const countryCode=item.getAttribute("data-country-code");excludeCountries.includes(countryCode)&&(item.style.display="none")}));const visibleCountries=Array.from(countryItems).filter(item=>"none"!==item.style.display),includedVisibleCountries=visibleCountries.filter(item=>{const countryCode=item.getAttribute("data-country-code");return includeCountries.includes(countryCode)});if(includedVisibleCountries.length>0){const selectedItem=includedVisibleCountries.find(item=>"true"===item.getAttribute("aria-selected"));if(!selectedItem){const firstItem=includedVisibleCountries[0];firstItem.setAttribute("aria-selected","true");const newCountryCode=firstItem.getAttribute("data-country-code");iti.setCountry(newCountryCode)}}}}telFIeld.removeAttribute("pattern"),this.iti[formId+widgetId]=iti}}updateCountryCodeHandler(element,currentCode,previousCode){let value=element.value;currentCode&&"+undefined"===currentCode||["","+"].includes(value)||(currentCode!==previousCode&&(value=value.replace(new RegExp(`^\\${previousCode}`),"")),value.startsWith(currentCode)||(value=value.replace(/\+/g,""),element.value=currentCode+value))}customFlags(){const selectedCountries=this.$element.find(".cfefp-intl-container .iti__country-container .iti__flag:not(.iti__globe)");selectedCountries.each((function(){const selectedCountry=this,classList=selectedCountry.className.split(" ");if(classList[1]){const selectedCountryFlag=classList[1].split("__")[1],svgFlagPath=CCFEFCustomData.pluginDir+`assets/flags/${selectedCountryFlag}.svg`;selectedCountry.style.backgroundImage=`url('${svgFlagPath}')`}}))}removeInputTelSpanEle(){this.$element.find("span.ccfef-editor-intl-input").remove()}getIntlUserData(){const intelInputElement=this.elements.$intlSpanElement,previousIds=[];intelInputElement.each((_,ele)=>{const element=jQuery(ele),includeCountries=element.data("include-countries"),excludeCountries=element.data("exclude-countries"),defaultCountry=element.data("defaultCountry"),commonAttr=element.data("common-countries"),inputId=element.data("id"),fieldId=element.data("field-id"),formId=element.closest(".elementor-element.elementor-widget-form").data("id"),currentId=`${formId}${fieldId}`;if("same"===commonAttr&&""===includeCountries&&""!==excludeCountries)this.commonCountries[currentId]=!0;else{if(""!==includeCountries&&isNaN(includeCountries)){const splitIncludeCountries=includeCountries.split(",");this.includeCountries[currentId]=splitIncludeCountries}if(""!==excludeCountries&&isNaN(excludeCountries)){const splitExcludeCountries=excludeCountries.split(",");this.excludeCountries[currentId]=splitExcludeCountries}if("same"!==commonAttr&&""!==includeCountries&&""!==excludeCountries&&isNaN(includeCountries)){const includeArray=includeCountries.split(",").map(item=>item.trim());if(isNaN(excludeCountries)){const excludeArray=excludeCountries.split(",").map(item=>item.trim()),allIncludedPresent=includeArray.every(country=>excludeArray.includes(country));allIncludedPresent&&(this.commonCountries[currentId]=!0)}}""!==defaultCountry&&(this.defaultCountry[currentId]=defaultCountry)}previousIds.includes(currentId)||(this.telId.push({formId:formId,fieldId:fieldId,customId:inputId}),previousIds.push(currentId))})}intlInputValidation(){this.elements.$submitButton.on("click",e=>{const itiArr=this.iti;Object.keys(itiArr).length>0&&Object.keys(itiArr).forEach(data=>{const iti=itiArr[data],inputTelElement=iti.telInput;""!==inputTelElement.value&&(inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g,""));const parentWrp=inputTelElement.closest(".elementor-field-group"),telContainer=parentWrp.querySelector(".cfefp-intl-container");telContainer&&inputTelElement.offsetHeight&&telContainer.style.setProperty("--cfefp-intl-tel-button-height",`${inputTelElement.offsetHeight}px`);const errorContainer=jQuery(inputTelElement).parent();errorContainer.find("span.elementor-message").remove();const errorMap=CCFEFCustomData.errorMap;let errorMsgHtml='<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';if(""!==inputTelElement.value)if(iti.isValidNumber())jQuery(inputTelElement).closest(".cfefp-intl-container").removeClass("elementor-error");else{const errorType=iti.getValidationError();void 0!==errorType&&errorMap[errorType]&&(errorMsgHtml+=errorMap[errorType]+"</span>",jQuery(inputTelElement).closest(".cfefp-intl-container").addClass("elementor-error"),jQuery(inputTelElement).after(errorMsgHtml),e.preventDefault())}})})}}jQuery(window).on("elementor/frontend/init",()=>{const addHandler=$element=>{elementorFrontend.elementsHandler.addHandler(CCFEF,{$element:$element})};elementorFrontend.hooks.addAction("frontend/element_ready/form.default",addHandler)});
     1class CoolFormCCFEF extends elementorModules.frontend.handlers.Base{getDefaultSettings(){return{selectors:{inputTelTextArea:"textarea.ccfef_country_code_data_js",intlInputSpan:".ccfef-editor-intl-input",submitButton:"div.cool-form__submit-group button",form:".cool-form"}}}getDefaultElements(){const t=this.getSettings("selectors");return{$textArea:this.$element.find(t.inputTelTextArea),$intlSpanElement:this.$element.find(t.intlInputSpan),$submitButton:this.$element.find(t.submitButton),$form:this.$element.find(t.form)}}bindEvents(){this.telId=new Array,this.includeCountries={},this.excludeCountries={},this.defaultCountry={},this.commonCountries={},this.dialCodeVisibility={},this.countryStrictMode={},this.iti={},this.getIntlUserData(),this.appendCountryCodeHandler(),this.addCountryCodeInputHandler(),this.customFlags(),this.removeInputTelSpanEle(),this.intlInputValidation()}handleTelWithMdcFields(t){function e(){const t=o.find(".iti__dropdown-content");o.nextAll(".cool-form__field-group").each(function(){t.hasClass("iti__hide")?this.style.zIndex="initial":this.style.zIndex="-1"})}const i=t.telInput,n=i.closest(".cool-form__field-group"),o=jQuery(n),s=o.find(".mdc-floating-label"),l=o.find("input"),r=o.find(".mdc-notched-outline__notch"),a=o.find(".mdc-notched-outline__leading");let d=l.eq(1).prev(".iti__country-container").find(".iti__selected-dial-code");if(d.css("visibility","hidden"),""!==l.eq(1).val()?d.css("visibility","visible"):d.css("visibility","hidden"),o.nextAll().length>0){const t=o.nextAll();if(t.length>0){const e=t[0],i=t[1],n=t=>t&&t.classList&&t.classList.contains("cool-form__submit-group"),s=o.hasClass("has-width-100")?n(e):n(e)||n(i);s&&(o.css({"margin-bottom":"25px"}),o.find(".iti__country-list").css({"max-height":"100px"}))}}s.css("left","57px"),l.eq(1).on("blur",()=>{""!==l.eq(1).val()?d.css("visibility","visible"):d.css("visibility","hidden")}),l.eq(1).on("focus",()=>{d.css("visibility","visible"),s.css({left:"57px","background-color":"white"});const t=getComputedStyle(r[0]).getPropertyValue("border-bottom");r.css({"border-top":t})}),o.on("click",t=>{e()}),l.eq(0).on("mouseover",()=>{const t=getComputedStyle(a[0]).getPropertyValue("border-bottom-width");r.css({"border-top-width":t,"border-top-color":"black"})}),o.on("mouseover",t=>{const i=getComputedStyle(a[0]).getPropertyValue("border-bottom-width");r.css({"border-top-width":i,"border-top-color":"black"}),e()}),o.on("mouseleave",t=>{const i=getComputedStyle(a[0]).getPropertyValue("border-bottom-width"),n=getComputedStyle(a[0]).getPropertyValue("border-right-color");r.css({"border-top-width":i,"border-top-color":n}),e()})}appendCountryCodeHandler(){this.telId.forEach(t=>{this.addCountryCodeIconHandler(t.formId,t.fieldId,t.customId)})}addCountryCodeInputHandler(){const t=this.iti;Object.keys(t).forEach(e=>{const i=t[e],n=i.telInput;this.handleTelWithMdcFields(i);let o=i.getSelectedCountryData(),s=`+${o.dialCode}`,l=!1;const r=()=>{l=!1},a=t=>{this.handleTelWithMdcFields(i),this.customFlags();const n=i.getSelectedCountryData(),a=`+${n.dialCode}`;if("keydown"===t.type||"input"===t.type)l=!0,clearTimeout(r),setTimeout(r,400),o.dialCode!==n.dialCode?o=n:o.dialCode===n.dialCode&&o.iso2!==n.iso2&&i.setCountry(o.iso2);else if("countrychange"===t.type){if(l)return;o=n}t.currentTarget.value.startsWith(a.replace("+",""))?this.updateCountryCodeHandler(t.currentTarget,"+",s,this.dialCodeVisibility[e]):(this.updateCountryCodeHandler(t.currentTarget,a,s,this.dialCodeVisibility[e]),s=a)};n.addEventListener("keydown",a),n.addEventListener("input",a),n.addEventListener("countrychange",a)})}addCountryCodeIconHandler(t,e,i){const n=CCFEFCustomData.pluginDir+"assets/addons/intl-tel-input/js/utils.min.js",o=jQuery(`.elementor-widget.elementor-widget-cool-form[data-id="${t}"] .is-field-type-tel.cool-form__field-group input[type="tel"]#${i}`)[0];if(void 0!==o){let i=[],s=[],l="in";const r=["in","us","gb","ru","fr","de","br","cn","jp","it"],a=`${t}${e}`;if(this.includeCountries.hasOwnProperty(a)&&this.includeCountries[a].length>0&&(l=this.includeCountries[a][0],i=[...this.includeCountries[a]]),this.excludeCountries.hasOwnProperty(a)&&this.excludeCountries[a].length>0){let t=r.filter(t=>!this.excludeCountries[a].includes(t));l=t[0],s=[...this.excludeCountries[a]]}this.defaultCountry[a]&&""!==this.defaultCountry[a]&&(l=this.defaultCountry[a]);const d=window.intlTelInput(o,{initialCountry:l,utilsScript:n,dialCodeVisibility:this.dialCodeVisibility[a],strictMode:"yes"===this.countryStrictMode[a],separateDialCode:"separate"===this.dialCodeVisibility[a],formatOnDisplay:!1,formatAsYouType:!0,autoFormat:!1,containerClass:"cfefp-intl-container",useFullscreenPopup:!1,onlyCountries:i,excludeCountries:s,customPlaceholder:(t,e)=>{if(this.commonCountries[a])return"No country found";if(!e||!t||!e.dialCode)return"No country found";let i=t;"in"===e.iso2&&(i=t.replace(/^0+/,""));const n="separate"===this.dialCodeVisibility[a]||"hide"===this.dialCodeVisibility[a]?`${i}`:`+${e.dialCode} ${i}`;return n}});if("separate"===this.dialCodeVisibility[a]){const t=document.createElement("style");t.textContent="\n                    .cfefp-intl-container .iti__selected-dial-code,\n                    .cfefp-intl-container .iti__selected-flag {\n                        color: var(--e-form-field-text-color, #7a7a7a) !important;\n                    }\n                    .cfefp-intl-container .iti__selected-dial-code {\n                        font-size: inherit !important;\n                        font-family: inherit !important;\n                        line-height: inherit !important;\n                    }\n                ",document.head.appendChild(t)}const c=document.querySelector(`.elementor-widget.elementor-widget-form[data-id="${t}"] .ccfef-editor-intl-input[data-field-id="${e}"]`),u=c?c.getAttribute("data-common-countries"):"";if("same"===u&&this.commonCountries[a]&&""!==i&&""!==s){const t=d.countryList;t&&t.classList.contains("iti__country-list")&&(t.style.display="none")}else{const t=d.countryList;if(t&&t.classList.contains("iti__country-list")){const e=t.querySelectorAll(".iti__country");e.forEach(function(t){const e=t.getAttribute("data-country-code");s.includes(e)&&(t.style.display="none")});const n=Array.from(e).filter(t=>"none"!==t.style.display),o=n.filter(t=>{const e=t.getAttribute("data-country-code");return i.includes(e)});if(o.length>0){const t=o.find(t=>"true"===t.getAttribute("aria-selected"));if(!t){const t=o[0];t.setAttribute("aria-selected","true");const e=t.getAttribute("data-country-code");d.setCountry(e)}}}}o.removeAttribute("pattern"),this.iti[t+e]=d,this.setInitialCountry(d,s,a,o)}}setInitialCountry(t,e,i,n){const o=this.defaultCountry[i]||"",s=["in","us","gb","ru","fr","de","br","cn","jp","it"],l=t.countries.map(t=>t.iso2);t.telInput;jQuery(n).closest(".elementor-field-type-country").hasClass("elementor-field-required")&&jQuery(n).closest(".elementor-field-type-country").hasClass("cfef-hidden")&&(""===o?(t.setCountry("us"),jQuery(n).val("United States"),jQuery(n).focus(),jQuery(n).trigger("change")):(t.setCountry(o),jQuery(n).val(o),jQuery(n).focus(),jQuery(n).trigger("change")));const r=i=>{if(l.length<=0)return;const n=isNaN(i)&&i?i.toLowerCase():"";if(n&&l.includes(n))t.setCountry(n);else if(o&&l.includes(o))t.setCountry(o);else{const i=s.filter(t=>!e.includes(t)&&l.includes(t)),n=i.length>0?i[0]:l[0];t.setCountry(n)}const r=t.getSelectedCountryData();r.hasOwnProperty("iso2")};o&&r(o)}updateCountryCodeHandler(t,e,i,n){let o=t.value;if(!(e&&"+undefined"===e||["","+"].includes(o)))if(e!==i&&(o=o.replace(new RegExp(`^\\${i}`),"")),o.startsWith(e)){if(o.length>12){const i=e.replace("+",""),n=`+${i}${i}`;o.startsWith(n)&&(t.value=`+${o.slice(e.length)}`)}}else o=o.replace(/\+/g,""),t.value="separate"===n||"hide"===n?o:e+o}customFlags(){const t=this.$element.find(".cfefp-intl-container .iti__country-container .iti__flag:not(.iti__globe)");t.each(function(){const t=this,e=t.className.split(" ");if(e[1]){const i=e[1].split("__")[1],n=CCFEFCustomData.pluginDir+`assets/addons/flags/${i}.svg`;t.style.backgroundImage=`url('${n}')`}})}removeInputTelSpanEle(){this.$element.find("span.ccfef-editor-intl-input").remove()}getIntlUserData(){const t=this.elements.$intlSpanElement,e=[];t.each((t,i)=>{const n=jQuery(i),o=n.data("include-countries"),s=n.data("exclude-countries"),l=n.data("defaultCountry"),r=n.data("common-countries"),a=n.data("id"),d=n.data("field-id"),c=n.data("dial-code-visibility"),u=n.data("strict-mode"),f=n.closest(".elementor-element.elementor-widget-cool-form").data("id"),h=`${f}${d}`;if("same"===r&&""===o&&""!==s)this.commonCountries[h]=!0;else{if(""!==o&&isNaN(o)){const t=o.split(",");this.includeCountries[h]=t}if(""!==s&&isNaN(s)){const t=s.split(",");this.excludeCountries[h]=t}if("same"!==r&&""!==o&&""!==s&&isNaN(o)){const t=o.split(",").map(t=>t.trim());if(isNaN(s)){const e=s.split(",").map(t=>t.trim()),i=t.every(t=>e.includes(t));i&&(this.commonCountries[h]=!0)}}""!==c&&(this.dialCodeVisibility[h]=c),""!==u&&(this.countryStrictMode[h]=u),""!==l&&(this.defaultCountry[h]=l)}e.includes(h)||(this.telId.push({formId:f,fieldId:d,customId:a}),e.push(h))})}validateTelInputs(t,e="submit"){const i=this.iti;Object.keys(i).length>0&&Object.keys(i).forEach(n=>{const o=i[n],s=o.telInput;let l=s.closest("label"),r=mdc.textfield.MDCTextField.attachTo(l);if(""!==s.value){s.value=s.value.replace(/[^0-9+]/g,"");const t=o.getSelectedCountryData(),e=`+${t.dialCode}`;"separate"!==this.dialCodeVisibility[n]&&"hide"!==this.dialCodeVisibility[n]||s.value.startsWith("+")||(s.value=e+s.value)}const a=s.closest(".cool-form__field-group"),d=a.querySelector(".cfefp-intl-container");d&&s.offsetHeight&&d.style.setProperty("--cfefp-intl-tel-button-height",`${s.offsetHeight}px`);const c=jQuery(s).parent();c.find("span.elementor-message").remove();const u=CCFEFCustomData.errorMap;let f='<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';if(""!==s.value)if(o.isValidNumber()){jQuery(s).closest(".cfefp-intl-container").removeClass("elementor-error"),r.valid=!0,r.trailingIcon.root.style.display="none",r.helperText.foundation.adapter.setContent("");const t=this.elements.$form.find(".mask-error").filter(function(){return"flex"===jQuery(this).css("display")});0===t.length&&this.elements.$form[0].classList.remove("elementor-form-waiting")}else{const i=o.getValidationError();if(void 0!==i&&u[i]){if("separate"===this.dialCodeVisibility[n]||"hide"===this.dialCodeVisibility[n]){const t=o.getSelectedCountryData(),e=`+${t.dialCode}`;s.value.startsWith(e)&&(s.value=s.value.substring(e.length))}f+=u[i]+"</span>",jQuery(s).closest(".cfefp-intl-container").addClass("elementor-error"),r.valid=!1,r.trailingIcon.root.style.display="initial",r.helperText.foundation.adapter.setContent(u[i]),t.preventDefault(),this.elements.$form.find(".is-field-type-recaptcha_v3").length>0&&t.stopImmediatePropagation(),"submit"===e&&this.elements.$form[0].classList.add("elementor-form-waiting")}}})}intlInputValidation(){this.elements.$submitButton.on("click",t=>{this.validateTelInputs(t,"button")}),this.elements.$form.on("submit",t=>{this.validateTelInputs(t,"submit")})}}jQuery(window).on("elementor/frontend/init",()=>{const t=t=>{elementorFrontend.elementsHandler.addHandler(CoolFormCCFEF,{$element:t})};elementorFrontend.hooks.addAction("frontend/element_ready/cool-form.default",t)});
  • extensions-for-elementor-form/trunk/assets/helloplus-addons/js/helloplus-country-code-script.js

    r3329586 r3389352  
    114114                }
    115115
    116                 this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
    117                 previousCode = currentCode;
     116                if(e.currentTarget.value.startsWith(currentCode.replace('+',''))){
     117                    this.updateCountryCodeHandler(e.currentTarget, '+', previousCode, this.dialCodeVisibility[key]);
     118                }else{
     119                    this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
     120                    previousCode = currentCode;
     121                }
    118122            };
    119123
     
    340344            value = value.replace(/\+/g, '');
    341345            element.value = dialCodeVisibility === 'separate' || dialCodeVisibility === 'hide' ? value : currentCode + value;
     346        }
     347
     348        else if (value.length > 12) {
     349            const plainCode = currentCode.replace('+', '');
     350            const doublePrefix = `+${plainCode}${plainCode}`;
     351
     352            if (value.startsWith(doublePrefix)) {
     353                element.value = `+${value.slice(currentCode.length)}`;
     354            }
    342355        }
    343356    }
  • extensions-for-elementor-form/trunk/assets/js/form-country-code-script.js

    r3378085 r3389352  
    116116                }
    117117
    118                 this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
    119                 previousCode = currentCode;
     118                if(e.currentTarget.value.startsWith(currentCode.replace('+',''))){
     119                    this.updateCountryCodeHandler(e.currentTarget, '+', previousCode, this.dialCodeVisibility[key]);
     120                }else{
     121                    this.updateCountryCodeHandler(e.currentTarget, currentCode, previousCode, this.dialCodeVisibility[key]);
     122                    previousCode = currentCode;
     123                }
    120124            };
    121125
     
    343347            element.value = dialCodeVisibility === 'separate' || dialCodeVisibility === 'hide' ? value : currentCode + value;
    344348        }
     349
     350        else if (value.length > 12) {
     351            const plainCode = currentCode.replace('+', '');
     352            const doublePrefix = `+${plainCode}${plainCode}`;
     353
     354            if (value.startsWith(doublePrefix)) {
     355                element.value = `+${value.slice(currentCode.length)}`;
     356            }
     357        }
    345358    }
    346359
     
    444457
    445458
     459    // Helper: Validate all telephone fields
     460    validateTelInputs(e, trigger = 'submit') {
     461
     462        const itiArr = this.iti;
     463
     464        if (Object.keys(itiArr).length > 0) {
     465            Object.keys(itiArr).forEach(data => {
     466                const iti = itiArr[data];
     467             
     468                const inputTelElement = iti.telInput;
     469               
     470                if(jQuery(inputTelElement).closest('.elementor-field-type-tel').hasClass('cfef-hidden')){
     471
     472                    inputTelElement.value = '+1234567890';
     473
     474                    return;
     475                }
     476
     477                if('' !== inputTelElement.value){
     478                    inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
     479                                               
     480                    // Always ensure dial code is present in the value before validation
     481                    const currentCountryData = iti.getSelectedCountryData();
     482                    const dialCode = `+${currentCountryData.dialCode}`;
     483                       
     484                    // If using separate or hide mode, ensure dial code is in the value
     485                    if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     486                        if (!inputTelElement.value.startsWith('+')) {
     487                            inputTelElement.value = dialCode + inputTelElement.value;
     488                        }
     489                    }
     490                }
     491
     492                const parentWrp = inputTelElement.closest('.elementor-field-group');
     493                const telContainer=parentWrp.querySelector('.cfefp-intl-container');
     494
     495                if (telContainer && inputTelElement.offsetHeight) {
     496                    telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
     497                }
     498
     499                const errorContainer = jQuery(inputTelElement).parent();
     500                errorContainer.find('span.elementor-message').remove();
     501
     502                const errorMap = CCFEFCustomData.errorMap;
     503                let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
     504                if('' === inputTelElement.value){
     505                    return;
     506                };
     507                if (iti.isValidNumber()) {
     508                    jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
     509                    this.elements.$submitButton.removeClass('cfkef-prevent-submit');
     510                    const $visibleFlexErrors = this.elements.$form.find('.mask-error').filter(function() {
     511                        return jQuery(this).css('display') === 'flex';
     512                    });
     513
     514                    if($visibleFlexErrors.length === 0){
     515
     516                        this.elements.$form[0].classList.remove('elementor-form-waiting');
     517                    }
     518                } else {
     519                    this.elements.$submitButton.addClass('cfkef-prevent-submit')
     520
     521                    const errorType = iti.getValidationError();
     522                    if (errorType !== undefined && errorMap[errorType]) {
     523                        // Remove dial code from input field if validation fails
     524                        if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
     525                            const currentCountryData = iti.getSelectedCountryData();
     526                            const dialCode = `+${currentCountryData.dialCode}`;
     527                            if (inputTelElement.value.startsWith(dialCode)) {
     528                                inputTelElement.value = inputTelElement.value.substring(dialCode.length);
     529                            }
     530                        }
     531                        errorMsgHtml += errorMap[errorType] + '</span>';
     532                        jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
     533                        jQuery(inputTelElement).after(errorMsgHtml);
     534                        e.preventDefault();
     535                        if (trigger === 'submit') {
     536                            this.elements.$form[0].classList.add('elementor-form-waiting');
     537                        }
     538                        if(this.elements.$form.find('.elementor-field-type-recaptcha_v3').length > 0){
     539                            e.stopImmediatePropagation()
     540                        }
     541                    }
     542                }
     543            });
     544        }
     545    }
     546
     547
    446548
    447549    /**
     
    450552     */
    451553    intlInputValidation() {
     554
    452555        this.elements.$submitButton.on('click', (e) => {
    453             const itiArr = this.iti;
    454 
    455             if (Object.keys(itiArr).length > 0) {
    456                 Object.keys(itiArr).forEach(data => {
    457                     const iti = itiArr[data];
    458              
    459                     const inputTelElement = iti.telInput;                   
    460 
    461                     if('' !== inputTelElement.value){
    462                         inputTelElement.value=inputTelElement.value.replace(/[^0-9+]/g, '');
    463                                                
    464                         // Always ensure dial code is present in the value before validation
    465                         const currentCountryData = iti.getSelectedCountryData();
    466                         const dialCode = `+${currentCountryData.dialCode}`;
    467                        
    468                         // If using separate or hide mode, ensure dial code is in the value
    469                         if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    470                             if (!inputTelElement.value.startsWith('+')) {
    471                                 inputTelElement.value = dialCode + inputTelElement.value;
    472                             }
    473                         }
    474                     }
    475 
    476                     const parentWrp = inputTelElement.closest('.elementor-field-group');
    477                     const telContainer=parentWrp.querySelector('.cfefp-intl-container');
    478 
    479                     if (telContainer && inputTelElement.offsetHeight) {
    480                         telContainer.style.setProperty('--cfefp-intl-tel-button-height', `${inputTelElement.offsetHeight}px`);
    481                     }
    482 
    483                     const errorContainer = jQuery(inputTelElement).parent();
    484                     errorContainer.find('span.elementor-message').remove();
    485 
    486                     const errorMap = CCFEFCustomData.errorMap;
    487                     let errorMsgHtml = '<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">';
    488                     if('' === inputTelElement.value){
    489                         return;
    490                     };
    491                     if (iti.isValidNumber()) {
    492                         jQuery(inputTelElement).closest('.cfefp-intl-container').removeClass('elementor-error');
    493                         this.elements.$submitButton.removeClass('cfkef-prevent-submit')
    494                     } else {
    495                         this.elements.$submitButton.addClass('cfkef-prevent-submit')
    496 
    497                         const errorType = iti.getValidationError();
    498                         if (errorType !== undefined && errorMap[errorType]) {
    499                             // Remove dial code from input field if validation fails
    500                             if (this.dialCodeVisibility[data] === 'separate' || this.dialCodeVisibility[data] === 'hide') {
    501                                 const currentCountryData = iti.getSelectedCountryData();
    502                                 const dialCode = `+${currentCountryData.dialCode}`;
    503                                 if (inputTelElement.value.startsWith(dialCode)) {
    504                                     inputTelElement.value = inputTelElement.value.substring(dialCode.length);
    505                                 }
    506                             }
    507                             errorMsgHtml += errorMap[errorType] + '</span>';
    508                             jQuery(inputTelElement).closest('.cfefp-intl-container').addClass('elementor-error');
    509                             jQuery(inputTelElement).after(errorMsgHtml);
    510                             e.preventDefault();
    511                             if(this.elements.$form.find('.elementor-field-type-recaptcha_v3').length > 0){
    512                                 e.stopImmediatePropagation()
    513                             }
    514                         }
    515                     }
    516                 });
    517             }
     556            this.validateTelInputs(e, 'button');
     557        });
     558
     559        this.elements.$form.on('submit', (e) => {
     560            this.validateTelInputs(e, 'submit');
    518561        });
    519562    }
  • extensions-for-elementor-form/trunk/extensions-for-elementor-form.php

    r3378085 r3389352  
    88 * Author URI: https://coolplugins.net/?utm_source=cfkl_plugin&utm_medium=inside&utm_campaign=author_page&utm_content=plugins_list
    99 * Text Domain: extensions-for-elementor-form
    10  * Version: 2.5.4
     10 * Version: 2.5.5
    1111 * Requires at least: 6.2
    1212 * Requires PHP: 6.2
     
    1414 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
    1515 * Requires Plugins: elementor
    16  * Elementor tested up to: 3.32.4
     16 * Elementor tested up to: 3.32.5
    1717 * Elementor Pro tested up to: 3.32.2
    1818 */
     
    3232}
    3333
    34 define('CFL_VERSION','2.5.4');
     34define('CFL_VERSION','2.5.5');
    3535define('PHP_MINIMUM_VERSION','7.4');
    3636define('WP_MINIMUM_VERSION','5.5');
  • extensions-for-elementor-form/trunk/readme.txt

    r3378085 r3389352  
    55Requires at least: 6.2
    66Tested up to: 6.8.2
    7 Stable tag: 2.5.4
     7Stable tag: 2.5.5
    88Requires PHP: 8.2
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
    11 Elementor tested up to: 3.32.4
     11Elementor tested up to: 3.32.5
    1212Elementor Pro tested up to: 3.32.2
    1313
     
    195195== Changelog ==
    196196
     197= 2.5.5 - 2025-11-04 =
     198* Fixed: Double country code issue.
     199
    197200= 2.5.4 - 2025-10-14 =
    198201* Fixed: Conditional navigation ensures hidden steps are skipped and users are routed correctly.
Note: See TracChangeset for help on using the changeset viewer.