PageSourceSearch

https://123webpages.co.uk/wp-content/plugins/tenweb-builder/pro-fe…/js/form.23168c11e0d20fa0282b.bundle.js

js 123webpages.co.uk collected 2026-10-02 13:40:02 UTC 37,418 bytes, 1,085 lines download raw bytes

1/*! elementor-pro - v3.13.2 - 22-05-2023 */
2"use strict";
3(self["webpackChunkelementor_tenweb"] = self["webpackChunkelementor_tenweb"] || []).push([["form"],{
4
5  
5/***/ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js":
6  /*!***********************************************************************************!*\
7    !*** ../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js ***!
8    \***********************************************************************************/
9  /***/ ((__unused_webpack_module, exports) => {
10
11
12
13    Object.defineProperty(exports, "__esModule", ({
14      value: true
15    }));
16    exports["default"] = void 0;
17    class DataTimeFieldBase extends elementorModules.frontend.handlers.Base {
18      getDefaultSettings() {
19        return {
20          selectors: {
21            fields: this.getFieldsSelector()
22          },
23          classes: {
24            useNative: 'elementor-use-native'
25          }
26        };
27      }
28
29      getDefaultElements() {
30        const {
31          selectors
32        } = this.getDefaultSettings();
33        return {
34          $fields: this.$element.find(selectors.fields)
35        };
36      }
37
38      addPicker(element) {
39        const {
40              classes
41            } = this.getDefaultSettings(),
42            $element = jQuery(element);
43
44        if ($element.hasClass(classes.useNative)) {
45          return;
46        }
47
48        element.flatpickr(this.getPickerOptions(element));
49      }
50
51      onInit() {
52        super.onInit(...arguments);
53        this.elements.$fields.each((index, element) => this.addPicker(element));
54      }
55
56    }
57
58    exports["default"] = DataTimeFieldBase;
59
60    /***/ }),
61
62  
62/***/ "../modules/forms/assets/js/frontend/handlers/fields/date.js":
63  /*!*******************************************************************!*\
64    !*** ../modules/forms/assets/js/frontend/handlers/fields/date.js ***!
65    \*******************************************************************/
66  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
67
68
69
70    var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
71
72    Object.defineProperty(exports, "__esModule", ({
73      value: true
74    }));
75    exports["default"] = void 0;
76
77    var _dataTimeFieldBase = _interopRequireDefault(__webpack_require__(/*! ./data-time-field-base */ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js"));
78
79    class DateField extends _dataTimeFieldBase.default {
80      getFieldsSelector() {
81        return '.elementor-date-field';
82      }
83
84      getPickerOptions(element) {
85        const $element = jQuery(element);
86        return {
87          minDate: $element.attr('min') || null,
88          maxDate: $element.attr('max') || null,
89          allowInput: true
90        };
91      }
92
93    }
94
95    exports["default"] = DateField;
96
97    /***/ }),
98
99  
99/***/ "../modules/forms/assets/js/frontend/handlers/fields/time.js":
100  /*!*******************************************************************!*\
101    !*** ../modules/forms/assets/js/frontend/handlers/fields/time.js ***!
102    \*******************************************************************/
103  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
104
105
106
107    var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
108
109    Object.defineProperty(exports, "__esModule", ({
110      value: true
111    }));
112    exports["default"] = void 0;
113
114    var _dataTimeFieldBase = _interopRequireDefault(__webpack_require__(/*! ./data-time-field-base */ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js"));
115
116    class TimeField extends _dataTimeFieldBase.default {
117      getFieldsSelector() {
118        return '.elementor-time-field';
119      }
120
121      getPickerOptions() {
122        return {
123          noCalendar: true,
124          enableTime: true,
125          allowInput: true
126        };
127      }
128
129    }
130
131    exports["default"] = TimeField;
132
133    /***/ }),
134
135  
135/***/ "../modules/forms/assets/js/frontend/handlers/form-redirect.js":
136  /*!*********************************************************************!*\
137    !*** ../modules/forms/assets/js/frontend/handlers/form-redirect.js ***!
138    \*********************************************************************/
139  /***/ ((__unused_webpack_module, exports) => {
140
141
142
143    Object.defineProperty(exports, "__esModule", ({
144      value: true
145    }));
146    exports["default"] = void 0;
147
148    var _default = elementorModules.frontend.handlers.Base.extend({
149      getDefaultSettings() {
150        return {
151          selectors: {
152            form: '.elementor-form'
153          }
154        };
155      },
156
157      getDefaultElements() {
158        var selectors = this.getSettings('selectors'),
159            elements = {};
160        elements.$form = this.$element.find(selectors.form);
161        return elements;
162      },
163
164      bindEvents() {
165        this.elements.$form.on('form_destruct', this.handleSubmit);
166      },
167
168      handleSubmit(event, response) {
169        if ('undefined' !== typeof response.data.redirect_url) {
170          location.href = response.data.redirect_url;
171        }
172      }
173
174    });
175
176    exports["default"] = _default;
177
178    /***/ }),
179
180  
180/***/ "../modules/forms/assets/js/frontend/handlers/form-sender.js":
181  /*!*******************************************************************!*\
182    !*** ../modules/forms/assets/js/frontend/handlers/form-sender.js ***!
183    \*******************************************************************/
184  /***/ ((__unused_webpack_module, exports) => {
185
186
187
188    Object.defineProperty(exports, "__esModule", ({
189      value: true
190    }));
191    exports["default"] = void 0;
192
193    var _default = elementorModules.frontend.handlers.Base.extend({
194      getDefaultSettings() {
195        return {
196          selectors: {
197            form: '.elementor-form',
198            submitButton: '[type="submit"]'
199          },
200          action: 'tenweb_builder_forms_send_form',
201          ajaxUrl: elementorTenwebFrontend.config.ajaxurl
202        };
203      },
204
205      getDefaultElements() {
206        const selectors = this.getSettings('selectors'),
207            elements = {};
208        elements.$form = this.$element.find(selectors.form);
209        elements.$submitButton = elements.$form.find(selectors.submitButton);
210        return elements;
211      },
212
213      bindEvents() {
214        this.elements.$form.on('submit', this.handleSubmit);
215        const $fileInput = this.elements.$form.find('input[type=file]');
216
217        if ($fileInput.length) {
218          $fileInput.on('change', this.validateFileSize);
219        }
220      },
221
222      validateFileSize(event) {
223        const $field = jQuery(event.currentTarget),
224            files = $field[0].files;
225
226        if (!files.length) {
227          return;
228        }
229
230        const maxSize = parseInt($field.attr('data-maxsize')) * 1024 * 1024,
231            maxSizeMessage = $field.attr('data-maxsize-message');
232        const filesArray = Array.prototype.slice.call(files);
233        filesArray.forEach(file => {
234          /* 10Web */
235          $field.parent().removeClass('elementor-error').find('.elementor-message').remove();
236          if (maxSize < file.size) {
237            $field.parent().addClass('elementor-error').append('<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">' + maxSizeMessage + '</span>').find(':input').attr('aria-invalid', 'true');
238            this.elements.$form.trigger('error');
239          }
240        });
241      },
242
243      beforeSend() {
244        const $form = this.elements.$form;
245        $form.animate({
246          opacity: '0.45'
247        }, 500).addClass('elementor-form-waiting');
248        $form.find('.elementor-message').remove();
249        $form.find('.elementor-error').removeClass('elementor-error');
250        $form.find('div.elementor-field-group').removeClass('error').find('span.elementor-form-help-inline').remove().end().find(':input').attr('aria-invalid', 'false');
251        this.elements.$submitButton.attr('disabled', 'disabled').find('> span').prepend('<span class="elementor-button-text elementor-form-spinner"><i class="fa fa-spinner fa-spin"></i>&nbsp;</span>');
252      },
253
254      getFormData() {
255        const formData = new FormData(this.elements.$form[0]);
256        formData.append('action', this.getSettings('action'));
257        formData.append('referrer', location.toString());
258        return formData;
259      },
260
261      onSuccess(response) {
262        const $form = this.elements.$form;
263        this.elements.$submitButton.removeAttr('disabled').find('.elementor-form-spinner').remove();
264        $form.animate({
265          opacity: '1'
266        }, 100).removeClass('elementor-form-waiting');
267
268        if (!response.success) {
269          if (response.data.errors) {
270            jQuery.each(response.data.errors, function (key, title) {
271              $form.find('#form-field-' + key).parent().addClass('elementor-error').append('<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">' + title + '</span>').find(':input').attr('aria-invalid', 'true');
272            });
273            $form.trigger('error');
274          }
275
276          $form.append('<div class="elementor-message elementor-message-danger" role="alert">' + response.data.message + '</div>');
277        } else {
278          $form.trigger('submit_success', response.data); // For actions like redirect page
279
280          $form.trigger('form_destruct', response.data);
281          $form.trigger('reset');
282
283          if ('undefined' !== typeof response.data.message && '' !== response.data.message) {
284            $form.append('<div class="elementor-message elementor-message-success" role="alert">
284' + response.data.message + '</div>');
285          }
286        }
287      },
288
289      onError(xhr, desc) {
290        const $form = this.elements.$form;
291        $form.append('<div class="elementor-message elementor-message-danger" role="alert">' + desc + '</div>');
292        this.elements.$submitButton.html(this.elements.$submitButton.text()).removeAttr('disabled');
293        $form.animate({
294          opacity: '1'
295        }, 100).removeClass('elementor-form-waiting');
296        $form.trigger('error');
297      },
298
299      handleSubmit(event) {
300        const self = this,
301            $form = this.elements.$form;
302        event.preventDefault();
303
304        if ($form.hasClass('elementor-form-waiting')) {
305          return false;
306        }
307
308        this.beforeSend();
309        jQuery.ajax({
310          url: self.getSettings('ajaxUrl'),
311          type: 'POST',
312          dataType: 'json',
313          data: self.getFormData(),
314          processData: false,
315          contentType: false,
316          success: self.onSuccess,
317          error: self.onError
318        });
319      }
320
321    });
322
323    exports["default"] = _default;
324
325    /***/ }),
326
327  
327/***/ "../modules/forms/assets/js/frontend/handlers/form-steps.js":
328  /*!******************************************************************!*\
329    !*** ../modules/forms/assets/js/frontend/handlers/form-steps.js ***!
330    \******************************************************************/
331  /***/ ((__unused_webpack_module, exports) => {
332
333
334
335    Object.defineProperty(exports, "__esModule", ({
336      value: true
337    }));
338    exports["default"] = void 0;
339
340    class FormSteps extends elementorModules.frontend.handlers.Base {
341      getDefaultSettings() {
342        return {
343          selectors: {
344            form: '.elementor-form',
345            fieldsWrapper: '.elementor-form-fields-wrapper',
346            fieldGroup: '.elementor-field-group',
347            stepWrapper: '.elementor-field-type-step',
348            stepField: '.e-field-step',
349            submitWrapper: '.elementor-field-type-submit',
350            submitButton: '[type="submit"]',
351            buttons: '.e-form__buttons',
352            buttonWrapper: '.e-form__buttons__wrapper',
353            button: '.e-form__buttons__wrapper__button',
354            indicator: '.e-form__indicators__indicator',
355            indicatorProgress: '.e-form__indicators__indicator__progress',
356            indicatorProgressMeter: '.e-form__indicators__indicator__progress__meter',
357            formHelpInline: '.elementor-form-help-inline'
358          },
359          classes: {
360            hidden: 'elementor-hidden',
361            column: 'elementor-column',
362            fieldGroup: 'elementor-field-group',
363            elementorButton: 'elementor-button',
364            step: 'e-form__step',
365            buttons: 'e-form__buttons',
366            buttonWrapper: 'e-form__buttons__wrapper',
367            button: 'e-form__buttons__wrapper__button',
368            indicators: 'e-form__indicators',
369            indicator: 'e-form__indicators__indicator',
370            indicatorIcon: 'e-form__indicators__indicator__icon',
371            indicatorNumber: 'e-form__indicators__indicator__number',
372            indicatorLabel: 'e-form__indicators__indicator__label',
373            indicatorProgress: 'e-form__indicators__indicator__progress',
374            indicatorProgressMeter: 'e-form__indicators__indicator__progress__meter',
375            indicatorSeparator: 'e-form__indicators__indicator__separator',
376            indicatorInactive: 'e-form__indicators__indicator--state-inactive',
377            indicatorActive: 'e-form__indicators__indicator--state-active',
378            indicatorCompleted: 'e-form__indicators__indicator--state-completed',
379            indicatorShapeCircle: 'e-form__indicators__indicator--shape-circle',
380            indicatorShapeSquare: 'e-form__indicators__indicator--shape-square',
381            indicatorShapeRounded: 'e-form__indicators__indicator--shape-rounded',
382            indicatorShapeNone: 'e-form__indicators__indicator--shape-none'
383          }
384        };
385      }
386
387      getDefaultElements() {
388        const {
389              selectors
390            } = this.getSettings(),
391            elements = {
392              $form: this.$element.find(selectors.form)
393            };
394        elements.$fieldsWrapper = elements.$form.children(selectors.fieldsWrapper);
395        elements.$stepWrapper = elements.$fieldsWrapper.children(selectors.stepWrapper);
396        elements.$stepField = elements.$stepWrapper.children(selectors.stepField);
397        elements.$fieldGroup = elements.$fieldsWrapper.children(selectors.fieldGroup);
398        elements.$submitWrapper = elements.$fieldsWrapper.children(selectors.submitWrapper);
399        elements.$submitButton = elements.$submitWrapper.children(selectors.submitButton);
400        return elements;
401      }
402
403      onInit() {
404        super.onInit(...arguments);
405
406        if (!this.isStepsExist()) {
407          return;
408        }
409
410        this.data = {
411          steps: [],
412          indicatorsWithObjectTags: []
413        };
414        this.state = {
415          currentStep: 0,
416          stepsType: '',
417          stepsShape: ''
418        };
419        this.buildSteps();
420        this.elements = {
421          ...this.elements,
422          ...this.createStepsIndicators(),
423          ...this.createStepsButtons()
424        };
425        this.initProgressBar();
426        this.extractResponsiveSizeFromSubmitWrapper();
427      }
428
429      bindEvents() {
430        if (!this.isStepsExist()) {
431          return;
432        }
433
434        this.elements.$form.on({
435          submit: () => this.resetForm(),
436          keydown: e => {
437            if (13 === e.keyCode && !this.isLastStep() && 'textarea' !== e.target.localName) {
438              e.preventDefault();
439              this.applyStep('next');
440            }
441          },
442          error: () => this.onFormError()
443        });
444      }
445
446      isStepsExist() {
447        return this.elements.$stepWrapper.length;
448      }
449
450      initProgressBar() {
451        const stepsSettings = this.getElementSettings();
452
453        if ('progress_bar' === stepsSettings.step_type) {
454          this.setProgressBar();
455        }
456      }
457
458      buildSteps() {
459        this.elements.$stepWrapper.each((index, el) => {
460          const {
461                selectors,
462                classes
463              }
463 = this.getSettings(),
464              $currentStep = jQuery(el);
465          $currentStep.addClass(classes.step).removeClass(classes.fieldGroup, classes.column);
466
467          if (index) {
468            $currentStep.addClass(classes.hidden);
469          }
470
471          this.setStepData($currentStep.children(selectors.stepField));
472          $currentStep.append($currentStep.nextUntil(this.elements.$stepWrapper).not(this.elements.$submitWrapper));
473        });
474      }
475
476      setStepData($stepElement) {
477        const dataAttributes = ['label', 'previousButton', 'nextButton', 'iconUrl', 'iconLibrary', 'icon'],
478            stepData = {};
479        dataAttributes.forEach(attr => {
480          const attrValue = $stepElement.attr('data-' + attr);
481
482          if (attrValue) {
483            stepData[attr] = attrValue;
484          }
485        });
486        this.data.steps.push(stepData);
487      }
488
489      createStepsIndicators() {
490        const stepsSettings = this.getElementSettings(),
491            stepsElements = {};
492
493        if ('none' !== stepsSettings.step_type) {
494          const {
495                selectors,
496                classes
497              } = this.getSettings(),
498              indicatorsTypeClass = classes.indicators + '--type-' + stepsSettings.step_type,
499              indicatorsClasses = [classes.indicators, indicatorsTypeClass];
500          stepsElements.$indicatorsWrapper = jQuery('<div>', {
501            class: indicatorsClasses.join(' ')
502          });
503          stepsElements.$indicatorsWrapper.append(this.buildIndicators());
504          this.elements.$fieldsWrapper.before(stepsElements.$indicatorsWrapper);
505
506          if ('progress_bar' === stepsSettings.step_type) {
507            stepsElements.$progressBar = stepsElements.$indicatorsWrapper.find(selectors.indicatorProgress);
508            stepsElements.$progressBarMeter = stepsElements.$indicatorsWrapper.find(selectors.indicatorProgressMeter);
509          } else {
510            stepsElements.$indicators = stepsElements.$indicatorsWrapper.find(selectors.indicator);
511            stepsElements.$currentIndicator = stepsElements.$indicators.eq(this.state.currentStep);
512          }
513        }
514
515        this.saveIndicatorsState();
516        return stepsElements;
517      }
518
519      buildIndicators() {
520        const stepsSettings = this.getElementSettings();
521        return 'progress_bar' === stepsSettings.step_type ? this.buildProgressBar() : this.buildIndicatorsFromStepsData();
522      }
523
524      buildProgressBar() {
525        const {
526              classes
527            } = this.getSettings(),
528            $progressBar = jQuery('<div>', {
529              class: classes.indicatorProgress
530            }),
531            $progressBarMeter = jQuery('<div>', {
532              class: classes.indicatorProgressMeter
533            });
534        $progressBar.append($progressBarMeter);
535        return $progressBar;
536      }
537
538      getProgressBarValue() {
539        const totalSteps = this.data.steps.length,
540            currentStep = this.state.currentStep,
541            percentage = currentStep ? (currentStep + 1) / totalSteps * 100 : 100 / totalSteps;
542        return Math.floor(percentage) + '%';
543      }
544
545      setProgressBar() {
546        const progressBarValue = this.getProgressBarValue();
547        this.updateProgressMeterCSSVariable(progressBarValue);
548        this.elements.$progressBarMeter.text(progressBarValue);
549      }
550
551      updateProgressMeterCSSVariable(value) {
552        this.$element[0].style.setProperty('--e-form-steps-indicator-progress-meter-width', value);
553      }
554
555      saveIndicatorsState() {
556        const stepsSettings = this.getElementSettings();
557        this.state.stepsType = stepsSettings.step_type;
558
559        if (!['none', 'text', 'progress_bar'].includes(stepsSettings.step_type)) {
560          this.state.stepsShape = stepsSettings.step_icon_shape;
561        }
562      }
563
564      buildIndicatorsFromStepsData() {
565        const indicators = [];
566        this.data.steps.forEach((stepObj, index) => {
567          if (index) {
568            indicators.push(this.getStepSeparator());
569          }
570
571          indicators.push(this.getStepIndicatorElement(stepObj, index));
572        });
573        return indicators;
574      }
575
576      getStepIndicatorElement(stepObj, index) {
577        const {
578              classes
579            }
579 = this.getSettings(),
580            stepsSettings = this.getElementSettings(),
581            indicatorStateClass = this.getIndicatorStateClass(index),
582            indicatorClasses = [classes.indicator, indicatorStateClass],
583            $stepIndicator = jQuery('<div>', {
584              class: indicatorClasses.join(' ')
585            });
586
587        if (stepsSettings.step_type.includes('icon')) {
588          $stepIndicator.append(this.getStepIconElement(stepObj));
589        }
590
591        if (stepsSettings.step_type.includes('number')) {
592          $stepIndicator.append(this.getStepNumberElement(index));
593        }
594
595        if (stepsSettings.step_type.includes('text')) {
596          $stepIndicator.append(this.getStepLabelElement(stepObj.label));
597        }
598
599        return $stepIndicator;
600      }
601
602      getIndicatorStateClass(index) {
603        const {
604          classes
605        } = this.getSettings();
606
607        if (index < this.state.currentStep) {
608          return classes.indicatorCompleted;
609        } else if (index > this.state.currentStep) {
610          return classes.indicatorInactive;
611        }
612
613        return classes.indicatorActive;
614      }
615
616      getIndicatorShapeClass() {
617        const stepsSettings = this.getElementSettings(),
618            {
619              classes
620            } = this.getSettings();
621        return classes['indicatorShape' + this.firstLetterToUppercase(stepsSettings.step_icon_shape)];
622      }
623
624      firstLetterToUppercase(str) {
625        return str.charAt(0).toUpperCase() + str.slice(1);
626      }
627
628      getStepNumberElement(index) {
629        const {
630              classes
631            } = this.getSettings(),
632            numberClasses = [classes.indicatorNumber, this.getIndicatorShapeClass()];
633        return jQuery('<div>', {
634          class: numberClasses.join(' '),
635          text: index + 1
636        });
637      }
638
639      getStepIconElement(stepObj) {
640        const {
641              classes
642            } = this.getSettings(),
643            iconClasses = [classes.indicatorIcon, this.getIndicatorShapeClass()],
644            $icon = jQuery('<div>', {
645              class: iconClasses.join(' ')
646            });
647
648        if (stepObj.icon) {
649          $icon.html(stepObj.icon);
650        } else {
651          let $iconElement;
652
653          if (stepObj.iconLibrary) {
654            $iconElement = jQuery('<i>', {
655              class: stepObj.iconLibrary
656            });
657          } else {
658            // Using the attributes inline when creating the object, otherwise the data attribute will not work.
659            $iconElement = jQuery(`<object type="image/svg+xml" data="${stepObj.iconUrl}"></object>`); // Updating an indicator svg fill color, when loaded inside an object tag with a separated scope.
660
661            $iconElement.on('load', event => {
662              event.target.contentDocument.querySelector('svg').style.fill = $iconElement.css('fill');
663            }); // Storing the indicators elements that contain object tags in order to change their fill color on steps change.
664
665            this.data.indicatorsWithObjectTags.push($iconElement);
666          }
667
668          $icon.append($iconElement);
669        }
670
671        return $icon;
672      }
673
674      getStepLabelElement(label) {
675        const {
676          classes
677        } = this.getSettings();
678        return jQuery('<label>', {
679          class: classes.indicatorLabel,
680          text: label
681        });
682      }
683
684      getStepSeparator() {
685        const {
686          classes
687        } = this.getSettings();
688        return jQuery('<div>', {
689          class: classes.indicatorSeparator
690        });
691      }
692
693      createStepsButtons() {
694        const {
695              selectors
696            } = this.getSettings(),
697            stepsElements = {};
698        this.injectButtonsToSteps(stepsElements);
699        stepsElements.$buttonsContainer = this.elements.$stepWrapper.find(selectors.buttons);
700        stepsElements.$buttonsWrappers = stepsElements.$buttonsContainer.children(selectors.buttonWrapper);
701        return stepsElements;
702      }
703
704      injectButtonsToSteps() {
705        const totalSteps = this.elements.$stepWrapper.length;
706        this.elements.$stepWrapper.each((index, el) => {
707          const $el = jQuery(el),
708              $container = this.getButtonsContainer();
709          let $nextButton;
710
711          if (index) {
712            $container.append(this.getStepButton('previous', index));
713            $nextButton = index === totalSteps - 1 ? this.getSubmitButton() : this.getStepButton('next', index);
714          } else {
715            $nextButton = this.getStepButton('next', index);
716          }
717
718          $container.append($nextButton);
719          $el.append($container);
720        });
721      }
722
723      getButtonsContainer() {
724        const {
725              classes
726            } = this.getSettings(),
727            stepsSettings = this.getElementSettings(),
728            buttonColumnWidthClasses = [classes.buttons, classes.column, 'elementor-col-' + stepsSettings.button_width];
729        return jQuery('<div>', {
730          class: buttonColumnWidthClasses.join(' ')
731        });
732      }
733
734      extractResponsiveSizeFromSubmitWrapper() {
735        let sizeClasses = [];
736        this.elements.$submitWrapper.removeClass((index, className) => {
737          sizeClasses = className.match(/elementor-(sm|md)-[0-9]+/g)?.join(' ');
738          return sizeClasses;
739        });
740        this.elements.$buttonsContainer.addClass(sizeClasses);
741      }
742
743      getStepButton(buttonType, index) {
744        const {
745              classes
746            } = this.getSettings(),
747            $button = this.getButton(buttonType, index).on('click', () => this.applyStep(buttonType)),
748            buttonWrapperClasses = [classes.fieldGroup, classes.buttonWrapper, 'elementor-field-type-' + buttonType];
749        return jQuery('<div>', {
750          class: buttonWrapperClasses.join(' ')
751        }).append($button);
752      }
753
754      getSubmitButton() {
755        const {
756          classes
757        } = this.getSettings();
758        this.elements.$submitButton.addClass(classes.button); // TODO: When a solution for the conditions will be found, check if can remove the elementor-col-x manipulation.
759
760        return this.elements.$submitWrapper.attr('class', (index, className) => {
761          return this.replaceClassNameColSize(className, '');
762        }).removeClass(classes.column).removeClass(classes.buttons).addClass(classes.buttonWrapper);
763      }
764
765      replaceClassNameColSize(className, value) {
766        return className.replace(/elementor-col-([0-9]+)/g, value);
767      }
768
769      getButton(buttonType, index) {
770        const {
771              classes
772            } = this.getSettings(),
773            submitSizeClass = this.elements.$submitButton.attr('class').match(/elementor-size-([^\W\d]+)/g),
774            buttonClasses = [classes.elementorButton, submitSizeClass, classes.button, classes.button + '-' + buttonType];
775        return jQuery('<button>', {
776          type: 'button',
777          text: this.getButtonLabel(buttonType, index),
778          class: buttonClasses.join(' ')
779        });
780      }
781
782      getButtonLabel(buttonType, index) {
783        const stepsSettings = this.getElementSettings(),
784            stepData = this.data.steps[index],
785            buttonName = buttonType + 'Button',
786            buttonSettingsProp = `step_${buttonType}_label`;
787        return stepData[buttonName] || stepsSettings[buttonSettingsProp];
788      }
789
790      applyStep(direction) {
791        const nextIndex = 'next' === direction ? this.state.currentStep + 1 : this.state.currentStep - 1;
792
793        if ('next' === direction && !this.isFieldsValid(this.elements.$stepWrapper)) {
794          return false;
795        }
796
797        this.goToStep(nextIndex);
798        this.state.currentStep = nextIndex;
799
800        if ('progress_bar' === this.state.stepsType) {
801          this.setProgressBar();
802        } else if ('none' !== this.state.stepsType) {
803          this.updateIndicatorsState(direction);
804        }
805      }
806
807      goToStep(index) {
808        const {
809          classes
810        } = this.getSettings();
811        this.elements.$stepWrapper.eq(this.state.currentStep).addClass(classe
811s.hidden);
812        this.elements.$stepWrapper.eq(index).removeClass(classes.hidden).children(this.getSettings('selectors.fieldGroup')).first().find(':input').first().trigger('focus');
813      }
814
815      isFieldsValid($stepWrapper) {
816        let isValid = true;
817        $stepWrapper.eq(this.state.currentStep).find('.elementor-field-group :input').each((index, el) => {
818          if (!el.checkValidity()) {
819            el.reportValidity();
820            return isValid = false;
821          }
822        });
823        return isValid;
824      }
825
826      isLastStep() {
827        return this.state.currentStep === this.data.steps.length - 1;
828      }
829
830      resetForm() {
831        this.state.currentStep = 0;
832        this.resetSteps();
833
834        if ('progress_bar' === this.state.stepsType) {
835          this.setProgressBar();
836        } else if ('none' !== this.state.stepsType) {
837          this.elements.$currentIndicator = this.elements.$indicators.eq(this.state.currentStep);
838          this.resetIndicators();
839        }
840      }
841
842      resetSteps() {
843        const {
844          classes
845        } = this.getSettings();
846        this.elements.$stepWrapper.addClass(classes.hidden).eq(0).removeClass(classes.hidden);
847      }
848
849      resetIndicators() {
850        const {
851              classes
852            } = this.getSettings(),
853            stateTypes = ['inactive', 'active', 'completed'],
854            stateClasses = stateTypes.map(state => classes.indicator + '--state-' + state);
855        this.elements.$indicators.removeClass(stateClasses.join(' ')).not(this.elements.$indicators.eq(0)).addClass(classes.indicatorInactive);
856        this.elements.$indicators.eq(0).addClass(classes.indicatorActive);
857      }
858
859      updateIndicatorsState(direction) {
860        const {
861              classes
862            } = this.getSettings(),
863            indicatorsClasses = {
864              current: {
865                remove: classes.indicatorActive,
866                add: 'next' === direction ? classes.indicatorCompleted : classes.indicatorInactive
867              },
868              next: {
869                remove: 'next' === direction ? classes.indicatorInactive : classes.indicatorCompleted,
870                add: classes.indicatorActive
871              }
872            };
873        this.elements.$currentIndicator.removeClass(indicatorsClasses.current.remove).addClass(indicatorsClasses.current.add);
874        this.elements.$currentIndicator = this.elements.$indicators.eq(this.state.currentStep);
875        this.elements.$currentIndicator.removeClass(indicatorsClasses.next.remove).addClass(indicatorsClasses.next.add); // Updating an indicator svg fill color, if loaded inside an object tag.
876
877        this.data.indicatorsWithObjectTags.forEach($element => {
878          $element.contents().children('svg').css('fill', $element.css('fill'));
879        });
880      }
881
882      updateValue(updatedValue) {
883        const actionsMap = {
884          step_type: () => this.updateStepsType(),
885          step_icon_shape: () => this.updateStepsShape(),
886          step_next_label: () => this.updateStepButtonsLabel('next'),
887          step_previous_label: () => this.updateStepButtonsLabel('previous')
888        };
889
890        if (actionsMap[updatedValue]) {
891          actionsMap[updatedValue]();
892        }
893      }
894
895      updateStepsType() {
896        const stepsSettings = this.getElementSettings();
897
898        if (this.elements.$indicatorsWrapper) {
899          this.elements.$indicatorsWrapper.remove();
900        }
901
902        if ('none' !== stepsSettings.step_type) {
903          this.rebuildIndicators();
904        }
905
906        this.state.stepsType = stepsSettings.step_type;
907      }
908
909      rebuildIndicators() {
910        this.elements = {
911          ...this.elements,
912          ...this.createStepsIndicators()
913        };
914        this.initProgressBar();
915      }
916
917      updateStepsShape() {
918        const stepsSettings = this.getElementSettings(),
919            {
920              selectors,
921              classes
922            } = this.getSettings(),
923            shapeClassStart = classes.indicator + '--shape-',
924            currentShapeClass = shapeClassStart + this.state.stepsShape,
925            newShapeClass = shapeClassStart + stepsSettings.step_icon_shape;
926        let elementsTargetType = '';
927
928        if (stepsSettings.step_type.includes('icon')) {
929          elementsTargetType = 'icon';
930        } else if (stepsSettings.step_type.includes('number')) {
931          elementsTargetType = 'number';
932        }
933
934        this.elements.$indicators.children(selectors.indicator + '__' + elementsTargetType).removeClass(currentShapeClass).addClass(newShapeClass);
935        this.state.stepsShape = stepsSettings.step_icon_shape;
936      }
937
938      updateStepButtonsLabel(buttonType) {
939        const {
940              selectors
941            } = this.getSettings(),
942            buttonSelector = {
943              previous: selectors.button + '-previous',
944              next: selectors.button + '-next'
945            };
946        this.elements.$stepWrapper.each((index, el) => {
947          jQuery(el).find(buttonSelector[buttonType]).text(this.getButtonLabel(buttonType, index));
948        });
949      }
950
951      onFormError() {
952        const {
953              selectors
954            } = this.getSettings(),
955            $errorStepElement = this.elements.$form.find(selectors.formHelpInline).closest(selectors.stepWrapper);
956
957        if ($errorStepElement.length) {
958          this.goToStep($errorStepElement.index());
959        }
960      }
961
962      onElementChange(updatedValue) {
963        if (!this.isStepsExist()) {
964          return;
965        }
966
967        this.updateValue(updatedValue);
968      }
969
970    }
971
972    exports["default"] = FormSteps;
973
974    /***/ }),
975
976  
976/***/ "../modules/forms/assets/js/frontend/handlers/recaptcha.js":
977  /*!*****************************************************************!*\
978    !*** ../modules/forms/assets/js/frontend/handlers/recaptcha.js ***!
979    \*****************************************************************/
980  /***/ ((__unused_webpack_module, exports) => {
981
982
983
984    Object.defineProperty(exports, "__esModule", ({
985      value: true
986    }));
987    exports["default"] = void 0;
988
989    class Recaptcha extends elementorModules.frontend.handlers.Base {
990      getDefaultSettings() {
991        return {
992          selectors: {
993            recaptcha: '.elementor-g-recaptcha:last',
994            submit: 'button[type="submit"]',
995            recaptchaResponse: '[name="g-recaptcha-response"]'
996          }
997        };
998      }
999
1000      getDefaultElements() {
1001        const {
1002              selectors
1003            } = this.getDefaultSettings(),
1004            elements = {
1005              $recaptcha: this.$element.find(selectors.recaptcha)
1006            };
1007        elements.$form = elements.$recaptcha.parents('form');
1008        elements.$submit = elements.$form.find(selectors.submit);
1009        return elements;
1010      }
1011
1012      bindEvents() {
1013        this.onRecaptchaApiReady();
1014      }
1015
1016      isActive(settings) {
1017        const {
1018          selectors
1019        } = this.getDefaultSettings();
1020        return settings.$element.find(selectors.recaptcha).length;
1021      }
1022
1023      addRecaptcha() {
1024        const settings = this.elements.$recaptcha.data(),
1025            isV2 = 'v3' !== settings.type,
1026            captchaIds = [];
1027        captchaIds.forEach(id => window.grecaptcha.reset(id));
1028        const widgetId = window.grecaptcha.render(this.elements.$recaptcha[0], settings);
1029        this.elements.$form.on('reset error', () => {
1030          window.grecaptcha.reset(widgetId);
1031        });
1032
1033        if (isV2) {
1034          this.elements.$recaptcha.data('widgetId', widgetId);
1035        } else {
1036          captchaIds.push(widgetId);
1037          this.elements.$submit.on('click', e => this.onV3FormSubmit(e, widgetId));
1038        }
1039      }
1040
1041      onV3FormSubmit(e, widgetId) {
1042        e.preventDefault();
1043        window.grecaptcha.ready(() => {
1044          const $form = this.elements.$form;
1045          grecaptcha.execute(widgetId, {
1046            action: this.elements.$recaptcha.data('action')
1047          }).then(token => {
1048            if (this.elements.$recaptchaResponse) {
1049              this.elements.$recaptchaResponse.val(token);
1050            } else {
1051              this.elements.$recaptchaResponse = jQuery('<input>', {
1052                type: 'hidden',
1053                value: token,
1054                name: 'g-recaptcha-response'
1055              });
1056              $form.append(this.elements.$recaptchaResponse);
1057            } // Support old browsers.
1058
1059
1060            const bcSupport = !$form[0].reportValidity || 'function' !== typeof $form[0].reportValidity;
1061
1062            if (bcSupport || $form[0].reportValidity()) {
1063              $form.trigger('submit');
1064            }
1065          });
1066        });
1067      }
1068
1069      onRecaptchaApiReady() {
1070        if (window.grecaptcha && window.grecaptcha.render) {
1071          this.addRecaptcha();
1072        } else {
1073          // If not ready check again by timeout..
1074          setTimeout(() => this.onRecaptchaApiReady(), 350);
1075        }
1076      }
1077
1078    }
1079
1080    exports["default"] = Recaptcha;
1081
1082    /***/ })
1082
1083
1084}]);
1085//# sourceMappingURL=form.23168c11e0d20fa0282b.bundle.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.