File "bulk-restore.js"

Full path: /home/satitravel/public_html/wp-content/plugins/wp-smushit/_src/js/modules/bulk-restore.js
File size: 6.17 B
MIME-type: text/plain
Charset: utf-8

Download   Open   Edit   Advanced Editor &nnbsp; Back

/* global WP_Smush */
/* global ajaxurl */

/**
 * Bulk restore JavaScript code.
 *
 * @since 3.2.2
 */
(function() {
  "use strict";

  /**
   * Bulk restore modal.
   *
   * @since 3.2.2
   */
  WP_Smush.restore = {
    modal: document.getElementById("smush-restore-images-dialog"),
    contentContainer: document.getElementById("smush-bulk-restore-content"),
    settings: {
      slide: "start", // start, progress or finish.
      success: 0,
      errors: []
    },
    items: [], // total items, 1 item = 1 step.
    success: [], // successful items restored.
    errors: [], // failed items.
    currentStep: 0,
    totalSteps: 0,

    /**
     * Init module.
     */
    init() {
      if (!this.modal) {
        return;
      }

      this.settings = {
        slide: "start",
        success: 0,
        errors: []
      };

      this.resetModalWidth();
      this.renderTemplate();

      // Show the modal.

      window.SUI.openModal(
        "smush-restore-images-dialog",
        "wpbody-content",
        undefined,
        false
      );
    },

    /**
     * Update the template, register new listeners.
     */
    renderTemplate() {
      const template = WP_Smush.onboarding.template("smush-bulk-restore");
      const content = template(this.settings);

      if (content) {
        this.contentContainer.innerHTML = content;
      }

      this.bindSubmit();
    },

    /**
     * Reset modal width.
     *
     * @since 3.6.0
     */
    resetModalWidth() {
      this.modal.style.maxWidth = "460px";
      this.modal.querySelector(".sui-box").style.maxWidth = "460px";
    },

    /**
     * Catch "Finish setup wizard" button click.
     */
    bindSubmit() {
      const confirmButton = this.modal.querySelector(
        'button[id="smush-bulk-restore-button"]'
      );
      const self = this;

      if (confirmButton) {
        confirmButton.addEventListener("click", function(e) {
          e.preventDefault();
          self.resetModalWidth();

          self.settings = { slide: "progress" };
          self.errors = [];

          self.renderTemplate();
          self.initScan();
        });
      }
    },

    /**
     * Cancel the bulk restore.
     */
    cancel() {
      if ("start" === this.settings.slide || "finish" === this.settings.slide) {
        // Hide the modal.
        window.SUI.closeModal();
      } else {
        this.updateProgressBar(true);
        window.location.reload();
      }
    },

    /**
     * Update progress bar during directory smush.
     *
     * @param {boolean} cancel  Cancel status.
     */
    updateProgressBar(cancel = false) {
      let progress = 0;
      if (0 < this.currentStep) {
        progress = Math.min(
          Math.round((this.currentStep * 100) / this.totalSteps),
          99
        );
      }

      if (progress > 100) {
        progress = 100;
      }

      // Update progress bar
      this.modal.querySelector(".sui-progress-text span").innerHTML =
        progress + "%";
      this.modal.querySelector(".sui-progress-bar span").style.width =
        progress + "%";

      const statusDiv = this.modal.querySelector(".sui-progress-state-text");
      if (progress >= 90) {
        statusDiv.innerHTML = "Finalizing...";
      } else if (cancel) {
        statusDiv.innerHTML = "Cancelling...";
      } else {
        statusDiv.innerHTML =
          this.currentStep + "/" + this.totalSteps + " " + "images restored";
      }
    },

    /**
     * First step in bulk restore - get the bulk attachment count.
     */
    initScan() {
      const self = this;
      const _nonce = document.getElementById("_wpnonce");

      const xhr = new XMLHttpRequest();
      xhr.open("POST", ajaxurl + "?action=get_image_count", true);
      xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr.onload = () => {
        if (200 === xhr.status) {
          const res = JSON.parse(xhr.response);
          if ("undefined" !== typeof res.data.items) {
            self.items = res.data.items;
            self.totalSteps = res.data.items.length;
            self.step();
          }
        } else {
          window.console.log(
            "Request failed.  Returned status of " + xhr.status
          );
        }
      };
      xhr.send("_ajax_nonce=" + _nonce.value);
    },

    /**
     * Execute a scan step recursively
     */
    step() {
      const self = this;
      const _nonce = document.getElementById("_wpnonce");

      if (0 < this.items.length) {
        const item = this.items.pop();
        const xhr = new XMLHttpRequest();
        xhr.open("POST", ajaxurl + "?action=restore_step", true);
        xhr.setRequestHeader(
          "Content-type",
          "application/x-www-form-urlencoded"
        );
        xhr.onload = () => {
          this.currentStep++;

          if (200 === xhr.status) {
            const res = JSON.parse(xhr.response);
            if ("undefined" !== typeof res.data.success && res.data.success) {
              self.success.push(item);
            } else {
              self.errors.push({
                id: item,
                src: res.data.src,
                thumb: res.data.thumb,
                link: res.data.link
              });
            }
          }

          self.updateProgressBar();
          self.step();
        };
        xhr.send("item=" + item + "&_ajax_nonce=" + _nonce.value);
      } else {
        // Finish.
        this.settings = {
          slide: "finish",
          success: this.success.length,
          errors: this.errors,
          total: this.totalSteps
        };

        self.renderTemplate();
        if (0 < this.errors.length) {
          this.modal.style.maxWidth = "660px";
          this.modal.querySelector(".sui-box").style.maxWidth = "660px";
        }
      }
    }
  };

  /**
   * Template function (underscores based).
   *
   * @type {Function}
   */
  WP_Smush.restore.template = _.memoize(id => {
    let compiled;
    const options = {
      evaluate: /<#([\s\S]+?)#>/g,
      interpolate: /{{{([\s\S]+?)}}}/g,
      escape: /{{([^}]+?)}}(?!})/g,
      variable: "data"
    };

    return data => {
      _.templateSettings = options;
      compiled = compiled || _.template(document.getElementById(id).innerHTML);
      return compiled(data);
    };
  });
})();