module_matrix-1.0.2/js/module-matrix/filter-manager.js

js/module-matrix/filter-manager.js
/**
 * @file filter-manager.js
 * All filtering logic and operations
 */

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

window.ModuleMatrix.FilterManager = {

  /**
   * Apply all active filters to modules
   */
  applyFilters(mainList, selectedPackage, filterInput, statusCheckboxes, lifecycleCheckboxes, stabilityCheckboxes) {
    const { Utils } = window.ModuleMatrix;
    const { SELECTORS } = window.ModuleMatrix.Constants;

    const query = Utils.getFilterQuery(filterInput);
    const selectedStatuses = Utils.getSelectedCheckboxValues(statusCheckboxes);
    const selectedLifecycles = Utils.getSelectedCheckboxValues(lifecycleCheckboxes);
    const selectedStability = Utils.getSelectedCheckboxValues(stabilityCheckboxes);

    const allModules = Array.from(mainList.querySelectorAll(SELECTORS.moduleItem));

    // Filter modules
    const visibleModules = allModules.filter(module =>
      this.moduleMatchesFilters(
        module,
        query,
        selectedPackage,
        selectedStatuses,
        selectedLifecycles,
        selectedStability
      )
    );

    // Sort filtered modules alphabetically
    const sortedModules = Utils.sortModulesByName(visibleModules);

    // Update visibility
    this.updateModuleVisibility(allModules, sortedModules);
  },

  /**
   * Check if module matches all active filters
   */
  moduleMatchesFilters(module, query, selectedPackage, selectedStatuses, selectedLifecycles, selectedStability) {
    const moduleDetails = this.getModuleFilterData(module);
    if (!moduleDetails) return false;

    return (
      this.matchesTextFilter(query, moduleDetails.name, moduleDetails.description) &&
      this.matchesPackageFilter(selectedPackage, moduleDetails.package) &&
      this.matchesCheckboxFilter(selectedStatuses, moduleDetails.status) &&
      this.matchesCheckboxFilter(selectedLifecycles, moduleDetails.lifecycle) &&
      this.matchesCheckboxFilter(selectedStability, moduleDetails.stability)
    );
  },

  /**
   * Extract filter-relevant data from module element
   */
  getModuleFilterData(module) {
    const { SELECTORS } = window.ModuleMatrix.Constants;
    const namePackage = module.querySelector(SELECTORS.namePackage);

    if (!namePackage) return null;

    return {
      name: namePackage.dataset.name?.toLowerCase() || '',
      description: namePackage.dataset.description?.toLowerCase() || '',
      package: namePackage.dataset.package || '',
      status: namePackage.dataset.status || '',
      lifecycle: namePackage.dataset.lifecycle || '',
      stability: namePackage.dataset.stability || ''
    };
  },

  /**
   * Check text filter match
   */
  matchesTextFilter(query, name, description) {
    return query === '' || name.includes(query) || description.includes(query);
  },

  /**
   * Check package filter match
   */
  matchesPackageFilter(selectedPackage, modulePackage) {
    const { DEFAULTS } = window.ModuleMatrix.Constants;
    return selectedPackage === DEFAULTS.activePackage || modulePackage === selectedPackage;
  },

  /**
   * Check checkbox filter match
   */
  matchesCheckboxFilter(selectedValues, moduleValue) {
    return selectedValues.length === 0 || selectedValues.includes(moduleValue);
  },

  /**
   * Update module visibility based on filtering
   */
  updateModuleVisibility(allModules, visibleModules) {
    const { CLASSES } = window.ModuleMatrix.Constants;

    // Hide all modules
    allModules.forEach(module => module.classList.add(CLASSES.hidden));

    // Show filtered modules
    visibleModules.forEach(module => module.classList.remove(CLASSES.hidden));
  },

  /**
   * Reset all filter inputs
   */
  resetAllFilters(filterInput, statusCheckboxes, lifecycleCheckboxes, stabilityCheckboxes) {
    if (filterInput) filterInput.value = '';

    const allCheckboxes = [
      ...statusCheckboxes,
      ...lifecycleCheckboxes,
      ...stabilityCheckboxes
    ];

    allCheckboxes.forEach(checkbox => checkbox.checked = false);
  },

  /**
   * Get current filter state
   */
  getCurrentFilterState(filterInput, statusCheckboxes, lifecycleCheckboxes, stabilityCheckboxes) {
    const { Utils } = window.ModuleMatrix;

    return {
      query: Utils.getFilterQuery(filterInput),
      statuses: Utils.getSelectedCheckboxValues(statusCheckboxes),
      lifecycles: Utils.getSelectedCheckboxValues(lifecycleCheckboxes),
      stability: Utils.getSelectedCheckboxValues(stabilityCheckboxes)
    };
  },

  /**
   * Check if any filters are active
   */
  hasActiveFilters(filterInput, statusCheckboxes, lifecycleCheckboxes, stabilityCheckboxes) {
    const filterState = this.getCurrentFilterState(
      filterInput,
      statusCheckboxes,
      lifecycleCheckboxes,
      stabilityCheckboxes
    );

    return filterState.query !== '' ||
           filterState.statuses.length > 0 ||
           filterState.lifecycles.length > 0 ||
           filterState.stability.length > 0;
  },

  /**
   * Count visible modules after filtering
   */
  countVisibleModules(mainList) {
    const { SELECTORS, CLASSES } = window.ModuleMatrix.Constants;
    return mainList.querySelectorAll(`${SELECTORS.moduleItem}:not(.${CLASSES.hidden})`).length;
  },

  /**
   * Filter modules by specific criteria
   */
  filterModulesByStatus(modules, status) {
    const { DEFAULTS } = window.ModuleMatrix.Constants;
    const targetStatus = status === 'enabled' ? DEFAULTS.enabledStatus.toString() : '0';

    return modules.filter(module => {
      const moduleDetails = this.getModuleFilterData(module);
      return moduleDetails && moduleDetails.status === targetStatus;
    });
  }
};

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

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