1(function ($) { 2 "use strict"; 3 jQuery(document).ready(function ($) { 4 document.addEventListener('change', function (event) { 5 const el = event.target; 6 var $form = $(el).closest('form.wpcf7-form'); 7 if (!$form.length) { 8 return; 9 } 10 $(".repeater-field-content .wpcf7-not-valid-tip", $form).remove(); 11 }, false); 12 document.addEventListener('wpcf7invalid', function (event) { 13 $.each(event.detail.apiResponse.invalid_fields, function (index, value) { 14 if (value.idref == "yeeaddons") { 15 $('[name="' + value.field + '"]').closest(".wpcf7-form-control-wrap").append('<span class="wpcf7-not-valid-tip" aria-hidden="true">' + value.message + '</span>'); 16 } 17 }); 18 }, false); 19 var select2Configs = {}; 20 function init_template_select2_configs() { 21 if (typeof $.fn.select2 !== 'function') return; 22 $(".cf7-repeater").each(function () { 23 var $template = $(this).find(".cf7-field-repeater-data-html"); 24 $template.find("select").each(function () { 25 var $sel = $(this); 26 var s2 = $sel.data("select2"); 27 var key = "s2_" + Math.random().toString(36).substr(2, 9); 28 if (s2 && s2.options && s2.options.options) { 29 select2Configs[key] = $.extend({}, s2.options.options); 30 $sel.attr("data-repeater-select2-key", key); 31 } else if ($sel.hasClass("select2-hidden-accessible") || $sel.siblings(".select2-container").length) { 32 select2Configs[key] = {}; 33 $sel.attr("data-repeater-select2-key", key); 34 } 35 try { 36 if (s2) { 37 $sel.select2("destroy"); 38 } 39 } catch (e) {} 40 }); 41 $template.find(".select2-container").remove(); 42 $template.find("[data-select2-id]").removeAttr("data-select2-id"); 43 $template.find(".select2-hidden-accessible") 44 .removeClass("select2-hidden-accessible") 45 .removeAttr("tabindex") 46 .removeAttr("aria-hidden"); 47 }); 48 } 49 init_template_select2_configs(); 50 get_repeater_data_name(); 51 document.addEventListener('wpcf7mailsent', function (event) { 52 setTimeout(function () { 53 $(".field-repeater-data").each(function () { 54 var field = $(this); 55 var data = JSON.stringify(field.data("old")); 56 field.val(data).change(); 57 }) 58 }, 100); 59 }, false); 60 var list_names = []; 61 function change_name_and_ids(item, field_end = null, id_rand = '') { 62 var datas = JSON.parse(field_end.find(".field-repeater-data").val()); 63 var datas_ids = datas.id; 64 datas_ids.push(id_rand); 65 datas.id = datas_ids; 66 field_end.find(".field-repeater-data").val(JSON.stringify(datas)); 67 field_end.find(".field-repeater-data").attr("data-old", JSON.stringify(datas)); 68 item = $("<div>" + item + "</div>"); 69 // Clean up any select2 artifacts copied from template 70 item.find(".select2-container").remove(); 71 item.find("[data-select2-id]").removeAttr("data-select2-id"); 72 item.removeAttr("data-select2-id"); 73 item.find(".select2-hidden-accessible") 74 .removeClass("select2-hidden-accessible") 75 .removeAttr("tabindex") 76 .removeAttr("aria-hidden"); 77 $(item.find(".cf7-group")).each(function () { 78 var id = $(this).attr("id"); 79 if (id) { 80 $(this).attr("id", id + "__" + id_rand); 81 } 82 $(this).removeClass("cf7-logic-hidden"); 83 }) 84 $("input", item).each(function () { 85 var name = $(this).attr("name"); 86 list_names.push(name.replace("[]", "")); 87 var type = $(this).attr("type"); 88 var id = $(this).attr("id"); 89 var index = $(this).closest(".container-repeater-field").data("step"); 90 if (name.indexOf("[]") !== -1) { 91 name = name.replace("[]", "__" + id_rand + "[]"); 92 } else { 93 name = name + "__" + id_rand; 94 } 95 $(this).attr("name", name); 96 if (id) { 97 $(this).attr("id", id + "-" + id_rand); 98 } 99 $(this).closest(".wpcf7-form-control-wrap").attr("data-name", name); 100 }) 101 $("textarea", item).each(function () { 102 var name = $(this).attr("name"); 103 list_names.push(name.replace("[]", "")); 104 var id = $(this).attr("id"); 105 $(this).attr("name", name + "__" + id_rand); 106 if (id) { 107 $(this).attr("id", id + "-" + id_rand); 108 } 109 $(this).closest(".wpcf7-form-control-wrap").attr("data-name", name + "__" + id_rand); 110 }) 111 $("select", item).each(function () { 112 var name = $(this).attr("name"); 113 if (!name) return; 114 list_names.push(name.replace("[]", "")); 115 var id = $(this).attr("id"); 116 if (name.indexOf("[]") !== -1) { 117 name = name.replace("[]", "__" + id_rand + "[]"); 118 } else { 119 name = name + "__" + id_rand; 120 } 121 $(this).attr("name", name); 122 if (id) { 123 $(this).attr("id", id + "-" + id_rand); 124 } 125 $(this).closest(".wpcf7-form-control-wrap").attr("data-name", name); 126 }) 127 if (list_names.length > 0) { 128 list_names = [...new Set(list_names)]; 129 $('input[name="_yeeaddons_cf7_repeater_fields"]').val(list_names.join("|")); 130 } 131 return item; 132 } 133 function add_repeater_data(button) { 134 var id_rand = Math.floor(Math.random() * 10000); 135 var item = $('<div class="repeater-field-item"><div class="repeater-field-header"></div><div class="repeater-field-content"></div></div>'); 136 item.attr("data-id", id_rand); 137 var html_field = get_repeater_data(button, id_rand); 138 var header = get_repeater_data_header(button); 139 item.find(".repeater-field-header").append(header); 140 item.find(".repeater-field-content").append(html_field); 141 button.find(".cf7-field-repeater-reponese").append(item); 142 update_repeater_count_header(); 143 // Universal Select2 re-initialization for any plugin using Select2 144 if (typeof $.fn.select2 === 'function') { 145 item.find('select').each(function() { 146 var $select = $(this); 147 var s2Key = $select.attr('data-repeater-select2-key'); 148 var isSelect2Field = s2Key || 149 $select.hasClass('wpcf7-woocommerce_product') || 150 $select.hasClass('wpcf7-products') || 151 $select.hasClass('select2') || 152 $select.hasClass('select2-enable') || 153 $select.hasClass('wc-enhanced-select') || 154 $select.hasClass('country_select'); 155 156 if (isSelect2Field) { 157 $select.siblings('.select2-container').remove(); 158 $select.removeClass('select2-hidden-accessible') 159 .removeAttr('tabindex') 160 .removeAttr('aria-hidden') 161 .removeAttr('data-select2-id'); 162 $select.find('[data-select2-id]').removeAttr('data-select2-id'); 163 164 var config = {}; 165 if (s2Key && select2Configs[s2Key]) { 166 config = $.extend({}, select2Configs[s2Key]); 167 } 168 169 // Specific defaults for known plugins if not already in config 170 if ($select.hasClass('wpcf7-woocommerce_product')) { 171 if (!config.placeholder) config.placeholder = "--- Select Product ---"; 172 if (config.minimumResultsForSearch === undefined) config.minimumResultsForSearch = -1; 173 } 174 if ($select.hasClass('wpcf7-products')) { 175 if (!config.placeholder && $select.attr('placeholder')) config.placeholder = $select.attr('placeholder'); 176 if (typeof window.formatOptions_product === 'function' && !config.templateResult) { 177 config.templateResult = window.formatOptions_product; 178 } 179 } 180 181 if (!config.width) { 182 config.width = '100%'; 183 } 184 185 $select.select2(config); 186 } 187 }); 188 try { 189 $(document.body).trigger('wc-enhanced-select-init'); 190 } catch (e) {} 191 } 192 $(document).trigger('cf7_repeater_added', [item]); 193 $("input").trigger("done_load_repeater"); 194 } 195 function get_repeater_data(step_field, id_rand) { 196 var html_step = change_name_and_ids(step_field.find(".cf7-field-repeater-data-
196html").html(), step_field, id_rand); 197 return html_step; 198 } 199 function get_repeater_data_name() { 200 var i = 1; 201 $(".cf7-repeater").each(function () { 202 var datas = $(this).find(".field-repeater-data").data("datas") + " yeeaddons_test"; 203 var title = explode_datas(datas, "title"); 204 var button_text = explode_datas(datas, "button_text"); 205 var data_header = $(this).find(".repeater-field-header-data").html(); 206 data_header = $(data_header); 207 data_header.find(".repeater-field-header-title-text").html(title); 208 $(".repeater-field-button-add", $(this)).html(button_text); 209 $(this).find(".repeater-field-header-data").html(data_header); 210 var html_step = $("<div class='container-repeater-field'></div>"); 211 var names = []; 212 var step_field_data = $(this).find(".field-repeater-data"); 213 var field_end = $(this).find(".cf7-field-repeater-data-html").html(); 214 var button = $(this); 215 $("input,select,textarea", $(field_end)).each(function (index) { 216 var name = $(this).attr("name"); 217 names.push(name.replace("[]", "")); 218 }) 219 names = [...new Set(names)]; 220 step_field_data.val(JSON.stringify({ "count": 1, "fields": names, "id": [] })); 221 step_field_data.attr("data-old", JSON.stringify({ "count": 1, "fields": names, "id": [] })); 222 var initial_rows = 0; 223 initial_rows = explode_datas(datas, "initial_rows"); 224 if (cf7_repeater.pro != "ok") { 225 if (initial_rows > 1) { 226 alert("Free version: initial_rows < 2"); 227 initial_rows = 1; 228 } 229 } 230 var initial_rows_map_field = explode_datas(datas, "initial_rows_map"); 231 if (initial_rows_map_field) { 232 var initial_rows_map_number = $('[name="' + initial_rows_map_field + '"]').val(); 233 if (initial_rows_map_number !== undefined) { 234 $('[name="' + initial_rows_map_field + '"]').attr("data-repeater", $(this).find(".field-repeater-data").attr("name")); 235 $('[name="' + initial_rows_map_field + '"]').attr("repeater_initial_rows", "ok"); 236 initial_rows = initial_rows_map_number; 237 $(this).find(".repeater-field-button-add").addClass("hidden"); 238 $(this).addClass("repeater-remove-toolbar"); 239 } 240 } 241 setTimeout(function () { 242 for (var j = 0; j < initial_rows; j++) { 243 add_repeater_data(button); 244 } 245 }, 100); 246 i++; 247 }) 248 } 249 $("body").on("change", "[repeater_initial_rows='ok']", function (e) { 250 var repeater_id = $(this).data("repeater"); 251 var $repeater = $("#" + repeater_id); 252 if (cf7_repeater.pro == "ok") { 253 $repeater.find(".repeater-field-item").remove(); 254 var number = $(this).val(); 255 for (let i = 0; i < number; i++) { 256 $repeater.find(".repeater-field-button-add").click(); 257 } 258 } else { 259 alert("Upgrade to pro version"); 260 } 261 $repeater.find(".repeater-field-button-add").addClass("hidden"); 262 $repeater.addClass("repeater-remove-toolbar"); 263 }) 264 function get_repeater_data_header(start_field) { 265 var html_step = start_field.find(".repeater-field-header-data").html() 266 return html_step; 267 } 268 function update_repeater_count_header() { 269 $(".cf7-repeater").each(function () { 270 var i = 1; 271 $(".repeater-field-item", $(this)).each(function () { 272 $(this).find(".repeater-field-header-count").html(i); 273 $(this).addClass("repeater-field-item-" + i); 274 i++; 275 }) 276 var datas = JSON.parse($(this).find(".field-repeater-data").val()); 277 datas.count = i - 1; 278 $(this).find(".field-repeater-data").val(JSON.stringify(datas)); 279 $(this).find(".field-repeater-data").attr("data-old", JSON.stringify(datas)); 280 }); 281 } 282 function check_max_row(step_field, button) { 283 var max = explode_datas(step_field.find(".field-repeater-data").data("datas")); 284 var number_item = $('.repeater-field-item', step_field).length; 285 if (max - number_item == 1) { 286 button.addClass('hidden'); 287 } else { 288 button.removeClass('hidden'); 289 } 290 if (number_item >= max) { 291 return false; 292 } else { 293 return true; 294 } 295 } 296 function check_min_row(step_field) { 297 var min = explode_datas(step_field.find(".field-repeater-data").data("datas"), "initial_rows"); 298 var number_item = $('.repeater-field-item', step_field).length; 299 if (number_item <= min) { 300 return false; 301 } else { 302 return true; 303 } 304 } 305 function explode_datas(str = "", type = "max") { 306 if (type == "max") { 307 const regex = /max\s*:\s*(\d+)/; 308 const match = str.match(regex); 309 return match ? parseInt(match[1], 10) : 100; 310 } else if (type == "initial_rows") { 311 const regex = /initial_rows\:(.\d?) /gm; 312 let m; 313 let max = 1; 314 while ((m = regex.exec(str)) !== null) { 315 if (m.index === regex.lastIndex) { 316 regex.lastIndex++; 317 } 318 m.forEach((match, groupIndex) => { 319 max = match; 320 });
321 } 322 return max; 323 } 324 else if (type == "title") { 325 const regex = /title\:'(.*?)' /gm; 326 let m; 327 let max = ""; 328 while ((m = regex.exec(str)) !== null) { 329 if (m.index === regex.lastIndex) { 330 regex.lastIndex++; 331 } 332 m.forEach((match, groupIndex) => { 333 max = match; 334 }); 335 } 336 return max; 337 } else if (type == "button_text") { 338 const regex = /button\:'(.*?)' /gm; 339 let m; 340 let max = "Add more"; 341 while ((m = regex.exec(str)) !== null) { 342 if (m.index === regex.lastIndex) { 343 regex.lastIndex++; 344 } 345 m.forEach((match, groupIndex) => { 346 max = match; 347 }); 348 } 349 return max; 350 } else if (type == "initial_rows_map") { 351 const regex = /initial_rows_map\:(.*?) /gm; 352 let m; 353 let max = ""; 354 while ((m = regex.exec(str)) !== null) { 355 if (m.index === regex.lastIndex) { 356 regex.lastIndex++; 357 } 358 m.forEach((match, groupIndex) => { 359 max = match; 360 }); 361 } 362 return max; 363 } 364 } 365 function removeAR(arr) { 366 var what, a = arguments, L = a.length, ax; 367 while (L > 1 && arr.length) { 368 what = a[--L]; 369 while ((ax = arr.indexOf(what)) !== -1) { 370 arr.splice(ax, 1); 371 } 372 } 373 return arr; 374 } 375 $("body").on("click", ".repeater-field-button-add", function (e) { 376 e.preventDefault(); 377 if (check_max_row($(this).closest(".cf7-repeater"), $(this))) { 378 add_repeater_data($(this).closest(".cf7-repeater")); 379 } else { 380 $(this).addClass('hidden'); 381 } 382 }) 383 $("body").on("click", ".repeater-field-header-acctions-toogle", function (e) { 384 e.preventDefault(); 385 if ($(this).hasClass("icon-down-open")) { 386 $(this).removeClass("icon-down-open"); 387 $(this).addClass("icon-up-open"); 388 } else { 389 $(this).addClass("icon-down-open"); 390 $(this).removeClass("icon-up-open"); 391 } 392 $(this).closest(".repeater-field-item").find(".repeater-field-content").slideToggle("slow"); 393 $(this).closest(".repeater-field-item").find(".repeater-field-header").toggleClass('repeater-content-show'); 394 }) 395 $("body").on("click", ".repeater-field-header-acctions-remove", function (e) { 396 e.preventDefault(); 397 $(this).closest(".cf7-repeater").find(".repeater-field-button-add").removeClass('hidden'); 398 if (check_min_row($(this).closest(".cf7-repeater"))) { 399 var id = $(this).closest(".repeater-field-item").data("id"); 400 var datas = JSON.parse($(this).closest(".cf7-repeater").find(".field-repeater-data").val()); 401 var datas_ids = datas.id; 402 datas_ids = removeAR(datas_ids, id); 403 datas.id = datas_ids; 404 $(this).closest(".cf7-repeater").find(".field-repeater-data").val(JSON.stringify(datas)); 405 $(this).closest(".cf7-repeater").find(".field-repeater-data").attr("data-old", JSON.stringify(datas)); 406 $(this).closest(".repeater-field-item").remove(); 407 } else { 408 } 409 update_repeater_count_header(); 410 $(document).trigger("cf7_repeater_removed"); 411 $("input").trigger("done_load_repeater"); 412 }) 413 }) 414})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.