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> </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.