PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 1.9.9
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v1.9.9
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 4 years ago admin.js 4 years ago admin.min.js 4 years ago deactivation-feedback.js 3 years ago deactivation-feedback.min.js 3 years ago editor.js 8 years ago editor.min.js 5 years ago evf-admin-email.js 3 years ago evf-admin-email.min.js 3 years ago evf-clipboard.js 8 years ago evf-clipboard.min.js 8 years ago evf-enhanced-select.js 3 years ago evf-enhanced-select.min.js 3 years ago evf-file-uploader.js 3 years ago evf-file-uploader.min.js 3 years ago evf-setup.js 3 years ago evf-setup.min.js 3 years ago extensions.js 4 years ago extensions.min.js 4 years ago form-builder.js 3 years ago form-builder.min.js 3 years ago form-template-controller.js 3 years ago form-template-controller.min.js 3 years ago settings.js 4 years ago settings.min.js 4 years ago tools.js 4 years ago tools.min.js 4 years ago upgrade.js 5 years ago upgrade.min.js 5 years ago
form-builder.js
3200 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 //To remove script tag.
22 $(document).on('input','.everest-forms-field-option-row-choices input[name$="[label]"]',function (e) {
23 var $value = $(this).val();
24 $(this).val($value.replace( /<script/gi, ''));
25 });
26
27
28 });
29
30 $( document ).ready( function( $ ) {
31 if( '1' === $( '.everest-forms-min-max-date-format input' ).val() ) {
32 $('.everest-forms-min-date').addClass('flatpickr-field').flatpickr({
33 disableMobile : true,
34 onChange : function(selectedDates, dateStr, instance) {
35 $('.everest-forms-min-date').val(dateStr);
36 },
37 onOpen: function(selectedDates, dateStr, instance) {
38 instance.set('maxDate', $('.everest-forms-max-date').val());
39 },
40 });
41
42 $('.everest-forms-max-date').addClass('flatpickr-field').flatpickr({
43 disableMobile : true,
44 onChange : function(selectedDates, dateStr, instance) {
45 $('.everest-forms-max-date').val(dateStr);
46 },
47 onOpen: function(selectedDates, dateStr, instance) {
48 instance.set('minDate', $('.everest-forms-min-date').val());
49 },
50 });
51 }
52
53 $( '.everest-forms-min-max-date-format' ).each( function () {
54 if( $( this ).find( 'input[type="checkbox"]' ).is( ':checked' ) ) {
55 $( this ).next( '.everest-forms-min-max-date-range-format' ).removeClass( 'everest-forms-hidden' );
56 $( this ).next().next( '.everest-forms-min-max-date-option' ).removeClass( 'everest-forms-hidden' );
57 if( $( this ).next( '.everest-forms-min-max-date-range-format' ).find( 'input[type="checkbox"]' ).is( ':checked' ) ) {
58 $( this ).next().next().next( '.everest-forms-min-max-date-range-option' ).removeClass( 'everest-forms-hidden' );
59 $( this ).next().next( '.everest-forms-min-max-date-option' ).addClass( 'everest-forms-hidden' );
60 }
61 } else {
62 $( this ).next().next().next( '.everest-forms-min-max-date-range-option' ).addClass( 'everest-forms-hidden' );
63 $( this ).next( '.everest-forms-min-max-date-range-format' ).addClass( 'everest-forms-hidden' );
64 $( this ).next().next( '.everest-forms-min-max-date-option' ).addClass( 'everest-forms-hidden' );
65 }
66 } );
67
68 $( '.everest-forms-row-option select.evf-field-show-hide' ).each( function() {
69 $(this).find( '[selected="selected"]').prop( 'selected', true );
70 });
71 });
72
73
74 if ( ! $( 'evf-panel-payments-button a' ).hasClass( 'active' ) ) {
75 $( '#everest-forms-panel-payments' ).find( '.everest-forms-panel-sidebar a' ).first().addClass( 'active' );
76 $( '.everest-forms-panel-content' ).find( '.evf-payment-setting-content' ).first().addClass( 'active' );
77 }
78
79
80 // Copy shortcode from the builder.
81 $( document.body ).find('#copy-shortcode' )
82 .on( 'click', this.copyShortcode )
83 .on( 'aftercopy', this.copySuccess )
84 .on( 'aftercopyfailure', this.copyFail );
85
86 // Copy shortcode from form list table.
87 $( document.body ).find('.evf-copy-shortcode').each( function() {
88 $( this )
89 .on( 'click', EVFPanelBuilder.copyShortcode )
90 .on( 'aftercopy', EVFPanelBuilder.copySuccess )
91 .on( 'aftercopyfailure', EVFPanelBuilder.copyFail );
92 });
93
94 // Document ready.
95 $( document ).ready( EVFPanelBuilder.ready );
96
97 // Page load.
98 $( window ).on( 'load', EVFPanelBuilder.load );
99
100 // Initialize builder UI fields.
101 $( document.body ).on( 'evf-init-builder-fields', function() {
102 EVFPanelBuilder.bindFields();
103 } ).trigger( 'evf-init-builder-fields' );
104
105 // Adjust builder width.
106 $( document.body ).on( 'adjust_builder_width', function() {
107 var adminMenuWidth = $( '#adminmenuwrap' ).width();
108
109 $( '#everest-forms-builder-form' ).css({ 'width': 'calc(100% - ' + adminMenuWidth + 'px)' });
110 } ).trigger( 'adjust_builder_width' );
111
112 $( document.body ).on( 'click', '#collapse-button', function() {
113 $( '#everest-forms-builder-form' ).width( '' );
114 $( document.body ).trigger( 'adjust_builder_width' );
115 });
116
117 $( window ).on( 'resize orientationchange', function() {
118 var resizeTimer;
119
120 clearTimeout( resizeTimer );
121 resizeTimer = setTimeout( function() {
122 $( '#everest-forms-builder' ).width( '' );
123 $( document.body ).trigger( 'adjust_builder_width' );
124 }, 250 );
125 }).trigger( 'resize' );
126 },
127
128 /**
129 * Copy shortcode.
130 *
131 * @param {Object} evt Copy event.
132 */
133 copyShortcode: function( evt ) {
134 evfClearClipboard();
135 evfSetClipboard( $( this ).closest( '.evf-shortcode-field' ).find( 'input' ).val(), $( this ) );
136 evt.preventDefault();
137 },
138
139 /**
140 * Display a "Copied!" tip when success copying.
141 */
142 copySuccess: function() {
143 $( this ).tooltipster( 'content', $( this ).attr( 'data-copied' ) ).trigger( 'mouseenter' ).on( 'mouseleave', function() {
144 var $this = $( this );
145
146 setTimeout( function() {
147 $this.tooltipster( 'content', $this.attr( 'data-tip' ) );
148 }, 1000 );
149 } );
150 },
151
152 /**
153 * Displays the copy error message when failure copying.
154 */
155 copyFail: function() {
156 $( this ).closest( '.evf-shortcode-field' ).find( 'input' ).focus().select();
157 },
158
159 /**
160 * Page load.
161 *
162 * @since 1.0.0
163 */
164 load: function () {
165 $( '.everest-forms-overlay' ).fadeOut();
166 },
167
168 /**
169 * Document ready.
170 *
171 * @since 1.0.0
172 */
173 ready: function() {
174 // Cache builder element.
175 $builder = $( '#everest-forms-builder' );
176
177 // Bind all actions.
178 EVFPanelBuilder.bindUIActions();
179
180 // Bind edit form actions.
181 EVFPanelBuilder.bindEditActions();
182
183 // jquery-confirm defaults.
184 jconfirm.defaults = {
185 closeIcon: true,
186 backgroundDismiss: true,
187 escapeKey: true,
188 animationBounce: 1,
189 useBootstrap: false,
190 theme: 'modern',
191 boxWidth: '400px',
192 columnClass: 'evf-responsive-class'
193 };
194
195 // Enable Perfect Scrollbar.
196 if ( 'undefined' !== typeof PerfectScrollbar ) {
197 var tab_content = $( '.everest-forms-tab-content' ),
198 evf_panel = $( '.everest-forms-panel' );
199
200 if ( tab_content.length >= 1 ) {
201 window.evf_tab_scroller = new PerfectScrollbar( '.everest-forms-tab-content', {
202 suppressScrollX: true,
203 });
204 }
205
206 evf_panel.each( function(){
207 var section_panel = $(this);
208 var panel_id = section_panel.attr( 'id' );
209
210 if ( section_panel.find( '.everest-forms-panel-sidebar' ).length >= 1 ) {
211 window.evf_setting_scroller = new PerfectScrollbar( '#' + panel_id + ' .everest-forms-panel-sidebar' );
212 }
213 });
214 }
215
216 // Enable Limit length.
217 $builder.on( 'change', '.everest-forms-field-option-row-limit_enabled input', function( event ) {
218 EVFPanelBuilder.updateTextFieldsLimitControls( $( event.target ).parents( '.everest-forms-field-option-row-limit_enabled' ).data().fieldId, event.target.checked );
219 } );
220
221 $builder.on( 'change', '.everest-forms-field-option-row-min_length_enabled input', function( event ) {
222 EVFPanelBuilder.updateTextFieldsMinLengthControls( $( event.target ).parents( '.everest-forms-field-option-row-min_length_enabled' ).data().fieldId, event.target.checked );
223 } );
224
225 // Enable enhanced select.
226 $builder.on( 'change', '.everest-forms-field-option-select .everest-forms-field-option-row-enhanced_select input', function( event ) {
227 EVFPanelBuilder.enhancedSelectFieldStyle( $( event.target ).parents( '.everest-forms-field-option-row-enhanced_select' ).data().fieldId, event.target.checked );
228 } );
229
230 // Enable Multiple options.
231 $builder.on( 'click', '.everest-forms-field-option-row-choices .everest-forms-btn-group span', function( event ) {
232 if ( $( this).hasClass( 'upgrade-modal' ) && 'checkbox' === $(this).data('type') ) {
233 $( this ).parent().find( 'span' ).addClass( 'is-active' );
234 $( this ).removeClass( 'is-active' );
235 EVFPanelBuilder.updateEnhandedSelectField( $( event.target ).parents( '.everest-forms-field-option-row-choices' ).data().fieldId, false );
236 } else {
237 $( this ).parent().find( 'span' ).removeClass( 'is-active' );
238 $( this ).addClass( 'is-active' );
239 EVFPanelBuilder.updateEnhandedSelectField( $( event.target ).parents( '.everest-forms-field-option-row-choices' ).data().fieldId, 'multiple' === $( this ).data( 'selection' ) );
240 }
241
242 // Show 'Select All' Checkbox for Dropdown field only if multiple selection is active
243 if( 'multiple' === $(this).data('selection') && 'checkbox' === $(this).data('type') && $( this).hasClass( 'is-active' ) ) {
244 var $field_id = $(this).parent().parent().data('field-id');
245 $('#everest-forms-field-option-row-'+$field_id+'-select_all').show();
246 } else {
247 var $field_id = $(this).parent().parent().data('field-id');
248 $('#everest-forms-field-option-row-'+$field_id+'-select_all').hide();
249 }
250 } );
251
252 // By default hide the 'Select All' checkbox for Dropdown field
253 $(document.body).on('click', '.everest-forms-field, .everest-forms-field-select[data-field-type="select"]', function () {
254 $builder.find('.everest-forms-field-option-row-choices .everest-forms-btn-group span').each(function () {
255 var $field_id = $(this).parent().parent().data('field-id');
256
257 if( 'multiple' === $(this).data('selection') && 'checkbox' === $(this).data('type') && $( this).hasClass( 'is-active' ) ) {
258 $('#everest-forms-field-option-'+$field_id+'-select_all').parent().show();
259 } else {
260 $('#everest-forms-field-option-'+$field_id+'-select_all').parent().hide();
261 }
262 });
263 });
264
265 // Search fields input.
266 $builder.on( 'keyup', '.everest-forms-search-fields', function() {
267 var searchTerm = $( this ).val().toLowerCase();
268
269 // Show/hide fields.
270 $( '.evf-registered-item' ).each( function() {
271 var $this = $( this );
272 field_type = $this.data( 'field-type' ),
273 field_label = $this.text().toLowerCase();
274
275 if (
276 field_type.search( searchTerm ) > -1
277 || field_label.search( searchTerm ) > -1
278 ) {
279 $this.addClass( 'evf-searched-item' );
280 $this.show();
281 } else {
282 $this.removeClass( 'evf-searched-item' );
283 $this.hide();
284 }
285 });
286
287 // Show/hide field group.
288 $( '.everest-forms-add-fields-group' ).each( function() {
289 var count = $( this ).find( '.evf-registered-item.evf-searched-item' ).length;
290
291 if ( 0 >= count ) {
292 $( this ).hide();
293 } else {
294 $( this ).show();
295 }
296 });
297
298 // Show/hide fields not found indicator.
299 if ( $( '.evf-registered-item.evf-searched-item' ).length ) {
300 $( '.everest-forms-fields-not-found' ).addClass( 'hidden' );
301 } else {
302 $( '.everest-forms-fields-not-found' ).removeClass( 'hidden' );
303 }
304 });
305
306 // Action available for each binding.
307 $( document ).trigger( 'everest_forms_ready' );
308 },
309
310 /**
311 * Update text fields limit controls.
312 *
313 * @since 1.5.10
314 *
315 * @param {number} fieldId Field ID.
316 * @param {bool} checked Whether an option is checked or not.
317 */
318 updateTextFieldsLimitControls: function( fieldId, checked ) {
319 if ( ! checked ) {
320 $( '#everest-forms-field-option-row-' + fieldId + '-limit_controls' ).addClass( 'everest-forms-hidden' );
321 } else {
322 $( '#everest-forms-field-option-row-' + fieldId + '-limit_controls' ).removeClass( 'everest-forms-hidden' );
323 }
324 },
325
326 /**
327 * Update text fields min length controls.
328 *
329 * @since 1.5.10
330 *
331 * @param {number} fieldId Field ID.
332 * @param {bool} checked Whether an option is checked or not.
333 */
334 updateTextFieldsMinLengthControls: function( fieldId, checked ) {
335 if ( ! checked ) {
336 $( '#everest-forms-field-option-row-' + fieldId + '-min_length_controls' ).addClass( 'everest-forms-hidden' );
337 } else {
338 $( '#everest-forms-field-option-row-' + fieldId + '-min_length_controls' ).removeClass( 'everest-forms-hidden' );
339 }
340 },
341
342 /**
343 * Enhanced select fields style.
344 *
345 * @since 1.7.1
346 *
347 * @param {number} fieldId Field ID.
348 * @param {bool} checked Whether an option is checked or not.
349 */
350 enhancedSelectFieldStyle: function( fieldId, checked ) {
351 var $primary = $( '#everest-forms-field-' + fieldId + ' .primary-input' ),
352 isEnhanced = $( '#everest-forms-field-option-' + fieldId + '-enhanced_select' ).is(':checked');
353
354 if ( checked && isEnhanced && $primary.prop( 'multiple' ) ) {
355 $primary.addClass( 'evf-enhanced-select' );
356 $( document.body ).trigger( 'evf-enhanced-select-init' );
357 } else {
358 $primary.removeClass( 'evf-enhanced-select enhanced' );
359 $primary.filter( '.select2-hidden-accessible' ).selectWoo( 'destroy' );
360 }
361 },
362
363 /**
364 * Update enhanced select field component.
365 *
366 * @since 1.7.1
367 *
368 * @param {number} fieldId Field ID.
369 * @param {bool} isMultiple Whether an option is multiple or not.
370 */
371 updateEnhandedSelectField: function( fieldId, isMultiple ) {
372 var $primary = $( '#everest-forms-field-' + fieldId + ' .primary-input' ),
373 $placeholder = $primary.find( '.placeholder' ),
374 $hiddenField = $( '#everest-forms-field-option-' + fieldId + '-multiple_choices' ),
375 $optionChoicesItems = $( '#everest-forms-field-option-row-' + fieldId + '-choices input.default' ),
376 selectedChoices = $optionChoicesItems.filter( ':checked' );
377
378 // Update hidden field value.
379 $hiddenField.val( isMultiple ? 1 : 0 );
380
381 // Add/remove a `multiple` attribute.
382 $primary.prop( 'multiple', isMultiple );
383
384 // Change a `Choices` fields type:
385 // radio - needed for single selection
386 // checkbox - needed for multiple selection
387 $optionChoicesItems.prop( 'type', isMultiple ? 'checkbox' : 'radio' );
388
389 // For single selection we can choose only one.
390 if ( ! isMultiple && selectedChoices.length ) {
391 $optionChoicesItems.prop( 'checked', false );
392 $( selectedChoices.get( 0 ) ).prop( 'checked', true );
393 }
394
395 // Toggle selection for a placeholder.
396 if ( $placeholder.length && isMultiple ) {
397 $placeholder.prop( 'selected', ! isMultiple );
398 }
399
400 // Update a primary field.
401 EVFPanelBuilder.enhancedSelectFieldStyle( fieldId, isMultiple );
402 },
403
404 /**
405 * Element bindings.
406 *
407 * @since 1.0.0
408 */
409 bindUIActions: function() {
410 EVFPanelBuilder.bindDefaultTabs();
411 EVFPanelBuilder.checkEmptyGrid();
412 EVFPanelBuilder.bindFields();
413 EVFPanelBuilder.bindFormPreview();
414 EVFPanelBuilder.bindFormPreviewWithKeyEvent();
415 EVFPanelBuilder.bindFormEntriesWithKeyEvent();
416 EVFPanelBuilder.bindGridSwitcher();
417 EVFPanelBuilder.bindFieldSettings();
418 EVFPanelBuilder.bindFieldDelete();
419 EVFPanelBuilder.bindFieldDeleteWithKeyEvent();
420 EVFPanelBuilder.bindCloneField();
421 EVFPanelBuilder.bindSaveOption();
422 EVFPanelBuilder.bindSaveOptionWithKeyEvent();
423 EVFPanelBuilder.bindOpenShortcutKeysModalWithKeyEvent();
424 EVFPanelBuilder.bindAddNewRow();
425 EVFPanelBuilder.bindRemoveRow();
426 EVFPanelBuilder.bindFormSettings();
427 EVFPanelBuilder.bindFormEmail();
428 EVFPanelBuilder.bindFormSmsNotifications();
429 EVFPanelBuilder.bindFormConversational();
430 EVFPanelBuilder.bindFormIntegrations();
431 EVFPanelBuilder.bindFormPayment();
432 EVFPanelBuilder.choicesInit();
433 EVFPanelBuilder.bindToggleHandleActions();
434 EVFPanelBuilder.bindLabelEditInputActions();
435 EVFPanelBuilder.bindSyncedInputActions();
436 EVFPanelBuilder.init_datepickers();
437 EVFPanelBuilder.bindBulkOptionActions();
438
439 // Fields Panel.
440 EVFPanelBuilder.bindUIActionsFields();
441
442 if ( evf_data.tab === 'field-options' ) {
443 $( '.evf-panel-field-options-button' ).trigger( 'click' );
444 }
445
446 $(document.body).on('everest-forms-field-drop','.evf-registered-buttons .evf-registered-item', function() {
447 EVFPanelBuilder.fieldDrop($(this).clone());
448 } )
449 },
450 /**
451 * Bind user action handlers for the Add Bulk Options feature.
452 */
453 bindBulkOptionActions: function() {
454 // Toggle `Bulk Add` option.
455 $( document.body ).on( 'click', '.evf-toggle-bulk-options', function( e ) {
456 $( this ).closest( '.everest-forms-field-option' ).find( '.everest-forms-field-option-row-add_bulk_options' ).slideToggle();
457 });
458 // Toggle presets list.
459 $( document.body ).on( 'click', '.evf-toggle-presets-list', function( e ) {
460 $( this ).closest( '.everest-forms-field-option' ).find( '.everest-forms-field-option-row .evf-options-presets' ).slideToggle();
461 });
462 // Add custom list of options.
463 $( document.body ).on( 'click', '.evf-add-bulk-options', function( e ) {
464 var $option_row = $( this ).closest( '.everest-forms-field-option-row' );
465 var field_id = $option_row.data( 'field-id' );
466
467 if ( $option_row.length ) {
468 var $choices = $option_row.closest( '.everest-forms-field-option' ).find( '.everest-forms-field-option-row-choices .evf-choices-list' );
469 var $bulk_options_container = $option_row.find( 'textarea#everest-forms-field-option-' + field_id + '-add_bulk_options' );
470 var options_texts = $bulk_options_container.val().replace( /<script/gi, '').split( '\n' );
471
472 EVFPanelBuilder.addBulkOptions( options_texts, $choices );
473 $bulk_options_container.val('');
474 }
475 });
476 // Add presets of options.
477 $( document.body ).on( 'click', '.evf-options-preset-label', function( e ) {
478 var $option_row = $( this ).closest( '.everest-forms-field-option-row' );
479 var field_id = $option_row.data( 'field-id' );
480
481 if ( $option_row.length ) {
482 var options_texts = $( this ).closest( '.evf-options-preset' ).find( '.evf-options-preset-value' ).val();
483
484 $option_row.find( 'textarea#everest-forms-field-option-' + field_id + '-add_bulk_options' ).val( options_texts );
485 $( this ).closest( '.evf-options-presets' ).slideUp();
486 }
487 });
488 //Add toggle option for password validation and strength meter.
489 $(document.body).on( 'click', '.everest-forms-field-option-row-password_strength', function(){
490 if( $(this).find('[type="checkbox"]:first').prop( 'checked' ) ) {
491 $(this).next().find('[type="checkbox"]:first').prop('checked', false);
492 // $(this).prev().find('.everest-forms-inner-options').hide();
493 }
494 });
495 $(document.body).on( 'click', '.everest-forms-field-option-row-password_validation', function(){
496 if( $(this).find('[type="checkbox"]:first').prop( 'checked' ) ) {
497 $(this).prev().find('[type="checkbox"]:first').prop('checked', false);
498 $(this).prev().find('.everest-forms-inner-options').addClass('everest-forms-hidden');
499 }
500 });
501 },
502
503 /**
504 * Add a list of options at once.
505 *
506 * @param {Array<string>} options_texts List of options to add.
507 * @param {object} $choices_container Options container where the options should be added.
508 */
509 addBulkOptions: function( options_texts, $choices_container ) {
510 options_texts.forEach( function( option_text ) {
511 if ( '' !== option_text ) {
512 var $add_button = $choices_container.find( 'li' ).last().find( 'a.add' );
513 EVFPanelBuilder.choiceAdd( null, $add_button, option_text.trim() );
514 }
515 });
516 },
517
518 /**
519 * Initialize date pickers like min/max date, disable dates etc.
520 *
521 * @since 1.6.6
522 */
523 init_datepickers: function() {
524 var date_format = $( '.everest-forms-disable-dates' ).data( 'date-format' ),
525 selection_mode = 'multiple';
526
527 // Initialize "Disable dates" option's date pickers that hasn't been initialized.
528 $( '.everest-forms-disable-dates' ).each( function() {
529 if ( ! $( this ).get(0)._flatpickr ) {
530 $( this ).flatpickr({
531 dateFormat: date_format,
532 mode: selection_mode,
533 });
534 }
535 })
536
537 // Reformat the selected dates input value for `Disable dates` option when the date format changes.
538 $( document.body ).on( 'change', '.evf-date-format', function( e ) {
539 var $disable_dates = $( '.everest-forms-field-option:visible .everest-forms-disable-dates' ),
540 flatpicker = $disable_dates.get(0)._flatpickr,
541 selectedDates = flatpicker.selectedDates,
542 date_format = $( this ).val(),
543 formatedDates = [];
544
545 selectedDates.forEach( function( date ) {
546 formatedDates.push( flatpickr.formatDate( date, date_format ) );
547 })
548 flatpicker.set( 'dateFormat', date_format );
549 $disable_dates.val( formatedDates.join( ', ' ) );
550 });
551
552 // Clear disabled dates.
553 $( document.body ).on( 'click', '.evf-clear-disabled-dates', function() {
554 $( '.everest-forms-field-option:visible .everest-forms-disable-dates' ).get(0)._flatpickr.clear();
555 });
556
557 // Triggring Setting Toggler.
558 $( '.everest-forms-field-date-time' ).each( function() {
559 var id = $( this ).attr( 'data-field-id' );
560 EVFPanelBuilder.dateSettingToggler( id, $('#everest-forms-field-option-' + id + '-datetime_style' ).val() );
561 } );
562 },
563
564 /**
565 * Form edit title actions.
566 *
567 * @since 1.6.0
568 */
569 bindEditActions: function() {
570 // Delegates event to toggleEditTitle() on clicking.
571 $( '#edit-form-name' ).on( 'click', function( e ) {
572 e.stopPropagation();
573
574 if ( '' !== $( '#evf-edit-form-name' ).val().trim() ) {
575 EVFPanelBuilder.toggleEditTitle( e );
576 }
577 });
578
579 // Apply the title change to form name field.
580 $( '#evf-edit-form-name' )
581 .on( 'change keypress', function( e ) {
582 var $this = $( this );
583
584 e.stopPropagation();
585
586 if ( 13 === e.which && '' !== $( this ).val().trim() ) {
587 EVFPanelBuilder.toggleEditTitle( e );
588 }
589
590 if ( '' !== $this.val().trim() ) {
591 $( '#everest-forms-panel-field-settings-form_title' ).val( $this.val().trim() );
592 }
593 })
594 .on( 'click', function( e ) {
595 e.stopPropagation();
596 });
597
598 // In case the user goes out of focus from title edit state.
599 $( document ).not( $( '.everest-forms-title-desc' ) ).on( 'click', function( e ) {
600 var field = $( '#evf-edit-form-name' );
601
602 e.stopPropagation();
603
604 // Only allow flipping state if currently editing.
605 if ( ! field.prop( 'disabled' ) && field.val() && '' !== field.val().trim() ) {
606 EVFPanelBuilder.toggleEditTitle( e );
607 }
608 });
609 },
610
611 // Toggles edit state.
612 toggleEditTitle: function( event ) {
613 var $el = $( '#edit-form-name' ),
614 $input_title = $el.siblings( '#evf-edit-form-name' );
615
616 event.preventDefault();
617
618 // Toggle disabled property.
619 $input_title.prop ( 'disabled' , function( _ , val ) {
620 return ! val;
621 });
622
623 if ( ! $input_title.hasClass( 'everst-forms-name-editing' ) ) {
624 $input_title.focus();
625 }
626
627 $input_title.toggleClass( 'everst-forms-name-editing' );
628 },
629
630 //--------------------------------------------------------------------//
631 // Fields Panel
632 //--------------------------------------------------------------------//
633
634 /**
635 * Creates a object from form elements.
636 *
637 * @since 1.6.0
638 */
639 formObject: function( el ) {
640 var form = jQuery( el ),
641 fields = form.find( '[name]' ),
642 json = {},
643 arraynames = {};
644
645 for ( var v = 0; v < fields.length; v++ ){
646
647 var field = jQuery( fields[v] ),
648 name = field.prop( 'name' ).replace( /\]/gi,'' ).split( '[' ),
649 value = field.val(),
650 lineconf = {};
651
652 if ( ( field.is( ':radio' ) || field.is( ':checkbox' ) ) && ! field.is( ':checked' ) ) {
653 continue;
654 }
655 for ( var i = name.length-1; i >= 0; i-- ) {
656 var nestname = name[i];
657 if ( typeof nestname === 'undefined' ) {
658 nestname = '';
659 }
660 if ( nestname.length === 0 ){
661 lineconf = [];
662 if ( typeof arraynames[name[i-1]] === 'undefined' ) {
663 arraynames[name[i-1]] = 0;
664 } else {
665 arraynames[name[i-1]] += 1;
666 }
667 nestname = arraynames[name[i-1]];
668 }
669 if ( i === name.length-1 ){
670 if ( value ) {
671 if ( value === 'true' ) {
672 value = true;
673 } else if ( value === 'false' ) {
674 value = false;
675 }else if ( ! isNaN( parseFloat( value ) ) && parseFloat( value ).toString() === value ) {
676 value = parseFloat( value );
677 } else if ( typeof value === 'string' && ( value.substr( 0,1 ) === '{' || value.substr( 0,1 ) === '[' ) ) {
678 try {
679 value = JSON.parse( value );
680 } catch (e) {}
681 } else if ( typeof value === 'object' && value.length && field.is( 'select' ) ){
682 var new_val = {};
683 for ( var i = 0; i < value.length; i++ ) {
684 new_val[ 'n' + i ] = value[ i ];
685 }
686 value = new_val;
687 }
688 }
689 lineconf[nestname] = value;
690 } else {
691 var newobj = lineconf;
692 lineconf = {};
693 lineconf[nestname] = newobj;
694 }
695 }
696 $.extend( true, json, lineconf );
697 }
698
699 return json;
700 },
701
702 /**
703 * Element bindings for Fields panel.
704 *
705 * @since 1.2.0
706 */
707 bindUIActionsFields: function() {
708 // Add new field choice.
709 $builder.on( 'click', '.everest-forms-field-option-row-choices .add', function( event ) {
710 EVFPanelBuilder.choiceAdd( event, $(this) );
711 });
712
713 // Delete field choice.
714 $builder.on( 'click', '.everest-forms-field-option-row-choices .remove', function( event ) {
715 EVFPanelBuilder.choiceDelete( event, $(this) );
716 });
717
718 // Field choices defaults - (before change).
719 $builder.on( 'mousedown', '.everest-forms-field-option-row-choices input[type=radio]', function() {
720 var $this = $(this);
721
722 if ( $this.is( ':checked' ) ) {
723 $this.attr( 'data-checked', '1' );
724 } else {
725 $this.attr( 'data-checked', '0' );
726 }
727 });
728
729 // Field choices defaults.
730 $builder.on( 'click', '.everest-forms-field-option-row-choices input[type=radio]', function() {
731 var $this = $(this),
732 list = $this.parent().parent();
733
734 $this.parent().parent().find( 'input[type=radio]' ).not( this ).prop( 'checked', false );
735
736 if ( $this.attr( 'data-checked' ) === '1' ) {
737 $this.prop( 'checked', false );
738 $this.attr( 'data-checked', '0' );
739 }
740
741 EVFPanelBuilder.choiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ) );
742 });
743
744 // Field choices update preview area.
745 $builder.on( 'change', '.everest-forms-field-option-row-choices input[type=checkbox]', function(e) {
746 var list = $(this).parent().parent();
747 EVFPanelBuilder.choiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ) );
748 });
749
750 // Updates field choices text in almost real time.
751 $builder.on( 'keyup paste focusout', '.everest-forms-field-option-row-choices input.label, .everest-forms-field-option-row-choices input.value', function(e) {
752 var list = $(this).parent().parent().parent();
753 EVFPanelBuilder.choiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ) );
754 });
755
756 // Field choices display value toggle.
757 $builder.on( 'change', '.everest-forms-field-option-row-show_values input', function(e) {
758 $(this).closest( '.everest-forms-field-option' ).find( '.everest-forms-field-option-row-choices ul' ).toggleClass( 'show-values' );
759 });
760
761 // Field image choices toggle.
762 $builder.on( 'change', '.everest-forms-field-option-row-choices_images input', function() {
763 var $this = $( this ),
764 field_id = $this.parent().data( 'field-id' ),
765 $fieldOptions = $( '#everest-forms-field-option-' + field_id ),
766 $columnOptions = $( '#everest-forms-field-option-' + field_id + '-input_columns' ),
767 type = $( '#everest-forms-field-option-' + field_id ).find( '.everest-forms-field-option-hidden-type' ).val();
768
769 $this.parent().find( '.notice' ).toggleClass( 'hidden' );
770 $fieldOptions.find( '.everest-forms-field-option-row-choices ul' ).toggleClass( 'show-images' );
771
772 // Trigger columns changes.
773 if ( $this.is( ':checked' ) ) {
774 $columnOptions.val( 'inline' ).trigger( 'change' );
775 } else {
776 $columnOptions.val( '' ).trigger( 'change' );
777 }
778
779 EVFPanelBuilder.choiceUpdate( type, field_id );
780 } );
781
782 // Upload or add an image.
783 $builder.on( 'click', '.everest-forms-attachment-media-view .upload-button', function( event ) {
784 var $el = $( this ), $wrapper, file_frame;
785
786 event.preventDefault();
787
788 // If the media frame already exists, reopen it.
789 if ( file_frame ) {
790 file_frame.open();
791 return;
792 }
793
794 // Create the media frame.
795 file_frame = wp.media.frames.everestforms_media_frame = wp.media({
796 title: evf_data.i18n_upload_image_title,
797 className: 'media-frame everest-forms-media-frame',
798 frame: 'select',
799 multiple: false,
800 library: {
801 type: 'image'
802 },
803 button: {
804 text: evf_data.i18n_upload_image_button
805 }
806 });
807
808 // When an image is selected, run a callback.
809 file_frame.on( 'select', function() {
810 var attachment = file_frame.state().get( 'selection' ).first().toJSON();
811
812 if ( $el.hasClass( 'button-add-media' ) ) {
813 $el.hide();
814 $wrapper = $el.parent();
815 } else {
816 $wrapper = $el.parent().parent().parent();
817 }
818
819 $wrapper.find( '.source' ).val( attachment.url );
820 $wrapper.find( '.attachment-thumb' ).remove();
821 $wrapper.find( '.thumbnail-image' ).prepend( '<img class="attachment-thumb" src="' + attachment.url + '">' );
822 $wrapper.find( '.actions' ).show();
823
824 $builder.trigger( 'everestFormsImageUploadAdd', [ $el, $wrapper ] );
825 });
826
827 // Finally, open the modal.
828 file_frame.open();
829 } );
830
831 // Remove and uploaded image.
832 $builder.on( 'click', '.everest-forms-attachment-media-view .remove-button', function( event ) {
833 event.preventDefault();
834
835 var $container = $( this ).parent().parent();
836
837 $container.find( '.attachment-thumb' ).remove();
838 $container.parent().find( '.source' ).val( '' );
839 $container.parent().find( '.button-add-media' ).show();
840
841 $builder.trigger( 'everestFormsImageUploadRemove', [ $( this ), $container ] );
842 });
843
844 // Field choices image upload add/remove image.
845 $builder.on( 'everestFormsImageUploadAdd everestFormsImageUploadRemove', function( event, $this, $container ) {
846 var $el = $container.closest( '.evf-choices-list' ),
847 type = $el.data( 'field-type' ),
848 field_id = $el.data( 'field-id' );
849
850 EVFPanelBuilder.choiceUpdate( type, field_id );
851 });
852
853 // Toggle Layout advanced field option.
854 $builder.on( 'change', '.everest-forms-field-option-row-input_columns select', function() {
855 var $this = $( this ),
856 value = $this.val(),
857 field_id = $this.parent().data( 'field-id' ),
858 css_class = '';
859
860 if ( 'inline' === value ) {
861 css_class = 'everest-forms-list-inline';
862 } else if ( '' !== value ) {
863 css_class = 'everest-forms-list-' + value + '-columns';
864 }
865
866 $( '#everest-forms-field-' + field_id ).removeClass( 'everest-forms-list-inline everest-forms-list-2-columns everest-forms-list-3-columns' ).addClass( css_class );
867 });
868
869 // Field sidebar tab toggle.
870 $builder.on( 'click', '.everest-forms-fields-tab a', function(e) {
871 e.preventDefault();
872 EVFPanelBuilder.fieldTabChoice( $(this).attr( 'id' ) );
873 });
874
875
876 // Dragged field and hover over tab buttons - multipart.
877 $(document).on( 'mouseenter', '.everest-forms-tabs li[class*="part_"]', function() {
878 if ( false === $( this ).hasClass( 'active' ) && ( $( document ).find( '.everest-forms-field' ).hasClass( 'ui-sortable-helper' ) || $( document ).find( '.evf-registered-buttons button.evf-registered-item' ).hasClass( 'field-dragged' ) ) ) {
879 $( this ).find( 'a' ).trigger( 'click' );
880 }
881 } );
882
883 // Display toggle for "Address" field hidden option.
884 $builder.on( 'change', '.everest-forms-field-option-address input.hide', function() {
885 var $this = $(this),
886 id = $this.parent().parent().data( 'field-id' ),
887 subfield = $this.parent().parent().data( 'subfield' );
888 $( '#everest-forms-field-' + id ).find( '.everest-forms-' + subfield ).toggleClass( 'hidden' );
889 });
890
891 // Real-time updates for "Show Label" field option.
892 $builder.on( 'input', '.everest-forms-field-option-row-label input', function() {
893 var $this = $(this),
894 value = $this.val().replace( /<script/gi, ''),
895 id = $this.parent().data( 'field-id' ),
896 $label = $( '#everest-forms-field-' + id ).find( '.label-title .text' );
897
898 if ( $label.hasClass( 'nl2br' ) ) {
899 $label.html( value.replace( /\n/g, '<br>') );
900 } else {
901 $label.html( value );
902 }
903 });
904
905 $builder.on( 'change', '.everest-forms-field-option-row-enable_prepopulate input', function( event ) {
906 var id = $( this ).parent().data( 'field-id' );
907
908 $( '#everest-forms-field-' + id ).toggleClass( 'parameter_name' );
909
910 // Toggle "Parameter Name" option.
911 if ( $( event.target ).is( ':checked' ) ) {
912 $( '#everest-forms-field-option-row-' + id + '-parameter_name' ).show();
913 } else {
914 $( '#everest-forms-field-option-row-' + id + '-parameter_name' ).hide();
915 }
916 });
917
918 // Real-time updates for "Description" field option.
919 $builder.on( 'input', '.everest-forms-field-option-row-description textarea', function() {
920 var $this = $( this ),
921 value = $this.val().replace( /<script/gi, ''),
922 id = $this.parent().data( 'field-id' ),
923 $desc = $( '#everest-forms-field-' + id ).find( '.description' );
924
925 if ( $desc.hasClass( 'nl2br' ) ) {
926 $desc.html( value.replace( /\n/g, '<br>') );
927 } else {
928 $desc.html( value );
929 }
930 });
931
932 // Real-time updates for "Required" field option.
933 $builder.on( 'change', '.everest-forms-field-option-row-required input', function( event ) {
934 var id = $( this ).parent().data( 'field-id' );
935
936 $( '#everest-forms-field-' + id ).toggleClass( 'required' );
937
938 // Toggle "Required Field Message Setting" option.
939 if ( $( event.target ).is( ':checked' ) ) {
940 $( '#everest-forms-field-option-row-' + id + '-required_field_message_setting' ).show();
941 if($('#everest-forms-field-option-' + id + '-required_field_message_setting-individual').is(':checked')) {
942 $( '#everest-forms-field-option-row-' + id + '-required-field-message' ).show();
943 }
944 } else {
945 $( '#everest-forms-field-option-row-' + id + '-required_field_message_setting' ).hide();
946 $( '#everest-forms-field-option-row-' + id + '-required-field-message' ).hide();
947 }
948 });
949
950 $builder.on( 'change', '.everest-forms-field-option-row-required_field_message_setting input', function( event ) {
951 var id = $( this ).parent().parent().parent().parent().data( 'field-id' );
952
953 $( '#everest-forms-field-' + id ).toggleClass( 'required_field_message_setting' );
954
955 // Toggle "Required Field Message" option.
956 if ( 'individual' === $(this).val() ) {
957 $( '#everest-forms-field-option-row-' + id + '-required-field-message' ).show();
958 } else {
959 $( '#everest-forms-field-option-row-' + id + '-required-field-message' ).hide();
960 }
961 });
962
963 // Real-time updates for "Confirmation" field option.
964 $builder.on( 'change', '.everest-forms-field-option-row-confirmation input', function( event ) {
965 var id = $( this ).parent().data( 'field-id' );
966
967 // Toggle "Confirmation" field option.
968 if ( $( event.target ).is( ':checked' ) ) {
969 $( '#everest-forms-field-' + id ).find( '.everest-forms-confirm' ).removeClass( 'everest-forms-confirm-disabled' ).addClass( 'everest-forms-confirm-enabled' );
970 $( '#everest-forms-field-option-' + id ).removeClass( 'everest-forms-confirm-disabled' ).addClass( 'everest-forms-confirm-enabled' );
971 } else {
972 $( '#everest-forms-field-' + id ).find( '.everest-forms-confirm' ).removeClass( 'everest-forms-confirm-enabled' ).addClass( 'everest-forms-confirm-disabled' );
973 $( '#everest-forms-field-option-' + id ).removeClass( 'everest-forms-confirm-enabled' ).addClass( 'everest-forms-confirm-disabled' );
974 }
975 });
976
977 // Real-time updates for "Placeholder" field option.
978 $builder.on( 'input', '.everest-forms-field-option-row-placeholder input', function(e) {
979 var $this = $( this ),
980 value = $this.val(),
981 id = $this.parent().data( 'field-id' ),
982 $primary = $( '#everest-forms-field-' + id ).find( '.widefat:not(.secondary-input)' );
983
984 if ( $primary.is( 'select' ) ) {
985 if ( ! value.length ) {
986 $primary.find( '.placeholder' ).remove();
987 } else {
988 if ( $primary.find( '.placeholder' ).length ) {
989 $primary.find( '.placeholder' ).text( value );
990 } else {
991 $primary.prepend( '<option class="placeholder" selected>' + value + '</option>' );
992 }
993
994 $primary.data( 'placeholder', value );
995
996 if ( $primary.hasClass( 'enhanced' ) ) {
997 $primary.parent().find( '.select2-search__field' ).prop( 'placeholder', value );
998 }
999 }
1000 } else {
1001 $primary.attr( 'placeholder', value );
1002 }
1003 });
1004
1005 // Real-time updates for "Address Placeholder" field options.
1006 $builder.on( 'input', '.everest-forms-field-option-address input.placeholder', function(e) {
1007 var $this = $(this),
1008 value = $this.val(),
1009 id = $this.parent().parent().data( 'field-id' ),
1010 subfield = $this.parent().parent().data( 'subfield' );
1011 $( '#everest-forms-field-' + id ).find( '.everest-forms-' + subfield + ' input' ).attr( 'placeholder', value );
1012 });
1013
1014 // Real-time updates for "Confirmation Placeholder" field option.
1015 $builder.on( 'input', '.everest-forms-field-option-row-confirmation_placeholder input', function() {
1016 var $this = $( this ),
1017 value = $this.val(),
1018 id = $this.parent().data( 'field-id' );
1019 $( '#everest-forms-field-' + id ).find( '.secondary-input' ).attr( 'placeholder', value );
1020 });
1021
1022 // Real-time updates for "Hide Label" field option.
1023 $builder.on( 'change', '.everest-forms-field-option-row-label_hide input', function() {
1024 var id = $(this).parent().data( 'field-id' );
1025 $( '#everest-forms-field-' + id ).toggleClass( 'label_hide' );
1026 });
1027
1028 // Real-time updates for Sub Label visbility field option.
1029 $builder.on( 'change', '.everest-forms-field-option-row-sublabel_hide input', function() {
1030 var id = $( this ).parent().data( 'field-id' );
1031 $( '#everest-forms-field-' + id ).toggleClass( 'sublabel_hide' );
1032 });
1033
1034 // Real-time updates for Date/Time and Name "Format" option.
1035 $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) {
1036 var $this = $(this),
1037 value = $this.val(),
1038 id = $this.parent().data( 'field-id' );
1039 $( '#everest-forms-field-' + id ).find( '.format-selected' ).removeClass().addClass( 'format-selected format-selected-' + value );
1040 $( '#everest-forms-field-option-' + id ).find( '.format-selected' ).removeClass().addClass( 'format-selected format-selected-'+ value );
1041 });
1042
1043 // Setting options toggler.
1044 $builder.on( 'change', '.everest-forms-field-option-row-datetime_style select', function() {
1045 EVFPanelBuilder.dateSettingToggler( $( this ).parent().attr( 'data-field-id' ), $( this ).val() );
1046 } );
1047
1048 // Enable Min Max Toggler.
1049 $( '.everest-forms-field-option-row-time_interval_format [id*=enable_min_max_time]' ).each ( function() {
1050 if( $( this ).prop('checked') ) {
1051 $( this ).parent().parent().find( '.input-group-col-2').has(' [id*=min_time_hour]' ).show();
1052 $( this ).parent().parent().find( '.input-group-col-2').has(' [id*=max_time_hour]').show();
1053 $( this ).parent().parent().find( '.input-group-col-2').has(' [for*=select_min_time]' ).show();
1054 $( this ).parent().parent().find( '.input-group-col-2').has( '[for*=select_max_time]' ).show();
1055 } else {
1056 $( this ).parent().parent().find( '.input-group-col-2').has( '[id*=min_time_hour]' ).hide();
1057 $( this ).parent().parent().find( '.input-group-col-2').has( '[id*=max_time_hour]' ).hide();
1058 $( this ).parent().parent().find( '[for*=select_min_time]' ).hide();
1059 $( this ).parent().parent().find( '[for*=select_max_time]' ).hide();
1060 }
1061 } );
1062
1063 $builder.on( 'click', '.everest-forms-field-option-row-time_interval_format [id*=enable_min_max_time]', function() {
1064 if( $( this ).prop('checked') ) {
1065 $( this ).parent().parent().find( '.input-group-col-2').has(' [id*=min_time_hour]' ).show();
1066 $( this ).parent().parent().find( '.input-group-col-2').has(' [id*=max_time_hour]').show();
1067 $( this ).parent().parent().find( '[for*=select_min_time]' ).show();
1068 $( this ).parent().parent().find( '[for*=select_max_time]' ).show();
1069 } else {
1070 $( this ).parent().parent().find( '.input-group-col-2').has( '[id*=min_time_hour]' ).hide();
1071 $( this ).parent().parent().find( '.input-group-col-2').has( '[id*=max_time_hour]' ).hide();
1072 $( this ).parent().parent().find( '[for*=select_min_time]' ).hide();
1073 $( this ).parent().parent().find( '[for*=select_max_time]' ).hide();
1074 }
1075 } );
1076
1077 // Time interval changes.
1078 $builder.on( 'change', '.everest-forms-field-option-row-time_interval_format select[id*=time_format]', function() {
1079 min_hour = $( this ).parent().siblings( '.input-group-col-2' ).find( '[id*=min_time_hour]' );
1080 max_hour = $( this ).parent().siblings( '.input-group-col-2' ).find( '[id*=max_time_hour]' );
1081 var selected_min = min_hour.find( 'option:selected' ).val();
1082 var selected_max = max_hour.find( 'option:selected' ).val();
1083 var options = '', a, h;
1084 for( i = 0; i<= 23; i++ ) {
1085 if( $( this ).val() === 'H:i' ) {
1086 options += '<option value = "' + i + '">' + ( ( i < 10 ) ? ( '0' + i ) : i )+ '</option>';
1087 } else {
1088 a = ' PM';
1089 if( i < 12 ) {
1090 a = ' AM';
1091 h = i;
1092 } else {
1093 h = i - 12;
1094 }
1095 if( h == 0 ) {
1096 h = 12;
1097 }
1098 options += '<option value = "' + i + '">' + h + a + '</option>';
1099 }
1100 }
1101 min_hour.html(options);
1102 max_hour.html(options);
1103 min_hour.find( 'option[value=' + selected_min + ']' ).prop( 'selected', true );
1104 max_hour.find( 'option[value=' + selected_max + ']' ).prop( 'selected', true );
1105 } );
1106 },
1107
1108 /**
1109 * Setting options for Date Picker and Dropdown Toggler.
1110 */
1111 dateSettingToggler: function( id, type ) {
1112 if( type == 'picker' ) {
1113 // Picker Date Setting Control
1114 $( '#everest-forms-field-option-row-' + id + '-placeholder' ).show();
1115 $( '#everest-forms-field-option-' + id + '-disable_dates' ).show();
1116 $( 'label[for=everest-forms-field-option-' + id + '-disable_dates]' ).show();
1117 $( '#everest-forms-field-option-' + id + '-date_mode-range' ).parents().find( 'everest-forms-checklist' ).show();
1118 $( '.everest-forms-field-option-row-date_format .time_interval' ).show();
1119 $( '#everest-forms-field-option-' + id + '-date_localization' ).show();
1120 $( 'label[for=everest-forms-field-option-' + id + '-date_localization]' ).show();
1121 $( '#everest-forms-field-option-' + id + '-date_default' ).parent().show();
1122 $('#everest-forms-field-option-' + id + '-past_date_disable' ).parent().show();
1123 $( '#everest-forms-field-option-' + id + '-enable_min_max' ).parent().show();
1124 //Check if min max date enabled.
1125 if( $('#everest-forms-field-option-' + id + '-enable_min_max' ).prop( 'checked' ) ) {
1126 $('#everest-forms-field-option-' + id + '-set_date_range' ).parent().show();
1127 if ( $('#everest-forms-field-option-' + id + '-set_date_range' ).prop( 'checked' ) ) {
1128 $('#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-range-option').removeClass('everest-forms-hidden');
1129 } else {
1130 $('#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-option').removeClass('everest-forms-hidden');
1131 }
1132 }
1133 $('#everest-forms-field-option-' + id + '-time_interval' ).show();
1134 $('#everest-forms-field-option-' + id + '-enable_min_max_time').hide();
1135 $('label[for=everest-forms-field-option-' + id + '-enable_min_max_time]').hide();
1136 $('label[for=everest-forms-field-option-' + id + '-select_min_time]').hide();
1137 $('label[for=everest-forms-field-option-' + id + '-select_max_time]').hide();
1138 $('#everest-forms-field-option-' + id + '-min_time_hour').parent().hide();
1139 $('#everest-forms-field-option-' + id + '-max_time_hour').parent().hide();
1140
1141 } else {
1142 // Dropdown Date Setting Control
1143 $('#everest-forms-field-option-' + id + '-date_mode-range').parents().find('everest-forms-checklist').hide();
1144 $('#everest-forms-field-option-' + id + '-date_default' ).parent().hide();
1145 $('#everest-forms-field-option-' + id + '-past_date_disable' ).parent().hide();
1146 $('#everest-forms-field-option-row-' + id + '-placeholder').hide();
1147 $('#everest-forms-field-option-' + id + '-enable_min_max').parent().hide();
1148 $('#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-option').addClass( 'everest-forms-hidden' );
1149 $('#everest-forms-field-option-' + id + '-set_date_range').parent().hide();
1150 $('#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-range-option').addClass( 'everest-forms-hidden' );
1151 $('#everest-forms-field-option-' + id + '-disable_dates' ).hide();
1152 $('label[for=everest-forms-field-option-' + id + '-disable_dates]').hide();
1153 $('.everest-forms-field-option-row-date_format .everest-forms-checklist' ).hide();
1154 $('.everest-forms-field-option-row-date_format .time_interval' ).hide();
1155 $('#everest-forms-field-option-' + id + '-date_localization' ).hide();
1156 $('label[for=everest-forms-field-option-' + id + '-date_localization]' ).hide();
1157 $('#everest-forms-field-option-' + id + '-time_interval' ).hide();
1158 $('#everest-forms-field-option-' + id + '-enable_min_max_time').show();
1159 $('label[for=everest-forms-field-option-' + id + '-enable_min_max_time]').show();
1160 //Check if min max time enabled.
1161 if( $('#everest-forms-field-option-' + id + '-enable_min_max_time').prop('checked') ) {
1162 $('label[for=everest-forms-field-option-' + id + '-select_min_time]').show();
1163 $('label[for=everest-forms-field-option-' + id + '-select_max_time]').show();
1164 $('#everest-forms-field-option-' + id + '-min_time_hour').parent().show();
1165 $('#everest-forms-field-option-' + id + '-max_time_hour').parent().show();
1166 }
1167 }
1168 },
1169
1170
1171 /**
1172 * Make field choices sortable.
1173 *
1174 * @since 1.0.0
1175 *
1176 * @param {string} selector Selector.
1177 */
1178 choicesInit: function( selector ) {
1179 selector = selector || '.everest-forms-field-option-row-choices ul';
1180
1181 $( selector ).sortable({
1182 items: 'li',
1183 axis: 'y',
1184 handle: '.sort',
1185 scrollSensitivity: 40,
1186 stop: function ( event ) {
1187 var field_id = $( event.target ).attr( 'data-field-id' ),
1188 type = $( '#everest-forms-field-option-' + field_id ).find( '.everest-forms-field-option-hidden-type' ).val();
1189
1190 EVFPanelBuilder.choiceUpdate( type, field_id );
1191 }
1192 } );
1193 },
1194
1195 /**
1196 * Add new field choice.
1197 *
1198 * @since 1.6.0
1199 */
1200 choiceAdd: function( event, el, value ) {
1201 if ( event && event.preventDefault ) {
1202 event.preventDefault();
1203 }
1204
1205 var $this = $( el ),
1206 $parent = $this.parent(),
1207 checked = $parent.find( 'input.default' ).is( ':checked' ),
1208 fieldID = $this.closest( '.everest-forms-field-option-row-choices' ).data( 'field-id' ),
1209 nextID = $parent.parent().attr( 'data-next-id' ),
1210 type = $parent.parent().data( 'field-type' ),
1211 $choice = $parent.clone().insertAfter( $parent );
1212
1213 $choice.attr( 'data-key', nextID );
1214 $choice.find( 'input.label' ).val( value ).attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][label]' );
1215 $choice.find( 'input.value' ).val( value ).attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][value]' );
1216 $choice.find( 'input.source' ).val( '' ).attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][image]' );
1217 $choice.find( 'input.default').attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][default]' ).prop( 'checked', false );
1218 $choice.find( '.attachment-thumb' ).remove();
1219 $choice.find( '.button-add-media' ).show();
1220
1221 if ( checked === true ) {
1222 $parent.find( 'input.default' ).prop( 'checked', true );
1223 }
1224
1225 nextID++;
1226 $parent.parent().attr( 'data-next-id', nextID );
1227 $builder.trigger( 'everestFormsChoiceAdd' );
1228 EVFPanelBuilder.choiceUpdate( type, fieldID );
1229 },
1230
1231 /**
1232 * Delete field choice.
1233 *
1234 * @since 1.6.0
1235 */
1236 choiceDelete: function( event, el ) {
1237 event.preventDefault();
1238
1239 var $this = $( el ),
1240 $list = $this.parent().parent(),
1241 total = $list.find( 'li' ).length;
1242
1243 if ( total < 2 ) {
1244 $.alert({
1245 title: false,
1246 content: evf_data.i18n_field_error_choice,
1247 icon: 'dashicons dashicons-info',
1248 type: 'blue',
1249 buttons: {
1250 ok: {
1251 text: evf_data.i18n_ok,
1252 btnClass: 'btn-confirm',
1253 keys: [ 'enter' ]
1254 }
1255 }
1256 });
1257 } else {
1258 $this.parent().remove();
1259 EVFPanelBuilder.choiceUpdate( $list.data( 'field-type' ), $list.data( 'field-id' ) );
1260 $builder.trigger( 'everestFormsChoiceDelete' );
1261 }
1262 },
1263
1264 /**
1265 * Update field choices in preview area, for the Fields panel.
1266 *
1267 * @since 1.6.0
1268 */
1269 choiceUpdate: function( type, id ) {
1270 var $fieldOptions = $( '#everest-forms-field-option-' + id );
1271 $primary = $( '#everest-forms-field-' + id + ' .primary-input' );
1272
1273 // Radio and Checkbox use _ template.
1274 if ( 'radio' === type || 'checkbox' === type || 'payment-multiple' === type || 'payment-checkbox' === type ) {
1275 var choices = [],
1276 formData = EVFPanelBuilder.formObject( $fieldOptions ),
1277 settings = formData.form_fields[ id ];
1278
1279 // Order of choices for a specific field.
1280 $( '#everest-forms-field-option-' + id ).find( '.evf-choices-list li' ).each( function() {
1281 choices.push( $( this ).data( 'key' ) );
1282 } );
1283
1284 var tmpl = wp.template( 'everest-forms-field-preview-choices' ),
1285 type = 'checkbox' === type || 'payment-checkbox' === type ? 'checkbox' : 'radio';
1286 data = {
1287 type: type,
1288 order: choices,
1289 settings: settings,
1290 amountFilter: EVFPanelBuilder.amountFilter,
1291 };
1292
1293 $( '#everest-forms-field-' + id ).find( 'ul.primary-input' ).replaceWith( tmpl( data ) );
1294
1295 return;
1296 }
1297
1298 var new_choice;
1299
1300 if ( 'select' === type ) {
1301 new_choice = '<option>{label}</option>';
1302 $primary.find( 'option' ).not( '.placeholder' ).remove();
1303 }
1304
1305 $( '#everest-forms-field-option-row-' + id + '-choices .evf-choices-list li' ).each( function( index ) {
1306 var $this = $( this ),
1307 label = $this.find( 'input.label' ).val().replace( /<script/gi, ''),
1308 selected = $this.find( 'input.default' ).is( ':checked' ),
1309 choice = $( new_choice.replace( '{label}', label ) );
1310
1311 $( '#everest-forms-field-' + id + ' .primary-input' ).append( choice );
1312
1313 if ( ! label ) {
1314 return;
1315 }
1316
1317 if ( true === selected ) {
1318 switch ( type ) {
1319 case 'select':
1320 choice.prop( 'selected', true );
1321 break;
1322 case 'radio':
1323 case 'checkbox':
1324 choice.find( 'input' ).prop( 'checked', true );
1325 break;
1326 }
1327 }
1328 } );
1329 },
1330
1331 amountFilter: function(data, amount){
1332 if ( 'right' === data.currency_symbol_pos ) {
1333 return amount + ' ' + data.currency_symbol;
1334 } else {
1335 return data.currency_symbol + ' ' + amount;
1336 }
1337 },
1338
1339 bindFormSettings: function () {
1340 $( 'body' ).on( 'click', '.evf-setting-panel', function( e ) {
1341 var data_setting_section = $(this).attr('data-section');
1342 $('.evf-setting-panel').removeClass('active');
1343 $('.everest-forms-active-email').removeClass('active');
1344 $('.everest-forms-active-sms-notifications').removeClass('active');
1345 $('.everest-forms-active-conversational-forms').removeClass('active');
1346 $('.evf-content-section').removeClass('active');
1347 $(this).addClass('active');
1348 $('.evf-content-' + data_setting_section + '-settings').addClass('active');
1349 e.preventDefault();
1350 });
1351
1352 $('.evf-setting-panel').eq(0).trigger('click');
1353 },
1354 bindFormEmail: function () {
1355 $('body').on('click', '.everest-forms-panel-sidebar-section-email', function ( e ) {
1356 $(this).siblings('.everest-forms-active-email').removeClass('active');
1357 $(this).next('.everest-forms-active-email').addClass('active');
1358 var container = $( this ).siblings('.everest-forms-active-email.active').find('.everest-forms-active-email-connections-list li');
1359
1360 if( container.length ){
1361 container.children('.user-nickname').first().trigger('click');
1362 }
1363 e.preventDefault();
1364 });
1365 },
1366 bindFormSmsNotifications: function () {
1367 $('body').on('click', '.everest-forms-panel-sidebar-section-sms-notifications', function ( e ) {
1368 $(this).siblings('.everest-forms-active-sms-notifications').removeClass('active');
1369 $(this).next('.everest-forms-active-sms-notifications').addClass('active');
1370 var container = $( this ).siblings('.everest-forms-active-sms-notifications.active').find('.everest-forms-active-sms-notifications-connections-list li');
1371
1372 if( container.length ){
1373 container.children('.user-nickname').first().trigger('click');
1374 }
1375 e.preventDefault();
1376 });
1377 },
1378 bindFormConversational: function () {
1379 $("body").on("click",".everest-forms-panel-sidebar-section-conversational-forms ", function (e) {
1380 var $this = $(this);
1381 $(this).siblings(".everest-forms-active-conversational-forms").removeClass("active");
1382 $(this).next(".everest-forms-active-conversational-forms").addClass("active");
1383 var container = $( this ).siblings('.everest-forms-active-conversational-forms.active');
1384
1385 if( container.length ){
1386 container.children('.evf-content-tab ').trigger('click');
1387 }
1388 e.preventDefault();
1389 });
1390 },
1391 bindFormIntegrations: function () {
1392 $('body').on('click', '.evf-integrations-panel', function ( e ) {
1393 var data_setting_section = $(this).attr('data-section');
1394 $('.evf-integrations-panel').removeClass('active');
1395 $('#everest-forms-panel-integrations').find('.evf-panel-content-section').removeClass('active');
1396 $(this).addClass('active');
1397 $(this).parent().find('.everest-forms-active-connections').removeClass('active');
1398 $(this).next('.everest-forms-active-connections').addClass('active');
1399 var container = $( this ).siblings('.everest-forms-active-connections.active').find('.everest-forms-active-connections-list li');
1400
1401 if( container.length ){
1402 container.children('.user-nickname').first().trigger('click');
1403 }
1404 $('.evf-panel-content-section-' + data_setting_section ).addClass('active');
1405 e.preventDefault();
1406 });
1407
1408 $('.evf-setting-panel').eq(0).trigger('click');
1409 },
1410 bindFormPayment: function () {
1411 $('body').on('click', '.evf-payments-panel', function ( e ) {
1412 var data_setting_section = $(this).attr('data-section');
1413 $('.evf-payments-panel').removeClass('active');
1414 $(this).siblings().removeClass('icon active');
1415 $(this).addClass('active');
1416 $(this).parents('#everest-forms-panel-payments').find('.evf-payment-setting-content').removeClass('active').hide();
1417 $('.evf-content-' + data_setting_section + '-settings' ).addClass('active').show();
1418 e.preventDefault();
1419 });
1420
1421 $('.evf-setting-panel').eq(0).trigger('click');
1422 },
1423 removeRow: function ( row ) {
1424 $.each( row.find( '.everest-forms-field' ), function() {
1425 var field_id = $( this ).attr( 'data-field-id' ),
1426 field_options = $( '#everest-forms-field-option-' + field_id );
1427
1428 // Remove form field.
1429 $( this ).remove();
1430
1431 // Remove field options.
1432 field_options.remove();
1433 });
1434
1435 // Remove row.
1436 row.remove();
1437 },
1438 bindRemoveRow: function () {
1439 $( 'body' ).on( 'click', '.evf-delete-row', function() {
1440 var $this = $( this ),
1441 total_rows = $( '.evf-admin-row' ).length,
1442 current_row = $this.closest( '.evf-admin-row' ),
1443 row_id = current_row.attr('data-row-id'),
1444 current_part = $this.parents( '.evf-admin-field-container' ).attr( 'data-current-part' ),
1445 multipart_active = $( '#everest-forms-builder' ).hasClass( 'multi-part-activated' );
1446
1447 if ( current_part && multipart_active ) {
1448 total_rows = $( '#part_' + current_part ).find( '.evf-admin-row' ).length;
1449 }
1450
1451 if ( total_rows < 2 ) {
1452 $.alert({
1453 title: evf_data.i18n_row_locked,
1454 content: evf_data.i18n_row_locked_msg,
1455 icon: 'dashicons dashicons-info',
1456 type: 'blue',
1457 buttons : {
1458 confirm : {
1459 text: evf_data.i18n_close,
1460 btnClass: 'btn-confirm',
1461 keys: ['enter']
1462 }
1463 }
1464 });
1465 } else {
1466 $.confirm({
1467 title: false,
1468 content: evf_data.i18n_delete_row_confirm,
1469 type: 'red',
1470 closeIcon: false,
1471 backgroundDismiss: false,
1472 icon: 'dashicons dashicons-warning',
1473 buttons: {
1474 confirm: {
1475 text: evf_data.i18n_ok,
1476 btnClass: 'btn-confirm',
1477 keys: ['enter'],
1478 action: function () {
1479 EVFPanelBuilder.removeRow( current_row );
1480 $( '.everest-forms-fields-tab' ).find( 'a' ).removeClass( 'active' );
1481 $( '.everest-forms-fields-tab' ).find( 'a' ).first().addClass( 'active' );
1482 $( '.everest-forms-add-fields' ).show();
1483 $( '#everest-forms-row-option-row_' + row_id ).remove();
1484 }
1485 },
1486 cancel: {
1487 text: evf_data.i18n_cancel
1488 }
1489 }
1490 } );
1491 }
1492 });
1493 },
1494 bindAddNewRow: function() {
1495 $( 'body' ).on( 'click', '.evf-add-row span', function() {
1496 $( '#add-fields').trigger( 'click' );
1497 var $this = $( this ),
1498 wrapper = $( '.evf-admin-field-wrapper' ),
1499 row_ids = $( '.evf-admin-row' ).map( function() {
1500 return $( this ).data( 'row-id' );
1501 } ).get(),
1502 max_row_id = Math.max.apply( Math, row_ids ),
1503 row_clone = $( '.evf-admin-row' ).eq(0).clone(),
1504 total_rows = $this.parent().attr( 'data-total-rows' ),
1505 current_part = $this.parents( '.evf-admin-field-container' ).attr( 'data-current-part' );
1506
1507 max_row_id++;
1508 total_rows++;
1509
1510 if ( current_part ) {
1511 wrapper = $( '.evf-admin-field-wrapper' ).find( '#part_' + current_part );
1512 }
1513
1514 // Row clone.
1515 row_clone.find( '.evf-admin-grid' ).html( '' );
1516 row_clone.attr( 'data-row-id', max_row_id );
1517
1518 // Row infos.
1519 $this.parent().attr( 'data-total-rows', total_rows );
1520 $this.parent().attr( 'data-next-row-id', max_row_id );
1521
1522 if( 0 < $( '.everest-forms-row-options' ).length && false === $this.closest( '.evf-add-row' ).hasClass('repeater-row') ) {
1523
1524 row_clone.find( 'div' ).hide();
1525
1526 row_clone.css({
1527 'padding': '40px'
1528 }).append( '<i class="spinner is-active" style="margin:0px auto;"></i>' );
1529
1530 // Row append.
1531 wrapper.append( row_clone );
1532
1533
1534 // Initialize fields UI.
1535 EVFPanelBuilder.bindFields();
1536 EVFPanelBuilder.checkEmptyGrid();
1537
1538 var row_id = row_clone.attr('data-row-id'),
1539 evf_data = window.evf_data;
1540 $.ajax({
1541 url: evf_data.ajax_url,
1542 type: 'POST',
1543 data: {
1544 action: 'everest_forms_new_row',
1545 security: evf_data.evf_add_row_nonce,
1546 form_id: evf_data.form_id,
1547 row_id: row_id
1548 },
1549 success: function( xhr ) {
1550 if( true === xhr.success ) {
1551 if( 'undefined' !== typeof xhr.data.html ) {
1552 $( document ).find( '.everest-forms-row-option-group' ).append( xhr.data.html );
1553 EVFPanelBuilder.conditionalLogicAppendRow( row_id );
1554 // Disable conditional logc by default.
1555 $( '#everest-forms-panel-field-form_rows-connection_row_' + row_id + '-conditional_logic_status' ).prop( 'checked', false );
1556 }
1557 }
1558 }
1559 }).always( function() {
1560 row_clone.css( {'padding':0 } );
1561
1562 row_clone.find( 'div' ).show();
1563
1564 row_clone.find( '.evf-toggle-row-content' ).css( 'display', 'none' );
1565
1566 row_clone.find( 'i' ).remove();
1567
1568 // Trigger event after row add.
1569 $this.trigger('everest-forms-after-add-row', row_clone);
1570 } );
1571 } else {
1572 // Row append.
1573 wrapper.append( row_clone );
1574 // Initialize fields UI.
1575 EVFPanelBuilder.bindFields();
1576 EVFPanelBuilder.checkEmptyGrid();
1577 // Trigger event after row add.
1578 $this.trigger('everest-forms-after-add-row', row_clone);
1579 }
1580 });
1581
1582 },
1583 bindCloneField: function () {
1584 $( 'body' ).on( 'click', '.everest-forms-preview .everest-forms-field .everest-forms-field-duplicate', function() {
1585 var $field = $( this ).closest( '.everest-forms-field' );
1586
1587 if ( $field.hasClass( 'no-duplicate' ) ) {
1588 $.alert({
1589 title: evf_data.i18n_field_locked,
1590 content: evf_data.i18n_field_locked_msg,
1591 icon: 'dashicons dashicons-info',
1592 type: 'blue',
1593 buttons : {
1594 confirm : {
1595 text: evf_data.i18n_close,
1596 btnClass: 'btn-confirm',
1597 keys: ['enter']
1598 }
1599 }
1600 });
1601 } else {
1602 $.confirm({
1603 title: false,
1604 content: evf_data.i18n_duplicate_field_confirm,
1605 type: 'orange',
1606 closeIcon: false,
1607 backgroundDismiss: false,
1608 icon: 'dashicons dashicons-warning',
1609 buttons: {
1610 confirm: {
1611 text: evf_data.i18n_ok,
1612 btnClass: 'btn-confirm',
1613 keys: ['enter'],
1614 action: function () {
1615 EVFPanelBuilder.cloneFieldAction( $field );
1616 }
1617 },
1618 cancel: {
1619 text: evf_data.i18n_cancel
1620 }
1621 }
1622 } );
1623 }
1624 } );
1625
1626 $( 'body' ).on( 'click', '.evf-admin-row .evf-duplicate-row', function() {
1627 var $row = $( this ).closest( '.evf-admin-row' );
1628 if( $row.find( '.everest-forms-field' ).hasClass( 'no-duplicate' ) ) {
1629 $.alert({
1630 title: evf_data.i18n_field_locked,
1631 content: evf_data.i18n_row_locked_msg,
1632 icon: 'dashicons dashicons-info',
1633 type: 'blue',
1634 buttons : {
1635 confirm : {
1636 text: evf_data.i18n_close,
1637 btnClass: 'btn-confirm',
1638 keys: ['enter']
1639 }
1640 }
1641 });
1642 } else {
1643 $.confirm({
1644 title: false,
1645 content: evf_data.i18n_duplicate_row_confirm,
1646 type: 'orange',
1647 closeIcon: false,
1648 backgroundDismiss: false,
1649 icon: 'dashicons dashicons-warning',
1650 buttons: {
1651 confirm: {
1652 text: evf_data.i18n_ok,
1653 btnClass: 'btn-confirm',
1654 keys: ['enter'],
1655 action: function () {
1656 EVFPanelBuilder.cloneRowAction( $row );
1657 }
1658 },
1659 cancel: {
1660 text: evf_data.i18n_cancel
1661 }
1662 }
1663 } );
1664 }
1665 } );
1666 },
1667 cloneRowAction: function ( row ) {
1668 row_ids = $( '.evf-admin-row' ).map( function() {
1669 return $( this ).data( 'row-id' );
1670 } ).get(),
1671 max_row_id = Math.max.apply( Math, row_ids ),
1672 row_clone = row.clone(),
1673 total_rows = $( '.evf-add-row' ).attr( 'data-total-rows' );
1674 max_row_id++;
1675 total_rows++;
1676
1677 // New row ID.
1678 row_clone.attr( 'data-row-id', max_row_id );
1679 // Initialize fields UI.
1680 $( '.evf-add-row' ).attr( 'data-total-rows', total_rows );
1681 $( '.evf-add-row' ).attr( 'data-next-row-id', max_row_id );
1682
1683 var data = {
1684 action : 'everest_forms_get_next_id',
1685 security: evf_data.evf_get_next_id,
1686 form_id : evf_data.form_id,
1687 fields : row_clone.find( '.everest-forms-field' ).length
1688 };
1689
1690 $.ajax({
1691 url: evf_data.ajax_url,
1692 data: data,
1693 type: 'POST',
1694 beforeSend: function() {
1695 $( document.body ).trigger( 'init_field_options_toggle' );
1696 },
1697 success: function ( response ) {
1698 if ( typeof response.success === 'boolean' && response.success === true ) {
1699 // Row append.
1700 row.after( row_clone );
1701 // Duplicating Fields
1702 $.each( response.data, function( index, data ) {
1703 var field_id = data.field_id;
1704 var field_key = data.field_key;
1705 $('#everest-forms-field-id').val(field_id);
1706 field = row_clone.find( '.everest-forms-field' ).eq( index );
1707 var element_field_id = field.attr('data-field-id');
1708 EVFPanelBuilder.render_node( field, element_field_id, field_key );
1709 field.remove();
1710 $( document.body ).trigger( 'init_field_options_toggle' );
1711 });
1712 // Binding fields.
1713 EVFPanelBuilder.bindFields();
1714 }
1715 }
1716 });
1717 },
1718 cloneFieldAction: function ( field ) {
1719 var element_field_id = field.attr('data-field-id');
1720 var form_id = evf_data.form_id;
1721 var data = {
1722 action: 'everest_forms_get_next_id',
1723 security: evf_data.evf_get_next_id,
1724 form_id: form_id
1725 };
1726 $.ajax({
1727 url: evf_data.ajax_url,
1728 data: data,
1729 type: 'POST',
1730 beforeSend: function() {
1731 $( document.body ).trigger( 'init_field_options_toggle' );
1732 },
1733 success: function ( response ) {
1734 if ( typeof response.success === 'boolean' && response.success === true ) {
1735 var field_id = response.data.field_id;
1736 var field_key = response.data.field_key;
1737 $('#everest-forms-field-id').val(field_id);
1738 EVFPanelBuilder.render_node(field, element_field_id, field_key);
1739 $( document.body ).trigger( 'init_field_options_toggle' );
1740 }
1741 }
1742 });
1743 },
1744 render_node: function ( field, old_key, new_key ) {
1745 var option = $('.everest-forms-field-options #everest-forms-field-option-' + old_key );
1746 var old_field_label = $('#everest-forms-field-option-' + old_key + '-label' ).val();
1747 var old_field_meta_key = $( '#everest-forms-field-option-' + old_key + '-meta-key' ).length ? $( '#everest-forms-field-option-' + old_key + '-meta-key' ).val() : '';
1748 var field_type = field.attr('data-field-type'),
1749 newOptionHtml = option.html(),
1750 new_field_label = old_field_label + ' ' + evf_data.i18n_copy,
1751 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 ) : '',
1752 newFieldCloned = field.clone();
1753 var regex = new RegExp(old_key, 'g');
1754 newOptionHtml = newOptionHtml.replace(regex, new_key);
1755 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 + '" />');
1756 newOption.append(newOptionHtml);
1757 $.each(option.find(':input'), function () {
1758 var type = $(this).attr('type');
1759 var name = $( this ).attr( 'name' ) ? $( this ).attr( 'name' ) : '';
1760 var new_name = name.replace(regex, new_key);
1761 var value = '';
1762 if ( type === 'text' || type === 'hidden' ) {
1763 value = $(this).val();
1764 newOption.find('input[name="' + new_name + '"]').val(value);
1765 newOption.find('input[value="' + old_key + '"]').val(new_key);
1766 } else if ( type === 'checkbox' || type === 'radio' ) {
1767 if ( $(this).is(':checked') ) {
1768 newOption.find('input[name="' + new_name + '"]').prop('checked', true).attr('checked', 'checked');
1769 } else {
1770 newOption.find('[name="' + new_name + '"]').prop('checked', false).attr('checked', false);
1771 }
1772 } else if ( $(this).is('select') ) {
1773 if ( $(this).find('option:selected').length ) {
1774 var option_value = $(this).find('option:selected').val();
1775 newOption.find('[name="' + new_name + '"]').find('[value="' + option_value + '"]').prop('selected', true);
1776 }
1777 } else {
1778 if ( $(this).val() !== '' ) {
1779 newOption.find('[name="' + new_name + '"]').val($(this).val());
1780 }
1781 }
1782 });
1783
1784 $('.everest-forms-field-options').append(newOption);
1785 $('#everest-forms-field-option-' + new_key + '-label').val(new_field_label);
1786 $('#everest-forms-field-option-' + new_key + '-meta-key').val(new_meta_key);
1787
1788 // Field Clone
1789 newFieldCloned.attr('class', field.attr('class'));
1790 newFieldCloned.attr('id', 'everest-forms-field-' + new_key);
1791 newFieldCloned.attr('data-field-id', new_key);
1792 newFieldCloned.attr('data-field-type', field_type);
1793 newFieldCloned.find('.label-title .text').text(new_field_label);
1794 field.closest( '.evf-admin-grid' ).find( '[data-field-id="' + old_key + '"]' ).after( newFieldCloned );
1795 $(document).trigger('everest-form-cloned', [ new_key, field_type ] );
1796 EVFPanelBuilder.switchToFieldOptionPanel(new_key);//switch to cloned field options
1797
1798 // Trigger an event indicating completion of render_node action for cloning.
1799 $( document.body ).trigger( 'evf_render_node_complete', [ field_type, new_key, newFieldCloned, newOption ] );
1800 },
1801 bindFieldDelete: function () {
1802 $( 'body' ).on('click', '.everest-forms-preview .everest-forms-field .everest-forms-field-delete', function () {
1803 var $field = $( this ).closest( '.everest-forms-field' );
1804 var field_id = $field.attr('data-field-id');
1805 var option_field = $( '#everest-forms-field-option-' + field_id );
1806 var grid = $( this ).closest( '.evf-admin-grid' );
1807
1808 if ( $field.hasClass( 'no-delete' ) ) {
1809 $.alert({
1810 title: evf_data.i18n_field_locked,
1811 content: evf_data.i18n_field_locked_msg,
1812 icon: 'dashicons dashicons-info',
1813 type: 'blue',
1814 buttons : {
1815 confirm : {
1816 text: evf_data.i18n_close,
1817 btnClass: 'btn-confirm',
1818 keys: ['enter']
1819 }
1820 }
1821 });
1822 } else {
1823 $.confirm({
1824 title: false,
1825 content: evf_data.i18n_delete_field_confirm,
1826 type: 'red',
1827 closeIcon: false,
1828 backgroundDismiss: false,
1829 icon: 'dashicons dashicons-warning',
1830 buttons: {
1831 confirm: {
1832 text: evf_data.i18n_ok,
1833 btnClass: 'btn-confirm',
1834 keys: ['enter'],
1835 action: function () {
1836 $( '.evf-panel-fields-button' ).trigger( 'click' );
1837 $field.fadeOut( 'slow', function () {
1838 var removed_el_id = $field.attr('data-field-id');
1839 $( document.body ).trigger( 'evf_before_field_deleted', [ removed_el_id] );
1840 $field.remove();
1841 option_field.remove();
1842 EVFPanelBuilder.checkEmptyGrid();
1843 $( '.everest-forms-fields-tab' ).find( 'a' ).removeClass( 'active' );
1844 $( '.everest-forms-fields-tab' ).find( 'a' ).first().addClass( 'active' );
1845 $( '.everest-forms-add-fields' ).show();
1846 EVFPanelBuilder.conditionalLogicRemoveField(removed_el_id);
1847 EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(removed_el_id);
1848 EVFPanelBuilder.paymentFieldRemoveFromQuantity(removed_el_id);
1849 });
1850 }
1851 },
1852 cancel: {
1853 text: evf_data.i18n_cancel
1854 }
1855 }
1856 } );
1857 }
1858 });
1859 },
1860 bindFieldDeleteWithKeyEvent: function () {
1861 $( 'body' ).on( 'keyup', function( e ) {
1862 var $field = $( '.everest-forms-preview .everest-forms-field.active' );
1863 if( 46 === e.which && true === $field.hasClass( 'active' ) && false === $field.hasClass( 'evf-delete-event-active' ) ) {
1864 if( false == $( '.evf-admin-row' ).hasClass( 'evf-hover' ) ) {
1865 return;
1866 }
1867 $field.addClass( 'evf-delete-event-active' );
1868 var field_id = $field.attr( 'data-field-id' );
1869 var option_field = $( '#everest-forms-field-option-' + field_id );
1870 if ( $field.hasClass( 'no-delete' ) ) {
1871 $.alert({
1872 title: evf_data.i18n_field_locked,
1873 content: evf_data.i18n_field_locked_msg,
1874 icon: 'dashicons dashicons-info',
1875 type: 'blue',
1876 buttons : {
1877 confirm : {
1878 text: evf_data.i18n_close,
1879 btnClass: 'btn-confirm',
1880 keys: ['enter'],
1881 action: function () {
1882 $field.removeClass( 'evf-delete-event-active' );
1883 }
1884 }
1885 }
1886 });
1887 } else {
1888 $.confirm({
1889 title: false,
1890 content: evf_data.i18n_delete_field_confirm,
1891 type: 'red',
1892 closeIcon: false,
1893 backgroundDismiss: false,
1894 icon: 'dashicons dashicons-warning',
1895 buttons: {
1896 confirm: {
1897 text: evf_data.i18n_ok,
1898 btnClass: 'btn-confirm',
1899 keys: ['enter'],
1900 action: function () {
1901 $( '.evf-panel-fields-button' ).trigger( 'click' );
1902 $field.fadeOut( 'slow', function () {
1903 var removed_el_id = $field.attr('data-field-id');
1904 $( document.body ).trigger( 'evf_before_field_deleted', [ removed_el_id] );
1905 $field.remove();
1906 option_field.remove();
1907 EVFPanelBuilder.checkEmptyGrid();
1908 $( '.everest-forms-fields-tab' ).find( 'a' ).removeClass( 'active' );
1909 $( '.everest-forms-fields-tab' ).find( 'a' ).first().addClass( 'active' );
1910 $( '.everest-forms-add-fields' ).show();
1911 EVFPanelBuilder.conditionalLogicRemoveField(removed_el_id);
1912 EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(removed_el_id);
1913 EVFPanelBuilder.paymentFieldRemoveFromQuantity(removed_el_id);
1914 });
1915 $field.removeClass( 'evf-delete-event-active' );
1916 }
1917 },
1918 cancel: {
1919 text: evf_data.i18n_cancel,
1920 action: function () {
1921 $field.removeClass( 'evf-delete-event-active' );
1922 }
1923 }
1924 }
1925 } );
1926 }
1927 }
1928 });
1929 },
1930 bindSaveOption: function () {
1931 $( 'body' ).on( 'click', '.everest-forms-save-button', function () {
1932 var $this = $( this );
1933 var $form = $( 'form#everest-forms-builder-form' );
1934 var structure = EVFPanelBuilder.getStructure();
1935 var form_data = $form.serializeArray();
1936 var form_title = $( '#evf-edit-form-name' ).val().trim();
1937
1938 // Save form args.
1939 $(document).trigger('everest_forms_save_args', [form_data]);
1940
1941 if ( '' === form_title ) {
1942 $.alert({
1943 title: evf_data.i18n_field_title_empty,
1944 content: evf_data.i18n_field_title_payload,
1945 icon: 'dashicons dashicons-warning',
1946 type: 'red',
1947 buttons: {
1948 ok: {
1949 text: evf_data.i18n_ok,
1950 btnClass: 'btn-confirm',
1951 keys: [ 'enter' ]
1952 }
1953 }
1954 });
1955 return;
1956 }
1957
1958 // Trigger a handler to let addon manipulate the form data if needed.
1959 if ( $form.triggerHandler( 'everest_forms_process_ajax_data', [ $this, form_data ] ) ) {
1960 form_data = $form.triggerHandler( 'everest_forms_process_ajax_data', [ $this, form_data ] );
1961 }
1962
1963 $( '.everest-forms-panel-content-wrap' ).block({
1964 message: null,
1965 overlayCSS: {
1966 background: '#fff',
1967 opacity: 0.6
1968 }
1969 });
1970
1971 /* DB unwanted data erase start */
1972 var rfields_ids = [];
1973 $( '.everest-forms-field[data-field-id]' ).each( function() {
1974 rfields_ids.push( $( this ).attr( 'data-field-id' ) );
1975 });
1976
1977 var form_data_length = form_data.length;
1978 while ( form_data_length-- ) {
1979 if ( form_data[ form_data_length ].name.startsWith( 'form_fields' ) ) {
1980 var idflag = false;
1981 rfields_ids.forEach( function( element ) {
1982 if ( form_data[ form_data_length ].name.startsWith( 'form_fields[' + element + ']' ) ) {
1983 idflag = true;
1984 }
1985 });
1986 if ( form_data_length > -1 && idflag === false ) {
1987 form_data.splice( form_data_length, 1 );
1988 }
1989 }
1990 }
1991 /* DB fix end */
1992
1993 var new_form_data = form_data.concat( structure );
1994 var data = {
1995 action: 'everest_forms_save_form',
1996 security: evf_data.evf_save_form,
1997 form_data: JSON.stringify( new_form_data )
1998 };
1999 $.ajax({
2000 url: evf_data.ajax_url,
2001 data: data,
2002 type: 'POST',
2003 beforeSend: function () {
2004 $this.addClass( 'processing' );
2005 $this.find( '.loading-dot' ).remove();
2006 $this.append( '<span class="loading-dot"></span>' );
2007 },
2008 success: function ( response ) {
2009 $this.removeClass( 'processing' );
2010 $this.find( '.loading-dot' ).remove();
2011
2012 //Response data of ajax.
2013 $(document).trigger('everest_forms_save_data',response.data);
2014
2015 if ( ! response.success ) {
2016 $.alert({
2017 title: response.data.errorTitle,
2018 content: response.data.errorMessage,
2019 icon: 'dashicons dashicons-warning',
2020 type: 'red',
2021 buttons: {
2022 ok: {
2023 text: evf_data.i18n_ok,
2024 btnClass: 'btn-confirm',
2025 keys: [ 'enter' ]
2026 }
2027 }
2028 });
2029 }
2030
2031 $( '.everest-forms-panel-content-wrap' ).unblock();
2032 }
2033 });
2034 });
2035 },
2036 bindSaveOptionWithKeyEvent:function() {
2037 $('body').on("keydown", function (e) {
2038 if (e.ctrlKey || e.metaKey) {
2039 if (
2040 "s" ===
2041 String.fromCharCode(e.which).toLowerCase() || 83 === e.which
2042 ) {
2043 e.preventDefault();
2044 $('.everest-forms-save-button').trigger('click');
2045 }
2046 }
2047 });
2048 },
2049 bindOpenShortcutKeysModalWithKeyEvent: function() {
2050 $('body').on("keydown", function (e) {
2051 if ( e.ctrlKey || e.metaKey ) {
2052 if( 'h' === String.fromCharCode(e.which).toLowerCase() || 72 === e.which ) {
2053 e.preventDefault();
2054 var shortcut_keys_html = '';
2055
2056 $.each(evf_data.i18n_shortcut_keys, function (key, value) {
2057 shortcut_keys_html += `
2058 <ul class="evf-shortcut-keyword">
2059 <li>
2060 <div class="evf-shortcut-title">${value}</div>
2061 <div class="evf-key">
2062 <span>${key.split('+')[0]}</span>
2063 <span>${key.split('+')[1]}</span>
2064 </div>
2065 </li>
2066 </ul>
2067 `;
2068 });
2069
2070 $.alert({
2071 title: evf_data.i18n_shortcut_key_title,
2072 content: shortcut_keys_html,
2073 icon: 'dashicons dashicons-info',
2074 type: 'blue',
2075 boxWidth: '550px',
2076 buttons : {
2077 confirm : {
2078 text: evf_data.i18n_close,
2079 btnClass: 'btn-confirm',
2080 keys: ['enter']
2081 }
2082 },
2083 onContentReady: function(){
2084 $('body').on("keydown", function (e) {
2085 if( e.ctrlKey || e.metaKey && 'h' === String.fromCharCode(e.which).toLowerCase() || 72 === e.which ) {
2086 $( '.btn-confirm' ).trigger( 'click' );
2087 }
2088 });
2089 }
2090 });
2091 }
2092 }
2093 });
2094 },
2095 getStructure: function () {
2096 var wrapper = $( '.evf-admin-field-wrapper' );
2097 var structure = [];
2098
2099 $.each( wrapper.find( '.evf-admin-row' ), function() {
2100 var $row = $( this ),
2101 row_id = $row.attr( 'data-row-id' );
2102
2103 $.each( $row.find( '.evf-admin-grid' ), function() {
2104 var $grid = $( this ),
2105 grid_id = $grid.attr( 'data-grid-id' );
2106
2107 var array_index = 0;
2108 $.each( $grid.find( '.everest-forms-field' ), function() {
2109 var structure_object = { name: '', value: '' };
2110 var field_id = $( this ).attr( 'data-field-id' );
2111 structure_object.name = 'structure[row_' + row_id + '][grid_' + grid_id + '][' + array_index + ']';
2112 array_index++;
2113 structure_object.value = field_id;
2114 structure.push( structure_object );
2115 });
2116 if ( $grid.find( '.everest-forms-field' ).length < 1 ) {
2117 structure.push({ name: 'structure[row_' + row_id + '][grid_' + grid_id + ']', value: '' });
2118 }
2119 });
2120 });
2121
2122 return structure;
2123 },
2124 getFieldArray: function ( grid ) {
2125
2126 var fields = [];
2127 $.each(grid.find('.everest-forms-field'), function () {
2128
2129 var field_id = $(this).attr('data-field-id');
2130 fields.push(field_id);
2131 });
2132 return fields;
2133 },
2134 checkEmptyGrid: function( $force ) {
2135 $.each( $( '.evf-admin-grid' ), function () {
2136 var $fields = $( this ).find( '.everest-forms-field, .evf-registered-item:not(.ui-draggable-dragging)' );
2137 if ( $fields.not( '.ui-sortable-helper' ).length < 1 ) {
2138 $( this ).addClass( 'evf-empty-grid' );
2139 } else {
2140 $( this ).removeClass( 'evf-empty-grid' );
2141 }
2142 } );
2143 EVFPanelBuilder.choicesInit();
2144 },
2145 bindDefaultTabs: function () {
2146 $( document ).on( 'click', '.evf-nav-tab-wrapper a', function ( e ) {
2147 e.preventDefault();
2148 EVFPanelBuilder.switchTab( $( this ).data( 'panel' ) );
2149 });
2150 },
2151 switchTab: function( panel ) {
2152 var $panel = $( '#everest-forms-panel-' + panel ),
2153 $panelBtn = $( '.evf-panel-' + panel + '-button' );
2154
2155 $( '.evf-nav-tab-wrapper' ).find( 'a' ).removeClass( 'nav-tab-active' );
2156 $panelBtn.addClass( 'nav-tab-active' );
2157 $panel.closest( '.evf-tab-content' ).find( '.everest-forms-panel' ).removeClass( 'active' );
2158 $panel.addClass( 'active' );
2159
2160 if ( 'integrations' === panel || 'payments' === panel ) {
2161 if ( ! $panel.find( '.everest-forms-panel-sidebar a' ).hasClass( 'active' ) ) {
2162 $panel.find( '.everest-forms-panel-sidebar a' ).first().addClass( 'active' );
2163 }
2164
2165 if ( ! $( '.everest-forms-panel-content' ).find( '.evf-panel-content-section' ).hasClass( 'active' ) ) {
2166 $( '.everest-forms-panel-content' ).find( '.evf-panel-content-section' ).first().addClass( 'active' );
2167 }
2168 }
2169
2170 history.replaceState({}, null, EVFPanelBuilder.updateQueryString( 'tab', panel ) );
2171 EVFPanelBuilder.switchPanel(panel);
2172 },
2173 updateQueryString: function ( key, value, url ) {
2174 if ( ! url ) url = window.location.href;
2175 var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
2176 hash;
2177
2178 if ( re.test( url ) ) {
2179 if ( typeof value !== 'undefined' && value !== null )
2180 return url.replace(re, '$1' + key + "=" + value + '$2$3');
2181 else {
2182 hash = url.split('#');
2183 url = hash[ 0 ].replace(re, '$1$3').replace(/(&|\?)$/, '');
2184 if ( typeof hash[ 1 ] !== 'undefined' && hash[ 1 ] !== null )
2185 url += '#' + hash[ 1 ];
2186 return url;
2187 }
2188 } else {
2189 if ( typeof value !== 'undefined' && value !== null ) {
2190 var separator = url.indexOf('?') !== -1 ? '&' : '?';
2191 hash = url.split('#');
2192 url = hash[ 0 ] + separator + key + '=' + value;
2193 if ( typeof hash[ 1 ] !== 'undefined' && hash[ 1 ] !== null )
2194 url += '#' + hash[ 1 ];
2195 return url;
2196 } else {
2197 return url;
2198 }
2199 }
2200 },
2201 switchPanel: function ( panel ) {
2202 if ( panel === 'field-options' ) {
2203 EVFPanelBuilder.switchToFieldOptionPanel();
2204 }
2205 },
2206 switchToFieldOptionPanel: function ( field_id ) {
2207 $('.everest-forms-field-options').find('.no-fields').hide();
2208 $('.evf-admin-field-wrapper .everest-forms-field').removeClass('active');
2209 $('#everest-forms-panel-fields').addClass('active');
2210 $('.everest-forms-fields-tab').find('a').removeClass('active');
2211 $('.everest-forms-fields-tab').find('a').last().addClass('active');
2212 $('.everest-forms-add-fields').hide();
2213 $('.everest-forms-field-options').show();
2214 $('.everest-forms-field-options').find('.everest-forms-field-option').hide();
2215 $('.evf-tab-lists').find('li a').removeClass('active');
2216 $('.evf-tab-lists').find('li.evf-panel-field-options-button a').addClass('active');
2217
2218 $( document.body ).trigger( 'evf-init-switch-field-options' );
2219
2220 if ( typeof field_id !== 'undefined' ) {
2221 $('#everest-forms-field-option-' + field_id).show();
2222 $('#everest-forms-field-' + field_id).addClass('active');
2223 } else {
2224 if ( $('.evf-admin-field-wrapper .everest-forms-field').length > 0 ) {
2225 $('.evf-admin-field-wrapper .everest-forms-field').eq(0).addClass('active');
2226 $('#everest-forms-field-option-' + $('.evf-admin-field-wrapper .everest-forms-field').eq(0).attr('data-field-id')).show();
2227 } else {
2228 $('.everest-forms-field-options').find('.no-fields').show();
2229 }
2230 }
2231 },
2232 bindFields: function () {
2233 $( '.evf-admin-field-wrapper' ).sortable({
2234 items: '.evf-admin-row',
2235 axis: 'y',
2236 cursor: 'move',
2237 opacity: 0.65,
2238 scrollSensitivity: 40,
2239 forcePlaceholderSize: true,
2240 placeholder: 'evf-sortable-placeholder',
2241 containment: '.everest-forms-panel-content',
2242 start: function( event, ui ) {
2243 ui.item.css({
2244 'backgroundColor': '#f7fafc',
2245 'border': '1px dashed #5d96ee'
2246 });
2247 },
2248 stop: function( event, ui ) {
2249 ui.item.removeAttr( 'style' );
2250 }
2251 }).disableSelection();
2252
2253 $( '.evf-admin-grid' ).sortable({
2254 items: '> .everest-forms-field[data-field-type!="repeater-fields"]',
2255 delay : 100,
2256 opacity: 0.65,
2257 cursor: 'move',
2258 scrollSensitivity: 40,
2259 forcePlaceholderSize: true,
2260 connectWith: '.evf-admin-grid',
2261 appendTo: document.body,
2262 containment: '.everest-forms-field-wrap',
2263
2264 out: function( event ) {
2265 $( '.evf-admin-grid' ).removeClass( 'evf-hover' );
2266 $( event.target ).removeClass( 'evf-item-hover' );
2267 $( event.target ).closest( '.evf-admin-row' ).removeClass( 'evf-hover' );
2268 EVFPanelBuilder.checkEmptyGrid();
2269 },
2270 over: function( event, ui ) {
2271 $( '.evf-admin-grid' ).addClass( 'evf-hover' );
2272 $( event.target ).addClass( 'evf-item-hover' );
2273 $( event.target ).closest( '.evf-admin-row' ).addClass( 'evf-hover' );
2274 EVFPanelBuilder.checkEmptyGrid();
2275 },
2276 receive: function( event, ui ) {
2277 if ( ui.sender.is( 'button' ) ) {
2278 EVFPanelBuilder.fieldDrop( ui.helper );
2279 }
2280 },
2281 update: function(event, ui) {
2282 $(document).trigger('evf_sort_update_complete',{event: event,ui: ui});
2283 },
2284 stop: function( event, ui ) {
2285 ui.item.removeAttr( 'style' );
2286 EVFPanelBuilder.checkEmptyGrid();
2287 }
2288 }).disableSelection();
2289
2290 $( '.evf-registered-buttons button.evf-registered-item' ).draggable({
2291 delay: 200,
2292 cancel: false,
2293 scroll: false,
2294 revert: 'invalid',
2295 scrollSensitivity: 40,
2296 forcePlaceholderSize: true,
2297 start: function() {
2298 $( this ).addClass( 'field-dragged' );
2299 },
2300 helper: function() {
2301 return $( this ).clone().insertAfter( $( this ).closest( '.everest-forms-tab-content' ).siblings( '.everest-forms-fields-tab' ) );
2302 },
2303 stop: function() {
2304 $( this ).removeClass( 'field-dragged' );
2305 },
2306 opacity: 0.75,
2307 containment: '#everest-forms-builder',
2308 connectToSortable: '.evf-admin-grid'
2309 }).disableSelection();
2310
2311 // Repeatable grid connect to sortable setter.
2312 $( ".evf-registered-item.evf-repeater-field" ).draggable( "option", "connectToSortable", ".evf-repeatable-grid" );
2313
2314 // Adapt hover behaviour on mouse event.
2315 $( '.evf-admin-row' ).on( 'mouseenter mouseleave', function( event ) {
2316 if ( 1 > event.buttons ) {
2317 if ( 'mouseenter' === event.type ) {
2318 $( this ).addClass( 'evf-hover' );
2319 } else {
2320 $( '.evf-admin-row' ).removeClass( 'evf-hover' );
2321 }
2322 }
2323 } );
2324
2325 // Refresh the position of placeholders on drag scroll.
2326 $( '.everest-forms-panel-content' ).on( 'scroll', function() {
2327 $( '.evf-admin-grid' ).sortable( 'refreshPositions' );
2328 $( '.evf-admin-field-wrapper' ).sortable( 'refreshPositions' );
2329 } );
2330 },
2331
2332 /**
2333 * Toggle fields tabs (Add Fields, Field Options).
2334 */
2335 fieldTabChoice: function( id ) {
2336 $( '.everest-forms-tab-content' ).scrollTop(0);
2337 $( '.everest-forms-fields-tab a' ).removeClass( 'active' );
2338 $( '.everest-forms-field, .everest-forms-title-desc' ).removeClass( 'active' );
2339
2340 $( '#' + id ).addClass( 'active' );
2341
2342 if ( 'add-fields' === id ) {
2343 $( '.everest-forms-add-fields' ).show();
2344 $( '.everest-forms-field-options' ).hide();
2345 } else {
2346 if ( 'field-options' === id ) {
2347 id = $( '.everest-forms-field' ).first().data( 'field-id' );
2348 $( '.everest-forms-field-options' ).show();
2349 $( '.everest-forms-field' ).first().addClass( 'active' );
2350 } else {
2351 $( '#everest-forms-field-' + id ).addClass( 'active' );
2352 }
2353 $( '.everest-forms-field-option' ).hide();
2354 $( '#everest-forms-field-option-' + id ).show();
2355 $( '.everest-forms-add-fields' ).hide();
2356 }
2357 },
2358 bindFormPreview: function () {},
2359 bindFormPreviewWithKeyEvent:function (){
2360 $( 'body' ).on( 'keydown', function( e ) {
2361 if (e.ctrlKey || e.metaKey) {
2362 if ( (
2363 "p" ===
2364 String.fromCharCode(e.which).toLowerCase() || 80 === e.which )
2365 ) {
2366 e.preventDefault();
2367 window.open( evf_data.preview_url );
2368 }
2369 }
2370
2371 });
2372 },
2373 bindFormEntriesWithKeyEvent:function (){
2374 $( 'body' ).on( 'keydown', function( e ) {
2375 if (e.ctrlKey || e.metaKey) {
2376 if ( (
2377 "e" ===
2378 String.fromCharCode(e.which).toLowerCase() || 69 === e.which )
2379 ) {
2380 e.preventDefault();
2381 window.open( evf_data.entries_url );
2382 }
2383 }
2384
2385 });
2386 },
2387 bindGridSwitcher: function () {
2388 $('body').on('click', '.evf-show-grid', function (e) {
2389 e.stopPropagation();
2390 EVFPanelBuilder.checkEmptyGrid();
2391 $(this).closest('.evf-toggle-row').find('.evf-toggle-row-content').stop(true).slideToggle(200);
2392 });
2393 $(document).on( 'click', function () {
2394 EVFPanelBuilder.checkEmptyGrid();
2395 $('.evf-show-grid').closest('.evf-toggle-row').find('.evf-toggle-row-content').stop(true).slideUp(200);
2396 });
2397 var max_number_of_grid = 4;
2398 $('body').on('click', '.evf-grid-selector', function () {
2399 var $this_single_row = $(this).closest('.evf-admin-row');
2400 if ( $(this).hasClass('active') ) {
2401 return;
2402 }
2403 var grid_id = parseInt( $( this ).attr( 'data-evf-grid' ), 10 );
2404 if ( grid_id > max_number_of_grid ) {
2405 return;
2406 }
2407
2408 var grid_node = $('<div class="evf-admin-grid evf-grid-' + grid_id + ' ui-sortable evf-empty-grid" />');
2409 var grids = $('<div/>');
2410
2411 $.each($this_single_row.find('.evf-admin-grid'), function () {
2412 $(this).children('*').each(function () {
2413 grids.append($(this).clone()); // "this" is the current element in the loop
2414 });
2415 });
2416 $this_single_row.find('.evf-admin-grid').remove();
2417 $this_single_row.find('.evf-clear ').remove();
2418 $this_single_row.append('<div class="clear evf-clear"></div>');
2419
2420 for ( var $grid_number = 1; $grid_number <= grid_id; $grid_number++ ) {
2421
2422 grid_node.attr('data-grid-id', $grid_number);
2423 $this_single_row.append(grid_node.clone());
2424
2425 }
2426 $this_single_row.append('<div class="clear evf-clear"></div>');
2427 $this_single_row.find('.evf-admin-grid').eq(0).append(grids.html());
2428 $this_single_row.find('.evf-grid-selector').removeClass('active');
2429 $(this).addClass('active');
2430 EVFPanelBuilder.bindFields();
2431 });
2432 },
2433 fieldDrop: function ( field ) {
2434 var field_type = field.attr( 'data-field-type' );
2435 var invalid_fields = ["payment-total"];
2436 if (
2437 invalid_fields.includes(
2438 field_type
2439 ) && field.closest('.evf-admin-row').hasClass('evf-repeater-fields')
2440 ) {
2441 $.confirm({
2442 title: false,
2443 content:'This field cannot be added to Repeater Fields',
2444 type: 'red',
2445 closeIcon: false,
2446 backgroundDismiss: false,
2447 icon: 'dashicons dashicons-warning',
2448 buttons: {
2449 cancel: {
2450 text: evf_data.i18n_close,
2451 btnClass: 'btn-default',
2452 },
2453 }
2454 } );
2455
2456 field.remove();
2457 return false;
2458 }
2459
2460 field.css({
2461 'left': '0',
2462 'width': '100%'
2463 }).append( '<i class="spinner is-active"></i>' );
2464
2465 $.ajax({
2466 url: evf_data.ajax_url,
2467 type: 'POST',
2468 data: {
2469 action: 'everest_forms_new_field_' + field_type,
2470 security: evf_data.evf_field_drop_nonce,
2471 field_type: field_type,
2472 form_id: evf_data.form_id
2473 },
2474 beforeSend: function() {
2475 $( document.body ).trigger( 'init_field_options_toggle' );
2476 },
2477 success: function( response ) {
2478 var field_preview = response.data.preview,
2479 field_options = response.data.options,
2480 form_field_id = response.data.form_field_id,
2481 field_type = response.data.field.type,
2482 dragged_el_id = $( field_preview ).attr( 'id' ),
2483 dragged_field_id = $( field_preview ).attr( 'data-field-id' );
2484
2485 $( '#everest-forms-field-id' ).val( form_field_id );
2486 $( '.everest-forms-field-options' ).find( '.no-fields' ).hide();
2487 $( '.everest-forms-field-options' ).append( field_options );
2488 $( '.everest-forms-field-option-row-icon_color input.colorpicker' ).wpColorPicker({
2489 change: function( event ) {
2490 var $this = $( this ),
2491 value = $this.val(),
2492 field_id = $this.closest( '.everest-forms-field-option-row' ).data( 'field-id' );
2493
2494 $( '#everest-forms-field-' + field_id + ' .rating-icon svg' ).css( 'fill', value );
2495 }
2496 });
2497
2498 field.after( field_preview );
2499
2500 if ( null !== $( '#everest-forms-panel-field-settings-enable_survey') && $( '#everest-forms-panel-field-settings-enable_survey' ).prop( 'checked' ) ) {
2501 $( '#everest-forms-field-option-' + dragged_field_id + '-survey_status' ).prop( 'checked', true );
2502 }
2503
2504 if ( null !== $( '#everest-forms-panel-field-settings-enable_quiz' ) && $( '#everest-forms-panel-field-settings-enable_quiz' ).prop( 'checked' ) ) {
2505 $( '#everest-forms-field-option-' + dragged_field_id + '-quiz_status' ).prop( 'checked', true );
2506 $( '#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' );
2507 }
2508
2509 field.remove();
2510
2511 // Triggers.
2512 $( document.body ).trigger( 'init_tooltips' );
2513 $( document.body ).trigger( 'init_field_options_toggle' );
2514 $( document.body ).trigger( 'evf_after_field_append', [dragged_el_id] );
2515
2516 // Conditional logic append rules.
2517 EVFPanelBuilder.conditionalLogicAppendField( dragged_el_id );
2518 EVFPanelBuilder.conditionalLogicAppendFieldIntegration( dragged_el_id );
2519 EVFPanelBuilder.paymentFieldAppendToQuantity( dragged_el_id );
2520 EVFPanelBuilder.paymentFieldAppendToDropdown( dragged_field_id, field_type );
2521
2522 // Initialization Datepickers.
2523 EVFPanelBuilder.init_datepickers();
2524
2525 // Hiding time min max options in setting for Datepickers.
2526 $('#everest-forms-field-option-' + dragged_field_id + '-enable_min_max_time').hide();
2527 $('label[for=everest-forms-field-option-' + dragged_field_id + '-enable_min_max_time]').hide();
2528 $('label[for=everest-forms-field-option-' + dragged_field_id + '-select_min_time]').hide();
2529 $('label[for=everest-forms-field-option-' + dragged_field_id + '-select_max_time]').hide();
2530 $('#everest-forms-field-option-' + dragged_field_id + '-min_time_hour').parent().hide();
2531 $('#everest-forms-field-option-' + dragged_field_id + '-max_time_hour').parent().hide();
2532
2533 // Trigger an event indicating completion of field_drop action.
2534 $( document.body ).trigger( 'evf_field_drop_complete', [ field_type, dragged_field_id, field_preview, field_options ] );
2535 EVFPanelBuilder.checkEmptyGrid();
2536 }
2537 });
2538 },
2539
2540 conditionalLogicAppendField: function( id ){
2541 var dragged_el = $('#' + id);
2542 var dragged_index = dragged_el.index();
2543
2544 var fields = $('.evf-field-conditional-field-select');
2545
2546 var field_type = dragged_el.attr( 'data-field-type' );
2547 var field_id = dragged_el.attr( 'data-field-id' );
2548 var field_label = dragged_el.find( '.label-title .text ' ).text();
2549
2550 $.fn.insertAt = function(elements, index, selected_id ) {
2551 var array = $.makeArray(this.children().clone(true));
2552 array.splice(index, 0, elements);
2553 $.each( array, function( index, el ) {
2554 if( selected_id === $( el )[0]['value'] ) {
2555 $( el )[0]['selected'] = true;
2556 array[ index ] = el;
2557 }
2558 } );
2559 this.empty().append(array);
2560 };
2561 var dragged_field_id = field_id;
2562 fields.each(function(index, el) {
2563 var selected_id = $( el ).val();
2564 var id_key = id.replace('everest-forms-field-', '');
2565 var name = $(el).attr('name');
2566 var name_key = name.substring(
2567 name.indexOf("[") + 1,
2568 name.indexOf("]")
2569 );
2570
2571 if (id_key === name_key) {
2572 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each( function(){
2573 var form_field_type = $( this ).data('field-type'),
2574 form_field_id = $( this ).data('field-id'),
2575 form_field_label = $( this ).find('.label-title span').first().text();
2576 field_to_be_restricted =[];
2577 field_to_be_restricted = [
2578 'html',
2579 'title',
2580 'address',
2581 'image-upload',
2582 'file-upload',
2583 'date-time',
2584 'hidden',
2585 'scale-rating',
2586 'likert',
2587 'yes-no',
2588 ];
2589 if( $.inArray( form_field_type, field_to_be_restricted ) === -1 && dragged_field_id !== form_field_id ){
2590 if( 0 === fields.eq(index).find( 'option[data-field_id="'+form_field_id+'"]' ).length ) {
2591 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>');
2592 }
2593 }
2594 });
2595 } else {
2596 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>';
2597 if (
2598 "html" !== field_type &&
2599 "title" !== field_type &&
2600 "address" !== field_type &&
2601 "image-upload" !== field_type &&
2602 "file-upload" !== field_type &&
2603 "date-time" !== field_type &&
2604 "hidden" !== field_type &&
2605 "likert" !== field_type &&
2606 "scale-rating" !== field_type &&
2607 "yes-no" !== field_type &&
2608 "divider" !== field_type
2609 ) {
2610 fields
2611 .eq(index)
2612 .insertAt(el_to_append, dragged_index, selected_id);
2613 }
2614 }
2615 if( fields.eq( index ).find( 'option:not(.evf-conditional-fields)').length > 1 ) {
2616 fields.eq( index ).find( 'option:not(.evf-conditional-fields):gt(0)').remove();
2617 }
2618 });
2619 },
2620 conditionalLogicAppendRow: function( id ){
2621
2622 var new_row_option = $('#everest-forms-row-option-row_' + id);
2623
2624 var fields = $( '.everest-forms-field' );
2625
2626 fields.each( function() {
2627 var field = $(this),
2628 field_id = field.attr( 'data-field-id' ),
2629 field_type = field.attr( 'data-field-type' ),
2630 field_label = '';
2631
2632
2633 field.find( '.required').remove()
2634 field_label = field.find( '.label-title').html();
2635
2636 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>';
2637
2638 if (
2639 0 ===
2640 $(document).find(
2641 '.evf-admin-row[data-row-id="' +
2642 id +
2643 '"] #everest-forms-field-' +
2644 field_id
2645 ).length &&
2646 0 ===
2647 new_row_option.find(
2648 '.evf-field-conditional-field-select option[data-field_id="' +
2649 field_id +
2650 '"]'
2651 ).length &&
2652 "html" !== field_type &&
2653 "title" !== field_type &&
2654 "address" !== field_type &&
2655 "image-upload" !== field_type &&
2656 "file-upload" !== field_type &&
2657 "date-time" !== field_type &&
2658 "hidden" !== field_type &&
2659 "likert" !== field_type &&
2660 "scale-rating" !== field_type &&
2661 "divider" !== field_type
2662 ) {
2663 new_row_option
2664 .find(".evf-field-conditional-field-select")
2665 .append(el_to_append);
2666 }
2667 if( new_row_option.find( '.evf-field-conditional-field-select option:not(.evf-conditional-fields)').length > 1 ) {
2668 new_row_option.find( '.evf-field-conditional-field-select option:not(.evf-conditional-fields):gt(0)').remove();
2669 }
2670 })
2671 },
2672
2673 paymentFieldAppendToQuantity: function( id ) {
2674 var dragged_el = $( '#' + id );
2675
2676 var fields = $( '.everest-forms-field-option-row-map_field select' );
2677 var field_type = dragged_el.attr( 'data-field-type' );
2678 var field_id = dragged_el.attr( 'data-field-id' );
2679 var field_label = dragged_el.find( '.label-title .text ' ).text();
2680
2681 var el_to_append = '<option value="'+field_id+'">'+field_label+'</option>';
2682 if( 'payment-single' === field_type || 'payment-multiple' === field_type || 'payment-checkbox' === field_type ) {
2683 fields.append( el_to_append );
2684 }
2685 },
2686
2687 paymentFieldAppendToDropdown: function( dragged_field_id, field_type ){
2688 if('payment-quantity' === field_type || 'payment-coupon' === field_type || 'payment-subtotal' === field_type ) {
2689 var match_fields = [ 'payment-checkbox', 'payment-multiple', 'payment-single', 'range-slider' ],
2690 qty_dropdown = $('#everest-forms-field-option-' + dragged_field_id + '-map_field');
2691 match_fields.forEach(function(single_field){
2692 $('.everest-forms-field-'+single_field).each(function(){
2693 if( 'range-slider' === $(this).attr('data-field-type')) {
2694 if('true' === ($(this).find('.evf-range-slider-preview').attr('data-enable-payment-slider'))) {
2695 var id = $(this).attr('data-field-id'),
2696 label = $(this).find( ".label-title .text" ).text();
2697 var el_to_append = '<option value="'+id+'">'+label+'</option>';
2698 }else{
2699 return;
2700 }
2701 }
2702 var id = $(this).attr('data-field-id'),
2703 label = $(this).find( ".label-title .text" ).text();
2704 var el_to_append = '<option value="'+id+'">'+label+'</option>';
2705 qty_dropdown.append( el_to_append );
2706 });
2707 });
2708 }
2709 },
2710
2711 conditionalLogicAppendFieldIntegration: function( id ){
2712 var dragged_el = $('#' + id);
2713 var dragged_index = dragged_el.index();
2714
2715 var fields = $( '.evf-provider-conditional' ).find('.evf-conditional-field-select');
2716
2717 var field_type = dragged_el.attr( 'data-field-type' );
2718 var field_id = dragged_el.attr( 'data-field-id' );
2719 var field_label = dragged_el.find( '.label-title .text ' ).text();
2720
2721 $.fn.insertAt = function(elements, index) {
2722 var array = $.makeArray(this.children().clone(true));
2723 array.splice(index, 0, elements);
2724 this.empty().append(array);
2725 };
2726
2727 fields.each(function(index, el) {
2728 var id_key = id.replace('everest-forms-field-', '');
2729 var name = $(el).attr('name');
2730 var name_key = name.substring(
2731 name.indexOf("[") + 1,
2732 name.indexOf("]")
2733 );
2734
2735 if (id_key === name_key) {
2736 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each( function(){
2737 var field_type = $( this ).data('field-type'),
2738 field_id = $( this ).data('field-id'),
2739 field_label = $( this ).find('.label-title span').first().text();
2740 field_to_be_restricted =[];
2741 field_to_be_restricted = [
2742 "html",
2743 "title",
2744 "address",
2745 "image-upload",
2746 "file-upload",
2747 "signature",
2748 "divider",
2749 "date-time",
2750 "hidden",
2751 "scale-rating",
2752 "likert",
2753 "yes-no",
2754 dragged_el.attr("data-field-type"),
2755 ];
2756
2757 if( $.inArray( field_type, field_to_be_restricted ) === -1 ){
2758 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>');
2759 }
2760 });
2761 } else {
2762 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>';
2763 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 && 'yes-no' !== field_type ) {
2764 fields.eq(index).insertAt( el_to_append, dragged_index );
2765 }
2766 }
2767 });
2768 },
2769
2770 conditionalLogicRemoveField: function( id ){
2771 $( '.evf-field-conditional-field-select option[value = ' +id +' ]' ).remove();
2772 },
2773
2774 conditionalLogicRemoveFieldIntegration: function( id ){
2775 $( '.evf-provider-conditional .evf-conditional-field-select option[value = ' +id +' ]' ).remove();
2776 },
2777
2778 paymentFieldRemoveFromQuantity: function( id ) {
2779 $('.everest-forms-field-option-row-map_field select option[value = ' +id +' ]').remove();
2780 },
2781
2782 bindFieldSettings: function () {
2783 $( 'body' ).on( 'click', '.everest-forms-preview .everest-forms-field, .everest-forms-preview .everest-forms-field .everest-forms-field-setting', function(e) {
2784 e.preventDefault();
2785 var field_id = $( this ).closest( '.everest-forms-field' ).attr( 'data-field-id' );
2786 $( '.everest-forms-tab-content' ).scrollTop(0);
2787 EVFPanelBuilder.switchToFieldOptionPanel( field_id );
2788 } );
2789 },
2790
2791 toggleLabelEdit: function( label, input ) {
2792 $( label ).toggleClass( 'everest-forms-hidden' );
2793 $( input ).toggleClass( 'everest-forms-hidden' );
2794
2795 if ( $( input ).is( ':visible' ) ) {
2796 $( input ).focus();
2797 }
2798 },
2799
2800 bindToggleHandleActions: function () {
2801 $( 'body' ).on( 'click', '.toggle-handle', function ( e ) {
2802 var label = $( this ).data( 'label' ),
2803 input = $( this ).data( 'input' );
2804
2805 if ( ! $( input ).is(':visible') ) {
2806 EVFPanelBuilder.toggleLabelEdit( label, input );
2807 }
2808 });
2809 },
2810
2811 bindLabelEditInputActions: function () {
2812 $( 'body' ).on( 'focusout', '.label-edit-input', function ( e ) {
2813 var label = $( this ).data( 'label' ),
2814 input = this;
2815
2816 EVFPanelBuilder.toggleLabelEdit( label, input );
2817 });
2818 },
2819
2820 /**
2821 * Sync an input element with other elements like labels. An element with `sync-input` class will be synced to the elements
2822 * specified in `sync-targets` data.
2823 *
2824 * `Warning:` This is an one way sync, meaning only the text `sync-targets` will be updated when the source element's value changes
2825 * and the source element's value will not be updated if the value of `sync-targets` changes.
2826 */
2827 bindSyncedInputActions: function () {
2828 $( 'body' ).on( 'input', '.sync-input', function ( e ) {
2829 var changed_value = $( this ).val(),
2830 sync_targets = $( this ).data( 'sync-targets' );
2831
2832 if ( changed_value && sync_targets ) {
2833 $( sync_targets ).text( changed_value );
2834 }
2835 });
2836 }
2837 };
2838
2839 EVFPanelBuilder.init();
2840 })(jQuery, window.evf_data);
2841
2842 jQuery(function () {
2843
2844 if ( jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email').attr("checked") != 'checked' ) {
2845 jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap').nextAll().hide();
2846 }
2847
2848 jQuery( '#everest-forms-panel-field-settingsemail-evf_send_confirmation_email' ).on( 'change', function () {
2849
2850 if ( jQuery( this ).attr('checked') != 'checked') {
2851 jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap').nextAll().hide();
2852 } else {
2853 jQuery('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap').nextAll().show();
2854 }
2855 });
2856
2857 // Query String Toogle.
2858 jQuery( '#everest-forms-panel-field-settings-enable_redirect_query_string-wrap input' ).on( 'change', function () {
2859 var $this = jQuery( this );
2860 if ( ! $this.is( ':checked' ) ) {
2861 jQuery('#everest-forms-panel-field-settings-query_string-wrap').hide();
2862 } else {
2863 jQuery('#everest-forms-panel-field-settings-query_string-wrap').show();
2864 }
2865 });
2866
2867 var mySelect = jQuery('#everest-forms-panel-field-settings-redirect_to option:selected').val();
2868
2869 if ( mySelect == 'same' ) {
2870 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
2871 jQuery('#everest-forms-panel-field-settings-enable_redirect_query_string-wrap').hide();
2872 jQuery('#everest-forms-panel-field-settings-query_string-wrap').hide();
2873 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
2874 }
2875 else if(mySelect == 'custom_page') {
2876 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').show();
2877 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
2878 }
2879 else if(mySelect == 'external_url'){
2880 jQuery('#everest-forms-panel-field-settings-external_url-wrap').show();
2881 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
2882 jQuery('#everest-forms-panel-field-settings-enable_redirect_query_string-wrap').hide();
2883 jQuery('#everest-forms-panel-field-settings-query_string-wrap').hide();
2884 }
2885
2886 jQuery( '#everest-forms-panel-field-settings-redirect_to' ).on( 'change', function () {
2887 if ( this.value == 'same' ) {
2888 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
2889 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
2890 jQuery('#everest-forms-panel-field-settings-enable_redirect_query_string-wrap').hide();
2891 jQuery('#everest-forms-panel-field-settings-query_string-wrap').hide();
2892 }
2893 else if ( this.value == 'custom_page') {
2894 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').show();
2895 jQuery('#everest-forms-panel-field-settings-enable_redirect_query_string-wrap').show();
2896 jQuery('#everest-forms-panel-field-settings-external_url-wrap').hide();
2897
2898 if(jQuery('#everest-forms-panel-field-settings-enable_redirect_query_string').is(':checked')){
2899 jQuery('#everest-forms-panel-field-settings-query_string-wrap').show();
2900 } else{
2901 jQuery('#everest-forms-panel-field-settings-query_string-wrap').hide();
2902 }
2903 }
2904 else if ( this.value == 'external_url') {
2905 jQuery('#everest-forms-panel-field-settings-custom_page-wrap').hide();
2906 jQuery('#everest-forms-panel-field-settings-enable_redirect_query_string-wrap').hide();
2907 jQuery('#everest-forms-panel-field-settings-query_string-wrap').hide();
2908 jQuery('#everest-forms-panel-field-settings-external_url-wrap').show();
2909 }
2910 });
2911 jQuery( '.evf-panel-field-options-button.evf-disabled-tab' ).hide();
2912
2913 // Conditional Logic fields for General Settings in Form for Submission Redirection.
2914
2915 jQuery( '.everest-forms-conditional-field-settings-redirect_to').each(function() {
2916 var conditional_rule_selection =this.value;
2917 if ( 'custom_page' == conditional_rule_selection ) {
2918 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-custom_page').show();
2919 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-external_url').hide();
2920 }
2921 else if( 'external_url' == conditional_rule_selection ) {
2922 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-custom_page').hide();
2923 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-external_url').show();
2924 } else {
2925 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-custom_page').hide();
2926 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-external_url').hide();
2927 }
2928
2929 })
2930
2931 jQuery( document ).on( 'change', '.everest-forms-conditional-field-settings-redirect_to', function () {
2932 if ( 'custom_page' == this.value ) {
2933 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-custom_page').show();
2934 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-external_url').hide();
2935 }
2936 else if( 'external_url' == this.value ) {
2937 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-custom_page').hide();
2938 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-external_url').show();
2939 } else {
2940 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-custom_page').hide();
2941 jQuery(this).parents('.evf-field-conditional-container').find('.everest-forms-conditional-field-settings-external_url').hide();
2942 }
2943 });
2944
2945 });
2946
2947 jQuery( function ( $ ) {
2948
2949 // Add Fields - Open/close.
2950 $( document.body ).on( 'init_add_fields_toogle', function() {
2951 $( '.everest-forms-add-fields' ).on( 'click', '.everest-forms-add-fields-group > a', function( event ) {
2952 event.preventDefault();
2953 $( this ).parent( '.everest-forms-add-fields-group' ).toggleClass( 'closed' ).toggleClass( 'open' );
2954 });
2955 $( '.everest-forms-add-fields' ).on( 'click', '.everest-forms-add-fields-group a', function() {
2956 $( this ).next( '.evf-registered-buttons' ).stop().slideToggle();
2957 });
2958 $( '.everest-forms-add-fields-group.closed' ).each( function() {
2959 $( this ).find( '.evf-registered-buttons' ).hide();
2960 });
2961 } ).trigger( 'init_add_fields_toogle' );
2962
2963 // Fields Options - Open/close.
2964 $( document.body ).on( 'click', '.everest-forms-field-option .everest-forms-field-option-group > a', function( event ) {
2965 event.preventDefault();
2966 $( this ).parent( '.everest-forms-field-option-group' ).toggleClass( 'closed' ).toggleClass( 'open' );
2967 });
2968 $( document.body ).on( 'click', '.everest-forms-field-option .everest-forms-field-option-group a', function( event ) {
2969 // If the user clicks on some form input inside, the box should not be toggled.
2970 if ( $( event.target ).filter( ':input, option, .sort' ).length ) {
2971 return;
2972 }
2973
2974 $( this ).next( '.everest-forms-field-option-group-inner' ).stop().slideToggle();
2975 });
2976 $( document.body ).on( 'init_field_options_toggle', function() {
2977 $( '.everest-forms-field-option-group.closed' ).each( function() {
2978 $( this ).find( '.everest-forms-field-option-group-inner' ).hide();
2979 });
2980 } ).trigger( 'init_field_options_toggle' );
2981
2982 $( document ).on( 'click', function() {
2983 $( '.evf-smart-tag-lists' ).hide();
2984 });
2985
2986 $( '.evf-smart-tag-lists' ).hide();
2987
2988 // Toggle Smart Tags.
2989 $( document.body ).on('click', '.evf-toggle-smart-tag-display', function(e) {
2990 e.stopPropagation();
2991 $('.evf-smart-tag-lists').hide();
2992 $('.evf-smart-tag-lists ul').empty();
2993 $( this ).parent().find('.evf-smart-tag-lists').toggle('show');
2994
2995 var type = $( this ).data('type');
2996
2997 var allowed_field = $ ( this ).data( 'fields' );
2998 get_all_available_field( allowed_field, type , $( this ) );
2999 });
3000
3001 $( document.body ).on('click', '.smart-tag-field', function(e) {
3002
3003 var field_id = $( this ).data('field_id'),
3004 field_label = $( this ).text(),
3005 type = $( this ).data('type'),
3006 $parent = $ ( this ).parent().parent().parent(),
3007 $input = $parent.find('input[type=text]'),
3008 $textarea = $parent.find('textarea');
3009 if ( field_id !== 'fullname' && field_id !== 'email' && field_id !== 'subject' && field_id !== 'message' && 'other' !== type ) {
3010 field_label = field_label.split(/[\s-_]/);
3011 for(var i = 0 ; i < field_label.length ; i++){
3012 if ( i === 0 ) {
3013 field_label[i] = field_label[i].charAt(0).toLowerCase() + field_label[i].substr(1);
3014 } else {
3015 field_label[i] = field_label[i].charAt(0).toUpperCase() + field_label[i].substr(1);
3016 }
3017 }
3018 field_label = field_label.join('');
3019 field_id = field_label+'_'+field_id;
3020 } else {
3021 field_id = field_id;
3022 }
3023 if ( 'field' === type ) {
3024 $input.val( $input.val() + '{field_id="'+field_id+'"}' );
3025 $textarea.val($textarea.val()+'{field_id="'+field_id+'"}' );
3026 $textarea.trigger('change');
3027 } else if ( 'other' === type ) {
3028 $input.val( $input.val() + '{'+field_id+'}' );
3029 $textarea.val($textarea.val() + '{'+field_id+'}' );
3030 }
3031 });
3032
3033 // Toggle form status.
3034 $( document ).on( 'change', '.wp-list-table .everest-forms-toggle-form input', function(e) {
3035 e.stopPropagation();
3036 $.post( evf_data.ajax_url, {
3037 action: 'everest_forms_enabled_form',
3038 security: evf_data.evf_enabled_form,
3039 form_id: $( this ).data( 'form_id' ),
3040 enabled: $( this ).prop( 'checked' ) ? 1 : 0
3041 });
3042 });
3043
3044 // Toggle email notification.
3045 $( document ).on( 'change', '.evf-content-email-settings .evf-toggle-switch input', function(e) {
3046 var $this = $( this ),
3047 value = $this.prop( 'checked' );
3048
3049 if ( false === value ) {
3050 $this.val('');
3051 $this.closest( '.evf-content-email-settings' ).find( '.email-disable-message' ).remove();
3052 $this.closest( '.evf-content-section-title' ).siblings( '.evf-content-email-settings-inner' ).addClass( 'everest-forms-hidden' );
3053 $( '<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' ) );
3054 } else if ( true === value ) {
3055 $this.val('1');
3056 $this.closest( '.evf-content-section-title' ).siblings( '.evf-content-email-settings-inner' ).removeClass( 'everest-forms-hidden' );
3057 $this.closest( '.evf-content-email-settings' ).find( '.email-disable-message' ).remove();
3058 }
3059 });
3060
3061
3062 $( document ).on( 'click', '.everest-forms-min-max-date-format input', function() {
3063 var minDate = $( this ).closest( '.everest-forms-date' ).find( '.everest-forms-min-date' ).val();
3064 var maxDate = $(this).closest('.everest-forms-date').find('.everest-forms-min-date').val();
3065
3066 if ( $( this ).is( ':checked' ) ) {
3067 var setDateRange = $( this ).parent().next( '.everest-forms-min-max-date-range-format' );
3068 if( setDateRange.find( 'input[type="checkbox"]' ).is( ':checked' ) ) {
3069 setDateRange.next( '.everest-forms-min-max-date-option' ).addClass( 'everest-forms-hidden' );
3070 setDateRange.next().next( '.everest-forms-min-max-date-range-option' ).removeClass( 'everest-forms-hidden' );
3071 } else {
3072 setDateRange.next( '.everest-forms-min-max-date-option' ).removeClass( 'everest-forms-hidden' );
3073 setDateRange.next().next( '.everest-forms-min-max-date-range-option' ).addClass( 'everest-forms-hidden' );
3074 }
3075
3076 $( this ).parent().next( '.everest-forms-min-max-date-range-format' ).removeClass( 'everest-forms-hidden' );
3077
3078 if( '' === minDate ){
3079 $('.everest-forms-min-date').addClass('flatpickr-field').flatpickr({
3080 disableMobile : true,
3081 onChange : function(selectedDates, dateStr, instance) {
3082 $( '.everest-forms-min-date' ).val(dateStr);
3083 },
3084 onOpen: function(selectedDates, dateStr, instance) {
3085 instance.set('maxDate', $('.everest-forms-max-date').val());
3086 },
3087 });
3088 }
3089 if('' === maxDate ){
3090 $( '.everest-forms-max-date' ).addClass( 'flatpickr-field' ).flatpickr({
3091 disableMobile : true,
3092 onChange : function(selectedDates, dateStr, instance) {
3093 $( '.everest-forms-max-date' ).val(dateStr);
3094 },
3095 onOpen: function(selectedDates, dateStr, instance) {
3096 instance.set('minDate', $( '.everest-forms-min-date' ).val());
3097 },
3098 });
3099 }
3100 } else {
3101 $( this ).parent().next().next( '.everest-forms-min-max-date-option' ).addClass( 'everest-forms-hidden' );
3102 $( this ).parent().next().next().next( '.everest-forms-min-max-date-range-option' ).addClass( 'everest-forms-hidden' );
3103 $( this ).parent().next( '.everest-forms-min-max-date-range-format' ).addClass( 'everest-forms-hidden' );
3104 }
3105 });
3106
3107 $( document ).on( 'click', '.everest-forms-min-max-date-range-format input[type="checkbox"]', function() {
3108 if ( $( this ).is( ':checked' ) ) {
3109 $( this ).parent().next( '.everest-forms-min-max-date-option' ).addClass( 'everest-forms-hidden' );
3110 $( this ).parent().next().next( '.everest-forms-min-max-date-range-option' ).removeClass( 'everest-forms-hidden' );
3111 } else {
3112 $( this ).parent().next( '.everest-forms-min-max-date-option' ).removeClass( 'everest-forms-hidden' );
3113 $( this ).parent().next().next( '.everest-forms-min-max-date-range-option' ).addClass( 'everest-forms-hidden' );
3114 }
3115 });
3116
3117 function get_all_available_field( allowed_field, type , el ) {
3118 var all_fields_without_email = [];
3119 var all_fields = [];
3120 var email_field = [];
3121 var phone_field = [];
3122 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each( function(){
3123 var field_type = $( this ).data('field-type');
3124 var field_id = $( this ).data('field-id');
3125 if ( 'email' === field_type ){
3126 var e_field_label = $( this ).find('.label-title span').first().text();
3127 var e_field_id = field_id;
3128 email_field[ e_field_id ] = e_field_label;
3129 } else if( 'phone' === field_type){
3130 var e_field_label = $( this ).find('.label-title span').first().text();
3131 var e_field_id = field_id;
3132 phone_field[ e_field_id ] = e_field_label;
3133 } else {
3134 var field_label = $( this ).find('.label-title span').first().text();
3135 all_fields_without_email[ field_id ] = field_label;
3136 }
3137 all_fields[ field_id ] = $( this ).find('.label-title span').first().text();
3138 });
3139
3140 if( 'other' === type || 'all' === type ){
3141 var other_smart_tags = evf_data.smart_tags_other;
3142 for( var key in other_smart_tags ) {
3143 $(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>');
3144 }
3145 }
3146
3147 if ( 'fields' === type || 'all' === type ) {
3148 if ( allowed_field === 'email' ) {
3149 if ( Object.keys(email_field).length < 1 ){
3150 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').addClass('everest-forms-hidden');
3151 } else {
3152 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').removeClass('everest-forms-hidden');
3153 }
3154 $(el).parent().find('.evf-smart-tag-lists .other-tag-title').remove();
3155 $(el).parent().find('.evf-smart-tag-lists .evf-others').remove();
3156 $(el).parent().find('.evf-smart-tag-lists').append('<div class="smart-tag-title other-tag-title">Others</div><ul class="evf-others"></ul>');
3157 $(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>');
3158 for (var key in email_field ) {
3159 $(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>');
3160 }
3161 } else if ( allowed_field === 'phone' ) {
3162 if ( Object.keys(phone_field).length < 1 ){
3163 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').addClass('everest-forms-hidden');
3164 } else {
3165 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').removeClass('everest-forms-hidden');
3166 }
3167 $(el).parent().find('.evf-smart-tag-lists .other-tag-title').remove();
3168 $(el).parent().find('.evf-smart-tag-lists .evf-others').remove();
3169 for (var key in phone_field ) {
3170 $(el).parent().find('.evf-smart-tag-lists .evf-fields').append('<li class = "smart-tag-field" data-type="field" data-field_id="'+key+'">'+phone_field[key]+'</li>');
3171 }
3172 } else {
3173 if ( Object.keys(all_fields).length < 1 ){
3174 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').addClass('everest-forms-hidden');
3175 } else {
3176 $(el).parent().find('.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")').removeClass('everest-forms-hidden');
3177 }
3178 for (var meta in all_fields ) {
3179 $(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>');
3180 }
3181 }
3182 }
3183
3184 if ( 'calculations' === type ) {
3185 var calculations = [
3186 "number",
3187 "payment-single",
3188 "range-slider",
3189 "payment-checkbox",
3190 "payment-multiple",
3191 ];
3192 $(document).find('.everest-forms-field').each(function() {
3193 if( calculations.includes($(this).attr('data-field-type')) && $(el).parents('.everest-forms-field-option-row-calculation_field').attr('data-field-id') !== $(this).attr('data-field-id')) {
3194 $(el).parent().find('.evf-smart-tag-lists .calculations').append('<li class = "smart-tag-field" data-type="field" data-field_id="'+$(this).attr('data-field-id')+'">'+$(this).find('.label-title .text').text()+'</li>');
3195 }
3196 })
3197 }
3198 }
3199 });
3200