MECHandlerPool_wev8.js 4.78 KB
var MECHandlerPool = [];

(function () {
  MECHandlerPool.initHandler = function (coms, loadedFn) {
    var len = coms.length;
		var handlers = Array.apply(null, { length: len ? len - 1 : 0 });
    var runLoadedFn = function () {
      handlers.forEach(function (handler) {
        MECHandlerPool.push(handler);
      });

      if (typeof (loadedFn) == "function") {
        loadedFn.call(this);
      }
    };

    MECHandlerPool.length = 0; // 每次初始化时, 清空pool

    if (len === 0) return runLoadedFn();

    coms.forEach(function (com, i) {
      try {
        ResourceLoader.loadResource(com.type, function () {
          var mecHandler = new MEC_NS[com.type](com.type, com.id, com.props);

          len--;
          mecHandler.selected = com.selected;
          handlers[i] = mecHandler;

          if (len === 0) {
            runLoadedFn();
          }
        });
      } catch (e) {
        console.error("MECHandlerPool.initHandler >> " + e);
      }
    });
  };

  MECHandlerPool.addHandler = function (mecHandler) {
    this.push(mecHandler);
  };

  MECHandlerPool.removeHandler = function (mec_id) {
    var removeIndex = -1;
    for (var i = 0; i < this.length; i++) {
      var mecHandler = this[i];
      if (mecHandler.id == mec_id) {
        removeIndex = i;
        break;
      }
    }
    if (removeIndex != -1) {
      this.splice(removeIndex, 1);
    }
  };

  MECHandlerPool.getHandler = function (mec_id) {
    for (var i = 0; i < this.length; i++) {
      var mecHandler = this[i];
      if (mecHandler.id == mec_id) {
        return mecHandler;
      }
    }
  };

  MECHandlerPool.getCopyMec = function (mec_id) {
    var mecHandler = MECHandlerPool.getHandler(mec_id);
    var copyedMecHandler = {};
    var childrenIds = [];
    var children = [];
    var copyedMecJson = '';

    if (!mecHandler) return false;

    // 拷贝一个新的handler
    $.extend(true, copyedMecHandler, mecHandler);
    var mecJson = copyedMecHandler.mecJson;

    if (copyedMecHandler.getCopyMecJson) {
      copyedMecHandler.getCopyMecJson(mecJson);
    }

    copyedMecHandler.id = new UUID().toString();
    mecJson.id = copyedMecHandler.id;

    if (copyedMecHandler.getChildrenIds) {
      childrenIds = copyedMecHandler.getChildrenIds();

      childrenIds.map(function (mecId) {
        children.push(MECHandlerPool.getCopyMec(mecId));
      });
    }

    if (copyedMecHandler.mappingChildrenIds) {
      copyedMecHandler.mappingChildrenIds(copyedMecHandler.mecJson, children);
    }

    if (children.length) {
      copyedMecHandler.children = children;
    }

    return copyedMecHandler;
  };

  MECHandlerPool.getHandlerByType = function (type) {
    var result = new Array();
    for (var i = 0; i < this.length; i++) {
      var mecHandler = this[i];
      if (mecHandler.type == type) {
        result.push(mecHandler);
      }
    }
    return result;
  };

  MECHandlerPool.eachHandler = function (fn) {
    for (var i = 0; i < this.length; i++) {
      var mecHandler = this[i];
      fn.call(mecHandler, i);
    };
  };

  MECHandlerPool.getSortableIds = getSortableIds;

  MECHandlerPool.getPageMecJsonArr = function () {
    var ids = getSortableIds(); // 获取受排序影响的插件
    var mecMap = getMecMap();
    var $curr = $('.Design_MecHandler.Design_MecHandler_Curr');
    var selectedId = $curr.attr('id');
    var updateSelected = function (com) {
      if (com.id === selectedId) {
        com.selected = true;
      }
    };
    var mecs = ids.map(function (id) {
      var mec = mecMap[id];

      delete mecMap[id];

      return convertToComponent(mec, updateSelected);
    });

    // 处理不需要排序(如: 浮动按钮)或有其他排序处理的插件(如: Tab内的插件)
    Object.keys(mecMap).forEach(function (id) {
      var mec = convertToComponent(mecMap[id], updateSelected);

      mecs.push(mec);
    });

    return mecs;
  };

  function convertToComponent(mecJson, handler) {
    var com = {
      id: mecJson.id,
      type: mecJson.mectype,
    };

    delete mecJson.id;
    delete mecJson.mectype;
    delete mecJson.selected;

    com.props = mecJson;
    handler && handler(com);

    return com;
  }

  function getMecMap() {
    var map = {};

    MECHandlerPool.forEach(function (handler) {
      var mecJson = handler.getMecJson();

      map[mecJson.id] = mecJson;
    });

    return map;
  }

  function getSortableIds() {
    var selector = 'abbr[mec="true"]';
    var $homepageContainer = $('#MEC_Design_Container');
    var $top = $('#content_editor_top');
    var $abbrs = $.merge(
      $.merge($top.children(selector), $homepageContainer.children(selector)),
      $('#content_editor_bottom').children(selector),
      $('#content_editor').siblings(selector)
    );

    $abbrs = $abbrs.map(function () {
      return this.id;
    });

    return [].slice.apply($abbrs);
  }
})()