=0;u--)d();var f=s.querySelector('option[value=""]');null!==f&&s.prepend(f)}}}function to(e,t,n,r){null!==t||e.querySelector('option[value="'.concat(n,'"]'))||((t=frmDom.tag("option",{text:r})).value=n),e.prepend(t)}function no(e,t,n,r,o,i){var a="",l=t.key.includes("other"),c="field_".concat(r,"-").concat(t.key),s="scale"===e?"radio":e,d='');return this.getSingle=function(){return""!==(a=wp.hooks.applyFilters("frm_admin.build_single_option_template",a,{opt:t,type:e,fieldId:n,classes:i,id:c}))?a:'\n\t\t\t\t\t\n\t\t\t\t\t").concat(l?d:"","\n\t\t\t\t
")},this.getSingle()}function ro(e,t){if(e){var n=t.sourceID,r=t.placeholder,o=Ba(n),i=t.other;!function(e){var t;if(void 0!==e.options)for(t=e.options.length-1;t>=0;t--)e.remove(t)}(e);for(var a=io(n,e.id.includes("frm_field_logic_opt")),l=void 0!==r,c=0;c1&&void 0!==arguments[1]&&arguments[1],c=[],s=jQuery('input[name^="field_options[options_'.concat(e,']"]')).filter('[name$="[label]"], [name*="[other_"]'),d=Ba(e),u=mo(e),f=fo(e),m=uo(e);for(t=0;t0||(o=n=s[t].value,i=s[t].name.replace("field_options[options_".concat(e,"]["),"").replace("[label]","").replace("]",""),m&&(r=s[t].name.replace("[label]","[value]"),n=jQuery('input[name="'.concat(r,'"]')).val(),l&&""===o&&(o=""!==n?n:frm_admin_js.no_label)),f&&(o=co(o,u,ao(s[t]))),a={saved:n,label:o=frmAdminBuild.hooks.applyFilters("frm_choice_field_label",o,e,s[t],f),checked:so(s[t].id),key:i},d&&(r=s[t].name.replace("[label]","[price]"),a.price=jQuery('input[name="'.concat(r,'"]')).val()),c.push(a));return c}function ao(e){var t=jQuery(e).siblings(".frm_image_preview_wrapper");if(!t.length)return"";var n=t.find("img");return n.length?n.attr("src"):""}function lo(e){(e instanceof Element||e instanceof Document)&&(e=e.outerHTML);var t=jQuery.parseHTML(e).reduce(function(e,t){var n=frmDom.cleanNode(t);return"#text"===n.nodeName?e+n.textContent:e+n.outerHTML},"");return t!==e?lo(t):t}function co(e,t,n){var r,o=e;o=lo(o),n?r=B({src:n,alt:o}):(r=b({className:"frm_empty_url"})).innerHTML=a.image_placeholder_icon;var i=t?" frm_label_with_image":"",l=[r];if(t){var c=u("span",{className:"frm_text_label_for_image_inner"});c.innerHTML=o,l.push(u("span",{className:"frm_text_label_for_image",child:c}))}return u("span",{className:"frm_image_option_container".concat(i),children:l})}function so(e){var t=jQuery("#".concat(e));if(0===t.length)return!1;var n=t.siblings("input[type=checkbox]");return n.length&&n.prop("checked")}function uo(e){return _o("separate_value_".concat(e))}function fo(e){for(var t=!1,n=document.getElementsByName("field_options[image_options_".concat(e,"]")),r=0;r=0&&(t.splice(n,1),e.val(t),e.next(".btn-group").find('.multiselect-container input[value=""]').prop("checked",!1))}(jQuery(this))}function So(e){e.val(""),e.next(".btn-group").find('.multiselect-container input[value!=""]').prop("checked",!1)}function ko(){jQuery(".frm-hide-empty").each(function(){0===jQuery(this).text().trim().length&&jQuery(this).remove()})}function Qo(e){e.preventDefault(),function(e,t,n){var r=document.getElementById(e.getAttribute("data-open")),o=jQuery(e).closest("p,ul"),i=void 0!==t;if(o.hasClass("frm-open"))o.removeClass("frm-open"),r.classList.add("frm_hidden");else{if(i||(t=Ri(e)),t){if(!i){var a=n.key;"Enter"!==a&&" "!==a&&t.focus()}o.after(r),r.setAttribute("data-fills",t.id.replace("-proxy-input","")),0===r.id.indexOf("frm-calc-box")&&Gt(r,!0)}o.addClass("frm-open"),r.classList.remove("frm_hidden"),wp.hooks.doAction("frm_show_inline_modal",r,e)}}(this,void 0,e)}function Lo(e){e.preventDefault(),this.parentNode.classList.add("frm_hidden"),jQuery('.frm-open [data-open="'.concat(this.parentNode.id,'"]')).closest(".frm-open").removeClass("frm-open")}function Ao(e){var t=e.target;t.closest(".frm-inline-modal.frm-modal-no-dismiss")||t.closest(".frm-show-inline-modal")||t.closest("#frm_adv_info")||t.closest(".frm-token-proxy-input")||document.querySelectorAll(".frm-inline-modal.frm-modal-no-dismiss:not(.frm_hidden)").forEach(function(e){e.classList.add("frm_hidden"),e.previousElementSibling.classList.remove("frm-open")})}function Io(){var e,t=this.getAttribute("data-frmchange").split(",");for(e=0;e').before('')}function Wo(){var e="success";"options[edit_action]"===this.name&&(e="edit");var t=jQuery(this).val();jQuery(".".concat(e,"_action_box")).hide(),"redirect"===t?jQuery(".".concat(e,"_action_redirect_box.").concat(e,"_action_box")).fadeIn("slow"):"page"===t?jQuery(".".concat(e,"_action_page_box.").concat(e,"_action_box")).fadeIn("slow"):jQuery(".".concat(e,"_action_message_box.").concat(e,"_action_box")).fadeIn("slow")}function $o(e){var t,n,r;if(e.stopPropagation(),!function(e){var t=jQuery(e),n=t.closest(".frm_form_action_settings"),r=n.find(".widget-inside");if(r.find("p, div, table").length)return!1;var o=n.find(".widget-top");return o.one("frm-action-loaded",function(){t.trigger("click"),n.removeClass("open"),r.hide()}),o.trigger("click"),!0}(e.target)){var o=e.target.closest(".frm_form_action_settings"),i=o.querySelectorAll(".wp-editor-area");i.length&&i.forEach(function(e){tinymce.EditorManager.execCommand("mceRemoveEditor",!0,e.id)});var a=jQuery(o).clone(),l=a.attr("id").replace("frm_form_action_",""),c=Vo(l),s=null===(t=o.querySelector(".frm_action_name"))||void 0===t?void 0:t.value,d=function(e,t){for(var n=new Set(t),r=e,o=2;n.has(r);)r="".concat(e," (").concat(o,")"),o++;return r}((null!==(n=null===(r=o.querySelector(".widget-title h4 span:not(.frm-border-icon)"))||void 0===r?void 0:r.textContent.trim())&&void 0!==n?n:"").replace(/ \(\d+\)$/,""),Ko(s));a[0].querySelector(".widget-title h4 span:not(.frm-border-icon)").textContent=d,a[0].querySelector('input[name$="['.concat(l,'][post_title]"]')).value=d,a.find(".frm_action_id, .frm-btn-group").remove(),a.find('input[name$="['.concat(l,'][ID]"]')).val(""),a.find(".widget-inside").hide(),a.find("input[type=text], textarea, input[type=number]").prop("defaultValue",function(){return this.value}),a.find("input[type=checkbox], input[type=radio]").prop("defaultChecked",function(){return this.checked});var u=new RegExp("\\[".concat(l,"\\]"),"g"),f=new RegExp("_".concat(l,'"'),"g"),m=new RegExp("_".concat(l," "),"g"),_=new RegExp("-".concat(l,'"'),"g"),p=new RegExp('"'.concat(l,'"'),"g"),g=a.html().replace(u,"[".concat(c,"]")).replace(f,"_".concat(c,'"'));g=(g=g.replace(m,"_".concat(c," "))).replace(_,"-".concat(c,'"')).replace(p,'"'.concat(c,'"'));var v=b({id:"frm_form_action_".concat(c),className:a.get(0).className});v.setAttribute("data-actionkey",c),v.innerHTML=g,v.querySelectorAll(".wp-editor-wrap, .wp-editor-wrap *").forEach(function(e){"string"==typeof e.className&&(e.className=e.className.replace(l,c)),e.id=e.id.replace(l,c)}),v.classList.remove("open"),document.getElementById("frm_notification_settings").append(v),i.length&&(i.forEach(function(e){frmDom.wysiwyg.init(e)}),v.querySelectorAll(".wp-editor-area").forEach(function(e){frmDom.wysiwyg.init(e)})),v.classList.contains("frm_single_on_submit_settings")&&v.querySelector("input.frm-page-search")&&fa(v),oa(),wp.hooks.doAction("frm_after_duplicate_action",v)}}function Vo(e){var t=parseInt(e,10)+11;return document.getElementById("frm_form_action_".concat(t))&&(t=Vo(++t)),t}function Ko(e){return Array.from(document.querySelectorAll(".frm_single_".concat(e,"_settings .widget-title h4 span:not(.frm-border-icon)")),function(e){return e.textContent.trim()})}function Jo(){var e,t=jQuery(this).data("actiontype");if(!ri(t)){var n=(e=jr(document.querySelectorAll(".frm_form_action_settings"),"frm_form_action_"),void 0!==document.getElementById("frm_form_action_".concat(e))&&(e+=100),V>=e&&(e=V+1),V=e,e),r=U,o=Ko(t),i=document.createElement("div");i.classList.add("frm_single_".concat(t,"_settings"));var a=document.getElementById("frm_notification_settings");a.append(i),jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"frm_add_form_action",type:t,list_id:n,form_id:r,nonce:frmGlobal.nonce,existing_titles:o},success:function(e){var r;Oi(),i.remove(),null===(r=document.querySelector(".frm-no-actions-message"))||void 0===r||r.classList.add("frm_hidden"),document.querySelectorAll(".frm_form_action_settings.open").forEach(function(e){return e.classList.remove("open")});var o=b();o.innerHTML=e;var l=o.querySelector(".widget-top");Array.from(o.children).forEach(function(e){return a.append(e)}),jQuery(".frm_form_action_settings").fadeIn("slow");var c,s,d=document.getElementById("frm_form_action_".concat(n));d.classList.add("open"),document.getElementById("post-body-content").scroll({top:d.offsetTop+10,left:0,behavior:"smooth"}),ni(t),(s=["stripe","square","paypal"]).includes(c=t)&&s.forEach(function(e){e!==c&&ni(e)}),Uo("#frm_form_action_".concat(n)),oa(),fa(d),l&&jQuery(l).trigger("frm-action-loaded"),frmAdminBuild.hooks.doAction("frm_added_form_action",d)}})}}function Xo(e){e.on("Change",function(){!function(e){(function(){var e=document.querySelector(".frm-single-settings:not(.frm_hidden)");if(!e)return!1;var t=e.querySelector(".wp-editor-wrap");return t&&t.classList.contains("tmce-active")})()&&!tinyMCE.activeEditor.isHidden()&&(e.targetElm.value=e.getContent(),jQuery(e.targetElm).trigger("change"))}(e)})}function Yo(e){var t=this;if(null!==e)return this.fragment=document.createDocumentFragment(),this.initOnceInAllInstances=function(){void 0===Yo.prototype.endMarker&&(Yo.prototype.endMarker=document.getElementById("frm-end-form-marker"))},this.append=function(e){var n=e?e.parentElement.classList:"";e&&(n.contains("frm_field_box")||n.contains("divider_section_only"))&&t.fragment.append(e)},this.moveFields=function(){R.insertBefore(t.fragment,Yo.prototype.endMarker)},this.initOnceInAllInstances(),void 0!==e?(this.append(e),void this.moveFields()):{append:this.append,moveFields:this.moveFields}}function Zo(){var e=jQuery(this).closest(".frm_form_action_settings").data("actionkey"),t=this.getAttribute("data-emailrow");jQuery("#frm_form_action_".concat(e," .frm_").concat(t,"_row")).fadeIn("slow"),jQuery(this).fadeOut("slow")}function ei(){var e=jQuery(this).closest(".frm_form_action_settings"),t=this.getAttribute("data-emailrow"),n=".frm_".concat(t,"_row"),r=".frm_".concat(t,"_button");jQuery(e).find(r).fadeIn("slow"),jQuery(e).find(n).fadeOut("slow",function(){jQuery(e).find("".concat(n," input")).val("")})}function ti(){var e=jQuery(this).closest(".frm_form_action_settings"),t=".frm_from_to_match_row";e.find('input[name$="[post_content][from]"]').val()===e.find('input[name$="[post_content][email_to]"]').val()?jQuery(e).find(t).fadeIn("slow"):jQuery(e).find(t).fadeOut("slow")}function ni(e){var t,n,r=document.querySelectorAll(".frm_".concat(e,"_action"));ri(e)?(t=r,n=oi(e)>0,t.forEach(function(e){e.classList.remove("frm_active_action"),e.classList.add("frm_inactive_action"),n&&e.classList.add("frm_already_used")})):r.forEach(function(e){e.querySelector(".frm_show_upgrade")||(e.classList.remove("frm_inactive_action","frm_already_used"),e.classList.add("frm_active_action"))})}function ri(e){var t=function(e){return["paypal","stripe","square"].includes(e)&&(e="payment"),jQuery(".frm_single_".concat(e,"_settings")).length}(e)>=oi(e),n={type:e};return wp.hooks.applyFilters("frm_action_at_limit",t,n)}function oi(e){return parseInt(jQuery(".frm_".concat(e,"_action")).data("limit"),10)}function ii(){var e=a.only_one_action,t=this.dataset.limit,n=this.dataset.actiontype;n&&["paypal","stripe","square","payment"].includes(n)&&(e="stripe"===n?a.only_one_stripe_action:a.only_one_payment_action),void 0!==t&&((t=parseInt(t))>1?e=e.replace(1,t).trim():e+=" ".concat(a.edit_action_text)),se(e)}function ai(e,t){var n=jQuery(t).closest(".frm_form_action_settings").find(".frm_action_name").val(),r=document.getElementById("form_id").value,o=document.getElementById("frm_logic_row_".concat(e)),i=jr(o.querySelectorAll(".frm_logic_row"),"frm_logic_".concat(e,"_")),a=b({id:"frm_logic_".concat(e,"_").concat(i),className:"frm_logic_row frm_hidden"}),l=document.getElementById("logic_link_".concat(e)),c=l?o.closest(".frm_logic_rows"):null;o.append(a),jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"frm_add_form_logic_row",email_id:e,form_id:r,meta_name:i,type:n,nonce:frmGlobal.nonce},success:function(e){a.insertAdjacentHTML("beforebegin",e),a.remove();var t=o.querySelector(".frm_logic_row:last-child"),n=t?t.querySelector(".frm-logic-rule-text"):null;n&&(n.textContent=o.dataset.ruleText||""),l&&l.classList.add("frm_hidden"),c&&(c.classList.remove("frm_hidden"),c.style.display="")}})}function li(){return ai(jQuery(this).data("emailkey"),this),!1}function ci(){var e;if(this.checked){var t=this.getAttribute("data-emailkey");if(t&&null!==(e=this.dataset.toggleclass)&&void 0!==e&&e.startsWith("frm_logic_rows_")){var n=document.getElementById("frm_logic_row_".concat(t));n&&!n.querySelector(".frm_logic_row")&&ai(t,this)}}}function si(){var e=jQuery("select.frm_single_post_field");e.css("border-color","");var t=this,n=jQuery(t).val();if(""===n||"checkbox"===n)return!1;e.each(function(){if(jQuery(this).val()===n&&this.name!==t.name)return this.style.borderColor="red",jQuery(t).val(""),se(a.field_already_used),!1})}function di(){var e=jQuery(this).val();""===e?(jQuery(".frm_post_content_opt, select.frm_dyncontent_opt").hide().val(""),jQuery(".frm_dyncontent_opt").hide()):"post_content"===e?(jQuery(".frm_post_content_opt").show(),jQuery(".frm_dyncontent_opt").hide(),jQuery("select.frm_dyncontent_opt").val("")):(jQuery(".frm_post_content_opt").hide().val(""),jQuery("select.frm_dyncontent_opt, .frm_form_field.frm_dyncontent_opt").show())}function ui(){var e=jQuery(this).val(),t=jQuery(document.getElementById("frm_post_action_custom_content")||document.getElementById("frm_dyncontent"));""===e||"new"===e?(t.val(""),jQuery(".frm_dyncontent_opt").show()):jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"frm_display_get_content",id:e,nonce:frmGlobal.nonce},success:function(e){t.val(e),jQuery(".frm_dyncontent_opt").show()}})}function fi(){var e,t,n=document.getElementById("frm_posttax_rows").childNodes,r=document.querySelector(".frm_post_parent_field"),o=document.querySelector(".frm_post_menu_order_field"),i=this.value;jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"frm_replace_posttax_options",post_type:i,nonce:frmGlobal.nonce},success:function(r){for(var o=0;o');var e=jQuery(this).closest(".frm_form_action_settings").find('select[name$="[post_content][post_type]"]').val(),t=jQuery(this).closest(".frm_form_action_settings").data("actionkey"),n=jQuery(this).closest(".frm_posttax_row").attr("id").replace("frm_posttax_",""),r=jQuery(this).val(),o=jQuery(document.getElementById("".concat(n,"_show_exclude"))).is(":checked")?1:0,i=jQuery('select[name$="[post_category]['.concat(n,'][field_id]"]')).val(),a=jQuery('input[name="id"]').val();jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"frm_add_posttax_row",form_id:a,post_type:e,tax_key:n,action_key:t,meta_name:r,field_id:i,show_exclude:o,nonce:frmGlobal.nonce},success:function(e){jQuery(document.getElementById("frm_posttax_".concat(n))).replaceWith(e)}})}}function yi(){var e=jQuery(this).closest(".frm_postmeta_row"),t=e.find(".frm_cancelnew"),n=e.find(".frm_enternew");return e.find("select.frm_cancelnew").is(":visible")?(t.hide(),n.show()):(t.show(),n.hide()),e.find("input.frm_enternew, select.frm_cancelnew").val(""),!1}function hi(){var e=jQuery(this),t=e.val();"checkbox"===e.attr("type")&&!1===this.checked&&(t="");var n=e.data("toggleclass");""===t?jQuery(".".concat(n)).hide():(jQuery(".".concat(n)).show(),jQuery(".hide_".concat(n,"_").concat(t)).hide())}function bi(){Mo()||(zo(this),To(document.querySelector(".frm_form_settings")))}function wi(e){return e.preventDefault(),ji(jQuery(this),this.getAttribute("data-code")),!1}function ji(e,t){var n=!1,r=e;if("object"===s(e)){if(e.hasClass("frm_noallow"))return;void 0===(r=jQuery(e).closest("[data-fills]").attr("data-fills"))&&void 0!==(r=e.closest("div").attr("class"))&&(r=r.split(" ")[1])}if(void 0===r){var o=document.activeElement;"search"===o.type?null===(r=o.id.replace("-search-input","")).match(/\d/gi)&&(r=(o=jQuery(".frm-single-settings:visible .".concat(r))).attr("id")):r=o.id}r&&(n=jQuery("#wp-".concat(r,"-wrap.wp-editor-wrap")).length>0);var i=jQuery(document.getElementById(r));if(void 0===e.attr("data-shortcode")&&(!i.length||void 0===i.attr("data-shortcode"))){var a=e.parents("ul.frm_code_list").attr("data-shortcode");"undefined"!==a&&"no"===a||(t="[".concat(t,"]"))}if(n&&(wpActiveEditor=r),!i.length)return!1;if("[default-html]"===t||"[default-plain]"===t){var l=0;"[default-plain]"===t&&(l=1),jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"frm_get_default_html",form_id:jQuery('input[name="id"]').val(),plain_text:l,nonce:frmGlobal.nonce},elementId:r,success:function(e){if(n){var t=document.createElement("p");t.innerText=e,send_to_editor(t.innerHTML)}else Ei(i,e)}})}else t=function(e,t,n){return"object"===s(t)&&t instanceof jQuery&&0===n[0].id.indexOf("success_url_")&&(t=t[0]).closest("#frm-insert-fields-box")?(t.parentNode.classList.contains("frm_insert_url")||(e=e.replace("]"," sanitize_url=1]")),e):e}(t,e,i),n?send_to_editor(t):Ei(i,t);return!1}function Ei(e,t){if(document.selection)e[0].focus(),document.selection.createRange().text=t;else{var n=e[0],r=n.selectionEnd;t=function(e,t,n,r){var o=e.data("sep");if(void 0===o)return t;var i=e.val();if(!i.trim().length)return t;var a=new RegExp("".concat(o,"\\s*$")),l=new RegExp("^\\s*".concat(o));return i.substr(0,n).trim().length&&!1===a.test(i.substr(0,n))&&(t=o+t),i.substr(r,i.length).trim().length&&!1===l.test(i.substr(r,i.length))&&(t+=o),t}(e,t,n.selectionStart,r),n.value=n.value.substr(0,n.selectionStart)+t+n.value.substr(n.selectionEnd,n.value.length);var o=r+t.length;!function(e,t){if(e.classList.contains("frm_classes")&&xi(t)){var n=e.value.split(" ").filter(xi);n.length&&(e.value=function(e,t,n){var r=e.split(" ").filter(function(e){return(e=e.trim()).length&&!t.includes(e)});return r.includes(n)||r.push(n),r.join(" ")}(e.value,n,t.trim()))}}(n,t),n.focus(),n.setSelectionRange(o,o)}Fo(e)}function xi(e){return["frm_half","frm_third","frm_two_thirds","frm_fourth","frm_three_fourths","frm_fifth","frm_sixth","frm2","frm3","frm4","frm6","frm8","frm9","frm10","frm12"].includes(e.trim())}function Si(){var e=document.getElementById("frm-id-condition"),t=document.getElementById("frm-key-condition");"id"===this.value?(e.classList.remove("frm_hidden"),t.classList.add("frm_hidden"),wa(t,"change")):(e.classList.add("frm_hidden"),t.classList.remove("frm_hidden"),wa(e,"change"))}function ki(){var e=document.getElementById("frm-id-key-condition-id").checked?"frm-id-condition":"frm-key-condition",t=document.getElementById("frm-is-condition").value,n=document.getElementById("frm-text-condition").value,r=document.getElementById("frm-insert-condition"),o=(e=document.getElementById(e)).options[e.selectedIndex].value,i="if ".concat(o," ").concat(t,'="').concat(n,'"]');r.setAttribute("data-code","".concat(i+a.conditional_text,"[/if ").concat(o)),r.innerHTML="[".concat(i,"[/if ").concat(o,"]")}function Qi(e){return e.getAttribute("href")||e.getAttributeNS("http://www.w3.org/1999/xlink","href")}function Li(e){var t;e.parentNode.parentNode.classList.contains("frm_has_shortcodes")&&(Hi(),"use"===(t=zi(e)).tagName?Qi(t=t.firstElementChild).includes("frm_close_icon")||Ci(t,"nofocus"):t.classList.contains("frm_close_icon")||Ci(t,"nofocus"))}function Ai(e){e.preventDefault(),e.stopPropagation(),Ci(this)}function Ii(e){var t=e.target;!function(e){var t;if(e.id.startsWith("field_options_type_")){var n=e.id.split("_"),r=n.length&&n[n.length-1];null!==(t=document.querySelector("#frm-single-settings-".concat(r)))&&void 0!==t&&t.classList.contains("frm-type-".concat(e.value))||qi()}}(t),x(t)}function qi(e){var t;void 0===e&&(e=Y("You are changing the field type. Not all field settings will appear as expected until you reload the page. Would you like to reload the page now?","formidable")),frmDom.modal.maybeCreateModal("frmSaveAndReloadModal",{title:Y("Save and Reload?","formidable"),content:(t=b(e),t.style.padding="var(--gap-md)",t),footer:function(){var e=frmDom.modal.footerButton({text:Y("Save and Reload","formidable"),buttonType:"primary"});C(e,function(){var e;(e=document.getElementById("frm_submit_side_top")).classList.contains("frm_submit_ajax")&&e.setAttribute("data-new-addon-installed",!0),e.click()});var t=frmDom.modal.footerButton({text:Y("Cancel","formidable"),buttonType:"cancel"});return t.classList.add("dismiss"),frmDom.div({children:[t,e]})}()})}function Bi(e){var t;if(e instanceof Event){var n=document.querySelectorAll(".frm-single-settings .frm-show-box.frmsvg use"),r=Array.from(n).find(function(e){return"#frm_close_icon"===e.getAttribute("href")});if(void 0===r)return;t=r.parentElement}else t=e;var o=t.getBoundingClientRect(),i=document.getElementById("frm_adv_info"),a=i.parentElement.getBoundingClientRect();i.style.top="".concat(o.top-a.top+32,"px"),i.style.left="".concat(o.left-a.left-280,"px")}function Ci(e,t){var n=Ri(e),r=document.getElementById("frm_adv_info"),o=e.className;if("svg"===e.tagName&&(e=e.firstElementChild),"use"===e.tagName&&(o=Qi(e)),o.includes("frm_close_icon"))Hi(r);else{if(function(e){var t=e.querySelector("template.frm-code-list-icons");if(t){var n={};t.content.querySelectorAll("[data-frm-icon-key]").forEach(function(e){n[e.dataset.frmIconKey]=e.firstElementChild}),e.querySelectorAll(".frm_customize_field_list [data-frm-icon]").forEach(function(e){var t=n[e.dataset.frmIcon];t&&e.querySelectorAll(":scope > a.frm_insert_code").forEach(function(e){e.prepend(t.cloneNode(!0))}),e.removeAttribute("data-frm-icon")})}}(r),Bi(e),jQuery(".frm_code_list a").removeClass("frm_noallow"),n.classList.contains("frm_not_email_to")?jQuery("#frm-insert-fields-box .frm_code_list li:not(.show_frm_not_email_to) a").addClass("frm_noallow"):n.classList.contains("frm_not_email_subject")&&jQuery(".frm_code_list li.hide_frm_not_email_subject a").addClass("frm_noallow"),r.setAttribute("data-fills",n.id),r.style.display="block","use"===e.tagName)if(e.hasAttributeNS("http://www.w3.org/1999/xlink","href"))e.setAttributeNS("http://www.w3.org/1999/xlink","href","#frm_close_icon");else{var i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS("http://www.w3.org/1999/xlink","href","#frm_close_icon"),e.parentNode.replaceChild(i,e)}else e.className=o.replace("frm_more_horiz_solid_icon","frm_close_icon");"nofocus"!==t&&("none"!==n.style.display?n.focus():jQuery(tinymce.get(n.id)).trigger("focus")),function(e){["address","body"].forEach(function(t){!function(e,t){var n,r=a.contextualShortcodes["".concat(t,"Selector")],o=a.contextualShortcodes[t],i=e.matches(r),l=g(o);try{for(l.s();!(n=l.n()).done;){var c,s=n.value,d=null===(c=document.querySelector('#frm-adv-info-tab .frm_code_list [data-code="'.concat(s,'"]')))||void 0===c?void 0:c.closest("li");null==d||d.classList.toggle("frm_hidden",!i)}}catch(e){l.e(e)}finally{l.f()}}(e,t)})}(n)}}function Ni(e){return 0===a.contextualShortcodes.length||!function(e){var t=e.querySelector("a");if(!t)return!1;var n=t.dataset.code;return a.contextualShortcodes.address.includes(n)||a.contextualShortcodes.body.includes(n)}(e)||function(e){var t=e.querySelector("a").dataset.code,n=document.getElementById("frm_adv_info").dataset.fills,r=document.getElementById(n),o=a.contextualShortcodes;return o.address.includes(t)?r.matches(o.addressSelector):r.matches(o.bodySelector)}(e)}function Oi(){G||(G=1,window.addEventListener("beforeunload",Mi))}function Ti(){G=0}function Fi(){G=0}function Di(){G=0}function Mi(e){G&&(e.preventDefault(),e.returnValue="")}function Pi(e,t){var n={my:"top",at:"top+".concat(t),of:window};e.dialog("option","position",n)}function Ri(e){if(e.classList.contains("frm-input-icon"))return e.previousElementSibling;for(var t,n=e.nextElementSibling;n&&("INPUT"!==n.tagName&&"TEXTAREA"!==n.tagName||n.classList.contains("frm-token-input-field"));)n=Ri(n);return n||(n=null===(t=e.closest(".frm-field-formula"))||void 0===t?void 0:t.querySelector(".frm-calc-field")),n}function zi(e){var t;if(null!==(t=e.nextElementSibling)&&void 0!==t&&t.classList.contains("frm-input-icon"))return e.nextElementSibling;for(var n=e.previousElementSibling;null!==n&&"I"!==n.tagName&&"svg"!==n.tagName;)n=zi(n);return n}function Hi(e){if((void 0!==e||(e=document.getElementById("frm_adv_info")))&&null===document.getElementById("frm_dyncontent")){e.style.display="none";for(var t=document.querySelectorAll(".frm-show-box.frm_close_icon"),n=0;n".concat(n.data.name,": ").concat(n.data.msg,""):'Imported ').concat(n.data.name,"
"),e.find(".status").prepend(r),e.find(".status").show(),re.importQueue=jQuery.grep(re.importQueue,function(e){return e!=t}),re.imported++,0===re.importQueue.length?(e.find(".process-count").hide(),e.find(".forms-completed").text(re.imported),e.find(".process-completed").show()):(e.find(".form-current").text(re.imported+1),Ki(e)))})}function Ji(e){e.preventDefault();var t=!1,n=jQuery('input[name="frm_export_forms[]"]');jQuery('input[name="frm_export_forms[]"]:checked').val()||(n.closest(".frm-table-box").addClass("frm_blank_field"),t="stop");var r=jQuery('input[name="type[]"]');if(jQuery('input[name="type[]"]:checked').val()||"checkbox"!==r.attr("type")||(r.closest("p").addClass("frm_blank_field"),t="stop"),"stop"===t)return!1;e.stopPropagation(),this.submit()}function Xi(){var e=jQuery(this).closest(".frm_blank_field");if(void 0!==e){var t=this.name;("type[]"===t&&jQuery('input[name="type[]"]:checked').val()||"frm_export_forms[]"===t&&jQuery(this).val())&&e.removeClass("frm_blank_field")}}function Yi(){null!==jQuery(this).val().match(/\.csv$/i)?jQuery(".show_csv").fadeIn():jQuery(".show_csv").fadeOut()}function Zi(){var e=document.querySelector('select[name="format"]');return e?e.value:""}function ea(e){var t,n,r=e.target.value;na(r),ta.call(e.target),t=r,n=document.getElementById("frm-export-select-all"),"csv"===t?(n.checked=!1,n.disabled=!0):n.disabled=!1}function ta(){var e=jQuery(this),t=e.find(":selected"),n=t.data("support"),r=n.indexOf("|");jQuery('input[name="type[]"]').each(function(){this.checked=!1,n.includes(this.value)?(this.disabled=!1,-1===r&&(this.checked=!0)):this.disabled=!0}),"csv"===e.val()?(jQuery(".csv_opts").show(),jQuery(".xml_opts").hide()):(jQuery(".csv_opts").hide(),jQuery(".xml_opts").show());var o=t.data("count"),i=jQuery('input[name="frm_export_forms[]"]');"single"===o?(i.prop("multiple",!1),i.prop("checked",!1)):(i.prop("multiple",!0),i.prop("disabled",!1)),e.trigger("change")}function na(e){if(""!==e){var t=document.querySelectorAll(".frm-is-repeater");t.length&&("csv"===e?t.forEach(function(e){e.classList.remove("frm_hidden")}):t.forEach(function(e){e.classList.add("frm_hidden")}),ya.call(document.querySelector(".frm-auto-search")))}}function ra(){var e=jQuery("select[name=format]").find(":selected").data("count"),t=jQuery('input[name="frm_export_forms[]"]');"single"===e&&this.checked?(t.prop("disabled",!0),this.removeAttribute("disabled")):t.prop("disabled",!1)}function oa(e){var t=(e?jQuery(e).find(".frm_multiselect"):jQuery(".frm_multiselect")).not(".frm-single-settings.frm_hidden .frm_multiselect");t.toArray().forEach(L),t.hide().each(frmDom.bootstrap.multiselect.init)}function ia(e){e.preventDefault(),ca(this,"frm_multiple_addons")}function aa(e){e.preventDefault(),ca(this,"frm_activate_addon")}function la(e){e.preventDefault(),ca(this,"frm_install_addon")}function ca(e,t){n(105).toggleAddonState(e,t)}function sa(){ua()}function da(e){!function(e,t,n){var r=jQuery("#frm_leave_email_error");r.removeClass("frm_hidden").attr("frm-error",n),jQuery("#frm_leave_email").one("keyup",function(){r.addClass("frm_hidden")})}(0,0,e)}function ua(){var e=document.getElementById("frmapi-email-form");jQuery.ajax({dataType:"json",url:e.getAttribute("data-url"),success:function(t){var n=t.renderedHtml;n=n.replace(/]*(formidableforms.css|action=frmpro_css)[^>]*>/gi,""),e.innerHTML=n}})}function fa(e){frmDom.autocomplete.initSelectionAutocomplete(e)}function ma(e){var t=this.parentNode.parentNode,n=t.elements.type.value;e.preventDefault(),this.classList.add("frm_loading_button"),pa(t,n,this)}function _a(e){var t=this.elements.type.value,n=this.querySelector("button");e.preventDefault(),n.classList.add("frm_loading_button"),pa(this,t,n)}function pa(e,t,n){var r=function(e){var t,n,r={},o=e.elements;for(n=0;n .frm-with-line").forEach(function(e){var t=e.nextElementSibling;if(t){var n=t.querySelectorAll(":scope > li.frmbutton"),r=Array.from(n).every(function(e){return e.classList.contains("frm_hidden")});e.classList.toggle("frm_hidden",r)}}),jQuery(this).trigger("frmAfterSearch")}function ha(e,t){return"s"!==t&&"s"!==e[e.length-1]&&"".concat(e,"s").includes(t)}function ba(e){e.stopPropagation()}function wa(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!1,!0),e.dispatchEvent(n)}function ja(e,t){var n,r=new XMLHttpRequest,o="string"==typeof e?e:Object.keys(e).map(function(t){return"".concat(encodeURIComponent(t),"=").concat(encodeURIComponent(e[t]))}).join("&");return r.open("post",ajaxurl,!0),r.onreadystatechange=function(){if(r.readyState>3&&200==r.status){n=r.responseText;try{n=JSON.parse(n)}catch(e){}t(n)}},r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.setRequestHeader("Content-type","application/x-www-form-urlencoded"),r.send(o),r}function Ea(e,t){e.classList.add("frm-fade"),setTimeout(t,1e3)}function xa(e){jQuery(e).css("visibility","hidden")}function Sa(e){jQuery(e).css("visibility","visible")}function ka(e,t){return n(260).initModal(e,t)}function Qa(e,t,n){if("#"===t){var r=document.getElementById(e);if(void 0!==n)r.style.display=n?"block":"none";else{var o=r.style.display;r.style.display="none"===o?"block":"none"}}else void 0!==n?n?e.show():e.hide():e.is(":visible")?e.hide():e.show()}function La(){window.onbeforeunload=null;var e=jQuery(window);e.off("beforeunload.widgets"),e.off("beforeunload.edit-post")}function Aa(){var e=jQuery(this).closest(".frm-single-settings").data("fid"),t=document.getElementById("frm_field_id_".concat(e));if(t&&"form"===t.dataset.type)if(t=jQuery(t),this.options[this.selectedIndex].value){t.find(".frm-not-set")[0].classList.add("frm_hidden");var n=t.find(".frm-embed-message");n.html(n.data("embedmsg")+this.options[this.selectedIndex].text),t.find(".frm-embed-field-placeholder")[0].classList.remove("frm_hidden")}else t.find(".frm-not-set")[0].classList.remove("frm_hidden"),t.find(".frm-embed-field-placeholder")[0].classList.add("frm_hidden")}function Ia(e){var t=e.target,n=t.value.trim();if(!n.includes("[")||!n.includes("]")){if(isNaN(n.replace(/,/,""))){var r=Y("Please enter a valid number.","formidable");return frmAdminBuild.infoModal(r),void function(e){var t=document.querySelectorAll("#frm_info_modal .dismiss, #frm_info_modal #frm-info-click, .ui-widget-overlay.ui-front");function n(){e.classList.add("frm_invalid_field"),setTimeout(function(){return e.focus()},0),t.forEach(function(e){e.removeEventListener("click",n)})}t.forEach(function(e){e.addEventListener("click",n)})}(t)}t.classList.remove("frm_invalid_field")}}function qa(){var e=jQuery(this).closest(".frm-single-settings"),t=e.find(".frmjs_product_choices"),n=e.find(".frm_prod_options_heading"),r=this.options[this.selectedIndex].value,o=e[0].querySelector(".frm_display_format_options");o&&o.setAttribute("data-product-type",r),t.removeClass("frm_prod_type_single frm_prod_type_user_def"),n.removeClass("frm_prod_user_def"),"single"===r?t.addClass("frm_prod_type_single"):"user_def"===r&&(t.addClass("frm_prod_type_user_def"),n.addClass("frm_prod_user_def")),wp.hooks.doAction("frm_product_type_toggled",r,e[0])}function Ba(e){var t=document.getElementById("frm_field_id_".concat(e));return!!t&&"product"===t.getAttribute("data-type")}function Ca(){var e=function(e,t){return window.frmCachedSubFields=window.frmCachedSubFields||{},window.frmCachedSubFields[e]=window.frmCachedSubFields[e]||{},window.frmCachedSubFields[e][t]},t=function(e,t,n){window.frmCachedSubFields=window.frmCachedSubFields||{},window.frmCachedSubFields[e]=window.frmCachedSubFields[e]||{},window.frmCachedSubFields[e][t]=n},n=[1,2,3,4,5,6,7,8,9,10,11,12].map(function(e){return"frm".concat(e)}),r=["first","middle","last"];document.addEventListener("change",function(i){i.target.matches(".frm_name_layout_dropdown")&&function(i){var a,l=i.target.value.split("_"),c=i.target.dataset.fieldId,s=document.querySelector("#field_".concat(c,"_inner_container .frm_combo_inputs_container")),d=(a=l.length,"frm".concat(parseInt(12/a)));r.forEach(function(e){var r,i=s.querySelector('[data-sub-field-name="'.concat(e,'"]'));i&&(i.classList.add("frm_hidden"),(r=i.classList).remove.apply(r,o(n)),t(c,e,i))}),l.forEach(function(t){var n=e(c,t);n&&(n.classList.remove("frm_hidden"),n.classList.add(d),s.append(n))}),r.forEach(function(e){var n=document.querySelector(".frm_sub_field_options-".concat(e,'[data-field-id="').concat(c,'"]'));n&&(n.classList.add("frm_hidden"),t(c,"".concat(e,"_options"),n))}),l.forEach(function(t){var n=e(c,"".concat(t,"_options"));n&&n.classList.remove("frm_hidden")})}(i)},!1)}function Na(e,t){var n,r,o,i=!1,a=!1;(n=t.newOption?(new DOMParser).parseFromString(t.newOption,"text/html").body.childNodes[0]:t).querySelectorAll("svg").forEach(function(e){(r=e.getElementsByTagNameNS("http://www.w3.org/2000/svg","use")[0])&&("#frm_drag_icon"===(o=Qi(r))&&(i=!0),"#frm_save_icon"===o&&(a=!0))}),i||n.prepend(M.drag.cloneNode(!0)),n.querySelector("[id^=field_key_".concat(e,"-]"))&&!a&&n.querySelector("[id^=field_key_".concat(e,"-]")).after(M.save.cloneNode(!0)),t.newOption&&(t.newOption=n)}function Oa(){var e=document.getElementById("frm_leave_email").value.trim();if(""!==e)if(!1!==/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i.test(e)){var t=jQuery("#frmapi-email-form").find("form"),n=t.find('[type="email"]').not(".frm_verify");if(n.length){if(document.getElementById("frm_empty_inbox")){document.getElementById("frm-add-my-email-address").remove();var r=document.getElementById("frm_leave_email_wrapper");if(r){r.classList.add("frm_hidden");var o=k({className:"frm-wait frm_spinner"});o.style.visibility="visible",o.style.float="none",o.style.width="unset",r.parentElement.insertBefore(o,r.nextElementSibling)}}n.val(e),jQuery.ajax({type:"POST",url:t.attr("action"),data:"".concat(t.serialize(),"&action=frm_forms_preview")}).done(function(e){if(jQuery(e).find(".frm_message").text().trim().includes("Thanks!")){var t=document.getElementById("frmapi-email-form").parentElement.querySelector(".frm_spinner");t&&t.remove(),wp.hooks.applyFilters("frm_thank_you_on_signup",!0)&&document.getElementById("frm_leave_email_wrapper").replaceWith(k(Y("Thank you for signing up!","formidable")))}else da("invalid")})}}else da("invalid");else da("empty")}function Ta(e){var t;if(ae||e.stopPropagation(),!(e.target.classList.contains("frm-show-box")||null!==(t=e.target.parentElement)&&void 0!==t&&t.classList.contains("frm-show-box"))){var n=document.getElementById("frm_adv_info");n&&(n.dataset.fills===e.target.id&&void 0!==e.target.id||e.target.closest("#frm_adv_info")||"none"===n.style.display||Hi(n))}}return{init:function(){var e,t,r,i,a,l,c;!function(){jQuery(document).on("click","#frm-add-my-email-address",function(e){e.preventDefault(),Oa()});var e=document.getElementById("frm_empty_inbox"),t=document.getElementById("frm_leave_email");if(e&&t){var n=document.getElementById("frm-leave-email-modal");n.classList.remove("frm_hidden"),n.querySelector(".frm_modal_footer").classList.add("frm_hidden"),t.addEventListener("keyup",function(e){if("Enter"===e.key){var t=document.getElementById("frm-add-my-email-address");t&&t.click()}})}}(),t=document.querySelector(".frm-admin-footer-links"),r=null!==(e=document.querySelector(".frm_page_container"))&&void 0!==e?e:document.getElementById("wpbody-content"),t&&r&&(r.append(t),t.classList.remove("frm_hidden")),document.addEventListener("show.bs.dropdown",function(){me()}),re={},jQuery(".wp-admin").on("click",function(e){var t=jQuery(e.target),n=jQuery(".dropdown.open");!n.length||t.hasClass("dropdown")||t.closest(".dropdown").length||n.removeClass("open")}),jQuery("#frm_bs_dropdown:not(.open) a").on("click",wn),void 0===U&&(U=jQuery(document.getElementById("form_id")).val()),document.querySelectorAll(".frm-warning-dismiss").forEach(function(e){C(e,jn)}),frmAdminBuild.inboxBannerInit(),P.length>0?frmAdminBuild.buildInit():null!==document.getElementById("frm_notification_settings")?frmAdminBuild.settingsInit():null!==document.getElementById("frm_styling_form")?frmAdminBuild.styleInit():null!==document.getElementById("form_global_settings")?frmAdminBuild.globalSettingsInit():null!==document.getElementById("frm_export_xml")?frmAdminBuild.exportInit():null!==document.querySelector(".frm-inbox-wrapper")?frmAdminBuild.inboxInit():null!==document.getElementById("frm-welcome")?frmAdminBuild.solutionInit():(function(){if(document.body.classList.contains("frm-admin-page-entries")){var e=document.getElementById("screen-options-wrap");if(e){var t=b({className:"frm_warning_style",text:Y("Only 10 columns can be selected at a time.","formidable")});t.style.margin=0;var n=e.querySelector("legend");n.parentNode.insertBefore(t,n.nextElementSibling);var r=Array.from(e.querySelectorAll('input[type="checkbox"]')),o=function(){r.reduce(function(e,t){return t.checked?e+1:e},0)>=10?(t.classList.remove("frm_hidden"),r.forEach(function(e){e.checked||(e.parentNode.classList.add("frm_noallow"),e.disabled=!0)})):t.classList.add("frm_hidden")};o(),r.forEach(function(e){e.addEventListener("change",function(e){e.target.checked?o():(t.classList.add("frm_hidden"),r.forEach(function(e){e.parentNode.classList.remove("frm_noallow"),e.disabled=!1}))})})}}}(),fa(),jQuery("[data-frmprint]").on("click",function(){return window.print(),!1})),jQuery(document).on("change","select[data-toggleclass], input[data-toggleclass]",hi),function(){function e(e){var t=e.options[e.selectedIndex];e.querySelectorAll("option[data-dependency]:not([data-dependency-skip])").forEach(function(e){var n=document.querySelector(e.dataset.dependency);null==n||n.classList.toggle("frm_hidden",t!==e)})}document.querySelectorAll("select.frm_select_with_dependency").forEach(e),frmDom.util.documentOn("change","select.frm_select_with_dependency",function(t){return e(t.target)})}(),(jQuery(document.getElementById("frm_adv_info")).length>0||jQuery(".frm_field_list").length>0)&&frmAdminBuild.panelInit(),i=jQuery(".wrap, .frm_wrap"),a=document.getElementById("frm_confirm_modal"),l=!1,c=!1,jQuery(a).on("click","[data-deletefield]",vr),jQuery(a).on("click","[data-removeid]",_e),jQuery(a).on("click","[data-trashtemplate]",va),i.on("click",".frm_remove_tag, .frm_remove_form_action",_e),i.on("click","a[data-frmverify]",le),i.on("click","a[data-frmtoggle]",de),i.on("click","a[data-frmhide], a[data-frmshow]",ue),i.on("change","input[data-frmhide], input[data-frmshow]",ue),i.on("click",".widget-top,a.widget-action",ge),function(e){e.on("keydown",".widget-top",function(e){e.currentTarget===e.target&&("Enter"!==e.key&&" "!==e.key||(e.preventDefault(),ge(e,e.currentTarget)))});var t=function(e){return function(t){t.key===e&&(t.preventDefault(),t.currentTarget.click())}};e.on("keydown",".frm_form_action_settings .frm_duplicate_form_action, .frm_form_action_settings .frm_remove_form_action",t(" ")),e.on("keydown",".frm_form_action_settings .frm_toggle",t("Enter"))}(i),i.find("[data-tip-key]").each(function(){fe(this)}),i.on("mouseenter.frm",".frm_bstooltip, .frm_help",function(){jQuery(this).off("mouseenter.frm"),function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e;fe(n),(n.hasAttribute("data-toggle")||n.hasAttribute("data-bs-toggle"))&&(n.parentElement.setAttribute("title",n.getAttribute("title")),n.removeAttribute("title"),n.classList.remove("frm_bstooltip"),n.parentElement.classList.add("frm_bstooltip"),n=n.parentElement);var r=new bootstrap.Tooltip(n);t&&(me(),r.show())}(this,!0)}),jQuery(document).on("click","#doaction, #doaction2",function(e){var t="doaction"===this.id?"top":"bottom",n=document.getElementById("bulk-action-selector-".concat(t)),r=document.getElementById("confirm-bulk-delete-".concat(t));if(n&&r){if(l=this,!c&&"bulk_delete"===n.value)return e.preventDefault(),ce(r),!1}else l=!1}),jQuery(document).on("click","#frm-confirmed-click",function(e){if(!1!==l&&!e.target.classList.contains("frm-btn-inactive"))return"confirm-bulk-delete"===this.getAttribute("href")?(e.preventDefault(),c=!0,l.click(),!1):void 0}),n(260).initUpgradeModal(),frmDom.util.documentOn("click","[data-modal-title]",Ho);var s=jQuery(document.getElementById("frm_shortcodediv"));s.length>0&&(jQuery("a.edit-frm_shortcode").on("click",function(){return s.is(":hidden")&&(s.slideDown("fast"),this.style.display="none"),!1}),jQuery(".cancel-frm_shortcode","#frm_shortcodediv").on("click",function(){return s.slideUp("fast"),s.siblings("a.edit-frm_shortcode").show(),!1})),jQuery(document).on("click","#frm-nav-tabs a",he),jQuery(".post-type-frm_display .frm-nav-tabs a, .frm-category-tabs a").on("click",function(){var e=this.classList.contains("frm_show_upgrade_tab");if(!this.classList.contains("frm_noallow")||e)return e&&this.classList.contains("frm_show_expired_modal")?(wp.hooks.doAction("frm_show_expired_modal",this),!1):(e&&Go(this),be(this),!1)}),be(jQuery(".frm-category-tabs .starttab a"),"auto"),jQuery(document).on("click","#frm-fid-search-menu a",function(){var e=this.id.replace("fid-","");return jQuery('select[name="fid"]').val(e),To(document.getElementById("posts-filter")),!1}),jQuery(".frm_select_box").on("click focus",function(){this.select()}),jQuery(document).on("input search change",".frm-auto-search:not(#frm-form-templates-page #template-search-input)",ya),jQuery(document).on("focusin click",".frm-auto-search",ba);var d=jQuery(".frm-auto-search");""!==d.val()&&d.trigger("keyup"),FrmFormsConnect.init(),jQuery(document).on("click",".frm-install-addon",la),jQuery(document).on("click",".frm-activate-addon",aa),jQuery(document).on("click",".frm-solution-multiple",ia),jQuery("button, input[type=submit]").on("click",La),document.addEventListener("click",function(e){if("LABEL"===e.target.nodeName){var t=e.target.getAttribute("for");if(t){var n=document.getElementById(t);if(n&&n.nextElementSibling){var r=n.nextElementSibling.querySelector("button.dropdown-toggle.multiselect");r&&setTimeout(function(){return r.click()},0)}}}}),frmAdminBuild.hooks.addFilter("frm_before_embed_modal",function(e,t){var n,r,o=t.element;if("form"!==t.type)return e;var i=o.closest("tr");if(i)n=parseInt(i.querySelector(".column-id").textContent),r=i.querySelector(".column-form_key").textContent;else{n=document.getElementById("form_id").value;var a=document.getElementById("frm_form_key");if(a)r=a.value;else{var l=document.getElementById("frm-previewDrop");l&&(r=l.nextElementSibling.querySelector(".dropdown-item a").getAttribute("href").split("form=")[1])}}return[n,r]}),P.on("click","> li, .frm_grid_container li",function(){var e,t=(null===(e=this.querySelector("li"))||void 0===e?void 0:e.dataset.fid)||this.dataset.fid;!function(e){var t=document.querySelectorAll("[id^=frm_delete_field_".concat(e,"-]"));t.length<2||o(t).slice(1).forEach(function(t,n){t.classList.contains("frm_other_option")||Na(e,t)})}(t),function(e){var t=document.getElementById("frm_field_".concat(e,"_opts"));if(t){var n=t.querySelector(".frm_option_template"),r=null==n?void 0:n.querySelector(".frm_remove_tag"),o=null==n?void 0:n.querySelector(".frm_add_opt");if(r&&o){var i=t.querySelectorAll(".frm_single_option:not(.frm_option_template)"),a=i.length>1;i.forEach(function(e){if(!e.querySelector(".frm_remove_tag")){var t=e.dataset.optkey;if(void 0!==t){var n=r.cloneNode(!0);["removeid","removemore"].forEach(function(e){var r=n.dataset[e];r&&(n.dataset[e]=r.replace("-000","-".concat(t)))}),n.classList.toggle("frm_disabled",!a);var i=e.querySelector(".frm_option_key");i?i.before(n,o.cloneNode(!0)):e.append(n,o.cloneNode(!0))}}})}}}(t)});var u=document.getElementById("frm_small_screen_proceed_button");u&&C(u,function(){var e;null===(e=document.getElementById("frm_small_device_message_container"))||void 0===e||e.remove(),N("small_screen_proceed",new FormData)});var f=document.getElementById("frm_sale_banner"),m=null==f?void 0:f.querySelector(".dismiss");f&&(C(f,function(e){e.target.closest(".dismiss")||(window.location.href=f.getAttribute("data-url"))}),m&&C(m,function(){f.remove();var e=new FormData;N("sale_banner_dismiss",e)}))},buildInit:function(){var e;document.addEventListener("focusin",function(e){e.target.matches("select[data-frm-options]")&&L(e.target)}),jQuery("#frm_builder_page").on("mouseup","*:not(.frm-show-box)",Ta),O=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;return frmDom.util.debounce(e,t)}(Me,10),T=document.getElementById("post-body-content"),F=jQuery(T),(e=document.querySelectorAll("#frm-show-fields .frm_field_loading")).length&&(at=new IntersectionObserver(st,{root:T}),e.forEach(function(e){return at.observe(e)})),dt(),we("ul.frm_sorting"),document.querySelectorAll(".field_type_list > li:not(.frm_show_upgrade):not(.frm_show_update)").forEach(Ie),S(),jQuery("ul.field_type_list, .field_type_list li, ul.frm_code_list, .frm_code_list li, .frm_code_list li a, #frm_adv_info #category-tabs li, #frm_adv_info #category-tabs li a").disableSelection(),jQuery(".frm_submit_ajax").on("click",Oo),jQuery(".frm_submit_no_ajax").on("click",Do),Po(),jQuery("a.edit-form-status").on("click",jo),jQuery(".cancel-form-status").on("click",Eo),jQuery(".save-form-status").on("click",function(){var e=jQuery(document.getElementById("form_change_status")).val();return jQuery('input[name="new_status"]').val(e),jQuery(document.getElementById("form-status-display")).html(e),jQuery(".cancel-form-status").trigger("click"),!1}),jQuery(".frm_form_builder form").first().on("submit",function(){jQuery(".inplace_field").trigger("blur")}),oa(),qr();var t,n=jQuery(R),r=document.getElementById("frm_form_editor_container");n.on("click",".frm_add_logic_row",function(){if(wp.hooks.applyFilters("frm_should_add_logic_row_in_lite",!0))return wr.call(this)}),n.on("click",".frm_add_watch_lookup_row",Er),n.on("change",".frm_get_values_form",Ar),n.on("change",".frm_logic_field_opts",go),n.on("frm-multiselect-changed",'select[name^="field_options[admin_only_"]',xo),jQuery(document.getElementById("frm-insert-fields")).on("click",".frm_add_field",yt),P.on("click",".frm_clone_field",jt),n.on("blur",'input[id^="frm_calc"]',Rt),n.on("change","input.frm_format_opt, input.frm_max_length_opt",en),n.on("change click","[data-changeme]",Yt),n.on("click","input.frm_req_field",tn),n.on("click",".frm_mark_unique",rn),n.on("change",".frm_repeat_format",Gr),n.on("change",".frm_repeat_limit",Ur),n.on("change",".frm_js_checkbox_limit",Wr),n.on("input",'input[name^="field_options[add_label_"]',function(){$r(this,"add")}),n.on("input",'input[name^="field_options[remove_label_"]',function(){$r(this,"remove")}),n.on("change",'select[name^="field_options[data_type_"]',Ir),jQuery(r).on("click",".frm-collapse-page",Br),jQuery(r).on("click",".frm-collapse-section",Or),n.on("click",".frm-single-settings h3, .frm-single-settings h4.frm-collapsible",Tr),n.on("keydown",".frm-single-settings h3, .frm-single-settings h4.frm-collapsible",function(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),Tr.call(this,e))}),jQuery(r).on("show.bs.dropdown hide.bs.dropdown",Bt),n.on("change",".frm_toggle_sep_values",un),n.on("change",".frm_toggle_image_options",fn),n.on("click",".frm_remove_image_option",hn),n.on("click",".frm_choose_image_box",yn),n.on("change",".frm_hide_image_text",vn),n.on("change",".frm_field_options_image_size",pn),n.on("click",".frm_multiselect_opt",bn),P.on("mousedown","input, textarea, select",En),P.on("click","input[type=radio], input[type=checkbox]",En),P.on("click",".frm_delete_field",Ln),P.on("click",".frm_select_field",An),jQuery(document).on("click",".frm_delete_field_group",In),jQuery(document).on("click",".frm_clone_field_group",qn),jQuery(document).on("click","#frm_field_group_controls > span:first-child",Bn),jQuery(document).on("click",".frm-row-layout-option",Wn),jQuery(document).on("click",".frm-merge-fields-into-row .frm-row-layout-option",$n),jQuery(document).on("click",".frm-custom-field-group-layout",Kn),jQuery(document).on("click",".frm-merge-fields-into-row .frm-custom-field-group-layout",Xn),jQuery(document).on("click",".frm-break-field-group",nr),P.on("click","#frm_field_group_popup .frm_grid_container input",rr),jQuery(document).on("click",".frm-cancel-custom-field-group-layout",or),jQuery(document).on("click",".frm-save-custom-field-group-layout",ar),P.on("click","ul.frm_sorting",lr),jQuery(document).on("click",".frm-merge-fields-into-row",_r),jQuery(document).on("click",".frm-delete-field-groups",gr),P.on("click",'.frm-field-action-icons [data-toggle="dropdown"]',function(){this.closest("li.form-field").classList.add("frm-field-settings-open"),jQuery(document).on("click","#frm_builder_page",kt)}),P.on("mousemove","ul.frm_sorting",Qt),P.on("show.bs.dropdown",".frm-field-action-icons",It),jQuery(document).on("show.bs.dropdown","#frm_field_group_controls",qt),n.on("click",".frm_single_option a[data-removeid]",xn),n.on("mousedown",".frm_single_option input[type=radio]",Sn),n.on("focusin",".frm_single_option input[type=text]",kn),n.on("click",".frm_add_opt",cn),n.on("change",".frm_single_option input",Kr),n.on("change",".frm_image_id",Kr),n.on("change",".frm_toggle_mult_sel",sn),P.on("click",".frm_primary_label",Dr),P.on("click",".frm_description",Mr),P.on("click","li.ui-state-default:not(.frm_noallow)",Rr),P.on("dblclick","li.ui-state-default",Hr),n.on("change",".frm_tax_form_select",Vr),n.on("change","select.conf_field",on),n.on("change",".frm_get_field_selection",vo),n.on("click",".frm-show-inline-modal",Qo),n.on("keydown",".frm-show-inline-modal",function(e){var t=e.key;"Enter"!==t&&" "!==t||(e.preventDefault(),Qo.call(this,e))}),n.on("click",".frm-inline-modal .dismiss",Lo),jQuery(document).on("change","[data-frmchange]",Io),document.addEventListener("click",Ao),n.on("change",".frm_include_extras_field",$t),n.on("change",'select[name^="field_options[form_select_"]',Aa),jQuery(document).on("submit","#frm_js_build_form",Ti),jQuery(document).on("change","#frm_builder_page input:not(.frm-search-input):not(.frm-custom-grid-size-input), #frm_builder_page select, #frm_builder_page textarea",Oi),Jt(),frmDom.util.documentOn("change",".frm_product_price",Ia),jQuery(document).on("change",".frmjs_prod_data_type_opt",qa),jQuery(document).on("focus",'.frm-single-settings ul input[type="text"][name^="field_options[options_"]',Sr),jQuery(document).on("blur",'.frm-single-settings ul input[type="text"][name^="field_options[options_"]',Qr),frmDom.util.documentOn("click",".frm-show-field-settings",Rr),frmDom.util.documentOn("change","select.frm_format_dropdown, select.frm_phone_type_dropdown",zr),n.on("keydown",'.frm_single_option input[name^="field_options["], .frm_single_option input[name^="rows_"]',function(e){"Enter"===e.key&&function(e){var t=e.closest(".frm_single_option").parentElement.querySelectorAll('.frm_single_option input[name^="field_options[" ], .frm_single_option input[name^="rows_"]'),n=Array.from(t),r=n.indexOf(e);if(!(r<0)){var o=n.slice(r+1).find(function(e){return null!==e.offsetParent});if(o){o.focus();var i=o.value.length;o.setSelectionRange(i,i)}}}(e.currentTarget)}),!1!==(t=ka("#frm-bulk-modal","700px"))&&(jQuery(".frm-insert-preset").on("click",ln),jQuery(R).on("click","a.frm-bulk-edit-link",function(e){e.preventDefault();var n="",r=jQuery(this).closest("[data-fid]").data("fid"),o=uo(r),i=Ba(r),a=document.getElementById("frm_field_".concat(r,"_opts"));if(a){var l=a.getElementsByTagName("li");document.getElementById("bulk-field-id").value=r;for(var c=0;c=l.length-1&&(document.getElementById("frm_bulk_options").value=n)}return t.dialog("open"),!1}}),jQuery("#frm-update-bulk-opts").on("click",function(){var e=document.getElementById("bulk-field-id").value;document.getElementById("bulk-option-type").value||(this.classList.add("frm_loading_button"),frmAdminBuild.updateOpts(e,document.getElementById("frm_bulk_options").value,t),Oi())})),ko(),document.addEventListener("frm_added_field",ko),wt(),Ca(),bo(),frmDom.util.documentOn("change",".frm_show_password_setting_input",function(e){var t=e.target.getAttribute("data-fid"),n=document.getElementById("frm_field_id_".concat(t));n&&n.classList.toggle("frm_disabled_show_password",!e.target.checked)}),document.addEventListener("scroll",Bi,!0),document.addEventListener("change",Ii),document.querySelector(".frm_form_builder").addEventListener("mousedown",function(e){e.shiftKey&&e.preventDefault()}),wp.hooks.addAction("frmShowedFieldSettings","formidableAdmin",function(e,t){t.querySelectorAll(".frm-collapse-me").forEach(Fr),function(e){if(!e.classList.contains("ui-sortable")&&e.querySelector(".frm_sortable_field_opts")){var t={items:".frm_sortable_field_opts li",axis:"y",opacity:.65,forcePlaceholderSize:!1,handle:".frm-drag",helper:function(e,t){return H=t.clone().insertAfter(t),t.clone()},stop:function(e,t){H&&H.remove(),Yr(t.item.attr("id").replace("frm_delete_field_","").replace("-".concat(t.item.data("optkey"),"_container"),"")),Oi()}};jQuery(e).sortable(t)}}(t)},9999),frm_admin_js.pricingFieldsModal&&"object"===s(frm_admin_js.pricingFieldsModal)&&se(frm_admin_js.pricingFieldsModal,"550px")},settingsInit:function(){var e=jQuery(document.getElementById("frm_notification_settings"));e.on("click",".frm_email_buttons",Zo),e.on("click",".frm_remove_field",ei),e.on("change",".frm_to_row, .frm_from_row",ti),e.on("change",".frm_tax_selector",vi),e.on("change","select.frm_single_post_field",si),e.on("change","select.frm_toggle_post_content",di),e.on("change","select.frm_dyncontent_opt",ui),e.on("change",".frm_post_type",fi),e.on("click",".frm_add_postmeta_row",pi),e.on("click",".frm_add_posttax_row",_i),e.on("click",".frm_toggle_cf_opts",yi),e.on("click",".frm_duplicate_form_action",$o),jQuery(".frm_actions_list").on("click",".frm_active_action",Jo),jQuery(document).on("frmAfterSearch","#actions-search-input",pe),oa(),document.querySelectorAll(".frm_actions_list a[data-actiontype]").forEach(function(e){return ni(e.dataset.actiontype)}),jQuery(".frm_submit_settings_btn").on("click",bi),Po();var t=jQuery(".frm_form_settings");t.on("click",".frm_add_form_logic",li),t.on("change","input[data-emailkey][data-toggleclass]",ci),t.on("click",".frm_already_used",ii),document.addEventListener("click",function(e){var t=e.target;t.closest(".frm_image_preview_wrapper")&&(t.closest(".frm_choose_image_box")?yn.bind(t)(e):t.closest(".frm_remove_image_option")&&hn.bind(t)(e))}),t.on("mouseup","*:not(.frm-show-box)",Ta),jQuery(document.getElementById("no_save")).on("change",function(){this.checked&&!0!==confirm(a.no_save_warning)&&jQuery(this).attr("checked",!1)}),document.querySelectorAll('a[href="#spam_settings"]').forEach(function(e){e.addEventListener("click",function(e){e.preventDefault();var t=document.querySelector('.frm-category-tabs a[href="#spam_settings"]');t&&(be(t),setTimeout(function(){var e=document.getElementById("frm-categorydiv");e&&e.scrollIntoView({block:"start"})},50))})});var n=document.getElementById("frm_include_captcha");if(n){var r=n.checked;n.addEventListener("change",function(){var e=document.getElementById("frm_captcha_add_warning"),t=document.getElementById("frm_captcha_remove_warning");e&&t&&(this.checked!==r?this.checked?(e.style.display="block",t.style.display="none"):(e.style.display="none",t.style.display="block"):(e.style.display="none",t.style.display="none"))})}jQuery('select[name="options[edit_action]"]').on("change",Wo);var o=document.getElementById("logged_in");jQuery(o).on("change",function(){this.checked?Sa(".hide_logged_in"):xa(".hide_logged_in")});var i=jQuery(document.getElementById("frm_cookie_expiration"));jQuery(document.getElementById("frm_single_entry_type")).on("change",function(){"cookie"===this.value?i.fadeIn("slow"):i.fadeOut("slow")});var l=document.getElementById("single_entry");jQuery(l).on("change",function(){this.checked?Sa(".hide_single_entry"):xa(".hide_single_entry"),this.checked&&"cookie"===jQuery(document.getElementById("frm_single_entry_type")).val()?i.fadeIn("slow"):i.fadeOut("slow")}),jQuery(".hide_save_draft").hide();var c=jQuery(document.getElementById("save_draft"));c.on("change",function(){this.checked?jQuery(".hide_save_draft").fadeIn("slow"):jQuery(".hide_save_draft").fadeOut("slow")}),Fo(c);var s=document.getElementById("editable");jQuery(s).on("change",function(){this.checked?(jQuery(".hide_editable").fadeIn("slow"),Fo(document.getElementById("edit_action"))):(jQuery(".hide_editable").fadeOut("slow"),jQuery(".edit_action_message_box").fadeOut("slow"))}),jQuery(document).on("change","#protect_files",function(){this.checked?jQuery(".hide_protect_files").fadeIn("slow"):jQuery(".hide_protect_files").fadeOut("slow")}),jQuery(document).on("frm-multiselect-changed","#protect_files_role",xo),jQuery(document).on("submit",".frm_form_settings",Fi),jQuery(document).on("change","#form_settings_page input:not(.frm-search-input), #form_settings_page select, #form_settings_page textarea",Oi),fa(),jQuery(document).on("frm-action-loaded",Ui),frmDom.util.documentOn("change",'.frm_on_submit_type input[type="radio"]',function(e){if(e.target.checked){var t=e.target.closest(".frm_form_action_settings");t.querySelectorAll(".frm_on_submit_dependent_setting:not(.frm_hidden)").forEach(function(e){e.classList.add("frm_hidden")}),t.querySelectorAll(".frm_on_submit_dependent_setting[data-show-if-".concat(e.target.value,"]")).forEach(function(e){e.classList.remove("frm_hidden")}),t.setAttribute("data-on-submit-type",e.target.value)}}),wp.hooks.addAction("frm_reset_fields_updated","formidableAdmin",Di)},panelInit:function(){jQuery(".frm_wrap, #postbox-container-1").on("click",".frm_insert_code",wi),jQuery(document).on("change",".frm_insert_val",function(){ji(jQuery(this).data("target"),jQuery(this).val()),jQuery(this).val("")}),jQuery(document).on("click change",'[name="frm-id-key-condition"]',Si),jQuery(document).on("keyup change",".frm-build-logic",ki),Uo(),jQuery(document).on("frmElementAdded",function(e,t){Uo(t)}),jQuery(document).on("mousedown",".frm-show-box",Ai);var e=document.getElementById("form_settings_page"),t=document.body.classList.contains("post-type-frm_display"),n=document.getElementById("frm_insert_fields_tab");(e||t||ae)&&jQuery(document).on("focusin","form input, form textarea",function(r){var o,i,a;if(r.stopPropagation(),Li(this),jQuery(this).is(":not(:submit, input[type=button], .frm-search-input, input[type=checkbox])")){if(jQuery(r.target).closest("#frm_adv_info").length)return;if(e||ae)o=jQuery("#frm_html_tab"),jQuery(this).closest("#html_settings").length>0?(o.show(),o.siblings().hide(),jQuery("#frm_html_tab a").trigger("click"),void 0===(a=this.id)||a.includes("-search-input")||(jQuery("#frm-adv-info-tab").attr("data-fills",a.trim()),this.classList.contains("field_custom_html")&&(a="field_custom_html"),jQuery.inArray(a,["after_html","before_html","submit_html","field_custom_html"])>=0&&(jQuery(".frm_code_list li:not(.show_".concat(a,")")).addClass("frm_hidden"),jQuery(".frm_code_list li.show_".concat(a)).removeClass("frm_hidden")))):((i=jQuery(".frm-category-tabs li"))[0]&&(i[0].style.display=""),n.click(),o.hide(),o.siblings().show());else if(t){var l=new CustomEvent("frm_legacy_views_handle_field_focus");l.frmData={idAttrValue:this.id},document.dispatchEvent(l)}}}),jQuery(".frm_wrap, #postbox-container-1").on("mousedown","#frm_adv_info a, .frm_field_list a",function(e){e.preventDefault()});var r=jQuery("#frm_adv_info");r.on("click",".subsubsub a.frmids",function(e){Gi("frmids",e)}),r.on("click",".subsubsub a.frmkeys",function(e){Gi("frmkeys",e)})},inboxInit:function(){var e;jQuery(".frm_inbox_dismiss").on("click",function(e){var t=this.parentNode.parentNode,n=t.getAttribute("data-message"),r=this.getAttribute("href"),o=t.cloneNode(!0),i=document.querySelector(".frm-dismissed-inbox-messages");if("free_templates"!==n||this.classList.contains("frm_inbox_dismiss")){e.preventDefault();var a={action:"frm_inbox_dismiss",key:n,nonce:frmGlobal.nonce},l="frm_inbox_slide_in"===t.id;l&&(t.classList.remove("s11-fadein"),t.classList.add("s11-fadeout"),t.addEventListener("animationend",function(){return t.remove()},{once:!0})),ja(a,function(){if(!l)return"#"!==r?(window.location=r,!0):void Ea(t,function(){var e;i&&(o.classList.remove("frm-fade"),null===(e=o.querySelector(".frm-inbox-message-heading .frm_inbox_dismiss"))||void 0===e||e.remove(),i.append(o)),1===t.parentNode.querySelectorAll(".frm-inbox-message-container").length&&(document.getElementById("frm_empty_inbox").classList.remove("frm_hidden"),t.parentNode.closest(".frm-active").classList.add("frm-empty-inbox"),sa()),t.remove()})})}}),!1===(null===(e=document.getElementById("frm_empty_inbox"))||void 0===e?void 0:e.classList.contains("frm_hidden"))&&sa()},solutionInit:function(){jQuery(document).on("submit","#frm-new-template",_a)},styleInit:function(){var e=jQuery(".frm_image_preview_wrapper");e.on("click",".frm_choose_image_box",yn),e.on("click",".frm_remove_image_option",hn),wp.hooks.doAction("frm_style_editor_init")},customCSSInit:function(){console.warn("Calling frmAdminBuild.customCSSInit is deprecated.")},globalSettingsInit:function(){jQuery(document).on("click","[data-frmuninstall]",Wi),oa();var e=document.getElementById("licenses_settings");e&&jQuery(e).on("click",".edd_frm_save_license",$i),jQuery(document).on("click","#frm-new-template button",ma),jQuery("#frm-dismissable-cta .dismiss").on("click",function(e){e.preventDefault(),jQuery.post(ajaxurl,{action:"frm_lite_settings_upgrade",nonce:frmGlobal.nonce}),jQuery(".settings-lite-cta").remove()});var t=document.getElementById("frm_re_type");t&&t.addEventListener("change",ga),document.querySelector(".frm_captchas").addEventListener("change",function(e){var t,n=null===(t=document.querySelector('.frm_captchas input[checked="checked"]'))||void 0===t?void 0:t.value,r=e.target.value!==n;document.querySelector(".captcha_settings .frm_note_style").classList.toggle("frm_hidden",!r)}),frmDom.util.documentOn("submit",".frm_settings_form",function(){G=0});var n=document.getElementById("manage_styles_settings");n&&n.addEventListener("change",function(e){var t=e.target;"SELECT"===t.nodeName&&t.dataset.name&&!t.getAttribute("name")&&t.setAttribute("name",t.dataset.name)});var r=document.getElementById("payments_settings"),o=null==r?void 0:r.querySelectorAll('[name="frm_payment_section"]');o&&o.forEach(function(e){e.addEventListener("change",function(){if(e.checked){var t=r.querySelector('label[for="'.concat(e.id,'"]'));t&&t.setAttribute("aria-selected","true"),o.forEach(function(t){if(t!==e){var n=r.querySelector('label[for="'.concat(t.id,'"]'));n&&n.setAttribute("aria-selected","false")}})}})})},exportInit:function(){jQuery(".frm_form_importer").on("submit",Vi),jQuery(document.getElementById("frm_export_xml")).on("submit",Ji),jQuery("#frm_export_xml input, #frm_export_xml select").on("change",Xi),jQuery('input[name="frm_import_file"]').on("change",Yi),document.querySelector('select[name="format"]').addEventListener("change",ea),jQuery('input[name="frm_export_forms[]"]').on("click",ra),oa(),jQuery(".frm-feature-banner .dismiss").on("click",function(e){e.preventDefault(),jQuery.post(ajaxurl,{action:"frm_dismiss_migrator",plugin:this.id,nonce:frmGlobal.nonce}),this.parentElement.remove()}),na(Zi()),document.querySelector("#frm-export-select-all").addEventListener("change",function(e){document.querySelectorAll('[name="frm_export_forms[]"]').forEach(function(t){t.checked=e.target.checked})})},inboxBannerInit:function(){var e=document.getElementById("frm_banner");if(e){var t=e.querySelector(".frm-banner-dismiss");document.addEventListener("click",function(n){n.target===t&&ja({action:"frm_inbox_dismiss",key:e.dataset.key,nonce:frmGlobal.nonce},function(){jQuery(e).fadeOut(400,function(){e.remove()})})})}},updateOpts:function(e,t,n){var r=uo(e),o=Ba(e)?"frm_bulk_products":"frm_import_options";jQuery.ajax({type:"POST",url:ajaxurl,data:{action:o,field_id:e,opts:t,separate:r,nonce:frmGlobal.nonce},success:function(t){document.getElementById("frm_field_".concat(e,"_opts")).innerHTML=t,wp.hooks.doAction("frm_after_bulk_edit_opts",e),Yr(e),void 0!==n&&(n.dialog("close"),document.getElementById("frm-update-bulk-opts").classList.remove("frm_loading_button"))}})},triggerRemoveLogic:function(e,t){jQuery("#frm_logic_".concat(e,"_").concat(t," .frm_remove_tag")).trigger("click")},downloadXML:function(e,t,n){var r="".concat(ajaxurl,"?action=frm_").concat(e,"_xml&ids=").concat(t);null!==n&&(r="".concat(r,"&is_template=").concat(n)),location.href=r},hooks:{applyFilters:function(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),o=1;o1?n-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(function(n){var r=U,o=0;"summary"===e&&(o=P.children('li[data-type="break"]').length>0?1:0),jQuery.ajax({type:"POST",url:ajaxurl,data:Object.assign(Ke(e,0,r,o),{field_options:t}),success:function(t){n(t),setTimeout(function(){ho(),Ft(t,!0);var n=Ye(t);n&&wp.hooks.doAction("frm_after_field_added_in_form_builder",{field:t,fieldId:n,fieldType:e,form_id:r})},10)},error:et})})},confirmLinkClick:ce,handleInsertFieldByDraggingResponse:Xe,handleAddFieldClickResponse:bt,syncLayoutClasses:Re,moveFieldSettings:Yo,maybeCollapseSettings:Tr}},window.frmAdminBuild=frmAdminBuildJS(),jQuery(document).ready(function(){var e;frmAdminBuild.init(),k(),document.querySelectorAll(".frm-dropdown-menu").forEach(function(e){e.classList.add("dropdown-menu");var t,n,r=e.querySelector(".frm-dropdown-toggle");r&&(r.hasAttribute("role")||r.setAttribute("role","button"),r.hasAttribute("tabindex")||r.setAttribute("tabindex",0)),"UL"===e.tagName&&(n=(n=(n=(n=(n=(n=(t=e).outerHTML).replace("","")).replaceAll("- ",'
')).replaceAll('
- ","
"),t.outerHTML=n)}),null===(e=document.querySelector(".preview.dropdown .frm-dropdown-toggle"))||void 0===e||e.setAttribute("data-bs-toggle","dropdown"),document.querySelectorAll("[data-toggle]").forEach(function(e){return e.setAttribute("data-bs-toggle",e.getAttribute("data-toggle"))})}),window.frm_show_div=function(e,t,n,r){t==n?jQuery(r+e).fadeIn("slow").css("visibility","visible"):jQuery(r+e).fadeOut("slow")},window.frmCheckAll=function(e,t){jQuery('input[name^="'.concat(t,'"]')).prop("checked",Boolean(e))},window.frmCheckAllLevel=function(e,t,n){jQuery(".frm_catlevel_".concat(n)).children(".frm_checkbox").children("label").children('input[name^="'.concat(t,'"]')).prop("checked",Boolean(e))},window.frmGetFieldValues=function(e,t,n,r,o,i){e&&jQuery.ajax({type:"POST",url:ajaxurl,data:"action=frm_get_field_values¤t_field=".concat(t,"&field_id=").concat(e,"&name=").concat(o,"&t=").concat(r,"&form_action=").concat(jQuery('input[name="frm_action"]').val(),"&nonce=").concat(frmGlobal.nonce),success:function(e){document.getElementById("frm_show_selected_values_".concat(t,"_").concat(n)).innerHTML=e,"function"==typeof i&&i()}})},n(365),window.frmImportCsv=function(e){var t="";"undefined"!=typeof __FRMURLVARS&&(t=__FRMURLVARS),jQuery.ajax({type:"POST",url:ajaxurl,data:"action=frm_import_csv&nonce=".concat(frmGlobal.nonce,"&frm_skip_cookie=1").concat(t),success:function(t){var n=jQuery(".frm_admin_progress_bar").attr("aria-valuemax"),r=n-t,o=r/n*100;jQuery(".frm_admin_progress_bar").css("width","".concat(o,"%")).attr("aria-valuenow",r),parseInt(t,10)>0?(jQuery(".frm_csv_remaining").html(t),frmImportCsv(e)):(jQuery(document.getElementById("frm_import_message")).html(frm_admin_js.import_complete),setTimeout(function(){location.href="?page=formidable-entries&frm_action=list&form=".concat(e,"&import-message=1")},2e3))}})}})();
\ No newline at end of file
diff --git a/js/src/admin/admin.js b/js/src/admin/admin.js
index 6dd3cbb11f..a529adf99b 100644
--- a/js/src/admin/admin.js
+++ b/js/src/admin/admin.js
@@ -7,6 +7,8 @@ const { validateField } = require( './settings/validateField' );
const { getRangeSettingsDefaults, validateNumberRangeSetting, validateStepSetting, validateRangeSettings } = require( './settings/validateRangeSettings' );
const { initFieldListHoverPill } = require( './fieldListHoverPill' );
const { initShowBoxIconSwap } = require( './showBoxIconSwap' );
+const { hydrateBuilderSelect, hydrateBuilderSelectsIn } = require( './sharedSelectOptions' );
+const { processFieldLoadBatch } = require( './fieldLoadBatch' );
window.FrmFormsConnect = window.FrmFormsConnect || ( function( document, window, $ ) {
const el = {
@@ -2646,7 +2648,7 @@ window.frmAdminBuildJS = function() {
const FIELD_LOAD_BATCH_SIZE = 40;
/**
- * How many frm_load_field requests may be in flight at once.
+ * How many field batches may be downloading or rendering at once.
*
* Responses are safe to arrive in any order because every field replaces its own placeholder by
* id, and the placeholders are already sitting in the page in the right order.
@@ -2774,10 +2776,16 @@ window.frmAdminBuildJS = function() {
form_id: thisFormId,
nonce: frmGlobal.nonce
},
- success: handleAjaxLoadFieldSuccess,
- complete: () => {
- --activeFieldLoadRequests;
- fillFieldLoadQueue();
+ success: async response => {
+ try {
+ await handleAjaxLoadFieldSuccess( response, fieldIds );
+ } finally {
+ completeFieldLoadRequest();
+ }
+ },
+ error: () => {
+ showFieldLoadError( fieldIds );
+ completeFieldLoadRequest();
}
} );
}
@@ -2790,70 +2798,117 @@ window.frmAdminBuildJS = function() {
}
/**
- * Swap the placeholders for the fields the server rendered.
+ * Release a queue slot only after its fields and their controls are ready.
*
- * @param {string} response A json object of field id to { type, html }, plus a tooltips map of
- * data-tip-key to text for the tooltips in those fields.
+ * @since x.x
* @return {void}
*/
- function handleAjaxLoadFieldSuccess( response ) {
- let key;
+ function completeFieldLoadRequest() {
+ --activeFieldLoadRequests;
+ fillFieldLoadQueue();
+ }
+
+ /**
+ * Keep failed placeholders claimed so they are not automatically requested again.
+ *
+ * @since x.x
+ * @param {string[]} fieldIds The fields belonging to the failed request.
+ * @return {void}
+ */
+ function showFieldLoadError( fieldIds ) {
+ fieldIds.forEach( fieldId => {
+ const field = document.getElementById( `frm_field_id_${ fieldId }` );
+ if ( field?.classList.contains( 'frm_field_loading' ) ) {
+ field.textContent = __( 'Unable to load field.', 'formidable' );
+ }
+ } );
+ }
- // eslint-disable-next-line sonarjs/super-linear-regex -- regex kept as-is, not refactored
- response = response.replace( /^\s+|\s+$/g, '' );
- if ( response.indexOf( '{' ) !== 0 ) {
- jQuery( '.frm_load_now' ).removeClass( '.frm_load_now' ).html( 'Error' );
+ /**
+ * Swap placeholders in short slices while keeping each slice's controls ready for input.
+ *
+ * @param {string} response A JSON object of field HTML and shared option and tooltip maps.
+ * @param {string[]} fieldIds The fields requested in this batch.
+ * @return {Promise|void} Resolves after the last slice has initialized.
+ */
+ function handleAjaxLoadFieldSuccess( response, fieldIds ) {
+ let data;
+ try {
+ data = JSON.parse( response );
+ } catch {
+ showFieldLoadError( fieldIds );
+ return;
+ }
+ if ( ! data || typeof data !== 'object' || Array.isArray( data ) ) {
+ showFieldLoadError( fieldIds );
return;
}
- const { tooltips, ...loadedFields } = JSON.parse( response );
- const newFields = [];
-
- // The text behind each data-tip-key in this batch. Keys are hashes of the text, so merging
- // a batch on top of what the page already has can only ever re-add the same strings.
+ const { tooltips, selectOptions, ...loadedFields } = data;
+ if ( selectOptions ) {
+ frm_admin_js.selectOptions = { ...frm_admin_js.selectOptions, ...selectOptions };
+ }
if ( tooltips && window.frm_admin_js ) {
frm_admin_js.tooltips = { ...frm_admin_js.tooltips, ...tooltips };
}
- // Field ids and types for the listeners of frm_ajax_loaded_field.
- const loadedFieldData = [];
- for ( key in loadedFields ) {
- if ( ! Object.hasOwn( loadedFields, key ) ) {
- continue;
- }
- const oldField = document.getElementById( `frm_field_id_${ key }` );
- if ( oldField ) {
- placeholderSpinnerObserver?.unobserve( oldField );
- dragDropObserver.unobserve( oldField );
- dragDropAttachers.delete( oldField );
- }
- jQuery( `#frm_field_id_${ key }` ).replaceWith( loadedFields[ key ].html );
- loadedFieldData.push( { id: key, type: loadedFields[ key ].type } );
+ return processFieldLoadBatch(
+ Object.entries( loadedFields ),
+ renderLoadedField,
+ initializeLoadedFieldSlice
+ );
+ }
- const newReplacedField = document.getElementById( `frm_field_id_${ key }` );
- if ( newReplacedField ) {
- newFields.push( newReplacedField );
- newReplacedField.querySelectorAll( '[data-toggle]' ).forEach( toggle => toggle.setAttribute( 'data-bs-toggle', toggle.getAttribute( 'data-toggle' ) ) );
- newReplacedField.querySelectorAll( '.frm-dropdown-menu' ).forEach( dropdownMenu => dropdownMenu.classList.add( 'dropdown-menu' ) );
- newReplacedField.querySelectorAll( '[data-tip-key]' ).forEach( resolveDeferredTooltip );
- }
+ /**
+ * Replace one placeholder and prepare its builder interactions.
+ *
+ * @since x.x
+ * @param {Array} entry The field ID and its rendered HTML and type.
+ * @return {Object|null} The inserted field, or null if its placeholder was deleted.
+ */
+ function renderLoadedField( entry ) {
+ const [ key, field ] = entry;
+ const oldField = document.getElementById( `frm_field_id_${ key }` );
+ if ( ! oldField ) {
+ return null;
+ }
+ placeholderSpinnerObserver?.unobserve( oldField );
+ dragDropObserver.unobserve( oldField );
+ dragDropAttachers.delete( oldField );
+ jQuery( oldField ).replaceWith( field.html );
- setupSortable( `#frm_field_id_${ key }.edit_field_type_divider ul.frm_sorting` );
- lazyMakeDraggable( document.getElementById( `frm_field_id_${ key }` ) );
+ const element = document.getElementById( `frm_field_id_${ key }` );
+ if ( ! element ) {
+ return null;
}
+ element.querySelectorAll( '[data-toggle]' ).forEach( toggle => toggle.setAttribute( 'data-bs-toggle', toggle.getAttribute( 'data-toggle' ) ) );
+ element.querySelectorAll( '.frm-dropdown-menu' ).forEach( dropdownMenu => dropdownMenu.classList.add( 'dropdown-menu' ) );
+ element.querySelectorAll( '[data-tip-key]' ).forEach( resolveDeferredTooltip );
+ setupSortable( `#frm_field_id_${ key }.edit_field_type_divider ul.frm_sorting` );
+ lazyMakeDraggable( element );
+ return { id: key, type: field.type, element };
+ }
- // Only the fields that just arrived need this. Doing it for the whole page once per batch
- // re-initializes every field loaded so far, which turns into quadratic work on a long form.
- initiateMultiselect( newFields );
+ /**
+ * Initialize only the fields inserted in this slice before yielding to user input.
+ *
+ * @since x.x
+ * @param {Array} fields The inserted fields, including null for deleted placeholders.
+ * @return {void}
+ */
+ function initializeLoadedFieldSlice( fields ) {
+ const loadedFields = fields.filter( Boolean );
+ if ( ! loadedFields.length ) {
+ return;
+ }
+ initiateMultiselect( loadedFields.map( field => field.element ) );
if ( dragState.dragging ) {
- // A batch replaces placeholders with the real fields, so everything below it moves.
- // The drag is not re-measuring on its own, so tell it the rows have shifted.
refreshDroppableOffsets();
}
const loadedEvent = new Event( 'frm_ajax_loaded_field', { bubbles: false } );
- loadedEvent.frmFields = loadedFieldData;
+ loadedEvent.frmFields = loadedFields.map( ( { id, type } ) => ( { id, type } ) );
document.dispatchEvent( loadedEvent );
}
@@ -8633,6 +8688,7 @@ window.frmAdminBuildJS = function() {
}
const singleField = document.getElementById( `frm-single-settings-${ fieldId }` );
+ hydrateBuilderSelectsIn( singleField );
moveFieldSettings( singleField );
if ( fieldType && 'quantity' === fieldType ) {
@@ -10427,6 +10483,7 @@ window.frmAdminBuildJS = function() {
const $multiselect = ( container ? jQuery( container ).find( '.frm_multiselect' ) : jQuery( '.frm_multiselect' ) )
.not( '.frm-single-settings.frm_hidden .frm_multiselect' );
+ $multiselect.toArray().forEach( hydrateBuilderSelect );
$multiselect.hide().each( frmDom.bootstrap.multiselect.init );
}
@@ -11742,6 +11799,11 @@ window.frmAdminBuildJS = function() {
},
buildInit() {
+ document.addEventListener( 'focusin', event => {
+ if ( event.target.matches( 'select[data-frm-options]' ) ) {
+ hydrateBuilderSelect( event.target );
+ }
+ } );
jQuery( '#frm_builder_page' ).on( 'mouseup', '*:not(.frm-show-box)', maybeHideShortcodes );
debouncedSyncAfterDragAndDrop = debounce( syncAfterDragAndDrop, 10 );
diff --git a/js/src/admin/fieldLoadBatch.js b/js/src/admin/fieldLoadBatch.js
new file mode 100644
index 0000000000..8169150bfa
--- /dev/null
+++ b/js/src/admin/fieldLoadBatch.js
@@ -0,0 +1,36 @@
+/**
+ * Target time spent inserting fields before their controls initialize and input can run.
+ * One expensive field or an initialization listener can exceed this budget.
+ */
+const FIELD_RENDER_BUDGET = 8;
+
+/**
+ * Separate the network batch size from the amount of synchronous browser work.
+ *
+ * @since x.x
+ * @param {Array} fields The fields returned by one request, in insertion order.
+ * @param {Function} renderField Inserts a field and returns its initialization data.
+ * @param {Function} initializeSlice Initializes all fields inserted since the last yield.
+ * @return {Promise} Resolves when every field has been inserted and initialized.
+ */
+export async function processFieldLoadBatch( fields, renderField, initializeSlice ) {
+ let slice = [];
+ let sliceStarted = performance.now();
+ const lastIndex = fields.length - 1;
+
+ for ( let index = 0; index <= lastIndex; ++index ) {
+ slice.push( renderField( fields[ index ] ) );
+ const isLastField = index === lastIndex;
+ if ( ! isLastField && performance.now() - sliceStarted < FIELD_RENDER_BUDGET ) {
+ continue;
+ }
+
+ initializeSlice( slice );
+ slice = [];
+ if ( ! isLastField ) {
+ // A new task lets input run. A resolved Promise would only queue a microtask.
+ await new Promise( resolve => setTimeout( resolve, 0 ) );
+ sliceStarted = performance.now();
+ }
+ }
+}
diff --git a/js/src/admin/sharedSelectOptions.js b/js/src/admin/sharedSelectOptions.js
new file mode 100644
index 0000000000..bfcdfdcb92
--- /dev/null
+++ b/js/src/admin/sharedSelectOptions.js
@@ -0,0 +1,54 @@
+const templates = new Map();
+
+/**
+ * Populate a builder select from an already delivered option list.
+ *
+ * @since x.x
+ * @param {HTMLSelectElement} select The select whose saved options are already present.
+ * @return {void}
+ */
+export function hydrateBuilderSelect( select ) {
+ const key = select.dataset.frmOptions;
+ const records = window.frm_admin_js?.selectOptions?.[ key ];
+ if ( ! key || ! records ) {
+ return;
+ }
+
+ if ( ! templates.has( key ) ) {
+ const template = frmDom.tag( 'select' );
+ const options = records.map( record => {
+ const option = frmDom.tag( 'option', { text: record.label || ' ' } );
+ Object.entries( record.attributes ).forEach( ( [ name, value ] ) => option.setAttribute( name, value ) );
+ option.value = record.value;
+ return option;
+ } );
+ template.append( ...options );
+ templates.set( key, template );
+ }
+
+ const selected = new Set( Array.from( select.selectedOptions, option => option.value ) );
+ const defaults = new Set( Array.from( select.options ).filter( option => option.defaultSelected ).map( option => option.value ) );
+ const options = Array.from( templates.get( key ).cloneNode( true ).options );
+ const fragment = document.createDocumentFragment();
+ fragment.append( ...options );
+ options.forEach( option => {
+ option.defaultSelected = defaults.has( option.value );
+ option.selected = selected.has( option.value );
+ } );
+ select.replaceChildren( fragment );
+ if ( ! select.multiple && ! selected.size ) {
+ select.selectedIndex = -1;
+ }
+ delete select.dataset.frmOptions;
+}
+
+/**
+ * Populate options before a settings panel's controls and multiselects are shown.
+ *
+ * @since x.x
+ * @param {HTMLElement} container The settings panel being opened.
+ * @return {void}
+ */
+export function hydrateBuilderSelectsIn( container ) {
+ container.querySelectorAll( 'select[data-frm-options]' ).forEach( hydrateBuilderSelect );
+}
diff --git a/js/src/settings-components/components/radio-component.js b/js/src/settings-components/components/radio-component.js
index 60f7109bb7..ed516f7af7 100644
--- a/js/src/settings-components/components/radio-component.js
+++ b/js/src/settings-components/components/radio-component.js
@@ -1,8 +1,8 @@
/**
* Internal dependencies
*/
-import { HIDDEN_CLASS } from 'core/constants';
-import { show, hide, isVisible } from 'core/utils';
+import { HIDDEN_CLASS, HOOKS } from 'core/constants';
+import { show, hide } from 'core/utils';
/**
* Represents a radio component.
@@ -11,30 +11,18 @@ import { show, hide, isVisible } from 'core/utils';
*/
export default class frmRadioComponent {
constructor() {
- this.radioElements = document.querySelectorAll( '.frm-style-component.frm-radio-component' );
+ this.radioElements = Array.from( document.querySelectorAll( '.frm-style-component.frm-radio-component' ) )
+ .filter( element => ! element.closest( '.frm-single-settings' ) );
this.observers = new Map();
+ this.initializedRadios = new WeakSet();
+ this.activeFieldSettings = null;
if ( 0 < this.radioElements.length ) {
this.init();
}
- /**
- * Handles the addition of new fields.
- *
- * @param {Event} event The frm_added_field event.
- * @param {HTMLElement} event.frmField The added field object being destructured from the event.
- */
- document.addEventListener( 'frm_added_field', ( { frmField } ) =>
- this.discoverAndInitFieldRadios( frmField.dataset.fid )
- );
-
- /**
- * Handles the addition of new fields via AJAX.
- *
- * @param {Event} event The frm_ajax_loaded_field event.
- * @param {HTMLElement} event.frmFields The added field objects being destructured from the event.
- */
- document.addEventListener( 'frm_ajax_loaded_field', ( { frmFields } ) =>
- frmFields.forEach( field => this.discoverAndInitFieldRadios( field.id ) )
+ // Field settings, including newly added and batch-loaded fields, initialize on first use.
+ wp.hooks.addAction( HOOKS.SHOW_FIELD_SETTINGS, 'formidable-radio-component', ( obj, fieldSettingsEl ) =>
+ this.discoverAndInitFieldRadios( fieldSettingsEl.dataset.fid )
);
// Cleanup observers when page unloads to prevent memory leaks
@@ -66,6 +54,14 @@ export default class frmRadioComponent {
throw new Error( `Field container not found for field ID: ${ fieldId }` );
}
+ // Keep style-editor observers, but stop observing the previous field's settings.
+ this.observers.forEach( ( observer, element ) => {
+ if ( this.activeFieldSettings?.contains( element ) ) {
+ observer.disconnect();
+ this.observers.delete( element );
+ }
+ } );
+ this.activeFieldSettings = fieldContainer;
this.radioElements = fieldContainer.querySelectorAll( '.frm-style-component.frm-radio-component' );
this.initRadio();
}
@@ -105,6 +101,10 @@ export default class frmRadioComponent {
if ( radio.checked ) {
this.onRadioChange( radio );
}
+ if ( this.initializedRadios.has( radio ) ) {
+ return;
+ }
+ this.initializedRadios.add( radio );
radio.addEventListener( 'change', event => {
this.onRadioChange( event.target );
} );
@@ -158,7 +158,9 @@ export default class frmRadioComponent {
return;
}
- this.moveTracker( activeItem, wrapper );
+ if ( wrapper.getClientRects().length ) {
+ this.moveTracker( activeItem, wrapper );
+ }
this.hideExtraElements( target );
this.maybeShowExtraElements( target );
this.syncAriaChecked( wrapper );
@@ -190,7 +192,8 @@ export default class frmRadioComponent {
return;
}
- const elements = document.querySelectorAll( `div[data-frm-element="${ elementAttr }"]` );
+ const container = radio.closest( '.frm-single-settings' ) || document;
+ const elements = container.querySelectorAll( `div[data-frm-element="${ elementAttr }"]` );
if ( 0 === elements.length ) {
return;
@@ -213,9 +216,9 @@ export default class frmRadioComponent {
}
this.resizeTimeout = requestAnimationFrame( () => {
this.resizeTimeout = null;
- document.querySelectorAll( '.frm-radio-component input[type="radio"]:checked' ).forEach( radio => {
- const wrapper = radio.closest( '.frm-radio-component' );
- if ( wrapper && wrapper.offsetWidth > 0 ) {
+ this.observers.forEach( ( observer, wrapper ) => {
+ const radio = wrapper.querySelector( 'input[type="radio"]:checked' );
+ if ( radio && wrapper.getClientRects().length ) {
this.onRadioChange( radio );
}
} );
@@ -235,7 +238,7 @@ export default class frmRadioComponent {
const observer = new MutationObserver( () => {
// Check if element is now visible
- if ( isVisible( element ) ) {
+ if ( element.getClientRects().length ) {
const radio = element.querySelector( 'input[type="radio"]:checked' );
if ( radio ) {
this.onRadioChange( radio );
@@ -275,9 +278,12 @@ export default class frmRadioComponent {
/**
* Hide the possible opepend extra elements.
+ *
+ * @param {HTMLElement} [target] The radio whose related settings are being updated.
*/
- hideExtraElements() {
- const elements = document.querySelectorAll( '.frm-element-is-visible' );
+ hideExtraElements( target ) {
+ const container = target?.closest( '.frm-single-settings' ) || document;
+ const elements = container.querySelectorAll( '.frm-element-is-visible' );
if ( 0 === elements.length ) {
return;
}
diff --git a/js/src/settings-components/components/token-input/proxy-input-style.js b/js/src/settings-components/components/token-input/proxy-input-style.js
index d0db991680..758624a531 100644
--- a/js/src/settings-components/components/token-input/proxy-input-style.js
+++ b/js/src/settings-components/components/token-input/proxy-input-style.js
@@ -7,12 +7,13 @@
import { CLASS_NAMES, PROXY_INPUT_HEIGHT, TOKEN_GAP } from './constants';
/**
- * Adjust styling for all proxy inputs on the current settings
+ * Adjust styling for all proxy inputs in a settings panel.
*
+ * @param {HTMLElement|Document} settings The container whose token inputs need adjustment.
* @return {void}
*/
-export function adjustAllProxyInputStyles() {
- document.querySelectorAll( `.${ CLASS_NAMES.CONTAINER }` ).forEach( container =>
+export function adjustAllProxyInputStyles( settings = document ) {
+ settings.querySelectorAll( `.${ CLASS_NAMES.CONTAINER }` ).forEach( container =>
adjustProxyInputStyle(
container.querySelector( `.${ CLASS_NAMES.TOKEN_PROXY_INPUT }` ),
container.querySelector( `.${ CLASS_NAMES.TOKENS_WRAPPER }` )
diff --git a/js/src/settings-components/components/token-input/token-input.js b/js/src/settings-components/components/token-input/token-input.js
index 513a55c6f0..6b7b4f046f 100644
--- a/js/src/settings-components/components/token-input/token-input.js
+++ b/js/src/settings-components/components/token-input/token-input.js
@@ -30,26 +30,16 @@ function initTokenInputFields() {
findAndInitializeTokenFields( frmField.dataset.fid )
);
- /**
- * Initialize for newly added fields via AJAX
- *
- * @param {Event} event The frm_ajax_loaded_field event.
- * @param {HTMLElement} event.frmFields The added field objects being destructured from the event.
- */
- document.addEventListener( 'frm_ajax_loaded_field', ( { frmFields } ) =>
- frmFields.forEach( field => findAndInitializeTokenFields( field.id ) )
- );
-
/**
* Initialize token inputs for a field settings panel the first time it's shown,
- * then adjust styling for all token inputs initialized so far.
+ * including fields loaded in AJAX batches. Only adjust styling in the shown panel.
*
* @param {Object} obj The field element that was selected.
* @param {HTMLElement} fieldSettingsEl The field settings panel that was shown.
*/
wp.hooks.addAction( HOOKS.SHOW_FIELD_SETTINGS, 'formidable-token-input', ( obj, fieldSettingsEl ) => {
findAndInitializeTokenFields( fieldSettingsEl.id.replace( 'frm-single-settings-', '' ) );
- adjustAllProxyInputStyles();
+ adjustAllProxyInputStyles( fieldSettingsEl );
} );
}
diff --git a/tests/cypress/e2e/Forms/formsSettings.cy.js b/tests/cypress/e2e/Forms/formsSettings.cy.js
index 3855b892d3..8ba7c3409a 100644
--- a/tests/cypress/e2e/Forms/formsSettings.cy.js
+++ b/tests/cypress/e2e/Forms/formsSettings.cy.js
@@ -6,16 +6,15 @@ describe( 'Updating form settings', () => {
} );
it( "should 'Show the form title' and 'Show the form description' on the preview form", () => {
- cy.log( 'Create a blank form' );
- cy.contains( '.frm_nav_bar .button-primary', 'Add New' ).click();
- cy.get( '.frm-list-grid-layout #frm-form-templates-create-form' ).should( 'contain', 'Create a blank form' ).click();
- cy.get( '#frm_submit_side_top', { timeout: 5000 } ).should( 'contain', 'Save' ).click();
- cy.get( '#frm_new_form_name_input' ).type( 'Test Form' );
- cy.get( '#frm-save-form-name-button' ).should( 'contain', 'Save' ).click();
+ // Saving the form name redirects to the forms list asynchronously, so open the builder
+ // deliberately instead of racing that redirect.
+ cy.createNewForm();
+ cy.openForm();
cy.log( `Create a text field` );
// Plain, always-visible sidebar link - no hover gating involved.
cy.get( `li[id="text"] a[title="Text"]` ).should( 'be.visible' ).click();
+ cy.get( '.frm-type-text', { timeout: 10000 } ).should( 'exist' );
cy.log( 'Update form' );
cy.get( '#frm_submit_side_top' ).should( 'contain', 'Update' ).click();
@@ -81,16 +80,15 @@ describe( 'Updating form settings', () => {
it( 'should redirect you to a specific URL after submitting a form', () => {
const Origin = Cypress.config( 'baseUrl' );
- cy.log( 'Create a blank form' );
- cy.contains( '.frm_nav_bar .button-primary', 'Add New' ).click();
- cy.get( '.frm-list-grid-layout #frm-form-templates-create-form' ).should( 'contain', 'Create a blank form' ).click();
- cy.get( '#frm_submit_side_top', { timeout: 5000 } ).should( 'contain', 'Save' ).click();
- cy.get( '#frm_new_form_name_input' ).type( 'Test Form' );
- cy.get( '#frm-save-form-name-button' ).should( 'contain', 'Save' ).click();
+ // Saving the form name redirects to the forms list asynchronously, so open the builder
+ // deliberately instead of racing that redirect.
+ cy.createNewForm();
+ cy.openForm();
cy.log( `Create a text field` );
// Plain, always-visible sidebar link - no hover gating involved.
cy.get( 'li[id="text"] a[title="Text"]', { timeout: 5000 } ).should( 'be.visible' ).click();
+ cy.get( '.frm-type-text', { timeout: 10000 } ).should( 'exist' );
cy.log( 'Update form' );
// Plain cy.get() rather than cy.contains() works unforced elsewhere in the suite for this
@@ -124,7 +122,9 @@ describe( 'Updating form settings', () => {
cy.log( 'Verify URL redirect after submitting form' );
cy.origin( 'https://formidableforms.com', () => {
- cy.location( 'href', { timeout: 10000 } ).should( 'include', 'https://formidableforms.com/' );
+ // Errors thrown by the marketing site's own scripts are not under test here.
+ Cypress.on( 'uncaught:exception', () => false );
+ cy.location( 'href', { timeout: 20000 } ).should( 'include', 'https://formidableforms.com/' );
} );
cy.log( 'Navigate back to the formidable form page' );
@@ -145,7 +145,9 @@ describe( 'Updating form settings', () => {
cy.log( 'Verify URL redirect after submitting form' );
cy.origin( 'https://formidableforms.com', () => {
- cy.location( 'href', { timeout: 10000 } ).should( 'include', 'https://formidableforms.com/' );
+ // Errors thrown by the marketing site's own scripts are not under test here.
+ Cypress.on( 'uncaught:exception', () => false );
+ cy.location( 'href', { timeout: 20000 } ).should( 'include', 'https://formidableforms.com/' );
} );
cy.log( 'Navigate back to the formidable form page' );
diff --git a/tests/cypress/e2e/Forms/radioDeferredInit.cy.js b/tests/cypress/e2e/Forms/radioDeferredInit.cy.js
new file mode 100644
index 0000000000..06ed30b2ed
--- /dev/null
+++ b/tests/cypress/e2e/Forms/radioDeferredInit.cy.js
@@ -0,0 +1,102 @@
+describe( 'Radio settings initialize when their field opens', () => {
+ const radioMarkup = id => `
+ `;
+
+ beforeEach( () => {
+ cy.login();
+ cy.visit( '/wp-admin/admin.php?page=formidable' );
+ cy.createNewForm();
+ cy.openForm();
+ cy.viewport( 1280, 720 );
+ cy.get( 'li[id="text"] a[title="Text"]' ).click();
+ cy.get( '.frm-type-text', { timeout: 10000 } ).should( 'exist' );
+ cy.get( '.frm-tabs-navs #frm_insert_fields_tab' ).click();
+ cy.get( 'li[id="textarea"] a[title="Paragraph"]' ).click();
+ cy.get( '.frm-type-textarea', { timeout: 10000 } ).should( 'exist' );
+
+ // Exercise the shared radio component with Lite or Pro, before page initialization.
+ cy.intercept( { method: 'GET', pathname: '/wp-admin/admin.php', query: { frm_action: 'edit' } }, request => {
+ request.continue( response => {
+ response.body = response.body.replace(
+ /]*>/g,
+ ( openingTag, id ) => openingTag + radioMarkup( id )
+ ).replace( '