PluginProbe
Repeater Fields for Gravity Forms / 3.2.3
Repeater Fields for Gravity Forms v3.2.3
3.2.3 3.2.2 3.2.1 3.2.0 3.1.1 3.1.0 3.0.4 3.0.3 3.0.2 3.0.1 3.0.0 2.5.1 2.5.0 2.4.6 trunk 2.0.5 2.0.9 2.1.0 2.3.2 2.3.7 2.4.1 2.4.3 2.4.4 2.4.5
repeater-for-gravity-forms / libs / wp_repeater.js

wp_repeater.js in Repeater Fields for Gravity Forms 3.2.3, at libs/wp_repeater.js

1,062 lines 41.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function ($) {
2 "use strict";
3 jQuery(document).ready(function ($) {
4 jQuery(document).on('change keyup', '.gfield input, .gfield select, .gfield textarea', function (event) {
5 gf_raw_input_change(event, this);
6 });
7 $("body").on('change', ".container-repeater-field .gform-grid-col--size-auto", function (e) {
8 var self = $(this);
9 var value = $(this).val();
10 var input_ids = $(this).attr("name");
11 if (input_ids === undefined) {
12 return;
13 }
14 input_ids = input_ids.split("_");
15 var input_id = input_ids[1];
16 var form_ids = self.closest("form").attr("id");
17 form_ids = form_ids.split("_");
18 var form_id = form_ids[1];
19 var field_ids = input_ids[1].split(".");
20 if (field_ids[1] == 2) {
21 return;
22 }
23 var field_id = field_ids[0];
24 const obj = {
25 [input_id]: value,
26 [field_id + ".2"]: ""
27 }
28 var $nextSelect = $(this).closest(".ginput_container").find("#input_" + form_id + "_" + field_id + "_2_container select")
29 $.post(gformChainedSelectData.ajaxUrl, {
30 action: 'gform_get_next_chained_select_choices',
31 input_id: input_id,
32 form_id: form_id,
33 field_id: field_id,
34 value: obj,
35 nonce: gformChainedSelectData.nonce
36 }, function (response) {
37 if (!response) {
38 return;
39 }
40 var choices = $.parseJSON(response),
41 optionsMarkup = '';
42 $nextSelect.find('option').remove();
43 if (choices.length <= 0) {
44 //self.resetSelects( $select, true );
45 } else {
46 var hasSelectedChoice = false;
47 $.each(choices, function (i, choice) {
48 var selected = choice.isSelected ? 'selected="selected"' : '';
49 if (selected) {
50 hasSelectedChoice = true;
51 }
52 optionsMarkup += '<option value="' + choice.value + '"' + selected + '>' + choice.text + '</option>';
53 });
54 $nextSelect.show().append(optionsMarkup);
55 // the placeholder will be selected by default, rather than removing it and re-adding, just force the noOptions option to be selected
56 if (choices[0].noOptions) {
57 var $noOption = $nextSelect.find('option:last-child').clone(),
58 $nextSelects = $nextSelect.parents('span').nextAll().find('select');
59 $nextSelects.append($noOption);
60 $nextSelects.add($nextSelect)
61 .addClass('gf_no_options')
62 .find('option:last-child').prop('selected', true);
63 //self.toggleCompleted( true );
64 } else {
65 $nextSelect
66 .removeClass('gf_no_options')
67 //.prop( 'disabled', false ).show();
68 .toggleSelect(false, self);
69 if (hasSelectedChoice) {
70 $nextSelect.change();
71 }
72 }
73 }
74 //self.resizeSelects();
75 });
76 })
77 gform.addFilter('gform_is_value_match', function (isMatch, formId, rule) {
78 var check_repeater = rule['fieldId'].toString().split("-");
79 if (check_repeater.length < 2) {
80 return isMatch;
81 } else {
82 var $ = jQuery,
83 inputId = rule['fieldId'],
84 baseInputId = check_repeater[0],
85 randId = check_repeater[1],
86 baseFieldId = parseInt(baseInputId, 10),
87 inputIndex = gformExtractInputIndex(baseInputId),
88 isInputSpecific = inputIndex !== false,
89 $inputs;
90 if (isInputSpecific) {
91 $inputs = $('#input_{0}_{1}_{2}-{3}, #choice_{0}_{1}_{2}-{3}'.gformFormat(formId, baseFieldId, inputIndex, randId));
92 } else {
93 $inputs = $('input[id="input_{0}_{1}-{2}"], input[id^="input_{0}_{1}_"][id$="-{2}"], input[id^="choice_{0}_{1}_"][id$="-{2}"], select#input_{0}_{1}-{2}, textarea#input_{0}_{1}-{2}'.gformFormat(formId, baseFieldId, randId));
94 }
95 var isCheckable = $.inArray($inputs.attr('type'), ['checkbox', 'radio']) !== -1;
96 var isMatch = isCheckable ? gf_is_match_checkable($inputs, rule, formId, inputId) : gf_is_match_default($inputs.eq(0), rule, formId, inputId);
97 return isMatch;
98 }
99 });
100 gform.addFilter('gform_field_meta_raw_input_change', function (form, input, event) {
101 var htmlId = input.attr('id');
102 var fieldId = yeeaddons_gf_get_input_id_by_html_id(htmlId);
103 var formId = gf_get_form_id_by_html_id(htmlId);
104 if (formId !== undefined) {
105 var check_ids = htmlId.split("-");
106 if (check_ids.length > 1) {
107 form = { fieldId: fieldId, formId: formId };
108 }
109 }
110 return form;
111 });
112 function yeeaddons_gf_get_input_id_by_html_id(htmlId) {
113 var ids = htmlId ? htmlId.split('_') : [];
114 if (ids.length >= 3) {
115 var type = ids[0];
116 if (type === 'choice') {
117 var fieldId = ids[2];
118 var randSuffix = '';
119 var lastPart = ids[ids.length - 1];
120 if (lastPart && lastPart.indexOf('-') !== -1) {
121 var parts = lastPart.split('-');
122 randSuffix = '-' + parts[1];
123 }
124 return fieldId + randSuffix;
125 } else if (type === 'input') {
126 if (ids.length === 3) {
127 return ids[2];
128 } else if (ids.length >= 4) {
129 var fieldId = ids[2];
130 var indexPart = ids[3];
131 return fieldId + '.' + indexPart;
132 }
133 }
134 }
135 return htmlId;
136 }
137 gform.addAction('gform_input_change', function (elem, formId, fieldId) {
138 if (!window.gf_form_conditional_logic) {
139 return;
140 }
141 var dependentFieldIds = rgars(gf_form_conditional_logic, [formId, 'fields', (fieldId)].join('/'));
142 if (dependentFieldIds) {
143 gf_apply_rules(formId, dependentFieldIds);
144 }
145 }, 10);
146 get_repeater_data_name();
147 var names_upload = [];
148 jQuery(document).on("gform_page_loaded", function (e, form_id) {
149 //jQuery(".gform-datepicker").datepicker('destroy');
150 get_repeater_data_name();
151 });
152 jQuery(document).on('gform_post_render', function (event, form_id, current_page) {
153 //jQuery(".gform-datepicker").datepicker('destroy');
154 get_repeater_data_name();
155 });
156 gform.addFilter('gform_file_upload_markup', function (html, file, up, strings, imagesUrl, response) {
157 var formId = up.settings.multipart_params.form_id;
158 var fieldId = up.settings.multipart_params.field_id;
159 var container = $('#' + file.id).closest(".container-repeater-field");
160 var id_rand = container.data("id");
161 var nameAttr = 'gform_multifile_upload_' + formId + '_' + fieldId + '__' + id_rand;
162 var repeater = container.find('input[name="' + nameAttr + '"]');
163 if (repeater.length === 0) {
164 repeater = container.find(".gform_multifile_upload");
165 }
166 var val_repeater = repeater.val();
167 var link = response.data.uploaded_filename;
168 if (val_repeater == "") {
169 repeater.val(link)
170 } else {
171 repeater.val(val_repeater + ", " + link);
172 }
173 return html.replace("onclick", "data-onclick");;
174 });
175 if (window.gform && typeof window.gform.addFilter === 'function') {
176 window.gform.addFilter('gform_datepicker_options_pre_init', function (options, formId, fieldId) {
177 if (typeof fieldId === 'string' && fieldId.indexOf('-') > -1) {
178 var originalFieldId = fieldId.split('-')[0];
179 return window.gform.applyFilters('gform_datepicker_options_pre_init', options, formId, originalFieldId);
180 }
181 return options;
182 }, 9);
183 }
184 var repeater_fields_htmls = {};
185 //condition out repeater out
186 gform.addAction('gform_post_conditional_logic_field_action1', function (formId, action, targetId, defaultValues, isInit) {
187 if (targetId != "") {
188 var dat_select = targetId.replace("#", '');
189 $(".gf-field-repeater-data-html").each(function () {
190 var html_data = $(this).val();
191 html_data = $(html_data);
192 if (action == "hide") {
193 $('[data-js-reload="' + dat_select + '"]', html_data).css("display", "none");
194 } else {
195 $('[data-js-reload="' + dat_select + '"]', html_data).css("display", "block");
196 }
197 $(this).val("<div class='container-repeater-field'>" + html_data.html() + '</div>');
198 })
199 if (action == "hide") {
200 $('[data-js-reload="' + dat_select + '"]').css("display", "none");
201 } else {
202 $('[data-js-reload="' + dat_select + '"]').css("display", "block");
203 }
204 }
205 });
206 $("body").on("click", ".gform_delete_file", function (e) {
207 e.preventDefault();
208 var str = $(this).data("onclick");
209 const regex = /\((.*?)\)/gm;
210 var m = "";
211 var a = "";
212 while ((m = regex.exec(str)) !== null) {
213 // This is necessary to avoid infinite loops with zero-width matches
214 if (m.index === regex.lastIndex) {
215 regex.lastIndex++;
216 }
217 a = m[1].split(',');;
218 }
219 gformDeleteUploadedFileRepeater(a[0], a[1], $(this));
220 return;
221 })
222 function gformDeleteUploadedFileRepeater(formId, fieldId, deleteButton) {
223 if (deleteButton.closest(".repeater-field-warp-item-data").length > 0) {
224 var rand_id = deleteButton.closest(".container-repeater-field").data("id");
225 var fileIndex = jQuery(deleteButton).parent().index();
226 var parent = deleteButton.closest(".container-repeater-field").find("#field_" + formId + "_" + fieldId + "-" + rand_id);
227 if (parent.length === 0) {
228 parent = jQuery("#field_" + formId + "_" + fieldId);
229 }
230 parent.find('input[type="file"],.validation_message,#extensions_message_' + formId + '_' + fieldId).removeClass("gform_hidden");
231 parent.find(".ginput_post_image_file").show();
232 //parent.find("input[type=\"text\"]").val('');
233 var filesJson = jQuery('#gform_uploaded_files_' + formId).val();
234 if (filesJson) {
235 var files = jQuery.secureEvalJSON(filesJson);
236 if (files) {
237 var inputName = "input_" + fieldId;
238 var full_name = deleteButton.closest(".container-repeater-field").find('input[name="gform_multifile_upload_' + formId + '_' + fieldId + '__' + rand_id + '"]').val();
239 if (full_name == "") {
240 full_name = [];
241 } else {
242 full_name = full_name.split(",");
243 }
244 var $multfile = parent.find("#gform_multifile_upload_" + formId + "_" + fieldId + "__" + rand_id);
245 var remove_name = deleteButton.closest(".ginput_preview").find(".gfield_fileupload_filename").html();
246 var index1 = full_name.indexOf(remove_name);
247 if (index1 !== -1) {
248 full_name.splice(index1, 1);
249 }
250 deleteButton.closest(".container-repeater-field").find('input[name="gform_multifile_upload_' + formId + '_' + fieldId + '__' + rand_id + '"]').val(full_name.join(","));
251 deleteButton.closest(".ginput_preview").remove();
252 if ($multfile.length > 0) {
253 files[inputName].splice(fileIndex, 1);
254 var settings = $multfile.data('settings');
255 var max = settings.gf_vars.max_files;
256 jQuery("#" + settings.gf_vars.message_id + "__" + rand_id).html('');
257 if (files[inputName].length < max)
258 gfMultiFileUploader.toggleDisabled(settings, false);
259 } else {
260 files[inputName] = null;
261 }
262 jQuery('#gform_uploaded_files_' + formId).val(jQuery.toJSON(files));
263 }
264 }
265 } else {
266 var parent = jQuery("#field_" + formId + "_" + fieldId);
267 var fileIndex = jQuery(deleteButton).parent().index();
268 deleteButton.closest(".ginput_preview").remove();
269 //displaying single file upload field
270 parent.find('input[type="file"],.validation_message,#extensions_message_' + formId + '_' + fieldId).removeClass("gform_hidden");
271 //displaying post image label
272 parent.find(".ginput_post_image_file").show();
273 //clearing post image meta fields
274 parent.find("input[type=\"text\"]").val('');
275 //removing file from uploaded meta
276 var filesJson = jQuery('#gform_uploaded_files_' + formId).val();
277 if (filesJson) {
278 var files = jQuery.secureEvalJSON(filesJson);
279 if (files) {
280 var inputName = "input_" + fieldId;
281 var $multfile = parent.find("#gform_multifile_upload_" + formId + "_" + fieldId);
282 if ($multfile.length > 0) {
283 files[inputName].splice(fileIndex, 1);
284 var settings = $multfile.data('settings');
285 var max = settings.gf_vars.max_files;
286 jQuery("#" + settings.gf_vars.message_id).html('');
287 if (files[inputName].length < max)
288 gfMultiFileUploader.toggleDisabled(settings, false);
289 } else {
290 files[inputName] = null;
291 }
292 jQuery('#gform_uploaded_files_' + formId).val(jQuery.toJSON(files));
293 }
294 }
295 }
296 }
297 var input_ids = [];
298 function change_name_and_ids(item, field_end = null, key = null, row_data = null) {
299 if (key == null) {
300 var id_rand = Math.floor(Math.random() * 10000);
301 } else {
302 var id_rand = key;
303 }
304 var datas = JSON.parse(field_end.find(".gf-field-repeater-data").val());
305 var datas_ids = datas.id;
306 datas_ids.push(id_rand);
307 datas.id = datas_ids;
308 field_end.find(".gf-field-repeater-data").val(JSON.stringify(datas));
309 item = $(item);
310 item.attr("data-id", id_rand);
311
312 function get_saved_field_val(fieldName) {
313 if (!row_data || typeof row_data !== 'object') {
314 return null;
315 }
316 var clean = fieldName.replace(/\[\]$/, '');
317 if (row_data[clean] !== undefined) {
318 return row_data[clean];
319 }
320 var withUnderscore = clean.replace(/\./g, '_');
321 if (row_data[withUnderscore] !== undefined) {
322 return row_data[withUnderscore];
323 }
324 for (var rk in row_data) {
325 if (rk === clean || rk === withUnderscore || rk.replace(/\./g, '_') === withUnderscore) {
326 return row_data[rk];
327 }
328 }
329 return null;
330 }
331
332 $(".gfield_visibility_visible", item).each(function () {
333 var id = $(this).attr("id");
334 $(this).attr("id", id + "-" + id_rand);
335 $(this).attr("data-js-reload", id + "-" + id_rand);
336 })
337 $(".gform_fileupload_multifile", item).each(function () {
338 var id = $(this).attr("id");
339 var container_item = $(this).closest(".gfield gfield--type-fileupload");
340 var settings = $(this).attr("data-settings");
341 settings = jQuery.parseJSON(settings);
342 $.each(settings, function (index, value) {
343 switch (index) {
344 case "browse_button":
345 case "container":
346 case "drop_element":
347 case "filelist":
348 settings[index] = value + "__" + id_rand;
349 $("#" + value, item).attr("id", value + "__" + id_rand);
350 break;
351 case "multipart_params":
352 //settings["multipart_params"]["field_id"] = value.field_id + "__"+id_rand;
353 break;
354 }
355 });
356 item.append('<input type="hidden" name="' + id + '" class="gform_multifile_upload" />');
357 $(this).attr("id", id + "__" + id_rand);
358 $(this).attr("data-settings", JSON.stringify(settings));
359 names_upload.push(id + "__" + id_rand);
360 })
361 $("input", item).each(function () {
362 var name = $(this).attr("name");
363 if (typeof name !== 'string' || name == "MAX_FILE_SIZE") {
364 return;
365 }
366 var type = $(this).attr("type");
367 var id = $(this).attr("id");
368 input_ids.push(id);
369 var original_name = name;
370 if (name != "" && name.endsWith('[]')) {
371 name = name.replace(/\[\]$/, '');
372 $(this).attr("name", name + "__" + id_rand + "[]");
373 } else {
374 $(this).attr("name", name + "__" + id_rand);
375 }
376 $(this).attr("id", id + "-" + id_rand);
377 if ($(this).hasClass('gform-datepicker') || $(this).hasClass('datepicker')) {
378 $(this).removeAttr('data-initialized').removeData('initialized').removeClass('hasDatepicker');
379 if (this.dataset) {
380 delete this.dataset.initialized;
381 delete this.dataset.toggleClickedBeforeInit;
382 }
383 var $toggleBtn = $(this).siblings('.gform-datepicker-toggle');
384 if (!$toggleBtn.length) {
385 $toggleBtn = $(this).closest('.ginput_container_date').find('.gform-datepicker-toggle');
386 }
387 if ($toggleBtn.length) {
388 $toggleBtn.attr('id', 'datepicker_toggle_' + id + '-' + id_rand);
389 $toggleBtn.attr('aria-controls', id + '-' + id_rand);
390 }
391 var $kbd = $(this).siblings('#keyboardHint_' + id);
392 if (!$kbd.length) {
393 $kbd = $(this).closest('.ginput_container_date').find('#keyboardHint_' + id);
394 }
395 if ($kbd.length) {
396 $kbd.attr('id', 'keyboardHint_' + id + '-' + id_rand);
397 }
398 }
399 var value_check = localStorage.getItem(id + "-" + id_rand);
400 var saved_val = get_saved_field_val(name + "__" + id_rand);
401 if (saved_val === null) {
402 saved_val = get_saved_field_val(original_name + "__" + id_rand);
403 }
404 if (type == "checkbox") {
405 $(this).closest("div").find("label").attr("for", id + "-" + id_rand);
406 if (saved_val !== null) {
407 var is_checked = false;
408 if (Array.isArray(saved_val)) {
409 is_checked = saved_val.indexOf($(this).val()) !== -1;
410 } else {
411 is_checked = ($(this).val() == saved_val);
412 }
413 if (is_checked) {
414 $(this).prop("checked", true).attr("checked", "checked");
415 } else {
416 $(this).prop("checked", false).removeAttr("checked");
417 }
418 } else if (value_check != null) {
419 $(this).prop("checked", true).attr("checked", "checked");
420 }
421 } else if (type == "file") {
422 $(this).attr("id", id + "-" + id_rand);
423 if (saved_val && typeof saved_val === 'string' && saved_val.indexOf('http') === 0) {
424 var $fileContainer = $(this).closest('.ginput_container_fileupload');
425 if ($fileContainer.length && !$fileContainer.find('.gf-repeater-saved-file').length) {
426 var fileName = saved_val.split('/').pop();
427 $fileContainer.append('<div class="gf-repeater-saved-file" style="margin-top:5px;font-size:13px;">' +
428 '<a href="' + encodeURI(saved_val) + '" target="_blank" rel="noopener">' + (fileName || saved_val) + '</a>' +
429 '<input type="hidden" name="' + name + '__' + id_rand + '" value="' + saved_val + '" />' +
430 '</div>');
431 }
432 }
433 } else if (type == "radio") {
434 $(this).attr("id", id + "-" + id_rand);
435 $(this).closest("div, li").find("label").attr("for", id + "-" + id_rand);
436 if (saved_val !== null) {
437 if ($(this).val() == saved_val) {
438 $(this).prop("checked", true).attr("checked", "checked");
439 } else {
440 $(this).prop("checked", false).removeAttr("checked");
441 }
442 } else {
443 var value_check = localStorage.getItem(name + "__" + id_rand);
444 if (value_check != null) {
445 var old_check = $(this).val();
446 if (old_check == value_check) {
447 $(this).prop("checked", true).attr("checked", "checked");
448 }
449 }
450 }
451 }
452 else {
453 // ensure the field label's "for" attribute corresponds with the field's ID
454 $(this).closest("div").parent().find("label").attr("for", id + "-" + id_rand);
455 if (saved_val !== null) {
456 $(this).val(saved_val);
457 } else if (value_check != null) {
458 $(this).val(value_check);
459 }
460 }
461 })
462 $("textarea", item).each(function () {
463 var name = $(this).attr("name");
464 var id = $(this).attr("id");
465 $(this).attr("name", name + "__" + id_rand);
466 $(this).attr("id", id + "-" + id_rand);
467 // ensure the field label's "for" attribute corresponds with the field's ID
468 $(this).closest("div").parent().find("label").attr("for", id + "-" + id_rand);
469 var saved_val = get_saved_field_val(name + "__" + id_rand);
470 if (saved_val !== null) {
471 $(this).val(saved_val);
472 } else {
473 var value_check = localStorage.getItem(id + "-" + id_rand);
474 if (value_check != null) {
475 $(this).val(value_check);
476 }
477 }
478 })
479 $("select", item).each(function () {
480 var name = $(this).attr("name");
481 var id = $(this).attr("id");
482 if (name.includes("[")) {
483 name = name.replace(/\[\]/g, '');
484 $(this).attr("name", name + "__" + id_rand + "[]");
485 } else {
486 $(this).attr("name", name + "__" + id_rand);
487 }
488 $(this).attr("id", id + "-" + id_rand);
489 // ensure the field label's "for" attribute corresponds with the field's ID
490 $(this).closest("div").parent().find("label").attr("for", id + "-" + id_rand);
491 var saved_val = get_saved_field_val(name + "__" + id_rand);
492 if (saved_val !== null) {
493 $(this).val(saved_val);
494 } else {
495 var value_check = localStorage.getItem(id + "-" + id_rand);
496 if (value_check != null) {
497 $(this).val(value_check);
498 }
499 }
500 })
501 return item;
502 }
503 function add_repeater_data(button, key = null, row_data = null) {
504 var start_field;
505 if (key == null) {
506 var key = Math.floor(Math.random() * 10000);
507 }
508 var item = $('<div class="repeater-field-item"><div class="repeater-field-header"></div><div class="repeater-field-content"></div></div>');
509 button.prevAll().each(function (index) {
510 var item = $(this).clone();
511 if (item.hasClass("gfield--type-repeater_start")) {
512 start_field = $(this);
513 return false;
514 }
515 })
516 var html_field = get_repeater_data(button, key, row_data);
517 var header = get_repeater_data_header(start_field);
518 item.find(".repeater-field-header").append(header);
519 item.find(".repeater-field-content").append(html_field);
520 button.find(".repeater-field-warp-item").append(item);
521 item.find("input[type=radio][checked], input[type=checkbox][checked]").prop("checked", true);
522 update_repeater_count_header();
523 $("input").trigger("done_load_repeater");
524 var form_ids = button.attr("id").split("_");
525 if (yeeaddons_gf_repeater_data.pro == "ok") {
526 var form_id = form_ids[1];
527 if (window["gf_form_conditional_logic"] !== undefined) {
528 if (typeof window["gf_form_conditional_logic"][form_id] !== "undefined") {
529 var dependents = window["gf_form_conditional_logic"][form_id].dependents;
530 var dependents_new = dependents;
531 var dependents_new_id = [];
532 $.each(dependents, function (key_1, value) {
533 var datas_logic = [];
534 $.each(value, function (key_2, value_2) {
535 datas_logic.push(value_2 + "-" + key);
536 })
537 if (key_1.search("-") < 0) {
538 dependents_new[key_1 + "-" + key] = datas_logic;
539 dependents_new_id.push(key_1 + "-" + key);
540 } else {
541 dependents_new_id.push(key_1);
542 }
543 });
544 var fields = window["gf_form_conditional_logic"][form_id].fields;
545 var fields_new = fields;
546 $.each(fields, function (key_1, value) {
547 var datas_logic = [];
548 $.each(value, function (key_2, value_2) {
549 datas_logic.push(value_2 + "-" + key);
550 })
551 if (key_1.search("-") < 0) {
552 fields_new[key_1 + "-" + key] = datas_logic;
553 }
554 });
555 var logic = window["gf_form_conditional_logic"][form_id].logic;
556 //console.log(window["gf_form_conditional_logic"][form_id]);
557 var logic_new = logic;
558 $.each(logic, function (key_1, value) {
559 if (key_1.search("-") < 0) {
560 // use old and add new repeater
561 logic_new[key_1 + "-" + key] = yeeaddons_change_id_logic(value, key);
562 } else {
563 //da them
564 }
565 });
566 var animation = window["gf_form_conditional_logic"][form_id].animation;
567 var defaults = window["gf_form_conditional_logic"][form_id].defaults;
568 window["gf_form_conditional_logic"][form_id] = { animation: animation, defaults: defaults, dependents: dependents_new, fields: fields_new, logic: logic_new, "ok": "ok" };
569 gf_apply_rules(form_id, dependents_new_id, true);
570 }
571 }
572 }
573 //end logic
574
575 $.each(names_upload, function (key_1, value) {
576 if ($("#" + value).length > 0) {
577 gfMultiFileUploader.setup("#" + value);
578 }
579 });
580 names_upload = [];
581 var input_mask = yeeaddons_gf_repeater_data.input_mask;
582 $.each(input_ids, function (key_1, value_1) {
583 if (value_1 in input_mask) {
584 $('#' + value_1 + "-" + key).mask(input_mask[value_1]).bind('keypress', function (e) { if (e.which == 13) { jQuery(this).blur(); } })
585 }
586 });
587 conditional_logic_custom(key);
588 input_ids = [];
589 $('.gform-datepicker').each(function () {
590 var $element = $(this);
591 if (typeof $.fn.datepicker === 'function') {
592 // Legacy GF < 3.0: jQuery UI datepicker available
593 if (!$element.hasClass('hasDatepicker')) {
594 initSingleDatepicker($element);
595 $element.addClass('initialized');
596 }
597 }
598 });
599 // GF 3.0+: Re-trigger datepicker initialization for the form
600 // so GF's theme script loads the datepicker chunk and sets up delegation
601 reinitGF3Datepicker(button);
602 }
603 /**
604 * Re-trigger GF 3.0 datepicker initialization.
605 * GF 3.0 uses lazy-loading: the datepicker chunk is only loaded when
606 * gform/post_render fires and .gform-datepicker elements exist in the DOM.
607 * Since the repeater removes original fields before GF checks for them,
608 * we need to re-dispatch the event after creating new rows.
609 */
610 var _gf3DatepickerTriggered = {};
611 function reinitGF3Datepicker(el) {
612 if (typeof $.fn.datepicker === 'function') {
613 return; // Legacy jQuery UI datepicker is available, no need for GF 3.0 re-init
614 }
615 var $wrapper = el.closest('.gform_wrapper');
616 if (!$wrapper.length) return;
617 var formId = parseInt($wrapper.attr('id').replace('gform_wrapper_', ''));
618 if (!formId || isNaN(formId)) return;
619 // Only trigger once per form per page load to avoid duplicate event listeners
620 if (_gf3DatepickerTriggered[formId]) return;
621 _gf3DatepickerTriggered[formId] = true;
622 // Dispatch gform/post_render so GF's theme script detects datepicker fields
623 // and lazy-loads the accessible datepicker chunk
624 document.dispatchEvent(new CustomEvent('gform/post_render', {
625 detail: { formId: formId, currentPage: 1 }
626 }));
627 }
628 function yeeaddons_change_id_logic(value, key) {
629 var field_rules_inner = [];
630 if (value && value.field && Array.isArray(value.field.rules)) { // added this line to fix js issue in add more to autofill multiple data
631 $.each(value.field.rules, function (key_2, value_2) {
632 if (value_2.fieldId.search("-") < 0) {
633 var field_id_1 = value_2.fieldId + "-" + key;
634 }
635 field_rules_inner.push({ fieldId: field_id_1, operator: value_2.operator, value: value_2.value });
636 })
637 var rules = field_rules_inner;
638 var field = { actionType: value.field.actionType, enabled: value.field.enabled, logicType: value.field.logicType, rules: rules };
639 return { field: field, nextButton: value.nextButton, section: value.section };
640 } else {
641 return value;
642 }
643
644 }
645 function conditional_logic_custom(rand) {
646 return;
647 var value_check = $("#input_1_13-" + rand).val();
648 if (value_check == "Other" || value_check == "other") {
649 $("#input_1_14-" + rand).closest(".gfield").addClass("hidden");
650 } else {
651 $("#input_1_14-" + rand).closest(".gfield").removeClass("hidden");
652 }
653 }
654 gform.addAction('gform_input_change', function (elem, formId, fieldId) {
655 var datas = $(elem).attr("name").split("__");;
656 if (datas.length > 1) {
657 conditional_logic_custom(datas[1]);
658 }
659 }, 10);
660 function get_repeater_data(step_field, key = null, row_data = null) {
661 var data_html = step_field.find(".gf-field-repeater-data-html").val();
662 if (data_html == "") {
663 data_html = step_field.find(".gf-field-repeater-data-html").attr('value');
664 }
665 var html_step = change_name_and_ids(data_html, step_field, key, row_data);
666 return html_step;
667 }
668 function get_repeater_data_name() {
669 var i = 1;
670 $(".gfield--type-repeater_start").each(function () {
671 if ($(this).data("installed") == "installed") {
672 return;
673 }
674 $(this).data("installed", "installed");
675 $(this).addClass("installed");
676 var html_step = $("<div class='container-repeater-field'></div>");
677 var names = [];
678 var step_field = "";
679 var elements = $(this).nextAll();
680 var value = "";
681 elements.each(function (index) {
682 var item = $(this).clone();
683 if (item.hasClass("gfield--type-repeater_end")) {
684 $(this).attr("data-id", i);
685 value = $(this).find("input").val();
686 if (value == "") {
687 value = $(this).find("input").attr("value");
688 }
689 step_field = $(this);
690 $(this).find(".gf-field-repeater-data").val(JSON.stringify({ "count": 1, "fields": names, "id": [] }));
691 $(this).find(".gf-field-repeater-data").attr("value", JSON.stringify({ "count": 1, "fields": names, "id": [] }));
692 return false;
693 }
694 $(this).remove();
695 html_step.append(item);
696 var check_name = null;
697 if (item.find(".ginput_container_fileupload").length > 0) {
698 var name = item.find("input[type=file]").attr("name");
699 if (name === undefined) {
700 name = item[0].id;
701 name = name.split("field");
702 names.push("gform_multifile_upload" + name[1]);
703 } else {
704 names.push(item.find("input[type=file]").attr("name"));
705 }
706 } else {
707 if (item.find("input").attr("name")) {
708 var custom_n = item.find("input").attr("name");
709 custom_n = custom_n.replace(/\[\]$/, '');
710 names.push(custom_n);
711 } else if (item.find("textarea").attr("name")) {
712 names.push(item.find("textarea").attr("name"));
713 } else if (item.find("select").attr("name")) {
714 names.push(item.find("select").attr("name"));
715 } else {
716 var type = item.find("input").attr("type");
717 names.push(item.find("input").attr("name"));
718 }
719 }
720 })
721 var text_html = "<div class='container-repeater-field'>" + html_step.html() + "</div>";
722 step_field.find(".gf-field-repeater-data-html").val(text_html);
723 step_field.find(".gf-field-repeater-data-html").attr("value", text_html);
724 var initial_rows = 1;
725 initial_rows = step_field.find(".repeater-field-warp-item-data").data("initial_rows");
726 var initial_rows_map_field_check = step_field.find(".repeater-field-warp-item-data").data("initial_rows_map_check");
727 if (initial_rows_map_field_check != "" && initial_rows_map_field_check !== undefined) {
728 var initial_rows_map_field = step_field.find(".repeater-field-warp-item-data").data("initial_rows_map");
729 var initial_rows_map_number = $("#" + initial_rows_map_field).val();
730 if (initial_rows_map_number == "") {
731 initial_rows_map_number = $("#" + initial_rows_map_field).attr("value");
732 }
733 if (initial_rows_map_number == "") {
734 initial_rows_map_number = 0;
735 }
736 $("#" + initial_rows_map_field).attr("data-repeater", step_field.find(".repeater-field-warp-item-data").data("map_id"));
737 $("#" + initial_rows_map_field).attr("repeater_initial_rows", "ok");
738 initial_rows = initial_rows_map_number;
739 step_field.find(".gf-repeater-field-button-add").addClass("hidden");
740 step_field.addClass("repeater-remove-toolbar");
741 }
742 if (initial_rows === undefined || initial_rows === "") {
743 initial_rows = 1;
744 }
745 if (value != "") {
746 try {
747 var parsed_val = typeof value === "string" ? JSON.parse(value) : value;
748 initial_rows = parsed_val.count !== undefined ? parsed_val.count : (parsed_val.id ? parsed_val.id.length : 1);
749 var data_arr_ids = parsed_val.id || [];
750 var saved_values = parsed_val.saved_values || null;
751 setTimeout(function () {
752 for (var j = 0; j < initial_rows; j++) {
753 var row_id = data_arr_ids[j] !== undefined ? data_arr_ids[j] : null;
754 var row_data = (saved_values && row_id && saved_values[row_id]) ? saved_values[row_id] : null;
755 add_repeater_data(step_field.closest(".gfield--type-repeater_end"), row_id, row_data);
756 }
757 }, 100);
758 } catch (e) {
759 setTimeout(function () {
760 for (var j = 0; j < initial_rows; j++) {
761 add_repeater_data(step_field.closest(".gfield--type-repeater_end"));
762 }
763 }, 100);
764 }
765 } else {
766 setTimeout(function () {
767 for (var j = 0; j < initial_rows; j++) {
768 add_repeater_data(step_field.closest(".gfield--type-repeater_end"));
769 }
770 }, 100);
771 }
772 i++;
773 })
774 }
775 $("body").on("change", "[repeater_initial_rows='ok']", function (e) {
776 var repeater_id = $(this).data("repeater");
777 $("#" + repeater_id).find(".repeater-field-item").remove();
778 var number = $(this).val();
779 if (number == "") {
780 number = $(this).attr("value");
781 }
782 for (let i = 0; i < number; i++) {
783 $("#" + repeater_id).find(".gf-repeater-field-button-add").click();
784 }
785 })
786 function get_repeater_data_header(start_field) {
787 var html_step = start_field.find(".repeater-field-header-data").val();
788 if (html_step == "") {
789 html_step = start_field.find(".repeater-field-header-data").attr("value");
790 }
791 return html_step;
792 }
793 function update_repeater_count_header() {
794 $(".gfield--type-repeater_end").each(function () {
795 var i = 1;
796 $(".repeater-field-item", $(this)).each(function () {
797 $(this).find(".repeater-field-header-count").html(i);
798 i++;
799 })
800 var data_js = $(this).find(".gf-field-repeater-data").val();
801 if (data_js == "") {
802 $(this).find(".gf-field-repeater-data").attr("value");
803 }
804 var datas = JSON.parse(data_js);
805 datas.count = i - 1;
806 $(this).find(".gf-field-repeater-data").val(JSON.stringify(datas));
807 $(this).find(".gf-field-repeater-data").attr("value", JSON.stringify(datas));
808 });
809 }
810 function check_max_row(step_field) {
811 var max = step_field.find(".repeater-field-warp-item-data").data("limit");
812 var number_item = $('.repeater-field-item', step_field).length;
813 if (number_item >= max) {
814 return false;
815 } else {
816 return true;
817 }
818 }
819 function check_min_row(step_field) {
820 var min = step_field.find(".repeater-field-warp-item-data").data("initial_rows");
821 var number_item = $('.repeater-field-item', step_field).length;
822 if (number_item <= min) {
823 return false;
824 } else {
825 return true;
826 }
827 }
828 function removeAR(arr) {
829 var what, a = arguments, L = a.length, ax;
830 while (L > 1 && arr.length) {
831 what = a[--L];
832 while ((ax = arr.indexOf(what)) !== -1) {
833 arr.splice(ax, 1);
834 }
835 }
836 return arr;
837 }
838 $("body").on("click", ".gf-repeater-field-button-add", function (e) {
839 e.preventDefault();
840 if (check_max_row($(this).closest(".gfield--type-repeater_end"))) {
841 add_repeater_data($(this).closest(".gfield--type-repeater_end"));
842 } else {
843 $(this).addClass('hidden');
844 }
845 })
846 $("body").on("click", ".repeater-field-header-acctions-toogle", function (e) {
847 e.preventDefault();
848 if ($(this).hasClass("icon-down-open")) {
849 $(this).removeClass("icon-down-open");
850 $(this).addClass("icon-up-open");
851 } else {
852 $(this).addClass("icon-down-open");
853 $(this).removeClass("icon-up-open");
854 }
855 $(this).closest(".repeater-field-item").find(".repeater-field-content").slideToggle("slow");
856 $(this).closest(".repeater-field-item").find(".repeater-field-header").toggleClass('repeater-content-show');
857 })
858 $("body").on("click", ".repeater-field-header-acctions-remove", function (e) {
859 e.preventDefault();
860 $(this).closest(".gfield--type-repeater_end").find(".gf-repeater-field-button-add").removeClass('hidden');
861 if (check_min_row($(this).closest(".gfield--type-repeater_end"))) {
862 var id = $(this).closest(".repeater-field-item").find(".container-repeater-field").data("id");
863 var data_js = $(this).closest(".gfield--type-repeater_end").find(".gf-field-repeater-data").val();
864 if (data_js == "") {
865 data_js = $(this).closest(".gfield--type-repeater_end").find(".gf-field-repeater-data").attr("value");
866 }
867 var datas = JSON.parse(data_js);
868 var datas_ids = datas.id;
869 datas_ids = removeAR(datas_ids, id);
870 datas.id = datas_ids;
871 $(this).closest(".gfield--type-repeater_end").find(".gf-field-repeater-data").val(JSON.stringify(datas));
872 $(this).closest(".gfield--type-repeater_end").find(".gf-field-repeater-data").attr("value", JSON.stringify(datas));
873 $(this).closest(".repeater-field-item").remove();
874 } else {
875 }
876 update_repeater_count_header();
877 })
878 //date pick
879 function getDatepickerI18n() {
880 var i18n = gform_i18n.datepicker;
881 return {
882 dayNamesMin: [
883 i18n.days.sunday,
884 i18n.days.monday,
885 i18n.days.tuesday,
886 i18n.days.wednesday,
887 i18n.days.thursday,
888 i18n.days.friday,
889 i18n.days.saturday,
890 ],
891 monthNamesShort: [
892 i18n.months.january,
893 i18n.months.february,
894 i18n.months.march,
895 i18n.months.april,
896 i18n.months.may,
897 i18n.months.june,
898 i18n.months.july,
899 i18n.months.august,
900 i18n.months.september,
901 i18n.months.october,
902 i18n.months.november,
903 i18n.months.december,
904 ],
905 firstDay: i18n.firstDay,
906 iconText: i18n.iconText,
907 };
908 }
909 /**
910 * @function getDatepickerBaseOptions
911 * @description Return base options object that configures the datepicker.
912 * @param $element The datepicker trigger.
913 * @since 2.5
914 *
915 * @returns {{
916 * suppressDatePicker: boolean,
917 * changeMonth: boolean,
918 * changeYear: boolean,
919 * onClose: onClose,
920 * yearRange: string,
921 * dateFormat: string,
922 * showOn: string,
923 * dayNamesMin: *[],
924 * monthNamesShort: *[],
925 * beforeShow: (function(*, *): boolean),
926 * showOtherMonths: boolean
927 * }}
928 */
929 function getDatepickerBaseOptions($element) {
930 var i18n = getDatepickerI18n();
931 var isThemeDatepicker = $element.closest('.gform_wrapper').length > 0;
932 var isPreview = $('#preview_form_container').length > 0;
933 var isRTL = window.getComputedStyle($element[0], null).getPropertyValue('direction') === 'rtl';
934 var formTheme = isThemeDatepicker ? $element.closest('.gform_wrapper').data('form-theme') : 'gravity-theme';
935 var formId = isThemeDatepicker ? $element.closest('.gform_wrapper').attr('id').replace('gform_wrapper_', '') : '';
936 var formPageInstance = isThemeDatepicker ? $element.closest('.gform_wrapper').attr('data-form-index') : '';
937 return {
938 yearRange: '-100:+20',
939 showOn: 'focus',
940 dateFormat: 'mm/dd/yy',
941 dayNamesMin: i18n.dayNamesMin,
942 monthNamesShort: i18n.monthNamesShort,
943 firstDay: i18n.firstDay,
944 changeMonth: true,
945 changeYear: true,
946 isRTL: isRTL,
947 showOtherMonths: isThemeDatepicker,
948 suppressDatePicker: false,
949 onClose: function () {
950 var self = this;
951 $element.focus();
952 this.suppressDatePicker = true;
953 setTimeout(function () {
954 self.suppressDatePicker = false;
955 }, 200);
956 },
957 beforeShow: function (input, inst) {
958 // Remove any classes that were added before as it could have been added to a different datepicker.
959 inst.dpDiv[0].classList.remove('gform-theme-datepicker');
960 inst.dpDiv[0].classList.remove('gravity-theme');
961 inst.dpDiv[0].classList.remove('gform-theme');
962 inst.dpDiv[0].classList.remove('gform-legacy-datepicker');
963 inst.dpDiv[0].classList.remove('gform-theme--framework');
964 inst.dpDiv[0].classList.remove('gform-theme--foundation');
965 inst.dpDiv[0].classList.remove('gform-theme--orbital');
966 if (isThemeDatepicker) {
967 inst.dpDiv[0].classList.add('gform-theme-datepicker');
968 $(inst.dpDiv[0]).attr('data-parent-form', formId + '_' + formPageInstance);
969 }
970 if (formTheme === undefined || formTheme === 'gravity-theme') {
971 $(inst.dpDiv[0]).addClass('gravity-theme');
972 } else if (formTheme === 'legacy') {
973 $(inst.dpDiv[0]).addClass('gform-legacy-datepicker');
974 }
975 else {
976 $(inst.dpDiv[0]).addClass('gform-theme--' + formTheme);
977 if (formTheme === 'orbital') {
978 $(inst.dpDiv[0]).addClass('gform-theme--framework');
979 $(inst.dpDiv[0]).addClass('gform-theme--foundation');
980 }
981 }
982 if (isRTL && isPreview) {
983 var $inputContainer = $(input).closest('.gfield');
984 var rightOffset = $(document).outerWidth() - ($inputContainer.offset().left + $inputContainer.outerWidth());
985 inst.dpDiv[0].style.right = rightOffset + 'px';
986 }
987 return !this.suppressDatePicker;
988 },
989 };
990 }
991 /**
992 * @function initSingleDatepicker
993 * @description Initialize a datepicker assigning various additional options based on the trigger element.
994 * @param $element The datepicker trigger.
995 * @since 2.4
996 */
997 function initSingleDatepicker($element) {
998 var i18n = getDatepickerI18n();
999 var inputId = $element.attr('id') ? $element.attr('id') : '';
1000 var optionsObj = getDatepickerBaseOptions($element);
1001 if ($element.hasClass('dmy')) {
1002 optionsObj.dateFormat = 'dd/mm/yy';
1003 } else if ($element.hasClass('dmy_dash')) {
1004 optionsObj.dateFormat = 'dd-mm-yy';
1005 } else if ($element.hasClass('dmy_dot')) {
1006 optionsObj.dateFormat = 'dd.mm.yy';
1007 } else if ($element.hasClass('ymd_slash')) {
1008 optionsObj.dateFormat = 'yy/mm/dd';
1009 } else if ($element.hasClass('ymd_dash')) {
1010 optionsObj.dateFormat = 'yy-mm-dd';
1011 } else if ($element.hasClass('ymd_dot')) {
1012 optionsObj.dateFormat = 'yy.mm.dd';
1013 }
1014 if ($element.hasClass('gdatepicker_with_icon')) {
1015 optionsObj.showOn = 'both';
1016 optionsObj.buttonImage = $element.parent().siblings("[id^='gforms_calendar_icon_input']").val();
1017 optionsObj.buttonImageOnly = true;
1018 optionsObj.buttonText = i18n.iconText;
1019 } else {
1020 optionsObj.showOn = 'focus';
1021 }
1022 inputId = inputId.split('_');
1023 // allow the user to override the datepicker options object
1024 optionsObj = gform.applyFilters('gform_datepicker_options_pre_init', optionsObj, inputId[1], inputId[2], $element);
1025 if (typeof $element.datepicker === 'function') {
1026 $element.datepicker(optionsObj);
1027 // We give the input focus after selecting a date which differs from default Datepicker behavior; this prevents
1028 // users from clicking on the input again to open the datepicker. Let's add a manual click event to handle this.
1029 if ($element.is(':input')) {
1030 $element.click(function () {
1031 $element.datepicker('show');
1032 });
1033 }
1034 }
1035 }
1036 })
1037 $(document).on("change", ".gfield--type-repeater_end input,.gfield--type-repeater_end textarea,.gfield--type-repeater_end select", function (event) {
1038 var id = $(this).attr("id");
1039 if (typeof (Storage) !== "undefined") {
1040 if ($(this).attr("name") != "" && typeof $(this).attr("name") != 'undefined') {
1041 var type = $(this).attr("type");
1042 var name = $(this).attr("id");
1043 if (type == "checkbox") {
1044 if ($("#" + name + ":checked").length > 0) {
1045 var value = $("#" + name + ":checked").val();
1046 localStorage.setItem(id, value);
1047 } else {
1048 localStorage.removeItem(id);
1049 }
1050 } else if (type == "radio") {
1051 var id = $(this).attr("name");
1052 var value = $(this).val();
1053 localStorage.setItem(id, value);
1054 }
1055 else {
1056 var value = $(this).val();
1057 localStorage.setItem(id, value);
1058 }
1059 }
1060 }
1061 });
1062 })(jQuery);