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

js/module-matrix/main.js
/**
 * @file main.js
 * Module Matrix Main Entry Point
 *
 * Orchestrates the initialization and coordination of all Module Matrix components.
 * This is the primary entry point that registers the Drupal behavior and coordinates
 * all the modular components.
 *
 * Dependencies (must be loaded first):
 * - constants.js
 * - utilities.js
 * - data-manager.js
 * - module-unifier.js
 * - filter-manager.js
 * - event-manager.js
 * - animation-manager.js
 * - ui-generator.js
 */

((Drupal, drupalSettings, once) => {
  'use strict';

  // Ensure namespace exists
  window.ModuleMatrix = window.ModuleMatrix || {};

  // Cache DOM elements and state
  const ModuleMatrixMain = {

    // Component state
    state: {
      isInitialized: false,
      moduleData: null,
      unifiedWrapper: null,
      domElements: {}
    },

    /**
     * Initialize the Module Matrix system
     */
    init(context, settings) {
      const { SELECTORS } = window.ModuleMatrix.Constants;

      // Check if form context exists
      const formContext = document.querySelector(SELECTORS.form);
      if (!formContext) {
        console.warn('Module Matrix: Form context not found');
        return false;
      }

      // Cache DOM elements
      this.cacheDOMElements(formContext);

      // Unify multiple module containers
      this.state.unifiedWrapper = window.ModuleMatrix.ModuleUnifier.unifyModuleMatrix(SELECTORS.wrapperSelector);
      if (!this.state.unifiedWrapper) {
        console.warn('Module Matrix: Failed to unify module containers');
        return false;
      }

      // Initialize module data
      this.state.moduleData = window.ModuleMatrix.DataManager.initializeModuleData(this.state.unifiedWrapper);
      if (!window.ModuleMatrix.DataManager.validateData(this.state.moduleData)) {
        console.error('Module Matrix: Invalid module data structure');
        return false;
      }

      // Generate UI components
      this.generateUI();

      // Attach event listeners
      this.attachEventListeners();

      // Initialize animations
      this.initializeAnimations();

      this.state.isInitialized = true;
      console.log('Module Matrix: Successfully initialized');
      return true;
    },

    /**
     * Cache frequently accessed DOM elements
     */
    cacheDOMElements(formContext) {
      const { SELECTORS } = window.ModuleMatrix.Constants;

      this.state.domElements = {
        formContext,
        filterInput: formContext.querySelector(SELECTORS.filterInput),
        mainList: formContext.querySelector(SELECTORS.mainList),
        statusCheckboxes: formContext.querySelectorAll(SELECTORS.statusCheckboxes),
        lifecycleCheckboxes: formContext.querySelectorAll(SELECTORS.lifecycleCheckboxes),
        stabilityCheckboxes: formContext.querySelectorAll(SELECTORS.stabilityCheckboxes),
        resetButton: formContext.querySelector(SELECTORS.resetButton)
      };
    },

    /**
     * Generate all UI components
     */
    generateUI() {
      const { SELECTORS } = window.ModuleMatrix.Constants;
      const { UIGenerator } = window.ModuleMatrix;

      // Generate sidebar navigation
      UIGenerator.generateSidebarNavigation(SELECTORS.sidebarSelector, this.state.moduleData);

      // Populate and sort module list
      UIGenerator.populateModuleList(SELECTORS.listSelector, this.state.moduleData.modules);

      // Show initialization success
      this.showInitializationStatus();
    },

    /**
     * Attach all event listeners
     */
    attachEventListeners() {
      const { SELECTORS } = window.ModuleMatrix.Constants;
      const { EventManager } = window.ModuleMatrix;
      const { domElements } = this.state;

      EventManager.attachEventListeners(
        this.state.unifiedWrapper,
        domElements.mainList,
        SELECTORS.sidebarSelector,
        domElements.filterInput,
        domElements.statusCheckboxes,
        domElements.lifecycleCheckboxes,
        domElements.stabilityCheckboxes,
        domElements.resetButton
      );
    },

    /**
     * Initialize animations and interactive elements
     */
    initializeAnimations() {
      const { AnimationManager } = window.ModuleMatrix;

      // Initialize expandable details
      AnimationManager.initializeDetailsAnimation();

      // Check for reduced motion preference
      if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
        AnimationManager.disableAnimations();
      }
    },

    /**
     * Show initialization status
     */
    showInitializationStatus() {
      const { DataManager } = window.ModuleMatrix;
      const stats = DataManager.getPackageStats(this.state.moduleData);

      console.log(`Module Matrix: Loaded ${stats.totalModules} modules across ${Object.keys(this.state.moduleData.packageCounts).length} packages`);
    },

    /**
     * Get current module data
     */
    getModuleData() {
      return this.state.moduleData;
    },

    /**
     * Get DOM element references
     */
    getDOMElements() {
      return this.state.domElements;
    },

    /**
     * Check if system is initialized
     */
    isInitialized() {
      return this.state.isInitialized;
    },

    /**
     * Refresh the entire module matrix (useful for AJAX updates)
     */
    refresh() {
      if (!this.state.isInitialized) return false;

      console.log('Module Matrix: Refreshing...');

      // Re-initialize with current context
      const context = document;
      const settings = drupalSettings || {};

      return this.init(context, settings);
    },

    /**
     * Destroy the module matrix (cleanup)
     */
    destroy() {
      // Remove event listeners
      if (window.ModuleMatrix.EventManager.removeEventListeners) {
        window.ModuleMatrix.EventManager.removeEventListeners();
      }

      // Clear state
      this.state = {
        isInitialized: false,
        moduleData: null,
        unifiedWrapper: null,
        domElements: {}
      };

      console.log('Module Matrix: Destroyed');
    }
  };

  /**
   * Main Drupal behavior registration
   */
  Drupal.behaviors.moduleMatrixMain = {
    attach: function(context, settings) {
      // Ensure all required components are loaded
      if (!window.ModuleMatrix.Constants ||
          !window.ModuleMatrix.Utils ||
          !window.ModuleMatrix.DataManager ||
          !window.ModuleMatrix.ModuleUnifier ||
          !window.ModuleMatrix.FilterManager ||
          !window.ModuleMatrix.EventManager ||
          !window.ModuleMatrix.AnimationManager ||
          !window.ModuleMatrix.UIGenerator) {
        console.error('Module Matrix: Required components not loaded');
        return;
      }

      // Use 'once' to ensure single initialization
      once('moduleMatrixMain', 'form.system-modules', context).forEach(() => {
        ModuleMatrixMain.init(context, settings);
      });
    },

    detach: function(context, settings, trigger) {
      if (trigger === 'unload') {
        ModuleMatrixMain.destroy();
      }
    }
  };

  // Expose main controller for external access
  window.ModuleMatrix.Main = ModuleMatrixMain;

  // Expose public API
  window.ModuleMatrix.API = {

    /**
     * Get current filter state
     */
    getFilterState() {
      const { EventManager } = window.ModuleMatrix;
      return {
        activePackage: EventManager.getActivePackage(),
        isInitialized: ModuleMatrixMain.isInitialized()
      };
    },

    /**
     * Set active package programmatically
     */
    setActivePackage(packageName) {
      const { EventManager } = window.ModuleMatrix;
      EventManager.setActivePackage(packageName);
    },

    /**
     * Trigger filter update
     */
    updateFilters() {
      const { EventManager } = window.ModuleMatrix;
      EventManager.triggerFilterUpdate();
    },

    /**
     * Get module statistics
     */
    getStats() {
      const moduleData = ModuleMatrixMain.getModuleData();
      if (!moduleData) return null;

      const { DataManager } = window.ModuleMatrix;
      return DataManager.getPackageStats(moduleData);
    },

    /**
     * Refresh the interface
     */
    refresh() {
      return ModuleMatrixMain.refresh();
    }
  };

})(Drupal, drupalSettings, once);

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

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