PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 1.6.3
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v1.6.3
3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / assets / js / admin / form-builder.js
everest-forms / assets / js / admin Last commit date
gutenberg 6 years ago admin.js 6 years ago admin.min.js 6 years ago editor.js 8 years ago editor.min.js 6 years ago evf-admin-email.js 6 years ago evf-admin-email.min.js 6 years ago evf-clipboard.js 8 years ago evf-clipboard.min.js 8 years ago evf-enhanced-select.js 7 years ago evf-enhanced-select.min.js 7 years ago evf-setup.js 6 years ago evf-setup.min.js 6 years ago extensions.js 6 years ago extensions.min.js 6 years ago form-builder.js 6 years ago form-builder.min.js 6 years ago form-template-controller.js 6 years ago form-template-controller.min.js 6 years ago plugins.js 7 years ago plugins.min.js 7 years ago settings.js 6 years ago settings.min.js 6 years ago upgrade.js 7 years ago upgrade.min.js 7 years ago
form-builder.js
2034 lines
1 /* global evf_data, jconfirm, PerfectScrollbar, evfSetClipboard, evfClearClipboard */
2 (function ( $, evf_data ) {
3
4 var $builder;
5
6 var EVFPanelBuilder = {
7
8 /**
9 * Start the panel builder.
10 */
11 init: function () {
12 $( document ).ready( function( $ ) {
13 if ( ! $( 'evf-panel-integrations-button a' ).hasClass('active') ) {
14 $( '#everest-forms-panel-integrations' ).find( '.everest-forms-panel-sidebar a' ).first().addClass( 'active' );
15 if ( $('#everest-forms-panel-integrations' ).find( '.everest-forms-panel-sidebar a').hasClass( 'active' ) ) {
16 $('#everest-forms-panel-integrations' ).find( '.everest-forms-panel-sidebar a' ).next( '.everest-forms-active-connections' ).first().addClass( 'active' );
17 }
18 $( '.everest-forms-panel-content' ).find( '.evf-panel-content-section' ).first().addClass( 'active' );
19 }
20 });
21
22 $( document ).ready( function( $ ) {
23 if ( '1' === $( '.everest-forms-min-max-date-format input' ).val() ) {
24 $( '.everest-forms-min-max-date-option' ).find( 'input' ).datepicker({
25 defaultDate: '',
26 dateFormat: 'yy-mm-dd',
27 numberOfMonths: 1,
28 showButtonPanel: true,
29 onSelect: function() {
30 var option = $( this ).is( '.everest-forms-min-date' ) ? 'minDate' : 'maxDate',
31 dates = $( this ).closest( '.everest-forms-min-max-date-option' ).find( 'input' ),
32 date = $( this ).datepicker( 'getDate' );
33
34 dates.not( this ).datepicker( 'option', option, date );
35 $( this ).change();
36 }
37 } );
38 }
39
40 if ( ! $( 'evf-panel-payments-button a' ).hasClass( 'active' ) ) {
41 $( '#everest-forms-panel-payments' ).find( '.everest-forms-panel-sidebar a' ).first().addClass( 'active' );
42 $( '.everest-forms-panel-content' ).find( '.evf-payment-setting-content' ).first().addClass( 'active' );
43 }
44 });
45
46 $( document.body )
47 .on( 'click', '#copy-shortcode', this.copyShortcode )
48 .on( 'aftercopy', '#copy-shortcode', this.copySuccess )
49 .on( 'aftercopyfailure', '#copy-shortcode', this.copyFail );
50
51 // Document ready.
52 $( document ).ready( EVFPanelBuilder.ready );
53
54 // Page load.
55 $( window ).on( 'load', EVFPanelBuilder.load );
56
57 // Initialize builder UI fields.
58 $( document.body ).on( 'evf-init-builder-fields', function() {
59 EVFPanelBuilder.bindFields();
60 } ).trigger( 'evf-init-builder-fields' );
61
62 // Adjust builder width.
63 $( document.body ).on( 'adjust_builder_width', function() {
64 var adminMenuWidth = $( '#adminmenuwrap' ).width();
65
66 $( '#everest-forms-builder-form' ).css({ 'width': 'calc(100% - ' + adminMenuWidth + 'px)' });
67 } ).trigger( 'adjust_builder_width' );
68
69 $( document.body ).on( 'click', '#collapse-button', function() {
70 $( '#everest-forms-builder-form' ).width( '' );
71 $( document.body ).trigger( 'adjust_builder_width' );
72 });
73
74 $( window ).on( 'resize orientationchange', function() {
75 var resizeTimer;
76
77 clearTimeout( resizeTimer );
78 resizeTimer = setTimeout( function() {
79 $( '#everest-forms-builder' ).width( '' );
80 $( document.body ).trigger( 'adjust_builder_width' );
81 }, 250 );
82 }).trigger( 'resize' );
83 },
84
85 /**
86 * Copy shortcode.
87 *
88 * @param {Object} evt Copy event.
89 */
90 copyShortcode: function( evt ) {
91 evfClearClipboard();
92 evfSetClipboard( $( '.evf-shortcode-field' ).find( 'input' ).val(), $( this ) );
93 evt.preventDefault();
94 },
95
96 /**
97 * Display a "Copied!" tip when success copying.
98 */
99 copySuccess: function() {
100 $( '#copy-shortcode' ).tooltipster( 'content', $( this ).attr( 'data-copied' ) ).trigger( 'mouseenter' ).on( 'mouseleave', function() {
101 var $this = $( this );
102
103 setTimeout( function() {
104 $this.tooltipster( 'content', $this.attr( 'data-tip' ) );
105 }, 1000 );
106 } );
107 },
108
109 /**
110 * Displays the copy error message when failure copying.
111 */
112 copyFail: function() {
113 $( '.evf-shortcode-field' ).find( 'input' ).focus().select();
114 },
115
116 /**
117 * Page load.
118 *
119 * @since 1.0.0
120 */
121 load: function () {
122 $( '.everest-forms-overlay' ).fadeOut();
123 },
124
125 /**
126 * Document ready.
127 *
128 * @since 1.0.0
129 */
130 ready: function() {
131 // Cache builder element.
132 $builder = $( '#everest-forms-builder' );
133
134 // Bind all actions.
135 EVFPanelBuilder.bindUIActions();
136
137 // Bind edit form actions.
138 EVFPanelBuilder.bindEditActions();
139
140 // jquery-confirm defaults.
141 jconfirm.defaults = {
142 closeIcon: true,
143 backgroundDismiss: true,
144 escapeKey: true,
145 animationBounce: 1,
146 useBootstrap: false,
147 theme: 'modern',
148 boxWidth: '400px',
149 columnClass: 'evf-responsive-class'
150 };
151
152 // Enable Perfect Scrollbar.
153 if ( 'undefined' !== typeof PerfectScrollbar ) {
154 var tab_content = $( '.everest-forms-tab-content' ),
155 panel_setting = $( '#everest-forms-panel-settings .everest-forms-panel-sidebar' );
156
157 if ( tab_content.length >= 1 ) {
158 window.evf_tab_scroller = new PerfectScrollbar( tab_content.selector );
159 }
160
161 if ( panel_setting.length >= 1 ) {
162 window.evf_setting_scroller = new PerfectScrollbar( panel_setting.selector );
163 }
164 }
165
166 // Enable Limit length.
167 $builder.on( 'change', '.everest-forms-field-option-row-limit_enabled input', function( event ) {
168 EVFPanelBuilder.updateTextFieldsLimitControls( $( event.target ).parents( '.everest-forms-field-option-row-limit_enabled' ).data().fieldId, event.target.checked );
169 } );
170
171 // Action available for each binding.
172 $( document ).trigger( 'everest_forms_ready' );
173 },
174
175 /**
176 * Update text fields limit controls.
177 *
178 * @since 1.5.10
179 *
180 * @param {number} fieldId Field ID.
181 * @param {bool} checked Whether an option is checked or not.
182 */
183 updateTextFieldsLimitControls: function( fieldId, checked ) {
184 if ( ! checked ) {
185 $( '#everest-forms-field-option-row-' + fieldId + '-limit_controls' ).addClass( 'everest-forms-hidden' );
186 } else {
187 $( '#everest-forms-field-option-row-' + fieldId + '-limit_controls' ).removeClass( 'everest-forms-hidden' );
188 }
189 },
190
191 /**
192 * Element bindings.
193 *
194 * @since 1.0.0
195 */
196 bindUIActions: function() {
197 EVFPanelBuilder.bindDefaultTabs();
198 EVFPanelBuilder.checkEmptyGrid();
199 EVFPanelBuilder.bindFields();
200 EVFPanelBuilder.bindFormPreview();
201 EVFPanelBuilder.bindGridSwitcher();
202 EVFPanelBuilder.bindFieldSettings();
203 EVFPanelBuilder.bindFieldDelete();
204 EVFPanelBuilder.bindCloneField();
205 EVFPanelBuilder.bindSaveOption();
206 EVFPanelBuilder.bindAddNewRow();
207 EVFPanelBuilder.bindRemoveRow();
208 EVFPanelBuilder.bindFormSettings();
209 EVFPanelBuilder.bindFormEmail();
210 EVFPanelBuilder.bindFormIntegrations();
211 EVFPanelBuilder.bindFormPayment();
212 EVFPanelBuilder.choicesInit();
213 EVFPanelBuilder.bindToggleHandleActions();
214 EVFPanelBuilder.bindLabelEditInputActions();
215 EVFPanelBuilder.bindSyncedInputActions();
216
217 // Fields Panel.
218 EVFPanelBuilder.bindUIActionsFields();
219
220 if ( evf_data.tab === 'field-options' ) {
221 $( '.evf-panel-field-options-button' ).trigger( 'click' );
222 }
223 },
224
225 /**
226 * Form edit title actions.
227 *
228 * @since 1.6.0
229 */
230 bindEditActions: function() {
231 // Delegates event to toggleEditTitle() on clicking.
232 $( '#edit-form-name' ).on( 'click', function( e ) {
233 e.stopPropagation();
234
235 if ( '' !== $( '#evf-edit-form-name' ).val().trim() ) {
236 EVFPanelBuilder.toggleEditTitle( e );
237 }
238 });
239
240 // Apply the title change to form name field.
241 $( '#evf-edit-form-name' )
242 .on( 'change keypress', function( e ) {
243 var $this = $( this );
244
245 e.stopPropagation();
246
247 if ( 13 === e.which && '' !== $( this ).val().trim() ) {
248 EVFPanelBuilder.toggleEditTitle( e );
249 }
250
251 if ( '' !== $this.val().trim() ) {
252 $( '#everest-forms-panel-field-settings-form_title' ).val( $this.val().trim() );
253 }
254 })
255 .on( 'click', function( e ) {
256 e.stopPropagation();
257 });
258
259 // In case the user goes out of focus from title edit state.
260 $( document ).not( $( '.everest-forms-title-desc' ) ).click( function( e ) {
261 var field = $( '#evf-edit-form-name' );
262
263 e.stopPropagation();
264
265 // Only allow flipping state if currently editing.
266 if ( ! field.prop( 'disabled' ) && field.val() && '' !== field.val().trim() ) {
267 EVFPanelBuilder.toggleEditTitle( e );
268 }
269 });
270 },
271
272 // Toggles edit state.
273 toggleEditTitle: function( event ) {
274 var $el = $( '#edit-form-name' ),
275 $input_title = $el.siblings( '#evf-edit-form-name' );
276
277 event.preventDefault();
278
279 // Toggle disabled property.
280 $input_title.prop ( 'disabled' , function( _ , val ) {
281 return ! val;
282 });
283
284 if ( ! $input_title.hasClass( 'everst-forms-name-editing' ) ) {
285 $input_title.focus();
286 }
287
288 $input_title.toggleClass( 'everst-forms-name-editing' );
289 },
290
291 //--------------------------------------------------------------------//
292 // Fields Panel
293 //--------------------------------------------------------------------//
294
295 /**
296 * Creates a object from form elements.
297 *
298 * @since 1.6.0
299 */
300 formObject: function( el ) {
301 var form = jQuery( el ),
302 fields = form.find( '[name]' ),
303 json = {},
304 arraynames = {};
305
306 for ( var v = 0; v < fields.length; v++ ){
307
308 var field = jQuery( fields[v] ),
309 name = field.prop( 'name' ).replace( /\]/gi,'' ).split( '[' ),
310 value = field.val(),
311 lineconf = {};
312
313 if ( ( field.is( ':radio' ) || field.is( ':checkbox' ) ) && ! field.is( ':checked' ) ) {
314 continue;
315 }
316 for ( var i = name.length-1; i >= 0; i-- ) {
317 var nestname = name[i];
318 if ( typeof nestname === 'undefined' ) {
319 nestname = '';
320 }
321 if ( nestname.length === 0 ){
322 lineconf = [];
323 if ( typeof arraynames[name[i-1]] === 'undefined' ) {
324 arraynames[name[i-1]] = 0;
325 } else {
326 arraynames[name[i-1]] += 1;
327 }
328 nestname = arraynames[name[i-1]];
329 }
330 if ( i === name.length-1 ){
331 if ( value ) {
332 if ( value === 'true' ) {
333 value = true;
334 } else if ( value === 'false' ) {
335 value = false;
336 }else if ( ! isNaN( parseFloat( value ) ) && parseFloat( value ).toString() === value ) {
337 value = parseFloat( value );
338 } else if ( typeof value === 'string' && ( value.substr( 0,1 ) === '{' || value.substr( 0,1 ) === '[' ) ) {
339 try {
340 value = JSON.parse( value );
341 } catch (e) {}
342 } else if ( typeof value === 'object' && value.length && field.is( 'select' ) ){
343 var new_val = {};
344 for ( var i = 0; i < value.length; i++ ) {
345 new_val[ 'n' + i ] = value[ i ];
346 }
347 value = new_val;
348 }
349 }
350 lineconf[nestname] = value;
351 } else {
352 var newobj = lineconf;
353 lineconf = {};
354 lineconf[nestname] = newobj;
355 }
356 }
357 $.extend( true, json, lineconf );
358 }
359
360 return json;
361 },
362
363 /**
364 * Element bindings for Fields panel.
365 *
366 * @since 1.2.0
367 */
368 bindUIActionsFields: function() {
369 // Add new field choice.
370 $builder.on( 'click', '.everest-forms-field-option-row-choices .add', function( event ) {
371 EVFPanelBuilder.choiceAdd( event, $(this) );
372 });
373
374 // Delete field choice.
375 $builder.on( 'click', '.everest-forms-field-option-row-choices .remove', function( e ) {
376 EVFPanelBuilder.choiceDelete( event, $(this) );
377 });
378
379 // Field choices defaults - (before change).
380 $builder.on( 'mousedown', '.everest-forms-field-option-row-choices input[type=radio]', function(e) {
381 var $this = $(this);
382
383 if ( $this.is( ':checked' ) ) {
384 $this.attr( 'data-checked', '1' );
385 } else {
386 $this.attr( 'data-checked', '0' );
387 }
388 });
389
390 // Field choices defaults.
391 $builder.on( 'click', '.everest-forms-field-option-row-choices input[type=radio]', function(e) {
392 var $this = $(this),
393 list = $this.parent().parent();
394
395 $this.parent().parent().find( 'input[type=radio]' ).not( this ).prop( 'checked', false );
396
397 if ( $this.attr( 'data-checked' ) === '1' ) {
398 $this.prop( 'checked', false );
399 $this.attr( 'data-checked', '0' );
400 }
401
402 EVFPanelBuilder.choiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ) );
403 });
404
405 // Field choices update preview area.
406 $builder.on( 'change', '.everest-forms-field-option-row-choices input[type=checkbox]', function(e) {
407 var list = $(this).parent().parent();
408 EVFPanelBuilder.choiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ) );
409 });
410
411 // Updates field choices text in almost real time.
412 $builder.on( 'keyup paste focusout', '.everest-forms-field-option-row-choices input.label', function(e) {
413 var list = $(this).parent().parent().parent();
414 EVFPanelBuilder.choiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ) );
415 });
416
417 // Field choices display value toggle.
418 $builder.on( 'change', '.everest-forms-field-option-row-show_values input', function(e) {
419 $(this).closest( '.everest-forms-field-option' ).find( '.everest-forms-field-option-row-choices ul' ).toggleClass( 'show-values' );
420 });
421
422 // Field image choices toggle.
423 $builder.on( 'change', '.everest-forms-field-option-row-choices_images input', function() {
424 var $this = $( this ),
425 field_id = $this.parent().data( 'field-id' ),
426 $fieldOptions = $( '#everest-forms-field-option-' + field_id ),
427 $columnOptions = $( '#everest-forms-field-option-' + field_id + '-input_columns' ),
428 type = $( '#everest-forms-field-option-' + field_id ).find( '.everest-forms-field-option-hidden-type' ).val();
429
430 $this.parent().find( '.notice' ).toggleClass( 'hidden' );
431 $fieldOptions.find( '.everest-forms-field-option-row-choices ul' ).toggleClass( 'show-images' );
432
433 // Trigger columns changes.
434 if ( $this.is( ':checked' ) ) {
435 $columnOptions.val( 'inline' ).trigger( 'change' );
436 } else {
437 $columnOptions.val( '' ).trigger( 'change' );
438 }
439
440 EVFPanelBuilder.choiceUpdate( type, field_id );
441 } );
442
443 // Upload or add an image.
444 $builder.on( 'click', '.everest-forms-attachment-media-view .upload-button', function( event ) {
445 var $el = $( this ), $wrapper, file_frame;
446
447 event.preventDefault();
448
449 // If the media frame already exists, reopen it.
450 if ( file_frame ) {
451 file_frame.open();
452 return;
453 }
454
455 // Create the media frame.
456 file_frame = wp.media.frames.everestforms_media_frame = wp.media({
457 title: evf_data.i18n_upload_image_title,
458 className: 'media-frame everest-forms-media-frame',
459 frame: 'select',
460 multiple: false,
461 library: {
462 type: 'image'
463 },
464 button: {
465 text: evf_data.i18n_upload_image_button
466 }
467 });
468
469 // When an image is selected, run a callback.
470 file_frame.on( 'select', function() {
471 var attachment = file_frame.state().get( 'selection' ).first().toJSON();
472
473 if ( $el.hasClass( 'button-add-media' ) ) {
474 $el.hide();
475 $wrapper = $el.parent();
476 } else {
477 $wrapper = $el.parent().parent().parent();
478 }
479
480 $wrapper.find( '.source' ).val( attachment.url );
481 $wrapper.find( '.attachment-thumb' ).remove();
482 $wrapper.find( '.thumbnail-image' ).prepend( '<img class="attachment-thumb" src="' + attachment.url + '">' );
483 $wrapper.find( '.actions' ).show();
484
485 $builder.trigger( 'everestFormsImageUploadAdd', [ $el, $wrapper ] );
486 });
487
488 // Finally, open the modal.
489 file_frame.open();
490 } );
491
492 // Remove and uploaded image.
493 $builder.on( 'click', '.everest-forms-attachment-media-view .remove-button', function( event ) {
494 event.preventDefault();
495
496 var $container = $( this ).parent().parent();
497
498 $container.find( '.attachment-thumb' ).remove();
499 $container.parent().find( '.source' ).val( '' );
500 $container.parent().find( '.button-add-media' ).show();
501
502 $builder.trigger( 'everestFormsImageUploadRemove', [ $( this ), $container ] );
503 });
504
505 // Field choices image upload add/remove image.
506 $builder.on( 'everestFormsImageUploadAdd everestFormsImageUploadRemove', function( event, $this, $container ) {
507 var $el = $container.closest( '.evf-choices-list' ),
508 type = $el.data( 'field-type' ),
509 field_id = $el.data( 'field-id' );
510
511 EVFPanelBuilder.choiceUpdate( type, field_id );
512 });
513
514 // Toggle Layout advanced field option.
515 $builder.on( 'change', '.everest-forms-field-option-row-input_columns select', function() {
516 var $this = $( this ),
517 value = $this.val(),
518 field_id = $this.parent().data( 'field-id' ),
519 css_class = '';
520
521 if ( 'inline' === value ) {
522 css_class = 'everest-forms-list-inline';
523 } else if ( '' !== value ) {
524 css_class = 'everest-forms-list-' + value + '-columns';
525 }
526
527 $( '#everest-forms-field-' + field_id ).removeClass( 'everest-forms-list-inline everest-forms-list-2-columns everest-forms-list-3-columns' ).addClass( css_class );
528 });
529
530 // Field sidebar tab toggle.
531 $builder.on( 'click', '.everest-forms-fields-tab a', function(e) {
532 e.preventDefault();
533 EVFPanelBuilder.fieldTabChoice( $(this).attr( 'id' ) );
534 });
535
536 // Display toggle for "Address" field hidden option.
537 $builder.on( 'change', '.everest-forms-field-option-address input.hide', function() {
538 var $this = $(this),
539 id = $this.parent().parent().data( 'field-id' ),
540 subfield = $this.parent().parent().data( 'subfield' );
541 $( '#everest-forms-field-' + id ).find( '.everest-forms-' + subfield ).toggleClass( 'hidden' );
542 });
543
544 // Real-time updates for "Show Label" field option.
545 $builder.on( 'input', '.everest-forms-field-option-row-label input', function() {
546 var $this = $(this),
547 value = $this.val(),
548 id = $this.parent().data( 'field-id' );
549 $( '#everest-forms-field-' + id ).find( '.label-title .text' ).text(value);
550 });
551
552 // Real-time updates for "Description" field option.
553 $builder.on( 'input', '.everest-forms-field-option-row-description textarea', function() {
554 var $this = $( this ),
555 value = $this.val(),
556 id = $this.parent().data( 'field-id' ),
557 $desc = $( '#everest-forms-field-' + id ).find( '.description' );
558
559 if ( $desc.hasClass( 'nl2br' ) ) {
560 $desc.html( value.replace( /\n/g, '<br>') );
561 } else {
562 $desc.html( value );
563 }
564 });
565
566 // Real-time updates for "Required" field option.
567 $builder.on( 'change', '.everest-forms-field-option-row-required input', function( event ) {
568 var id = $( this ).parent().data( 'field-id' );
569
570 $( '#everest-forms-field-' + id ).toggleClass( 'required' );
571
572 // Toggle "Required Field Message" option.
573 if ( $( event.target ).is( ':checked' ) ) {
574 $( '#everest-forms-field-option-row-' + id + '-required-field-message' ).show();
575 } else {
576 $( '#everest-forms-field-option-row-' + id + '-required-field-message' ).hide();
577 }
578 });
579
580 // Real-time updates for "Confirmation" field option.
581 $builder.on( 'change', '.everest-forms-field-option-row-confirmation input', function() {
582 var id = $( this ).parent().data( 'field-id' );
583 $( '#everest-forms-field-' + id ).find( '.everest-forms-confirm' ).toggleClass( 'everest-forms-confirm-enabled everest-forms-confirm-disabled' );
584 $( '#everest-forms-field-option-' + id ).toggleClass( 'everest-forms-confirm-enabled everest-forms-confirm-disabled' );
585 });
586
587 // Real-time updates for "Placeholder" field option.
588 $builder.on( 'input', '.everest-forms-field-option-row-placeholder input', function(e) {
589 var $this = $( this ),
590 value = $this.val(),
591 id = $this.parent().data( 'field-id' ),
592 $primary = $( '#everest-forms-field-' + id ).find( '.primary-input' );
593
594 if ( $primary.is( 'select' ) ) {
595 if ( ! value.length ) {
596 $primary.find( '.placeholder' ).remove();
597 } else {
598 if ( $primary.find( '.placeholder' ).length ) {
599 $primary.find( '.placeholder' ).text( value );
600 } else {
601 $primary.prepend( '<option class="placeholder" selected>' + value + '</option>' );
602 }
603 }
604 } else {
605 $primary.attr( 'placeholder', value );
606 }
607 });
608
609 // Real-time updates for "Address Placeholder" field options.
610 $builder.on( 'input', '.everest-forms-field-option-address input.placeholder', function(e) {
611 var $this = $(this),
612 value = $this.val(),
613 id = $this.parent().parent().data( 'field-id' ),
614 subfield = $this.parent().parent().data( 'subfield' );
615 $( '#everest-forms-field-' + id ).find( '.everest-forms-' + subfield + ' input' ).attr( 'placeholder', value );
616 });
617
618 // Real-time updates for "Confirmation Placeholder" field option.
619 $builder.on('input', '.everest-forms-field-option-row-confirmation_placeholder input', function() {
620 var $this = $( this ),
621 value = $this.val(),
622 id = $this.parent().data( 'field-id' );
623 $( '#everest-forms-field-' + id ).find( '.secondary-input' ).attr( 'placeholder', value );
624 });
625
626 // Real-time updates for "Hide Label" field option.
627 $builder.on( 'change', '.everest-forms-field-option-row-label_hide input', function() {
628 var id = $(this).parent().data( 'field-id' );
629 $( '#everest-forms-field-' + id ).toggleClass( 'label_hide' );
630 });
631
632 // Real-time updates for Sub Label visbility field option.
633 $builder.on( 'change', '.everest-forms-field-option-row-sublabel_hide input', function() {
634 var id = $( this ).parent().data( 'field-id' );
635 $( '#everest-forms-field-' + id ).toggleClass( 'sublabel_hide' );
636 });
637
638 // Real-time updates for Date/Time and Name "Format" option.
639 $builder.on( 'change', '.everest-forms-field-option-row-datetime_format select, .everest-forms-field-option-row-phone_format select, .everest-forms-field-option-row-item_price select, .everest-forms-field-option-row-format select', function(e) {
640 var $this = $(this),
641 value = $this.val(),
642 id = $this.parent().data( 'field-id' );
643 $( '#everest-forms-field-' + id ).find( '.format-selected' ).removeClass().addClass( 'format-selected format-selected-' + value );
644 $( '#everest-forms-field-option-' + id ).find( '.format-selected' ).removeClass().addClass( 'format-selected format-selected-'+ value );
645 });
646 },
647
648 /**
649 * Make field choices sortable.
650 *
651 * @since 1.0.0
652 *
653 * @param {string} selector Selector.
654 */
655 choicesInit: function( selector ) {
656 selector = selector || '.everest-forms-field-option-row-choices ul';
657
658 $( selector ).sortable({
659 items: 'li',
660 axis: 'y',
661 handle: '.sort',
662 scrollSensitivity: 40,
663 stop: function ( event ) {
664 var field_id = $( event.target ).attr( 'data-field-id' ),
665 type = $( '#everest-forms-field-option-' + field_id ).find( '.everest-forms-field-option-hidden-type' ).val();
666
667 EVFPanelBuilder.choiceUpdate( type, field_id );
668 }
669 } );
670 },
671
672 /**
673 * Add new field choice.
674 *
675 * @since 1.6.0
676 */
677 choiceAdd: function( event, el ) {
678 event.preventDefault();
679
680 var $this = $( el ),
681 $parent = $this.parent(),
682 checked = $parent.find( 'input.default' ).is( ':checked' ),
683 fieldID = $this.closest( '.everest-forms-field-option-row-choices' ).data( 'field-id' ),
684 nextID = $parent.parent().attr( 'data-next-id' ),
685 type = $parent.parent().data( 'field-type' ),
686 $choice = $parent.clone().insertAfter( $parent );
687
688 $choice.attr( 'data-key', nextID );
689 $choice.find( 'input.label' ).val( '' ).attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][label]' );
690 $choice.find( 'input.value' ).val( '' ).attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][value]' );
691 $choice.find( 'input.source' ).val( '' ).attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][image]' );
692 $choice.find( 'input.default').attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][default]' ).prop( 'checked', false );
693 $choice.find( '.attachment-thumb' ).remove();
694 $choice.find( '.button-add-media' ).show();
695
696 if ( checked === true ) {
697 $parent.find( 'input.default' ).prop( 'checked', true );
698 }
699
700 nextID++;
701 $parent.parent().attr( 'data-next-id', nextID );
702 $builder.trigger( 'everestFormsChoiceAdd' );
703 EVFPanelBuilder.choiceUpdate( type, fieldID );
704 },
705
706 /**
707 * Delete field choice.
708 *
709 * @since 1.6.0
710 */
711 choiceDelete: function( event, el ) {
712 event.preventDefault();
713
714 var $this = $( el ),
715 $list = $this.parent().parent(),
716 total = $list.find( 'li' ).length;
717
718 if ( total < 2 ) {
719 $.alert({
720 title: false,
721 content: evf_data.i18n_field_error_choice,
722 icon: 'dashicons dashicons-info',
723 type: 'blue',
724 buttons: {
725 ok: {
726 text: evf_data.i18n_ok,
727 btnClass: 'btn-confirm',
728 keys: [ 'enter' ]
729 }
730 }
731 });
732 } else {
733 $this.parent().remove();
734 EVFPanelBuilder.choiceUpdate( $list.data( 'field-type' ), $list.data( 'field-id' ) );
735 $builder.trigger( 'everestFormsChoiceDelete' );
736 }
737 },
738
739 /**
740 * Update field choices in preview area, for the Fields panel.
741 *
742 * @since 1.6.0
743 */
744 choiceUpdate: function( type, id ) {
745 var $fieldOptions = $( '#everest-forms-field-option-' + id );
746
747 // Radio and Checkbox use _ template.
748 if ( 'radio' === type || 'checkbox' === type || 'payment-multiple' === type || 'payment-checkbox' === type ) {
749 var choices = [],
750 formData = EVFPanelBuilder.formObject( $fieldOptions ),
751 settings = formData.form_fields[ id ];
752
753 // Order of choices for a specific field.
754 $( '#everest-forms-field-option-' + id ).find( '.evf-choices-list li' ).each( function() {
755 choices.push( $( this ).data( 'key' ) );
756 } );
757
758 var tmpl = wp.template( 'everest-forms-field-preview-choices' ),
759 type = 'checkbox' === type || 'payment-checkbox' === type ? 'checkbox' : 'radio';
760 data = {
761 type: type,
762 order: choices,
763 settings: settings,
764 };
765
766 $( '#everest-forms-field-' + id ).find( 'ul.primary-input' ).replaceWith( tmpl( data ) );
767
768 return;
769 }
770
771 var new_choice;
772
773 if ( 'select' === type ) {
774 $( '#everest-forms-field-' + id + ' .primary-input option' ).not( '.placeholder' ).remove();
775 new_choice = '<option>{label}</option>';
776 }
777
778 $( '#everest-forms-field-option-row-' + id + '-choices .evf-choices-list li' ).each( function( index ) {
779 var $this = $( this ),
780 label = $this.find( 'input.label' ).val(),
781 selected = $this.find( 'input.default' ).is( ':checked' ),
782 choice = $( new_choice.replace( '{label}', label ) );
783
784 $( '#everest-forms-field-' + id + ' .primary-input' ).append( choice );
785
786 if ( true === selected ) {
787 switch ( type ) {
788 case 'select':
789 choice.prop( 'selected', true );
790 break;
791 case 'radio':
792 case 'checkbox':
793 choice.find( 'input' ).prop( 'checked', true );
794 break;
795 }
796 }
797 } );
798 },
799 bindFormSettings: function () {
800 $( 'body' ).on( 'click', '.evf-setting-panel', function( e ) {
801 var data_setting_section = $(this).attr('data-section');
802 $('.evf-setting-panel').removeClass('active');
803 $('.everest-forms-active-email').removeClass('active');
804 $('.evf-content-section').removeClass('active');
805 $(this).addClass('active');
806 $('.evf-content-' + data_setting_section + '-settings').addClass('active');
807 e.preventDefault();
808 });
809
810 $('.evf-setting-panel').eq(0).trigger('click');
811 },
812 bindFormEmail: function () {
813 $('body').on('click', '.everest-forms-panel-sidebar-section-email', function ( e ) {
814 $(this).siblings('.everest-forms-active-email').removeClass('active');
815 $(this).next('.everest-forms-active-email').addClass('active');
816 var container = $( this ).siblings('.everest-forms-active-email.active').find('.everest-forms-active-email-connections-list li');
817
818 if( container.length ){
819 container.children('.user-nickname').first().trigger('click');
820 }
821 e.preventDefault();
822 });
823 },
824 bindFormIntegrations: function () {
825 $('body').on('click', '.evf-integrations-panel', function ( e ) {
826 var data_setting_section = $(this).attr('data-section');
827 $('.evf-integrations-panel').removeClass('active');
828 $('#everest-forms-panel-integrations').find('.evf-panel-content-section').removeClass('active');
829 $(this).addClass('active');
830 $(this).parent().find('.everest-forms-active-connections').removeClass('active');
831 $(this).next('.everest-forms-active-connections').addClass('active');
832 var container = $( this ).siblings('.everest-forms-active-connections.active').find('.everest-forms-active-connections-list li');
833
834 if( container.length ){
835 container.children('.user-nickname').first().trigger('click');
836 }
837 $('.evf-panel-content-section-' + data_setting_section ).addClass('active');
838 e.preventDefault();
839 });
840
841 $('.evf-setting-panel').eq(0).trigger('click');
842 },
843 bindFormPayment: function () {
844 $('body').on('click', '.evf-payments-panel', function ( e ) {
845 var data_setting_section = $(this).attr('data-section');
846 $('.evf-payments-panel').removeClass('active');
847 $(this).siblings().removeClass('icon active');
848 $(this).addClass('active');
849 $(this).parents('#everest-forms-panel-payments').find('.evf-payment-setting-content').removeClass('active').hide();
850 $('.evf-content-' + data_setting_section + '-settings' ).addClass('active').show();
851 e.preventDefault();
852 });
853
854 $('.evf-setting-panel').eq(0).trigger('click');
855 },
856 removeRow: function ( row ) {
857 $.each( row.find( '.everest-forms-field' ), function() {
858 var field_id = $( this ).attr( 'data-field-id' ),
859 field_options = $( '#everest-forms-field-option-' + field_id );
860
861 // Remove form field.
862 $( this ).remove();
863
864 // Remove field options.
865 field_options.remove();
866 });
867
868 // Remove row.
869 row.remove();
870 },
871 bindRemoveRow: function () {
872 $( 'body' ).on( 'click', '.evf-delete-row', function() {
873 var $this = $( this ),
874 total_rows = $( '.evf-admin-row' ).length,
875 current_row = $this.closest( '.evf-admin-row' ),
876 current_part = $this.parents( '.evf-admin-field-container' ).attr( 'data-current-part' ),
877 multipart_active = $( '#everest-forms-builder' ).hasClass( 'multi-part-activated' );
878
879 if ( current_part && multipart_active ) {
880 total_rows = $( '#part_' + current_part ).find( '.evf-admin-row' ).length;
881 }
882
883 if ( total_rows < 2 ) {
884 $.alert({
885 title: evf_data.i18n_row_locked,
886 content: evf_data.i18n_row_locked_msg,
887 icon: 'dashicons dashicons-info',
888 type: 'blue',
889 buttons : {
890 confirm : {
891 text: evf_data.i18n_close,
892 btnClass: 'btn-confirm',
893 keys: ['enter']
894 }
895 }
896 });
897 } else {
898 $.confirm({
899 title: false,
900 content: evf_data.i18n_delete_row_confirm,
901 type: 'red',
902 closeIcon: false,
903 backgroundDismiss: false,
904 icon: 'dashicons dashicons-warning',
905 buttons: {
906 confirm: {
907 text: evf_data.i18n_ok,
908 btnClass: 'btn-confirm',
909 keys: ['enter'],
910 action: function () {
911 EVFPanelBuilder.removeRow( current_row );
912 }
913 },
914 cancel: {
915 text: evf_data.i18n_cancel
916 }
917 }
918 } );
919 }
920 });
921 },
922 bindAddNewRow: function() {
923 $( 'body' ).on( 'click', '.evf-add-row span', function() {
924 var $this = $( this ),
925 wrapper = $( '.evf-admin-field-wrapper' ),
926 row_clone = $( '.evf-admin-row' ).eq(0).clone(),
927 total_rows = $this.parent().attr( 'data-total-rows' ),
928 current_part = $this.parents( '.evf-admin-field-container' ).attr( 'data-current-part' );
929
930 total_rows++;
931
932 if ( current_part ) {
933 wrapper = $( '.evf-admin-field-wrapper' ).find( '#part_' + current_part );
934 }
935
936 // Row clone.
937 row_clone.find( '.evf-admin-grid' ).html( '' );
938 row_clone.attr( 'data-row-id', total_rows );
939 $this.parent().attr( 'data-total-rows', total_rows );
940
941 // Row append.
942 wrapper.append( row_clone );
943
944 // Initialize fields UI.
945 EVFPanelBuilder.bindFields();
946 EVFPanelBuilder.checkEmptyGrid();
947 });
948 },
949 bindCloneField: function () {
950 $( 'body' ).on( 'click', '.everest-forms-preview .everest-forms-field .everest-forms-field-duplicate', function() {
951 var $field = $( this ).closest( '.everest-forms-field' );
952
953 if ( $field.hasClass( 'no-duplicate' ) ) {
954 $.alert({
955 title: evf_data.i18n_field_locked,
956 content: evf_data.i18n_field_locked_msg,
957 icon: 'dashicons dashicons-info',
958 type: 'blue',
959 buttons : {
960 confirm : {
961 text: evf_data.i18n_close,
962 btnClass: 'btn-confirm',
963 keys: ['enter']
964 }
965 }
966 });
967 } else {
968 $.confirm({
969 title: false,
970 content: evf_data.i18n_duplicate_field_confirm,
971 type: 'orange',
972 closeIcon: false,
973 backgroundDismiss: false,
974 icon: 'dashicons dashicons-warning',
975 buttons: {
976 confirm: {
977 text: evf_data.i18n_ok,
978 btnClass: 'btn-confirm',
979 keys: ['enter'],
980 action: function () {
981 EVFPanelBuilder.cloneFieldAction( $field );
982 }
983 },
984 cancel: {
985 text: evf_data.i18n_cancel
986 }
987 }
988 } );
989 }
990 } );
991 },
992 cloneFieldAction: function ( field ) {
993 var element_field_id = field.attr('data-field-id');
994 var form_id = evf_data.form_id;
995 var data = {
996 action: 'everest_forms_get_next_id',
997 security: evf_data.evf_get_next_id,
998 form_id: form_id
999 };
1000 $.ajax({
1001 url: evf_data.ajax_url,
1002 data: data,
1003 type: 'POST',
1004 beforeSend: function() {
1005 $( document.body ).trigger( 'init_field_options_toggle' );
1006 },
1007 success: function ( response ) {
1008 if ( typeof response.success === 'boolean' && response.success === true ) {
1009 var field_id = response.data.field_id;
1010 var field_key = response.data.field_key;
1011 $('#everest-forms-field-id').val(field_id);
1012 EVFPanelBuilder.render_node(field, element_field_id, field_key);
1013 $( document.body ).trigger( 'init_field_options_toggle' );
1014 }
1015 }
1016 });
1017 },
1018 render_node: function ( field, old_key, new_key ) {
1019 var option = $('.everest-forms-field-options #everest-forms-field-option-' + old_key );
1020 var old_field_label = $('#everest-forms-field-option-' + old_key + '-label' ).val();
1021 var old_field_meta_key = $( '#everest-forms-field-option-' + old_key + '-meta-key' ).length ? $( '#everest-forms-field-option-' + old_key + '-meta-key' ).val() : '';
1022 var field_type = field.attr('data-field-type'),
1023 newOptionHtml = option.html(),
1024 new_field_label = old_field_label + ' ' + evf_data.i18n_copy,
1025 new_meta_key = 'html' !== field_type ? old_field_meta_key.replace( /\(|\)/g, '' ).toLowerCase().substring( 0, old_field_meta_key.lastIndexOf( '_' ) ) + '_' + Math.floor( 1000 + Math.random() * 9000 ) : '',
1026 newFieldCloned = field.clone();
1027 var regex = new RegExp(old_key, 'g');
1028 newOptionHtml = newOptionHtml.replace(regex, new_key);
1029 var newOption = $('<div class="everest-forms-field-option everest-forms-field-option-' + field_type + '" id="everest-forms-field-option-' + new_key + '" data-field-id="' + new_key + '" />');
1030 newOption.append(newOptionHtml);
1031 $.each(option.find(':input'), function () {
1032 var type = $(this).attr('type');
1033 var name = $( this ).attr( 'name' ) ? $( this ).attr( 'name' ) : '';
1034 var new_name = name.replace(regex, new_key);
1035 var value = '';
1036 if ( type === 'text' || type === 'hidden' ) {
1037 value = $(this).val();
1038 newOption.find('input[name="' + new_name + '"]').val(value);
1039 newOption.find('input[value="' + old_key + '"]').val(new_key);
1040 } else if ( type === 'checkbox' || type === 'radio' ) {
1041 if ( $(this).is(':checked') ) {
1042 newOption.find('input[name="' + new_name + '"]').prop('checked', true).attr('checked', 'checked');
1043 } else {
1044 newOption.find('[name="' + new_name + '"]').prop('checked', false).attr('checked', false);
1045 }
1046 } else if ( $(this).is('select') ) {
1047 if ( $(this).find('option:selected').length ) {
1048 var option_value = $(this).find('option:selected').val();
1049 newOption.find('[name="' + new_name + '"]').find('[value="' + option_value + '"]').prop('selected', true);
1050 }
1051 } else {
1052 if ( $(this).val() !== '' ) {
1053 newOption.find('[name="' + new_name + '"]').val($(this).val());
1054 }
1055 }
1056 });
1057
1058 $('.everest-forms-field-options').append(newOption);
1059 $('#everest-forms-field-option-' + new_key + '-label').val(new_field_label);
1060 $('#everest-forms-field-option-' + new_key + '-meta-key').val(new_meta_key);
1061
1062 // Field Clone
1063 newFieldCloned.attr('class', field.attr('class'));
1064 newFieldCloned.attr('id', 'everest-forms-field-' + new_key);
1065 newFieldCloned.attr('data-field-id', new_key);
1066 newFieldCloned.attr('data-field-type', field_type);
1067 newFieldCloned.find('.label-title .text').text(new_field_label);
1068 field.closest( '.evf-admin-grid' ).find( '[data-field-id="' + old_key + '"]' ).after( newFieldCloned );
1069 $(document).trigger('everest-form-cloned', [ new_key, field_type ]);
1070 EVFPanelBuilder.switchToFieldOptionPanel(new_key);//switch to cloned field options
1071 },
1072 bindFieldDelete: function () {
1073 $( 'body' ).on('click', '.everest-forms-preview .everest-forms-field .everest-forms-field-delete', function () {
1074 var $field = $( this ).closest( '.everest-forms-field' );
1075 var field_id = $field.attr('data-field-id');
1076 var option_field = $( '#everest-forms-field-option-' + field_id );
1077 var grid = $( this ).closest( '.evf-admin-grid' );
1078
1079 if ( $field.hasClass( 'no-delete' ) ) {
1080 $.alert({
1081 title: evf_data.i18n_field_locked,
1082 content: evf_data.i18n_field_locked_msg,
1083 icon: 'dashicons dashicons-info',
1084 type: 'blue',
1085 buttons : {
1086 confirm : {
1087 text: evf_data.i18n_close,
1088 btnClass: 'btn-confirm',
1089 keys: ['enter']
1090 }
1091 }
1092 });
1093 } else {
1094 $.confirm({
1095 title: false,
1096 content: evf_data.i18n_delete_field_confirm,
1097 type: 'red',
1098 closeIcon: false,
1099 backgroundDismiss: false,
1100 icon: 'dashicons dashicons-warning',
1101 buttons: {
1102 confirm: {
1103 text: evf_data.i18n_ok,
1104 btnClass: 'btn-confirm',
1105 keys: ['enter'],
1106 action: function () {
1107 $( '.evf-panel-fields-button' ).trigger( 'click' );
1108 $field.fadeOut( 'slow', function () {
1109 var removed_el_id = $field.attr('data-field-id');
1110 $( document.body ).trigger( 'evf_before_field_deleted', [ removed_el_id] );
1111 $field.remove();
1112 option_field.remove();
1113 EVFPanelBuilder.checkEmptyGrid();
1114 $( '.everest-forms-fields-tab' ).find( 'a' ).removeClass( 'active' );
1115 $( '.everest-forms-fields-tab' ).find( 'a' ).first().addClass( 'active' );
1116 $( '.everest-forms-add-fields' ).show();
1117 EVFPanelBuilder.conditionalLogicRemoveField(removed_el_id);
1118 EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(removed_el_id);
1119 EVFPanelBuilder.paymentFieldRemoveFromQuantity(removed_el_id);
1120 });
1121 }
1122 },
1123 cancel: {
1124 text: evf_data.i18n_cancel
1125 }
1126 }
1127 } );
1128 }
1129 });
1130 },
1131 bindSaveOption: function () {
1132 $( 'body' ).on( 'click', '.everest-forms-save-button', function () {
1133 var $this = $( this );
1134 var $form = $( 'form#everest-forms-builder-form' );
1135 var structure = EVFPanelBuilder.getStructure();
1136 var form_data = $form.serializeArray();
1137 var form_title = $( '#evf-edit-form-name' ).val().trim();
1138
1139 if ( '' === form_title ) {
1140 $.alert({
1141 title: evf_data.i18n_field_title_empty,
1142 content: evf_data.i18n_field_title_payload,
1143 icon: 'dashicons dashicons-warning',
1144 type: 'red',
1145 buttons: {
1146 ok: {
1147 text: evf_data.i18n_ok,
1148 btnClass: 'btn-confirm',
1149 keys: [ 'enter' ]
1150 }
1151 }
1152 });
1153 return;
1154 }
1155
1156 // Trigger a handler to let addon manipulate the form data if needed.
1157 if ( $form.triggerHandler( 'everest_forms_process_ajax_data', [ $this, form_data ] ) ) {
1158 form_data = $form.triggerHandler( 'everest_forms_process_ajax_data', [ $this, form_data ] );
1159 }
1160
1161 $( '.everest-forms-panel-content-wrap' ).block({
1162 message: null,
1163 overlayCSS: {
1164 background: '#fff',
1165 opacity: 0.6
1166 }
1167 });
1168
1169 /* DB unwanted data erase start */
1170 var rfields_ids = [];
1171 $( '.everest-forms-field[data-field-id]' ).each( function() {
1172 rfields_ids.push( $( this ).attr( 'data-field-id' ) );
1173 });
1174
1175 var form_data_length = form_data.length;
1176 while ( form_data_length-- ) {
1177 if ( form_data[ form_data_length ].name.startsWith( 'form_fields' ) ) {
1178 var idflag = false;
1179 rfields_ids.forEach( function( element ) {
1180 if ( form_data[ form_data_length ].name.startsWith( 'form_fields[' + element + ']' ) ) {
1181 idflag = true;
1182 }
1183 });
1184 if ( form_data_length > -1 && idflag === false ) {
1185 form_data.splice( form_data_length, 1 );
1186 }
1187 }
1188 }
1189 /* DB fix end */
1190
1191 var new_form_data = form_data.concat( structure );
1192 var data = {
1193 action: 'everest_forms_save_form',
1194 security: evf_data.evf_save_form,
1195 form_data: JSON.stringify( new_form_data )
1196 };
1197 $.ajax({
1198 url: evf_data.ajax_url,
1199 data: data,
1200 type: 'POST',
1201 beforeSend: function () {
1202 $this.addClass( 'processing' );
1203 $this.find( '.loading-dot' ).remove();
1204 $this.append( '<span class="loading-dot"></span>' );
1205 },
1206 success: function ( response ) {
1207 $this.removeClass( 'processing' );
1208 $this.find( '.loading-dot' ).remove();
1209
1210 if ( ! response.success ) {
1211 $.alert({
1212 title: response.data.errorTitle,
1213 content: response.data.errorMessage,
1214 icon: 'dashicons dashicons-warning',
1215 type: 'red',
1216 buttons: {
1217 ok: {
1218 text: evf_data.i18n_ok,
1219 btnClass: 'btn-confirm',
1220 keys: [ 'enter' ]
1221 }
1222 }
1223 });
1224 }
1225
1226 $( '.everest-forms-panel-content-wrap' ).unblock();
1227 }
1228 });
1229 });
1230 },
1231 getStructure: function () {
1232 var wrapper = $( '.evf-admin-field-wrapper' );
1233 var structure = [];
1234
1235 $.each( wrapper.find( '.evf-admin-row' ), function() {
1236 var $row = $( this ),
1237 row_id = $row.attr( 'data-row-id' );
1238
1239 $.each( $row.find( '.evf-admin-grid' ), function() {
1240 var $grid = $( this ),
1241 grid_id = $grid.attr( 'data-grid-id' );
1242
1243 var array_index = 0;
1244 $.each( $grid.find( '.everest-forms-field' ), function() {
1245 var structure_object = { name: '', value: '' };
1246 var field_id = $( this ).attr( 'data-field-id' );
1247 structure_object.name = 'structure[row_' + row_id + '][grid_' + grid_id + '][' + array_index + ']';
1248 array_index++;
1249 structure_object.value = field_id;
1250 structure.push( structure_object );
1251 });
1252 if ( $grid.find( '.everest-forms-field' ).length < 1 ) {
1253 structure.push({ name: 'structure[row_' + row_id + '][grid_' + grid_id + ']', value: '' });
1254 }
1255 });
1256 });
1257
1258 return structure;
1259 },
1260 getFieldArray: function ( grid ) {
1261
1262 var fields = [];
1263 $.each(grid.find('.everest-forms-field'), function () {
1264
1265 var field_id = $(this).attr('data-field-id');
1266 fields.push(field_id);
1267 });
1268 return fields;
1269 },
1270 checkEmptyGrid: function( $force ) {
1271 $.each( $( '.evf-admin-grid' ), function () {
1272 var $fields = $( this ).find( '.everest-forms-field, .evf-registered-item:not(.ui-draggable-dragging)' );
1273 if ( $fields.not( '.ui-sortable-helper' ).length < 1 ) {
1274 $( this ).addClass( 'evf-empty-grid' );
1275 } else {
1276 $( this ).removeClass( 'evf-empty-grid' );
1277 }
1278 } );
1279 EVFPanelBuilder.choicesInit();
1280 },
1281 bindDefaultTabs: function () {
1282 $( document ).on( 'click', '.evf-nav-tab-wrapper a', function ( e ) {
1283 e.preventDefault();
1284 EVFPanelBuilder.switchTab( $( this ).data( 'panel' ) );
1285 });
1286 },
1287 switchTab: function( panel ) {
1288 var $panel = $( '#everest-forms-panel-' + panel ),
1289 $panelBtn = $( '.evf-panel-' + panel + '-button' );
1290
1291 $( '.evf-nav-tab-wrapper' ).find( 'a' ).removeClass( 'nav-tab-active' );
1292 $panelBtn.addClass( 'nav-tab-active' );
1293 $panel.closest( '.evf-tab-content' ).find( '.everest-forms-panel' ).removeClass( 'active' );
1294 $panel.addClass( 'active' );
1295
1296 if ( 'integrations' === panel || 'payments' === panel ) {
1297 if ( ! $panel.find( '.everest-forms-panel-sidebar a' ).hasClass( 'active' ) ) {
1298 $panel.find( '.everest-forms-panel-sidebar a' ).first().addClass( 'active' );
1299 }
1300
1301 if ( ! $( '.everest-forms-panel-content' ).find( '.evf-panel-content-section' ).hasClass( 'active' ) ) {
1302 $( '.everest-forms-panel-content' ).find( '.evf-panel-content-section' ).first().addClass( 'active' );
1303 }
1304 }
1305
1306 history.replaceState({}, null, EVFPanelBuilder.updateQueryString( 'tab', panel ) );
1307 EVFPanelBuilder.switchPanel(panel);
1308 },
1309 updateQueryString: function ( key, value, url ) {
1310 if ( ! url ) url = window.location.href;
1311 var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
1312 hash;
1313
1314 if ( re.test( url ) ) {
1315 if ( typeof value !== 'undefined' && value !== null )
1316 return url.replace(re, '$1' + key + "=" + value + '$2$3');
1317 else {
1318 hash = url.split('#');
1319 url = hash[ 0 ].replace(re, '$1$3').replace(/(&|\?)$/, '');
1320 if ( typeof hash[ 1 ] !== 'undefined' && hash[ 1 ] !== null )
1321 url += '#' + hash[ 1 ];
1322 return url;
1323 }
1324 } else {
1325 if ( typeof value !== 'undefined' && value !== null ) {
1326 var separator = url.indexOf('?') !== -1 ? '&' : '?';
1327 hash = url.split('#');
1328 url = hash[ 0 ] + separator + key + '=' + value;
1329 if ( typeof hash[ 1 ] !== 'undefined' && hash[ 1 ] !== null )
1330 url += '#' + hash[ 1 ];
1331 return url;
1332 } else {
1333 return url;
1334 }
1335 }
1336 },
1337 switchPanel: function ( panel ) {
1338 if ( panel === 'field-options' ) {
1339 EVFPanelBuilder.switchToFieldOptionPanel();
1340 }
1341 },
1342 switchToFieldOptionPanel: function ( field_id ) {
1343 $('.everest-forms-field-options').find('.no-fields').hide();
1344 $('.evf-admin-field-wrapper .everest-forms-field').removeClass('active');
1345 $('#everest-forms-panel-fields').addClass('active');
1346 $('.everest-forms-fields-tab').find('a').removeClass('active');
1347 $('.everest-forms-fields-tab').find('a').last().addClass('active');
1348 $('.everest-forms-add-fields').hide();
1349 $('.everest-forms-field-options').show();
1350 $('.everest-forms-field-options').find('.everest-forms-field-option').hide();
1351 $('.evf-tab-lists').find('li a').removeClass('active');
1352 $('.evf-tab-lists').find('li.evf-panel-field-options-button a').addClass('active');
1353
1354 $( document.body ).trigger( 'evf-init-switch-field-options' );
1355
1356 if ( typeof field_id !== 'undefined' ) {
1357 $('#everest-forms-field-option-' + field_id).show();
1358 $('#everest-forms-field-' + field_id).addClass('active');
1359 } else {
1360 if ( $('.evf-admin-field-wrapper .everest-forms-field').length > 0 ) {
1361 $('.evf-admin-field-wrapper .everest-forms-field').eq(0).addClass('active');
1362 $('#everest-forms-field-option-' + $('.evf-admin-field-wrapper .everest-forms-field').eq(0).attr('data-field-id')).show();
1363 } else {
1364 $('.everest-forms-field-options').find('.no-fields').show();
1365 }
1366 }
1367 },
1368 bindFields: function () {
1369 $( '.evf-admin-field-wrapper' ).sortable({
1370 items: '.evf-admin-row',
1371 axis: 'y',
1372 cursor: 'move',
1373 opacity: 0.65,
1374 scrollSensitivity: 40,
1375 forcePlaceholderSize: true,
1376 placeholder: 'evf-sortable-placeholder',
1377 containment: '.everest-forms-panel-content',
1378 start: function( event, ui ) {
1379 ui.item.css({
1380 'background-color': '#f7fafc',
1381 'border': '1px dashed #5d96ee'
1382 });
1383 },
1384 stop: function( event, ui ) {
1385 ui.item.removeAttr( 'style' );
1386 }
1387 }).disableSelection();
1388
1389 $( '.evf-admin-grid' ).sortable({
1390 items: '> .everest-forms-field',
1391 delay : 100,
1392 opacity: 0.65,
1393 cursor: 'move',
1394 scrollSensitivity: 40,
1395 forcePlaceholderSize: true,
1396 connectWith: '.evf-admin-grid',
1397 containment: '.everest-forms-field-wrap',
1398 out: function( event ) {
1399 $( '.evf-admin-grid' ).removeClass( 'evf-hover' );
1400 $( event.target ).removeClass( 'evf-item-hover' );
1401 $( event.target ).closest( '.evf-admin-row' ).removeClass( 'evf-hover' );
1402 EVFPanelBuilder.checkEmptyGrid();
1403 },
1404 over: function( event, ui ) {
1405 $( '.evf-admin-grid' ).addClass( 'evf-hover' );
1406 $( event.target ).addClass( 'evf-item-hover' );
1407 $( event.target ).closest( '.evf-admin-row' ).addClass( 'evf-hover' );
1408 EVFPanelBuilder.checkEmptyGrid();
1409 },
1410 receive: function( event, ui ) {
1411 if ( ui.sender.is( 'button' ) ) {
1412 EVFPanelBuilder.fieldDrop( ui.helper );
1413 }
1414 },
1415 stop: function( event, ui ) {
1416 ui.item.removeAttr( 'style' );
1417 EVFPanelBuilder.checkEmptyGrid();
1418 }
1419 }).disableSelection();
1420
1421 $( '.evf-registered-buttons button.evf-registered-item' ).draggable({
1422 delay: 200,
1423 cancel: false,
1424 scroll: false,
1425 revert: 'invalid',
1426 scrollSensitivity: 40,
1427 forcePlaceholderSize: true,
1428 helper: function() {
1429 return $( this ).clone().insertAfter( $( this ).closest( '.everest-forms-tab-content' ).siblings( '.everest-forms-fields-tab' ) );
1430 },
1431 opacity: 0.75,
1432 containment: '#everest-forms-builder',
1433 connectToSortable: '.evf-admin-grid'
1434 }).disableSelection();
1435
1436 // Adapt hover behaviour on mouse event.
1437 $( '.evf-admin-row' ).on( 'mouseenter mouseleave', function( event ) {
1438 if ( 1 > event.buttons ) {
1439 if ( 'mouseenter' === event.type ) {
1440 $( this ).addClass( 'evf-hover' );
1441 } else {
1442 $( '.evf-admin-row' ).removeClass( 'evf-hover' );
1443 }
1444 }
1445 } );
1446
1447 // Refresh the position of placeholders on drag scroll.
1448 $( '.everest-forms-panel-content' ).on( 'scroll', function() {
1449 $( '.evf-admin-grid' ).sortable( 'refreshPositions' );
1450 $( '.evf-admin-field-wrapper' ).sortable( 'refreshPositions' );
1451 } );
1452 },
1453
1454 /**
1455 * Toggle fields tabs (Add Fields, Field Options).
1456 */
1457 fieldTabChoice: function( id ) {
1458 $( '.everest-forms-tab-content' ).scrollTop(0);
1459 $( '.everest-forms-fields-tab a' ).removeClass( 'active' );
1460 $( '.everest-forms-field, .everest-forms-title-desc' ).removeClass( 'active' );
1461
1462 $( '#' + id ).addClass( 'active' );
1463
1464 if ( 'add-fields' === id ) {
1465 $( '.everest-forms-add-fields' ).show();
1466 $( '.everest-forms-field-options' ).hide();
1467 } else {
1468 if ( 'field-options' === id ) {
1469 id = $( '.everest-forms-field' ).first().data( 'field-id' );
1470 $( '.everest-forms-field-options' ).show();
1471 $( '.everest-forms-field' ).first().addClass( 'active' );
1472 } else {
1473 $( '#everest-forms-field-' + id ).addClass( 'active' );
1474 }
1475 $( '.everest-forms-field-option' ).hide();
1476 $( '#everest-forms-field-option-' + id ).show();
1477 $( '.everest-forms-add-fields' ).hide();
1478 }
1479 },
1480 bindFormPreview: function () {},
1481 bindGridSwitcher: function () {
1482 $('body').on('click', '.evf-show-grid', function (e) {
1483 e.stopPropagation();
1484 EVFPanelBuilder.checkEmptyGrid();
1485 $(this).closest('.evf-toggle-row').find('.evf-toggle-row-content').stop(true).slideToggle(200);
1486 });
1487 $(document).click(function () {
1488 EVFPanelBuilder.checkEmptyGrid();
1489 $('.evf-show-grid').closest('.evf-toggle-row').find('.evf-toggle-row-content').stop(true).slideUp(200);
1490 });
1491 var max_number_of_grid = 2;
1492 $('body').on('click', '.evf-grid-selector', function () {
1493 var $this_single_row = $(this).closest('.evf-admin-row');
1494 if ( $(this).hasClass('active') ) {
1495 return;
1496 }
1497 var grid_id = parseInt( $( this ).attr( 'data-evf-grid' ), 10 );
1498 if ( grid_id > max_number_of_grid ) {
1499 return;
1500 }
1501
1502 var grid_node = $('<div class="evf-admin-grid evf-grid-' + grid_id + ' ui-sortable evf-empty-grid" />');
1503 var grids = $('<div/>');
1504
1505 $.each($this_single_row.find('.evf-admin-grid'), function () {
1506 $(this).children('*').each(function () {
1507 grids.append($(this).clone()); // "this" is the current element in the loop
1508 });
1509 });
1510 $this_single_row.find('.evf-admin-grid').remove();
1511 $this_single_row.find('.evf-clear ').remove();
1512 $this_single_row.append('<div class="clear evf-clear"></div>');
1513
1514 for ( var $grid_number = 1; $grid_number <= grid_id; $grid_number++ ) {
1515
1516 grid_node.attr('data-grid-id', $grid_number);
1517 $this_single_row.append(grid_node.clone());
1518
1519 }
1520 $this_single_row.append('<div class="clear evf-clear"></div>');
1521 $this_single_row.find('.evf-admin-grid').eq(0).append(grids.html());
1522 $this_single_row.find('.evf-grid-selector').removeClass('active');
1523 $(this).addClass('active');
1524 EVFPanelBuilder.bindFields();
1525 });
1526 },
1527 fieldDrop: function ( field ) {
1528 var field_type = field.attr( 'data-field-type' );
1529
1530 field.css({
1531 'left': '0',
1532 'width': '100%'
1533 }).append( '<i class="spinner is-active"></i>' );
1534
1535 $.ajax({
1536 url: evf_data.ajax_url,
1537 type: 'POST',
1538 data: {
1539 action: 'everest_forms_new_field_' + field_type,
1540 security: evf_data.evf_field_drop_nonce,
1541 field_type: field_type,
1542 form_id: evf_data.form_id
1543 },
1544 beforeSend: function() {
1545 $( document.body ).trigger( 'init_field_options_toggle' );
1546 },
1547 success: function( response ) {
1548 var field_preview = response.data.preview,
1549 field_options = response.data.options,
1550 form_field_id = response.data.form_field_id,
1551 field_type = response.data.field.type,
1552 dragged_el_id = $( field_preview ).attr( 'id' ),
1553 dragged_field_id = $( field_preview ).attr( 'data-field-id' );
1554
1555 $( '#everest-forms-field-id' ).val( form_field_id );
1556 $( '.everest-forms-field-options' ).find( '.no-fields' ).hide();
1557 $( '.everest-forms-field-options' ).append( field_options );
1558 $( '.everest-forms-field-option-row-icon_color input.colorpicker' ).wpColorPicker({
1559 change: function( event ) {
1560 var $this = $( this ),
1561 value = $this.val(),
1562 field_id = $this.closest( '.everest-forms-field-option-row' ).data( 'field-id' );
1563
1564 $( '#everest-forms-field-' + field_id + ' .rating-icon svg' ).css( 'fill', value );
1565 }
1566 });
1567
1568 field.after( field_preview );
1569
1570 if ( null !== $( '#everest-forms-panel-field-settings-enable_survey') && $( '#everest-forms-panel-field-settings-enable_survey' ).prop( 'checked' ) ) {
1571 $( '#everest-forms-field-option-' + dragged_field_id + '-survey_status' ).prop( 'checked', true );
1572 }
1573
1574 if ( null !== $( '#everest-forms-panel-field-settings-enable_quiz' ) && $( '#everest-forms-panel-field-settings-enable_quiz' ).prop( 'checked' ) ) {
1575 $( '#everest-forms-field-option-' + dragged_field_id + '-quiz_status' ).prop( 'checked', true );
1576 $( '#everest-forms-field-option-' + dragged_field_id + '-quiz_status' ).closest( '.everest-forms-field-option-row-quiz_status' ).siblings( '.everst-forms-field-quiz-settings' ).removeClass( 'everest-forms-hidden' ).addClass( 'everest-forms-show' );
1577 }
1578
1579 field.remove();
1580 EVFPanelBuilder.checkEmptyGrid();
1581
1582 // Triggers.
1583 $( document.body ).trigger( 'init_tooltips' );
1584 $( document.body ).trigger( 'init_field_options_toggle' );
1585 $( document.body ).trigger( 'evf_after_field_append', [dragged_el_id] );
1586
1587 // Conditional logic append rules.
1588 EVFPanelBuilder.conditionalLogicAppendField( dragged_el_id );
1589 EVFPanelBuilder.conditionalLogicAppendFieldIntegration( dragged_el_id );
1590 EVFPanelBuilder.paymentFieldAppendToQuantity( dragged_el_id );
1591 EVFPanelBuilder.paymentFieldAppendToDropdown( dragged_field_id, field_type );
1592 }
1593 });
1594 },
1595
1596 conditionalLogicAppendField: function( id ){
1597 var dragged_el = $('#' + id);
1598 var dragged_index = dragged_el.index();
1599
1600 var fields = $('.evf-field-conditional-field-select');
1601
1602 var field_type = dragged_el.attr( 'data-field-type' );
1603 var field_id = dragged_el.attr( 'data-field-id' );
1604 var field_label = dragged_el.find( '.label-title .text ' ).text();
1605
1606 $.fn.insertAt = function(elements, index, selected_id ) {
1607 var array = $.makeArray(this.children().clone(true));
1608 array.splice(index, 0, elements);
1609 $.each( array, function( index, el ) {
1610 if( selected_id === $( el )[0]['value'] ) {
1611 $( el )[0]['selected'] = true;
1612 array[ index ] = el;
1613 }
1614 } );
1615 this.empty().append(array);
1616 };
1617 var dragged_field_id = field_id;
1618 fields.each(function(index, el) {
1619 var selected_id = $( el ).val();
1620 var id_key = id.replace('everest-forms-field-', '');
1621 var name = $(el).attr('name');
1622 var name_key = name.substring(
1623 name.indexOf("[") + 1,
1624 name.indexOf("]")
1625 );
1626
1627 if (id_key === name_key) {
1628 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each( function(){
1629 var form_field_type = $( this ).data('field-type'),
1630 form_field_id = $( this ).data('field-id'),
1631 form_field_label = $( this ).find('.label-title span').first().text();
1632 field_to_be_restricted =[];
1633 field_to_be_restricted = [
1634 'html',
1635 'title',
1636 'address',
1637 'image-upload',
1638 'file-upload',
1639 'date-time',
1640 'hidden',
1641 'scale-rating',
1642 'likert',
1643 ];
1644 if( $.inArray( form_field_type, field_to_be_restricted ) === -1 && dragged_field_id !== form_field_id ){
1645 fields.eq(index).append('<option class="evf-conditional-fields" data-field_type="'+form_field_type+'" data-field_id="'+form_field_id+'" value="'+form_field_id+'">'+form_field_label+'</option>');
1646 }
1647 });
1648 } else {
1649 var el_to_append = '<option class="evf-conditional-fields" data-field_type="'+field_type+'" data-field_id="'+field_id+'" value="'+field_id+'">'+field_label+'</option>';
1650 if( 'html' !== field_type && 'title' !== field_type && 'address' !== field_type && 'image-upload' !== field_type && 'file-upload' !== field_type && 'date-time' !== field_type && 'hidden' !== field_type && 'likert' !== field_type && 'scale-rating' !== field_type ) {
1651 fields.eq(index).insertAt( el_to_append, dragged_index, selected_id );
1652 }
1653 }
1654 });
1655 },
1656
1657 paymentFieldAppendToQuantity: function( id ) {
1658 var dragged_el = $( '#' + id );
1659
1660 var fields = $( '.everest-forms-field-option-row-map_field select' );
1661 var field_type = dragged_el.attr( 'data-field-type' );
1662 var field_id = dragged_el.attr( 'data-field-id' );
1663 var field_label = dragged_el.find( '.label-title .text ' ).text();
1664
1665 var el_to_append = '<option value="'+field_id+'">'+field_label+'</option>';
1666 if( 'payment-single' === field_type || 'payment-multiple' === field_type || 'payment-checkbox' === field_type ) {
1667 fields.append( el_to_append );
1668 }
1669 },
1670
1671 paymentFieldAppendToDropdown: function( dragged_field_id, field_type ){
1672 if('payment-quantity' === field_type ) {
1673 var match_fields = [ 'payment-checkbox', 'payment-multiple', 'payment-single' ],
1674 qty_dropdown = $('#everest-forms-field-option-' + dragged_field_id + '-map_field');
1675 match_fields.forEach(function(single_field){
1676 $('.everest-forms-field-'+single_field).each(function(){
1677 var id = $(this).attr('data-field-id'),
1678 label = $(this).find( ".label-title .text" ).text();
1679 var el_to_append = '<option value="'+id+'">'+label+'</option>';
1680 qty_dropdown.append( el_to_append );
1681 });
1682 });
1683 }
1684 },
1685
1686 conditionalLogicAppendFieldIntegration: function( id ){
1687 var dragged_el = $('#' + id);
1688 var dragged_index = dragged_el.index();
1689
1690 var fields = $( '.evf-provider-conditional' ).find('.evf-conditional-field-select');
1691
1692 var field_type = dragged_el.attr( 'data-field-type' );
1693 var field_id = dragged_el.attr( 'data-field-id' );
1694 var field_label = dragged_el.find( '.label-title .text ' ).text();
1695
1696 $.fn.insertAt = function(elements, index) {
1697 var array = $.makeArray(this.children().clone(true));
1698 array.splice(index, 0, elements);
1699 this.empty().append(array);
1700 };
1701
1702 fields.each(function(index, el) {
1703 var id_key = id.replace('everest-forms-field-', '');
1704 var name = $(el).attr('name');
1705 var name_key = name.substring(
1706 name.indexOf("[") + 1,
1707 name.indexOf("]")
1708 );
1709
1710 if (id_key === name_key) {
1711 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each( function(){
1712 var field_type = $( this ).data('field-type'),
1713 field_id = $( this ).data('field-id'),
1714 field_label = $( this ).find('.label-title span').first().text();
1715 field_to_be_restricted =[];
1716 field_to_be_restricted = [
1717 'html',
1718 'title',
1719 'address',
1720 'image-upload',
1721 'file-upload',
1722 'date-time',
1723 'hidden',
1724 'scale-rating',
1725 'likert',
1726 dragged_el.attr('data-field-type'),
1727 ];
1728
1729 if( $.inArray( field_type, field_to_be_restricted ) === -1 ){
1730 fields.eq(index).append('<option class="evf-conditional-fields" data-field_type="'+field_type+'" data-field_id="'+field_id+'" value="'+field_id+'">'+field_label+'</option>');
1731 }
1732 });
1733 } else {
1734 var el_to_append = '<option class="evf-conditional-fields" data-field_type="'+field_type+'" data-field_id="'+field_id+'" value="'+field_id+'">'+field_label+'</option>';
1735 if( 'html' !== field_type && 'title' !== field_type && 'address' !== field_type && 'image-upload' !== field_type && 'file-upload' !== field_type && 'date-time' !== field_type && 'hidden' !== field_type && 'likert' !== field_type && 'scale-rating' !== field_type ) {
1736 fields.eq(index).insertAt( el_to_append, dragged_index );
1737 }
1738 }
1739 });
1740 },
1741
1742 conditionalLogicRemoveField: function( id ){
1743 $( '.evf-field-conditional-field-select option[value = ' +id +' ]' ).remove();
1744 },
1745
1746 conditionalLogicRemoveFieldIntegration: function( id ){
1747 $( '.evf-provider-conditional .evf-conditional-field-select option[value = ' +id +' ]' ).remove();
1748 },
1749
1750 paymentFieldRemoveFromQuantity: function( id ) {
1751 $('.everest-forms-field-option-row-map_field select option[value = ' +id +' ]').remove();
1752 },
1753
1754 bindFieldSettings: function () {
1755 $( 'body' ).on( 'click', '.everest-forms-preview .everest-forms-field, .everest-forms-preview .everest-forms-field .everest-forms-field-setting', function(e) {
1756 e.preventDefault();
1757 var field_id = $( this ).closest( '.everest-forms-field' ).attr( 'data-field-id' );
1758 $( '.everest-forms-tab-content' ).scrollTop(0);
1759 EVFPanelBuilder.switchToFieldOptionPanel( field_id );
1760 } );
1761 },
1762
1763 toggleLabelEdit: function( label, input ) {
1764 $( label ).toggleClass( 'everest-forms-hidden' );
1765 $( input ).toggleClass( 'everest-forms-hidden' );
1766
1767 if ( $( input ).is( ':visible' ) ) {
1768 $( input ).focus();
1769 }
1770 },
1771
1772 bindToggleHandleActions: function () {
1773 $( 'body' ).on( 'click', '.toggle-handle', function ( e ) {
1774 var label = $( this ).data( 'label' ),
1775 input = $( this ).data( 'input' );
1776
1777 if ( ! $( input ).is(':visible') ) {
1778 EVFPanelBuilder.toggleLabelEdit( label, input );
1779 }
1780 });
1781 },
1782
1783 bindLabelEditInputActions: function () {
1784 $( 'body' ).on( 'focusout', '.label-edit-input', function ( e ) {
1785 var label = $( this ).data( 'label' ),
1786 input = this;
1787
1788 EVFPanelBuilder.toggleLabelEdit( label, input );
1789 });
1790 },
1791
1792 /**
1793 * Sync an input element with other elements like labels. An element with `sync-input` class will be synced to the elements
1794 * specified in `sync-targets` data.
1795 *
1796 * `Warning:` This is an one way sync, meaning only the text `sync-targets` will be updated when the source element's value changes
1797 * and the source element's value will not be updated if the value of `sync-targets` changes.
1798 */
1799 bindSyncedInputActions: function () {
1800 $( 'body' ).on( 'input', '.sync-input', function ( e ) {
1801 var changed_value = $( this ).val(),
1802 sync_targets = $( this ).data( 'sync-targets' );
1803
1804 if ( changed_value && sync_targets ) {
1805 $( sync_targets ).text( changed_value );
1806 }
1807 });
1808 }
1809 };
1810
1811 $(function () {
1812 EVFPanelBuilder.init();
1813 });
1814 })(jQuery, window.evf_data);
1815
1816 jQuery(function () {
1817
1818 if ( jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email').attr("checked") != 'checked' ) {
1819 jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap').nextAll().hide();
1820 }
1821
1822 jQuery( '#everest-forms-panel-field-settingsemail-evf_send_confirmation_email' ).on( 'change', function () {
1823
1824 if ( jQuery( this ).attr('checked') != 'checked') {
1825 jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap').nextAll().hide();
1826 } else {
1827 jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap').nextAll().show();
1828 }
1829 });
1830
1831 var mySelect = jQuery('#everest-forms-panel-field-settings-redirect_to option:selected').val();
1832
1833 if ( mySelect == 'same' ) {
1834 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
1835 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
1836 }
1837 else if(mySelect == 'custom_page') {
1838 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').show();
1839 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
1840 }
1841 else if(mySelect == 'external_url'){
1842 jQuery('#everest-forms-panel-field-settings-external_url-wrap').show();
1843 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
1844 }
1845
1846 jQuery( '#everest-forms-panel-field-settings-redirect_to' ).on( 'change', function () {
1847 if ( this.value == 'same' ) {
1848 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
1849 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
1850 }
1851 else if ( this.value == 'custom_page') {
1852 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').show();
1853 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
1854 }
1855 else if ( this.value == 'external_url') {
1856 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
1857 jQuery('#everest-forms-panel-field-settings-external_url-wrap').show();
1858 }
1859 });
1860 jQuery( '.evf-panel-field-options-button.evf-disabled-tab' ).hide();
1861
1862 });
1863
1864 jQuery( function ( $ ) {
1865
1866 // Add Fields - Open/close.
1867 $( document.body ).on( 'init_add_fields_toogle', function() {
1868 $( '.everest-forms-add-fields' ).on( 'click', '.everest-forms-add-fields-group > a', function( event ) {
1869 event.preventDefault();
1870 $( this ).parent( '.everest-forms-add-fields-group' ).toggleClass( 'closed' ).toggleClass( 'open' );
1871 });
1872 $( '.everest-forms-add-fields' ).on( 'click', '.everest-forms-add-fields-group a', function() {
1873 $( this ).next( '.evf-registered-buttons' ).stop().slideToggle();
1874 });
1875 $( '.everest-forms-add-fields-group.closed' ).each( function() {
1876 $( this ).find( '.evf-registered-buttons' ).hide();
1877 });
1878 } ).trigger( 'init_add_fields_toogle' );
1879
1880 // Fields Options - Open/close.
1881 $( document.body ).on( 'init_field_options_toggle', function() {
1882 $( '.everest-forms-field-option' ).on( 'click', '.everest-forms-field-option-group > a', function( event ) {
1883 event.preventDefault();
1884 $( this ).parent( '.everest-forms-field-option-group' ).toggleClass( 'closed' ).toggleClass( 'open' );
1885 });
1886 $( '.everest-forms-field-option' ).on( 'click', '.everest-forms-field-option-group a', function( event ) {
1887 // If the user clicks on some form input inside, the box should not be toggled.
1888 if ( $( event.target ).filter( ':input, option, .sort' ).length ) {
1889 return;
1890 }
1891
1892 $( this ).next( '.everest-forms-field-option-group-inner' ).stop().slideToggle();
1893 });
1894 $( '.everest-forms-field-option-group.closed' ).each( function() {
1895 $( this ).find( '.everest-forms-field-option-group-inner' ).hide();
1896 });
1897 } ).trigger( 'init_field_options_toggle' );
1898
1899 $( document ).click(function() {
1900 $( '.evf-smart-tag-lists' ).hide();
1901 });
1902
1903 // Toggle Smart Tags.
1904 $( document.body ).on('click', '.evf-toggle-smart-tag-display', function(e) {
1905 e.stopPropagation();
1906 $('.evf-smart-tag-lists').hide();
1907 $('.evf-smart-tag-lists ul').empty();
1908 $( this ).parent().find('.evf-smart-tag-lists').toggle('show');
1909
1910 var type = $( this ).data('type');
1911
1912 var allowed_field = $ ( this ).data( 'fields' );
1913 get_all_available_field( allowed_field, type , $( this ) );
1914 });
1915
1916 // Toggle form status.
1917 $( document.body ).on( 'change', '.everest-forms-toggle-form input', function(e) {
1918 e.stopPropagation();
1919 $.post( evf_data.ajax_url, {
1920 action: 'everest_forms_enabled_form',
1921 security: evf_data.evf_enabled_form,
1922 form_id: $( this ).data( 'form_id' ),
1923 enabled: $( this ).attr( 'checked' ) ? 1 : 0
1924 });
1925 });
1926
1927 $( document.body ).on('click', '.smart-tag-field', function(e) {
1928
1929 var field_id = $( this ).data('field_id'),
1930 field_label = $( this ).text(),
1931 type = $( this ).data('type'),
1932 $parent = $ ( this ).parent().parent().parent(),
1933 $input = $parent.find('input[type=text]'),
1934 $textarea = $parent.find('textarea');
1935 if ( field_id !== 'fullname' && field_id !== 'email' && field_id !== 'subject' && field_id !== 'message' && 'other' !== type ) {
1936 field_label = field_label.split(/[\s-_]/);
1937 for(var i = 0 ; i < field_label.length ; i++){
1938 if ( i === 0 ) {
1939 field_label[i] = field_label[i].charAt(0).toLowerCase() + field_label[i].substr(1);
1940 } else {
1941 field_label[i] = field_label[i].charAt(0).toUpperCase() + field_label[i].substr(1);
1942 }
1943 }
1944 field_label = field_label.join('');
1945 field_id = field_label+'_'+field_id;
1946 } else {
1947 field_id = field_id;
1948 }
1949 if ( 'field' === type ) {
1950 $input.val( $input.val() + '{field_id="'+field_id+'"}' );
1951 $textarea.val($textarea.val()+'{field_id="'+field_id+'"}' );
1952 } else if ( 'other' === type ) {
1953 $input.val( $input.val() + '{'+field_id+'}' );
1954 $textarea.val($textarea.val() + '{'+field_id+'}' );
1955 }
1956 });
1957
1958 $( document ).on( 'change', '.evf-content-email-settings .evf-toggle-switch input', function(e) {
1959 var $this = $( this ),
1960 value = $this.prop( 'checked' );
1961
1962 if ( false === value ) {
1963 $( this ).closest( '#everest-forms-panel-settings' ).find( '.everest-forms-active-email' ).addClass( 'everest-forms-hidden' );
1964 $this.closest( '.evf-content-email-settings' ).find( '.email-disable-message' ).remove();
1965 $this.closest( '.evf-content-section-title' ).siblings( '.evf-content-email-settings-inner' ).addClass( 'everest-forms-hidden' );
1966 $( '<p class="email-disable-message everest-forms-notice everest-forms-notice-info">' + evf_data.i18n_email_disable_message + '</p>' ).insertAfter( $this.closest( '.evf-content-section-title' ) );
1967 } else if ( true === value ) {
1968 $( this ).closest( '#everest-forms-panel-settings' ).find( '.everest-forms-active-email' ).removeClass( 'everest-forms-hidden' );
1969 $this.closest( '.evf-content-section-title' ).siblings( '.evf-content-email-settings-inner' ).removeClass( 'everest-forms-hidden' );
1970 $this.closest( '.evf-content-email-settings' ).find( '.email-disable-message' ).remove();
1971 }
1972 });
1973
1974 $( document ).on( 'click', '.everest-forms-min-max-date-format input', function() {
1975 if ( $( this ).is( ':checked' ) ) {
1976 $( '.everest-forms-min-max-date-option' ).removeClass( 'everest-forms-hidden' );
1977 } else {
1978 $( '.everest-forms-min-max-date-option' ).addClass( 'everest-forms-hidden' );
1979 }
1980 });
1981
1982 function get_all_available_field( allowed_field, type , el ) {
1983 var all_fields_without_email = [];
1984 var all_fields = [];
1985 var email_field = [];
1986 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each( function(){
1987 var field_type = $( this ).data('field-type');
1988 var field_id = $( this ).data('field-id');
1989 if ( allowed_field === field_type ){
1990 var e_field_label = $( this ).find('.label-title span').first().text();
1991 var e_field_id = field_id;
1992 email_field[ e_field_id ] = e_field_label;
1993 } else {
1994 var field_label = $( this ).find('.label-title span').first().text();
1995 all_fields_without_email[ field_id ] = field_label;
1996 }
1997 all_fields[ field_id ] = $( this ).find('.label-title span').first().text();
1998 });
1999
2000 if( 'other' === type || 'all' === type ){
2001 var other_smart_tags = evf_data.smart_tags_other;
2002 for( var key in other_smart_tags ) {
2003 $(el).parent().find('.evf-smart-tag-lists .evf-others').append('<li class = "smart-tag-field" data-type="other" data-field_id="'+key+'">'+other_smart_tags[key]+'</li>');
2004 }
2005 }
2006
2007 if ( 'fields' === type || 'all' === type ) {
2008 if ( allowed_field === 'email' ) {
2009 if ( Object.keys(email_field).length < 1 ){
2010 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').addClass('everest-forms-hidden');
2011 } else {
2012 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').removeClass('everest-forms-hidden');
2013 }
2014 $(el).parent().find('.evf-smart-tag-lists .other-tag-title').remove();
2015 $(el).parent().find('.evf-smart-tag-lists .evf-others').remove();
2016 $(el).parent().find('.evf-smart-tag-lists').append('<div class="smart-tag-title other-tag-title">Others</div><ul class="evf-others"></ul>');
2017 $(el).parent().find('.evf-smart-tag-lists .evf-others').append('<li class="smart-tag-field" data-type="other" data-field_id="admin_email">Site Admin Email</li><li class="smart-tag-field" data-type="other" data-field_id="user_email">User Email</li>');
2018 for (var key in email_field ) {
2019 $(el).parent().find('.evf-smart-tag-lists .evf-fields').append('<li class = "smart-tag-field" data-type="field" data-field_id="'+key+'">'+email_field[key]+'</li>');
2020 }
2021 } else {
2022 if ( Object.keys(all_fields).length < 1 ){
2023 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').addClass('everest-forms-hidden');
2024 } else {
2025 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').removeClass('everest-forms-hidden');
2026 }
2027 for (var meta in all_fields ) {
2028 $(el).parent().find('.evf-smart-tag-lists .evf-fields').append('<li class = "smart-tag-field" data-type="field" data-field_id="'+meta+'">'+all_fields[meta]+'</li>');
2029 }
2030 }
2031 }
2032 }
2033 });
2034