PluginProbe
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder / 51.1.37
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder v51.1.37
51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 51.1.46 51.1.47 51.1.49 All 37 releases
king-addons / includes / widgets / Form_Builder / script.js

script.js in King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder 51.1.37, at includes/widgets/Form_Builder/script.js

781 lines 41.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2 (function ($) {
3 $(window).on('elementor/frontend/init', function () {
4 elementorFrontend.hooks.addAction('frontend/element_ready/king-addons-form-builder.default', function ($scope) {
5 elementorFrontend.elementsHandler.addHandler(elementorModules.frontend.handlers.Base.extend({
6 onInit: function onInit() {
7 let $scope = this.$element;
8
9 console.log("FORM BUILDER");
10
11 var formContent = {};
12
13 var fileUrl = {};
14
15 if ($('body').find('.king-addons-form-field-type-recaptcha-v3').length > 0) {
16 var script = document.createElement('script');
17 script.src = 'https://www.google.com/recaptcha/api.js?render=' + $scope.find('#g-recaptcha-response').data('site-key') + '';
18 document.body.appendChild(script);
19 }
20
21 var currentTab = 0;
22 if (0 < $scope.find('.king-addons-fb-step-tab').length) {
23 console.log(currentTab);
24 showTab(currentTab);
25
26 $scope.find('.king-addons-fb-step-prev').each(function () {
27 $(this).on('click', function () {
28 nextPrev(-1);
29 });
30 });
31
32 $scope.find(".king-addons-fb-step-next").each(function () {
33 $(this).on('click', function () {
34 nextPrev(1);
35 });
36 });
37 }
38
39 var actions = $scope.find('.king-addons-form-field-type-submit').data('actions');
40
41 $scope.find('input[type="file"]').on('change', function (e) {
42 var files = this.files;
43 var thisInput = $(this);
44 var eventType = e.type;
45 handleFileValidityAndUpload(thisInput, files, eventType);
46 });
47
48 $scope.find('input, select, textarea').each(function () {
49 $(this).on('change', function () {
50 var $this = $(this);
51 if ('checkbox' == $this.attr('type')) {
52 var $option = $this.closest('.king-addons-form-field-option');
53 if ($option.hasClass('king-addons-checked')) {
54 $option.removeClass('king-addons-checked');
55 } else {
56 $option.addClass('king-addons-checked');
57 }
58 } else if ('radio' == $this.attr('type')) {
59
60 var name = $this.attr('name');
61 var $group = $('input[type="radio"][name="' + name + '"]');
62
63
64 $group.closest('.king-addons-form-field-option').removeClass('king-addons-checked');
65
66
67 if ($this.is(':checked')) {
68 $this.closest('.king-addons-form-field-option').addClass('king-addons-checked');
69 }
70 }
71 });
72
73 $(this).on('input change keyup', function (e) {
74 if ($(this).closest('.king-addons-select-wrap').length > 0) {
75 $(this).closest('.king-addons-select-wrap').removeClass('king-addons-form-error-wrap');
76 }
77 $(this).removeClass('king-addons-form-error');
78 $(this).closest('.king-addons-field-group').find('.king-addons-submit-error').remove();
79 });
80 });
81
82 $scope.find('.king-addons-button').on('click', function (e) {
83 e.preventDefault();
84
85 var eventType = e.type;
86
87 formContent = {};
88
89
90 let fileUploadPromises = [];
91
92 if (0 < $scope.find('input[type="file"').length) {
93 $scope.find('input[type="file"]').each(function () {
94 var files = this.files;
95 var thisInput = $(this);
96
97 fileUploadPromises.push(handleFileValidityAndUpload(thisInput, files, eventType));
98 });
99
100
101 Promise.all(fileUploadPromises)
102 .then(() => {
103 createFormContent();
104
105
106 if (validateForm()) {
107 $(this).closest('form').trigger('submit');
108 }
109 })
110 .catch((error) => {
111
112 console.error(error);
113 });
114 } else {
115 createFormContent();
116
117 if (validateForm()) {
118 $(this).closest('form').trigger('submit');
119 }
120 }
121 });
122
123
124 $scope.find('form').on('submit', function (e) {
125
126 e.preventDefault();
127
128 let responsesArray = [];
129
130 $scope.find('.king-addons-button>span').addClass('king-addons-loader-hidden');
131 $scope.find('.king-addons-button').find('.king-addons-double-bounce').removeClass('king-addons-loader-hidden');
132
133 if ($scope.find('.king-addons-submit-error')) {
134 $scope.find('.king-addons-submit-error').remove();
135 }
136
137 if ($scope.find('.king-addons-submit-success')) {
138 $scope.find('.king-addons-submit-success').remove();
139 }
140
141 function processRecaptcha(callback) {
142 if ($scope.find('#g-recaptcha-response').length > 0) {
143 grecaptcha.ready(function () {
144 grecaptcha.execute(KingAddonsFormBuilderData.recaptcha_v3_site_key, {action: 'submit'}).then(function (token) {
145
146 $scope.find('#g-recaptcha-response').val(token);
147
148
149 $.ajax({
150 type: 'POST',
151 url: KingAddonsFormBuilderData.ajaxurl,
152 data: {
153 action: 'king_addons_verify_recaptcha',
154 'g-recaptcha-response': token
155 },
156 success: function (response) {
157 if (!response.success) {
158 console.log(response);
159 setTimeout(function () {
160 $scope.find('.king-addons-button').find('.king-addons-double-bounce').addClass('king-addons-loader-hidden');
161 $scope.find('.king-addons-button>span').removeClass('king-addons-loader-hidden');
162 $scope.find('form').append('<p class="king-addons-submit-error">' + KingAddonsFormBuilderData.recaptcha_error + '</p>');
163 }, 500);
164 callback(false);
165 } else {
166 console.log(response);
167 callback(true);
168 }
169 },
170 error: function (error) {
171 console.log(error);
172 setTimeout(function () {
173 $scope.find('.king-addons-button').find('.king-addons-double-bounce').addClass('king-addons-loader-hidden');
174 $scope.find('.king-addons-button>span').removeClass('king-addons-loader-hidden');
175 $scope.find('form').append('<p class="king-addons-submit-error">' + KingAddonsFormBuilderData.recaptcha_error + '</p>');
176 }, 500);
177 callback(false);
178 }
179 });
180 });
181 });
182 } else {
183 callback(true);
184 }
185 }
186
187
188 processRecaptcha(function (isRecaptchaSuccessful) {
189 if (isRecaptchaSuccessful) {
190
191
192 var actionsObject = {
193 emailPromise: sendEmail,
194 submissionsPromise: createPost,
195 mailchimpPromise: subscribeMailchimp,
196 webhookPromise: sendWebhook
197 }
198
199
200 Promise.all(
201 actions.map((action) => {
202 try {
203 if (actionsObject[action + 'Promise']) {
204 return actionsObject[action + 'Promise']();
205 }
206 } catch (error) {
207 console.error(error);
208 return Promise.reject(error);
209 }
210 })
211 )
212 .then((responses) => {
213 console.log(responses);
214
215
216 const createPostResponse = responses.find((response) => response && response.data.action === 'king_addons_form_builder_submissions');
217
218 const postId = createPostResponse ? createPostResponse.data.post_id : null;
219
220
221 var updateMetaPromises = actions.map((action) => {
222 if (action !== 'redirect') {
223 action = 'king_addons_form_builder_' + action;
224
225
226 const response = responses.find((response) => response && response.data.action === action);
227
228
229 const message = response ? response.data.message : '';
230
231 if (response && response.data.status === 'success') {
232 responsesArray.push('success');
233
234 if (postId) {
235 return updateFormActionMeta(postId, action, 'success', message);
236 }
237 } else {
238 responsesArray.push('error');
239
240 if (postId) {
241 return updateFormActionMeta(postId, action, 'error', message);
242 }
243 }
244 }
245 });
246
247 return Promise.all(updateMetaPromises).then(() => {
248 if (responsesArray.includes('error')) {
249 var sanitizedErrorMessage = $('<div>').text($scope.data('settings').error_message).html();
250 $scope.find('form').append('<p class="king-addons-submit-error">' + sanitizedErrorMessage + '</p>');
251 } else {
252 $scope.find('form').append(
253 $('<p class="king-addons-submit-success"></p>').text($scope.data('settings').success_message)
254 );
255
256 $scope.find('button').attr('disabled', true);
257 $scope.find('button').css('opacity', 0.6);
258 }
259 });
260
261 })
262 .catch((error) => {
263
264 console.error(error);
265 })
266 .then(() => {
267
268 setTimeout(function () {
269
270 $scope.find('.king-addons-button').find('.king-addons-double-bounce').addClass('king-addons-loader-hidden');
271 $scope.find('.king-addons-button>span').removeClass('king-addons-loader-hidden');
272 setTimeout(function () {
273 if (actions.includes('redirect') && responsesArray.includes('success')) {
274
275 $(location).prop('href', $scope.find('.king-addons-form-field-type-submit').data('redirect-url'))
276 }
277 }, 500);
278 }, 500);
279 })
280 .catch((error) => {
281
282 console.error(error);
283 });
284 } else {
285
286 return false;
287 }
288 });
289
290 function updateFormActionMeta(postId, actionName, status, message) {
291 return $.ajax({
292 type: 'POST',
293 url: KingAddonsFormBuilderData.ajaxurl,
294 data: {
295 action: 'king_addons_update_form_action_meta',
296 nonce: KingAddonsFormBuilderData.nonce,
297 post_id: postId,
298 action_name: actionName,
299 status: status,
300 message: message
301 },
302 });
303 }
304
305 function deepCopy(obj) {
306 return JSON.parse(JSON.stringify(obj));
307 }
308
309 function sendEmail() {
310 var data = deepCopy(formContent);
311
312 for (let key in data) {
313 if (data[key][0] == 'radio' || data[key][0] == 'checkbox') {
314 if (Array.isArray(data[key][1])) {
315 let trueValues = data[key][1].filter(innerArray => innerArray[1] === true).map(innerArray => innerArray[0]);
316 let trueValuesString = trueValues.join(', ');
317 data[key][1] = trueValuesString;
318 }
319 }
320 }
321
322 return $.ajax({
323 type: 'POST',
324 url: KingAddonsFormBuilderData.ajaxurl,
325 data: {
326 action: 'king_addons_form_builder_email',
327 nonce: KingAddonsFormBuilderData.nonce,
328 form_content: data,
329 king_addons_form_id: $scope.find('input[name="form_id"]').val(),
330 },
331 success: function (response) {
332 console.log(response);
333 if (!response.success) {
334
335
336
337 } else {
338
339
340
341 }
342 },
343 error: function (error) {
344
345
346
347 }
348 });
349 }
350
351 function sendWebhook() {
352 var data = deepCopy(formContent);
353
354 for (let key in data) {
355 if (data[key][0] == 'radio' || data[key][0] == 'checkbox') {
356 if (Array.isArray(data[key][1])) {
357 let trueValues = data[key][1].filter(innerArray => innerArray[1] === true).map(innerArray => innerArray[0]);
358 let trueValuesString = trueValues.join(', ');
359 data[key][1] = trueValuesString;
360 }
361 }
362 }
363
364 return $.ajax({
365 type: 'POST',
366 url: KingAddonsFormBuilderData.ajaxurl,
367 data: {
368 action: 'king_addons_form_builder_webhook',
369 nonce: KingAddonsFormBuilderData.nonce,
370 form_content: data,
371 king_addons_form_id: $scope.find('input[name="form_id"]').val(),
372 form_name: $scope.find('form').attr('name')
373 },
374 success: function (response) {
375 console.log(response);
376 if (!response.success) {
377
378
379
380 } else {
381
382
383
384 }
385 },
386 error: function (error) {
387 console.log(error);
388
389
390
391 }
392 });
393 }
394
395 function createPost() {
396
397 var data = {
398 action: 'king_addons_form_builder_submissions',
399 nonce: KingAddonsFormBuilderData.nonce,
400 form_content: formContent,
401 status: 'publish',
402 form_name: $scope.find('form').attr('name'),
403 form_id: $scope.find('input[name="form_id"]').val(),
404 form_page: $scope.find('form').attr('page'),
405 form_page_id: $scope.find('form').attr('page_id')
406 };
407
408 return $.ajax({
409 type: 'POST',
410 url: KingAddonsFormBuilderData.ajaxurl,
411 data: data,
412 success: function (response) {
413 console.log(response);
414
415
416
417 },
418 error: function (error) {
419 console.log(error)
420
421
422
423 }
424 });
425 }
426
427 function subscribeMailchimp() {
428
429 const submitButton = $scope.find('.king-addons-form-field-type-submit');
430 const mailchimpFields = JSON.parse(submitButton.attr('data-mailchimp-fields'));
431
432 let formData = {};
433
434 Object.keys(mailchimpFields).forEach(function (fieldId) {
435 if (fieldId == 'group_id') {
436
437 var fieldValue = Array.isArray(mailchimpFields[fieldId]) ? mailchimpFields[fieldId].join(',') : mailchimpFields[fieldId];
438 } else {
439 var fieldValue = $scope.find('#form-field-' + mailchimpFields[fieldId]).val();
440 }
441 if (fieldValue) {
442 if (fieldId == 'birthday_field') {
443 formData[fieldId] = convertToMailchimpBirthdayFormat(fieldValue);
444 } else {
445 formData[fieldId] = fieldValue;
446 }
447 }
448 });
449
450 return $.ajax({
451 url: KingAddonsFormBuilderData.ajaxurl,
452 method: 'POST',
453 data: {
454 action: 'king_addons_form_builder_mailchimp',
455 nonce: KingAddonsFormBuilderData.nonce,
456 form_data: formData,
457 listId: submitButton.data('list-id')
458
459 },
460 beforeSend: function () {
461 submitButton.prop('disabled', true);
462 },
463 success: function (response) {
464 console.log(response);
465 if (!response.success) {
466
467
468
469 } else {
470
471
472
473 }
474
475 },
476 error: function (jqXHR, textStatus, errorThrown) {
477 console.log(errorThrown);
478
479
480
481 },
482 complete: function () {
483 submitButton.prop('disabled', false);
484 }
485 });
486 }
487 });
488
489 function createFormContent() {
490 $scope.find('.king-addons-form-field, .king-addons-form-field-type-radio, .king-addons-form-field-type-checkbox, .king-addons-fb-step-input').each(function () {
491
492 var label = '';
493 if ($(this).prev('label')) {
494 label = $(this).prev('label').text().trim();
495 } else {
496 label = '';
497 }
498
499 if ('textarea' !== $(this).prop('tagName').toLowerCase()) {
500 if ($(this).hasClass('king-addons-select-wrap')) {
501 var selectValue = $(this).find('select').val();
502 if (Array.isArray($(this).find('select').val())) {
503 selectValue = $(this).find('select').val().join(', ');
504 } else {
505 selectValue = $(this).find('select').val();
506 }
507 formContent[$(this).find('select').attr('id').replace('-', '_')] = ['select', selectValue, label];
508 } else if ($(this).hasClass('king-addons-form-field-type-radio') || $(this).hasClass('king-addons-form-field-type-checkbox')) {
509 var valuesArray = [];
510 var checkedField = $(this).find('input');
511 var type;
512 checkedField.each(function () {
513 valuesArray.push([$(this).val(), $(this).is(':checked'), $(this).attr('name'), $(this).attr('id')]);
514 });
515
516 if ($(this).hasClass('king-addons-form-field-type-radio')) {
517 type = 'radio'
518 } else {
519 type = 'checkbox';
520 }
521
522 var inputLabel = $(this).find('.king-addons-form-field-label').text().trim();
523
524 if (checkedField.length > 0) {
525 formContent[$(this).find('.king-addons-form-field-option').data('key').replace('-', '_')] = [type, valuesArray, inputLabel];
526 }
527 } else if ($(this).hasClass('king-addons-fb-step-input')) {
528 formContent[$(this).attr('id').replace('-', '_')] = [$(this).attr('type'), '', $(this).val(), label];
529 } else {
530 if ($(this).attr('type') == 'file') {
531 formContent[$(this).attr('id').replace('-', '_')] = [$(this).attr('type'), fileUrl[$(this).attr('id')], label];
532 } else {
533 formContent[$(this).attr('id').replace('-', '_')] = [$(this).attr('type'), $(this).val(), label];
534 }
535 }
536 } else {
537 formContent[$(this).attr('id').replace('-', '_')] = [$(this).prop('tagName').toLowerCase(), $(this).val(), label];
538 }
539
540 });
541 }
542
543 function handleFileValidityAndUpload(thisInput, files, eventType) {
544 var thisId = thisInput.attr('id');
545
546 if (0 < thisInput.closest('.king-addons-field-group').find('.king-addons-submit-error').length) {
547 thisInput.closest('.king-addons-field-group').find('.king-addons-submit-error').remove();
548 }
549
550
551 var maxFileSize = thisInput.data('maxfs') ? thisInput.data('maxfs') : 0;
552 var allowedFileTypes = thisInput.data('allft') ? thisInput.data('allft') : 0;
553
554
555 let uploadPromises = [];
556
557 for (let i = 0; i < files.length; i++) {
558 var fileInput = files[i];
559
560
561 var formDataForFile = new FormData();
562 formDataForFile.append('action', 'king_addons_upload_file');
563 formDataForFile.append('uploaded_file', fileInput);
564 formDataForFile.append('max_file_size', maxFileSize);
565 formDataForFile.append('allowed_file_types', allowedFileTypes);
566 formDataForFile.append('triggering_event', eventType);
567 formDataForFile.append('king_addons_fb_nonce', KingAddonsFormBuilderData.nonce);
568
569 if ('click' == eventType) {
570 if (!fileUrl[thisId]) {
571 fileUrl[thisId] = [];
572 }
573 }
574
575
576 uploadPromises.push(
577 new Promise((resolve, reject) => {
578 $.ajax({
579 url: KingAddonsFormBuilderData.ajaxurl,
580 type: 'POST',
581 data: formDataForFile,
582 processData: false,
583 contentType: false,
584 success: function (response) {
585 if (response.success) {
586
587 console.log(response);
588 if (eventType == 'click') {
589 fileUrl[thisId][i] = response.data.url;
590 }
591 resolve(response);
592 } else {
593 console.error('Error:', response);
594 if (response.data) {
595 if ('filesize' === response.data.cause) {
596 let maxFileNotice = thisInput.data('maxfs-notice') ? thisInput.data('maxfs-notice') : response.data.message;
597 thisInput.closest('.king-addons-field-group').append('<p class="king-addons-submit-error">' + maxFileNotice + '</p>');
598 }
599
600 if ('filetype' == response.data.cause) {
601 thisInput.closest('.king-addons-field-group').append('<p class="king-addons-submit-error">' + response.data.message + '</p>');
602 }
603 }
604
605 reject(response);
606 }
607 },
608 error: function (error) {
609 if ('filesize' === error.cause) {
610 let maxFileNotice = thisInput.data('maxfs-notice') ? thisInput.data('maxfs-notice') : error.message;
611 thisInput.closest('.king-addons-field-group').append('<p class="king-addons-submit-error">' + maxFileNotice + '</p>');
612 }
613
614 if ('filetype' == error.cause) {
615 thisInput.closest('.king-addons-field-group').append('<p class="king-addons-submit-error">' + error.message + '</p>');
616 }
617 console.log(error);
618 reject(error);
619 },
620 });
621 }),
622 );
623 }
624
625
626 return Promise.all(uploadPromises);
627 }
628
629 function convertToMailchimpBirthdayFormat(dateString) {
630 const date = new Date(dateString);
631 const month = (date.getMonth() + 1).toString().padStart(2, '0');
632 const day = date.getDate().toString().padStart(2, '0');
633 return `${month}/${day}`;
634 }
635
636 function showTab(n) {
637
638 var $stepTab = $scope.find(".king-addons-fb-step-tab");
639 $stepTab.eq(n).removeClass('king-addons-fb-step-tab-hidden');
640
641 if (n === 0) {
642 $scope.find(".king-addons-fb-step-prev").hide();
643 } else {
644 $scope.find(".king-addons-fb-step-prev").show();
645 }
646
647 fixStepIndicator(n);
648 }
649
650 function nextPrev(n) {
651
652 var $stepTab = $scope.find(".king-addons-fb-step-tab");
653
654
655 if (n === 1 && !validateForm()) {
656 return false;
657 }
658
659 $stepTab.eq(currentTab).addClass('king-addons-fb-step-tab-hidden');
660
661 currentTab = currentTab + n;
662
663 if (currentTab >= $stepTab.length) {
664
665 $scope.find("form").submit();
666 return false;
667 }
668
669 showTab(currentTab);
670 }
671
672 function validateForm() {
673 var valid = true;
674 var $stepTab = $scope.find(".king-addons-fb-step-tab");
675 if (!($stepTab.length > 0)) {
676 $stepTab = $scope.find('.king-addons-form-fields-wrap');
677 currentTab = 0;
678 }
679 var $types = ['text', 'email', 'password', 'file', 'url', 'tel', 'number', 'date', 'datetime-local', 'time', 'week', 'month', 'color'];
680
681 $stepTab.eq(currentTab).find('input, select, textarea').each(function () {
682 const type = $(this).attr('type');
683
684 var requiredField = $(this).closest('.king-addons-field-group').find('.king-addons-form-field').attr('required') === 'required' || $(this).closest('.king-addons-field-group').find('.king-addons-form-field-textual').attr('required') === 'required';
685
686
687
688
689
690 if (type !== undefined && $.inArray(type, $types) !== -1 && $(this).val() === '' && requiredField) {
691
692 $(this).addClass("king-addons-form-error");
693
694 valid = false;
695 } else if (type === 'radio' || type === 'checkbox') {
696 let requiredOption = $(this).closest('.king-addons-field-group').find('.king-addons-form-field-option input').attr('required') === 'required';
697
698 if (requiredOption && $stepTab.eq(currentTab).find('input[type="' + type + '"]:checked').length === 0) {
699
700 $(this).addClass("king-addons-form-error");
701
702 valid = false;
703 }
704 } else if (requiredField && this.tagName === 'SELECT' && $(this).val().trim() === '') {
705
706 $(this).closest('.king-addons-select-wrap').addClass('king-addons-form-error-wrap');
707
708 $(this).addClass("king-addons-form-error");
709
710 valid = false;
711 } else if (requiredField && this.tagName === 'TEXTAREA' && $(this).val().trim() === '') {
712
713 $(this).addClass("king-addons-form-error");
714
715 valid = false;
716 }
717 });
718
719 if (!valid) {
720 $stepTab.eq(currentTab).find('.king-addons-form-error, .king-addons-form-error-wrap').each(function () {
721 if (!($(this).closest('.king-addons-field-group').find('.king-addons-submit-error').length > 0)) {
722 if ($(this).attr('type') == 'file') {
723 $(this).closest('.king-addons-field-group').append('<p class="king-addons-submit-error">' + KingAddonsFormBuilderData.file_empty + '</p>');
724 } else if ($(this).is('select') || $(this).attr('type') === 'radio' || $(this).attr('type') === 'checkbox') {
725 $(this).closest('.king-addons-field-group').append('<p class="king-addons-submit-error">' + KingAddonsFormBuilderData.select_empty + '</p>');
726 } else {
727 $(this).closest('.king-addons-field-group').append('<p class="king-addons-submit-error">' + KingAddonsFormBuilderData.input_empty + '</p>');
728 }
729 }
730 });
731 }
732
733 if (valid) {
734 $scope.find(".king-addons-fb-step").eq(currentTab).addClass("king-addons-fb-step-finish");
735 } else {
736 if ($scope.find(".king-addons-fb-step").eq(currentTab).hasClass('king-addons-fb-step-finish')) {
737 $scope.find(".king-addons-fb-step").eq(currentTab).removeClass('king-addons-fb-step-finish');
738 }
739 }
740
741 return valid;
742 }
743
744 function fixStepIndicator(n) {
745
746 var $step = $scope.find(".king-addons-fb-step");
747 $step.removeClass("king-addons-fb-step-active");
748
749 $step.eq(n).addClass("king-addons-fb-step-active");
750
751 if ($scope.find('.king-addons-fb-step-active').hasClass('king-addons-fb-step-finish')) {
752 $scope.find('.king-addons-fb-step-active').removeClass('king-addons-fb-step-finish');
753 }
754
755 const stepTabs = $scope.find('.king-addons-fb-step-tab');
756 const progressBarFill = $scope.find('.king-addons-fb-step-progress-fill');
757
758 let currentStep = n + 1;
759
760 updateProgressBar()
761
762 function updateProgressBar() {
763 const totalSteps = stepTabs.length;
764 const progressPercentage = (currentStep / totalSteps) * 100;
765
766 progressBarFill.css('width', progressPercentage + '%');
767 setTimeout(function () {
768 progressBarFill.text(Math.round(progressPercentage) + '%');
769 }, 500);
770 }
771 }
772
773
774
775 },
776 }), {
777 $element: $scope
778 });
779 });
780 });
781 })(jQuery);