module_matrix-1.0.2/js/module-matrix/module-unifier.js

js/module-matrix/module-unifier.js
/**
 * @file module-unifier.js
 * Module container unification logic
 */

window.ModuleMatrix = window.ModuleMatrix || {};

window.ModuleMatrix.ModuleUnifier = {

  /**
   * Unify multiple module matrix wrappers into single interface
   */
  unifyModuleMatrix(wrapperSelector) {
    const { SELECTORS } = window.ModuleMatrix.Constants;

    const systemModules = document.querySelector('form.system-modules');
    if (!systemModules) return null;

    const wrappers = Array.from(document.querySelectorAll(wrapperSelector));
    if (wrappers.length === 0) return null;

    const allModuleWrappers = this.extractModuleWrappers(wrappers, systemModules);
    const mainWrapper = allModuleWrappers[0];

    if (!mainWrapper) return null;

    // Remove original wrappers
    wrappers.forEach(wrapper => wrapper.remove());

    const mainSidebar = mainWrapper.querySelector(SELECTORS.sidebarSelector);
    const mainList = mainWrapper.querySelector(SELECTORS.listSelector);

    if (!mainSidebar || !mainList) return null;

    // Merge additional wrappers into main wrapper
    this.mergeAdditionalWrappers(allModuleWrappers.slice(1), mainSidebar, mainList);

    return mainWrapper;
  },

  /**
   * Extract module wrappers from package wrappers
   */
  extractModuleWrappers(wrappers, systemModules) {
    const { SELECTORS } = window.ModuleMatrix.Constants;
    const moduleWrappers = [];

    wrappers.forEach(wrapper => {
      const moduleWrapper = wrapper.querySelector(SELECTORS.moduleWrapper);
      if (moduleWrapper) {
        systemModules.appendChild(moduleWrapper);
        moduleWrappers.push(moduleWrapper);
      }
    });

    return moduleWrappers;
  },

  /**
   * Merge additional wrappers into main wrapper
   */
  mergeAdditionalWrappers(additionalWrappers, mainSidebar, mainList) {
    additionalWrappers.forEach(wrapper => {
      this.mergeWrapperElements(wrapper, mainSidebar, mainList);
      wrapper.remove();
    });
  },

  /**
   * Merge elements from source wrapper into target elements
   */
  mergeWrapperElements(sourceWrapper, targetSidebar, targetList) {
    const { SELECTORS } = window.ModuleMatrix.Constants;
    const { Utils } = window.ModuleMatrix;

    const sourceSidebar = sourceWrapper.querySelector(SELECTORS.sidebarSelector);
    const sourceList = sourceWrapper.querySelector(SELECTORS.listSelector);

    if (sourceSidebar) {
      Utils.mergeElements(sourceSidebar, targetSidebar, 'a');
    }

    if (sourceList) {
      Utils.mergeElements(sourceList, targetList, SELECTORS.moduleItem);
    }
  },

  /**
   * Validate unified wrapper structure
   */
  validateUnifiedWrapper(wrapper) {
    const { SELECTORS } = window.ModuleMatrix.Constants;

    const requiredElements = [
      SELECTORS.sidebarSelector,
      SELECTORS.listSelector
    ];

    return requiredElements.every(selector =>
      wrapper.querySelector(selector) !== null
    );
  },

  /**
   * Count total modules in unified wrapper
   */
  countModulesInWrapper(wrapper) {
    const { SELECTORS } = window.ModuleMatrix.Constants;
    return wrapper.querySelectorAll(SELECTORS.moduleItem).length;
  },

  /**
   * Get all package names from unified wrapper
   */
  getPackageNamesFromWrapper(wrapper) {
    const { SELECTORS } = window.ModuleMatrix.Constants;
    const packageSet = new Set();

    wrapper.querySelectorAll(SELECTORS.namePackage).forEach(element => {
      if (element.dataset.package) {
        packageSet.add(element.dataset.package);
      }
    });

    return Array.from(packageSet).sort();
  },

  /**
   * Check if wrapper contains modules
   */
  hasModules(wrapper) {
    const { SELECTORS } = window.ModuleMatrix.Constants;
    return wrapper.querySelectorAll(SELECTORS.moduleItem).length > 0;
  }
};

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc