관리-도구
편집 파일: onboarding.js
var softaculous_pro_show_themes_loaded = 0; jQuery(document).ready(function(){ let url = new URL(window.location.href); let step = url.searchParams.get('step'); if(step === 'import_theme'){ jQuery('.softaculous-pro-wizard-sidebar').addClass('compact'); jQuery('.softaculous-pro-setup-logo').hide(); jQuery('.active_step').find('span').css('min-width', '0'); if(!softaculous_pro_show_themes_loaded){ softaculous_pro_show_themes(); } } var feature_holder = jQuery('.softaculous-pro-features'); feature_holder.each(function(){ var feature_checked = jQuery(this).find('input').is(":checked"); if(feature_checked){ jQuery(this).addClass("feature-border"); } }); feature_holder.click(function(){ var feature_disabled = jQuery(this).find('input').is(":disabled"); if(feature_disabled && !jQuery(this).hasClass("spro-erro")){ var selected_erro = jQuery(this).find('input').attr('spro-erro'); const para = jQuery('<p>'+selected_erro+'</p>').css('color', 'red'); jQuery(this).find('.softaculous-pro-features-text').find('p').replaceWith(para); jQuery(this).addClass("spro-erro"); } }); if(jQuery('.softaculous-pro-wizard').length > 0){ window.addEventListener('popstate', function(event){ // Get the current URL let url = new URL(window.location.href); let step = url.searchParams.get('step'); if(step){ softaculous_pro_set_active_step(step); } }); } }); function softaculous_pro_set_active_step(step) { // Active Tab jQuery('.softaculous-pro-steps-holder ol li').removeClass('active_step'); if(step ==='import_theme'){ jQuery('.softaculous-pro-steps-holder ol li [data-step="'+step+'"]').closest('li').addClass('active_step'); jQuery('.softaculous-pro-wizard-sidebar').addClass('compact'); jQuery('.softaculous-pro-setup-logo').hide(); jQuery('.active_step').find('span').css('min-width', '0'); }else{ jQuery('.softaculous-pro-steps-holder ol li [data-step="'+step+'"]').closest('li').addClass('active_step'); } // Active Panel jQuery('.softaculous-pro-wizard .softaculous-pro-wizard-content').attr('data-active-panel', step); } function softaculous_pro_next_handler(element) { var ele = jQuery(element); var nextStep = ele.data('step'); var currentStep = ele.closest('[data-panel]').data('panel'); // Save the current URL let currentUrl = window.location.href; if(currentStep === 'welcome'){ if(jQuery("#onboarding_done_confirm").length > 0 && !jQuery("#onboarding_done_confirm").is(":checked")){ alert("Please confirm that you accept data loss since you have already run the onboarding process previously"); return false; } } // Get the current URL let url = new URL(currentUrl); // Add a query parameter url.searchParams.set('step', nextStep); // Replace the current URL without refreshing the page window.history.pushState({ path: currentUrl }, '', url); softaculous_pro_set_active_step(nextStep); jQuery('.softaculous-pro-steps-holder ol li').removeClass('active_step'); jQuery('.softaculous-pro-steps-holder ol li [data-step="'+nextStep+'"]').closest('li').addClass('active_step'); var post_data = null; if(currentStep === 'type'){ var active_step = jQuery('.active_category').children('input').val(); if(active_step === 'Others'){ post_data = jQuery('.softaculous-pro-category-input').children('input').val(); } else{ post_data = active_step; } } if(currentStep === 'title'){ var site_input = jQuery('.softaculous-pro-title-input'); var new_site_title = site_input.children('input').val(); post_data = new_site_title ; } if(currentStep === 'features'){ var selected_feats = []; var feature_holder = jQuery('.softaculous-pro-features'); feature_holder.each(function(){ var feature_checked = jQuery(this).find('input').is(":checked"); if(feature_checked){ var selected_feat = jQuery(this).attr('data-slug'); selected_feats.push(selected_feat); } }); post_data = selected_feats; } if(nextStep === 'import_theme'){ if(!softaculous_pro_show_themes_loaded){ softaculous_pro_show_themes(); } } if(post_data){ jQuery.ajax({ type: 'post', url: soft_pro_obj.ajax_url, data: { action: 'softaculous_pro_setup_info', step: currentStep, softaculous_pro_nonce: softaculous_pro_ajax_nonce, data: post_data, }, success: function (response) {}, }); } } function softaculous_pro_prev_handler(element) { var ele = jQuery(element); var currentStep = ele.closest('[data-panel]').data('panel'); var prevStep = ele.data('step'); let currentUrl = window.location.href; let url = new URL(currentUrl); url.searchParams.set('step', prevStep); window.history.pushState({ path: currentUrl }, '', url); softaculous_pro_set_active_step(prevStep); jQuery('.softaculous-pro-steps-holder ol li').removeClass('active_step'); jQuery('.softaculous-pro-steps-holder ol li [data-step="'+prevStep+'"]').closest('li').addClass('active_step'); } function softaculous_pro_selected_features(element) { var ele_parent = jQuery(element).parent().parent(); if(jQuery(element).is(":checked")){ ele_parent.addClass("feature-border"); }else{ ele_parent.removeClass("feature-border"); } } function softaculous_pro_modal(sel){ var page_names = []; jQuery('.softaculous_pro_img_screen').each(function() { var is_selected = jQuery(this).find('input').is(':checked'); if(is_selected){ var page_name = jQuery(this).attr('page-name'); } page_names.push(page_name); }); page_names.forEach(function(value) { var input = jQuery('<input>').attr('type', 'hidden').attr('name', 'to_import[]').val(value); jQuery('#softaculous-pro-import-form').append(input); }); if(page_names.length == 0){ alert("Please select atleast one page to import"); } else{ jQuery('#softaculous-pro-templates-holder').hide(); var modal = jQuery(sel); modal.show(); modal.find('.softaculous-pro-done').hide(); modal.find('.softaculous-pro-import').show(); var spro_temp_form_data = jQuery('#softaculous-pro-import-form').serialize(); softaculous_pro_handle_templates(spro_temp_form_data); } } function softaculous_pro_handle_templates(spro_temp_form_data){ jQuery('#softaculous-pro-templates-holder').remove(); jQuery('#SproTemplatesModal').hide(); var message = 'Checking the requirements ...'; softaculous_pro_create_html(message, 10, true); // Start progress at 1% jQuery.ajax({ url: softaculous_pro_ajax_url+'action=softaculous_pro_start_install_template', type: 'POST', data: spro_temp_form_data+'&softaculous_pro_nonce='+softaculous_pro_ajax_nonce, success: function(response){ if(!response.success && response.data && response.data.form){ softaculous_handle_ftp_form(response.data.form, spro_temp_form_data); return; } // Install plugin gives too much output, hence match the data var data = response.match(/<softaculous\-pro\-xmlwrap>(.*?)<\/softaculous\-pro\-xmlwrap>/is); if(data){ data = data[1]; } data = JSON.parse(data); softaculous_pro_selected_plugin(data, spro_temp_form_data); }, error: function(jqXHR, textStatus, errorThrown){ softaculous_pro_show_error({err: 'AJAX failure ! Status : '+textStatus+' | Error : '+errorThrown}); } }); } function softaculous_pro_selected_plugin(data, spro_temp_form_data){ if(typeof data === 'object' && 'error' in data){ softaculous_pro_show_error(data['error']); return false; } var message = 'Downloading and installing required plugins'; softaculous_pro_create_html(message, 25, true); // Update progress to 50% jQuery.ajax({ url: softaculous_pro_ajax_url+'action=softaculous_pro_selected_plugin_install', type: 'POST', data: spro_temp_form_data+'&softaculous_pro_nonce='+softaculous_pro_ajax_nonce, dataType: 'json', success: function(data){ softaculous_pro_download_template(data, spro_temp_form_data); }, error: function(jqXHR, textStatus, errorThrown){ softaculous_pro_show_error({err: 'AJAX failure ! Status : '+textStatus+' | Error : '+errorThrown}); } }) } function softaculous_pro_download_template(data, spro_temp_form_data){ var failed = []; if(typeof data === 'object' && 'error' in data){ softaculous_pro_show_error(data['error']); return false; } if(typeof data === 'object' && 'failed_plugin' in data){ failed.push(data['failed_plugin']); } var message = 'Downloading the template'; softaculous_pro_create_html(message, 50, true, failed); // Update progress to 50% // Make the call jQuery.ajax({ url: softaculous_pro_ajax_url+'action=softaculous_pro_download_template', type: 'POST', data: spro_temp_form_data+'&softaculous_pro_nonce='+softaculous_pro_ajax_nonce, dataType: 'json', success: function(data){ data.failed_plugin = failed; softaculous_pro_import_template(data, spro_temp_form_data); }, error: function(jqXHR, textStatus, errorThrown){ softaculous_pro_show_error({err: 'AJAX failure ! Status : '+textStatus+' | Error : '+errorThrown}); } }); } function softaculous_handle_ftp_form(form, form_data){ // Handling FTP Form jQuery('body').append(form); var ftp_modal = jQuery('#request-filesystem-credentials-dialog'); ftp_modal.show(); // Handling the close btn of the FTP form. ftp_modal.find('.cancel-button').on('click', function(event){ event.preventDefault(); ftp_modal.hide(); alert("WordPress requires FTP details, without them you won't be able to install a plugin/theme"); }); ftp_modal.on('submit', 'form', function(event){ event.preventDefault(); let serialized_data = jQuery(event.target).serialize(); form_data += '&'+serialized_data; ftp_modal.hide(); softaculous_pro_handle_templates(form_data); }); } // Import template function softaculous_pro_import_template(data, spro_temp_form_data){ if(typeof data === 'object' && 'error' in data){ softaculous_pro_show_error(data['error']); return false; } var message = 'Importing the template'; softaculous_pro_create_html(message, 90); // Update progress to 100% // Make the call jQuery.ajax({ url: softaculous_pro_ajax_url+'action=softaculous_pro_import_template', type: 'POST', data: spro_temp_form_data+'&softaculous_pro_nonce='+softaculous_pro_ajax_nonce, dataType: 'json', success: function(data){ var modal = jQuery('.progress-bar'); if(typeof data === 'object' && 'done' in data){ softaculous_pro_create_html('Your website setup is completed', 100, true); // Update message here modal.find('.progress-text').text('Congratulations 🎊') modal.find('.skeleton-loader').hide(); modal.find('.softaculous-pro-done').show(); } }, error: function(jqXHR, textStatus, errorThrown){ softaculous_pro_show_error({err: 'AJAX failure ! Status : '+textStatus+' | Error : '+errorThrown}); } }); } function softaculous_pro_show_error(err){ var html = '<div class="setup-error"><div class="setup-error-message"><span class="dashicons dashicons-info-outline"></span><h1>Error</h1></div><ul>'; for(var x in err){ html += '<li>'+err[x]+'</li>'; } html += '</ul></div>'; jQuery('.softaculous-pro-wizard-content').append(html); jQuery('#softaculous-pro-error-template').html(html).show(); jQuery('.progress-bar').hide(); } function softaculous_pro_create_html(message, finalPercentage, slowAnimation, logs) { // Check if progress bar already exists var progressBar = jQuery('.progress-bar'); if (progressBar.length > 0) { // Update the message and animate the progress jQuery('.progress-indicator').text(message); softaculous_pro_animateProgress(progressBar.find('.progress-float-r'), progressBar.find('.setup-progress-counter'), finalPercentage, slowAnimation); } else { // Create the progress bar var html = `<div class="progress-bar"> <h1 class="progress-text">Building your website...</h1> <div class="setup-progress-bar"> <span class="progress-indicator">${message}</span> <span class="progress-float-r">0%</span> <div class="progress-bar-par"> <div class="setup-progress-counter" style="width: 0%; background-color: blue"></div> </div> <div class="skeleton-loader" style="display:none;"> <div class="skeleton-loader-shadow"></div> <div class="skeleton-row"> <div class="skeleton-row-heading" style="width:50px; height:50px;border-radius:100%;"></div> <div class="skeleton-row-para" style="width:70%; height:20px"></div> <div class="skeleton-row-para" style="width:100%; height:20px"></div> <div class="skeleton-row-para" style="width:100%; height:20px"></div> <div class="skeleton-img" style="width:100%;"></div> </div> <div class="skeleton-row"> <div class="skeleton-row-heading" style="width:50px; height:50px;border-radius:100%;"></div> <div class="skeleton-row-para" style="width:70%; height:20px"></div> <div class="skeleton-row-para" style="width:100%; height:20px"></div> <div class="skeleton-row-para" style="width:100%; height:20px"></div> <div class="skeleton-img" style="width:100%;"></div> </div> </div> </div> <div class="softaculous-pro-done" style="display: none"> <a class="button softaculous-pro-demo-btn" href="${soft_pro_obj.site_url}" target="_blank" >Visit Website</a> <a class="button softaculous-pro-demo-btn" href="${soft_pro_obj.admin_url}" target="_blank" >WordPress Dashboard</a> <a class="button softaculous-pro-demo-btn" href="${soft_pro_obj.admin_url}admin.php?page=assistant" target="_blank" >Assistant</a> </div> </div> <div class="spro-setup-progress-logs"> <b> Some Error Occurred: </b> <ul class="failed-progress-logs"> </ul> </div>`; jQuery('.softaculous-pro-wizard-content').append(html); softaculous_pro_animateProgress(jQuery('.progress-float-r'), jQuery('.setup-progress-counter'), finalPercentage, slowAnimation); } if(logs && typeof ele === 'object'){ jQuery('.spro-setup-progress-logs').show(); Object.entries(logs[0]).map(entry => { console.log(entry[0], entry[1]); jQuery('.failed-progress-logs').append('<li class="spro-failed-ins-li">'+ entry[1] + '</li>'); }); } } function softaculous_pro_animateProgress($progressText, $progressBar, finalPercentage, slowAnimation) { var currentPercentage = parseInt($progressText.text()); var increment = 1; var duration = 10; if (slowAnimation) { duration = 100; } var interval = setInterval(function() { if (currentPercentage >= finalPercentage) { clearInterval(interval); $progressText.text(finalPercentage + '%'); } else { currentPercentage += increment; $progressText.text(currentPercentage + '%'); $progressBar.animate({ width: currentPercentage + '%' }, duration).css('background-color', 'blue'); } if(currentPercentage === 100){ } }, duration); }