messages-2.3.1/js/messages.js

js/messages.js
/**
 * @file
 * Enhanced Status Messages JavaScript functionality.
 * 
 * Provides enhanced animations, auto-hide functionality, and close button handling.
 */

(function ($, Drupal, drupalSettings, once) {

  'use strict';

  /**
   * Enhanced Status Messages behavior.
   */
  Drupal.behaviors.enhancedStatusMessages = {
    attach: function (context, settings) {
      const containers = once('enhanced-status-messages', '.enhanced-status-messages', context);
      
      containers.forEach(function(container) {
        const $container = $(container);
        const config = settings.enhancedStatusMessages || {};
        const autoHideTime = config.autoHideTime || 5000;
        const enableAnimations = config.enableAnimations !== false;
        
        // Initialize messages
        const $messages = $container.find('.enhanced-message-card');
        
        if (enableAnimations) {
          $container.addClass('animations-enabled');
          
          // Show messages with staggered animation
          $messages.each(function(index) {
            const $message = $(this);
            setTimeout(function() {
              $message.addClass('show');
            }, index * 200); // Stagger by 200ms
          });
        } else {
          // Show messages immediately without animation
          $messages.addClass('show').css({
            opacity: 1,
            transform: 'none'
          });
        }
        
        // Auto-hide functionality
        if (autoHideTime > 0) {
          setTimeout(function() {
            hideAllMessages($container, enableAnimations);
          }, autoHideTime);
        }
        
        // Close button functionality
        $messages.find('.enhanced-cross-icon').on('click', function(e) {
          e.preventDefault();
          e.stopPropagation();
          
          const $message = $(this).closest('.enhanced-message-card');
          hideMessage($message, enableAnimations);
        });
        
        // Keyboard accessibility for close buttons
        $messages.find('.enhanced-cross-icon').on('keydown', function(e) {
          if (e.key === 'Enter' || e.key === ' ') {
            e.preventDefault();
            $(this).trigger('click');
          }
        });
      });
    }
  };

  /**
   * Hide a single message.
   * 
   * @param {jQuery} $message - The message element to hide.
   * @param {boolean} enableAnimations - Whether animations are enabled.
   */
  function hideMessage($message, enableAnimations) {
    if (enableAnimations) {
      $message.removeClass('show').addClass('hide');
      setTimeout(function() {
        $message.remove();
      }, 300); // Match CSS transition duration
    } else {
      $message.remove();
    }
  }

  /**
   * Hide all messages in a container.
   * 
   * @param {jQuery} $container - The container with messages.
   * @param {boolean} enableAnimations - Whether animations are enabled.
   */
  function hideAllMessages($container, enableAnimations) {
    const $messages = $container.find('.enhanced-message-card.show');
    
    if (enableAnimations) {
      $messages.each(function(index) {
        const $message = $(this);
        setTimeout(function() {
          hideMessage($message, enableAnimations);
        }, index * 100); // Stagger hide animation
      });
    } else {
      $messages.each(function() {
        hideMessage($(this), enableAnimations);
      });
    }
  }

  /**
   * Show enhanced status messages programmatically.
   * 
   * @param {string} type - Message type (status, warning, error, info).
   * @param {string} message - Message text.
   * @param {string} subText - Optional sub-text.
   * @param {Object} options - Additional options.
   */
  Drupal.enhancedStatusMessages = {
    show: function(type, message, subText, options) {
      options = options || {};
      const config = drupalSettings.enhancedStatusMessages || {};
      
      // Create message HTML
      const messageHtml = Drupal.theme('enhancedStatusMessage', {
        type: type,
        message: message,
        subText: subText || '',
        showWave: config.showWaveBackground !== false
      });
      
      // Find or create container
      let $container = $('.enhanced-status-messages');
      if ($container.length === 0) {
        const position = config.position || 'top-right';
        const animationsClass = config.enableAnimations !== false ? 'animations-enabled' : '';
        const waveClass = config.showWaveBackground === false ? 'hide-wave' : '';
        
        $container = $('<div class="enhanced-status-messages position-' + position + ' ' + animationsClass + ' ' + waveClass + '"></div>');
        $('body').append($container);
      }
      
      // Add message to container
      const $message = $(messageHtml);
      $container.append($message);
      
      // Trigger behavior attachment for new message
      Drupal.behaviors.enhancedStatusMessages.attach($message[0], drupalSettings);
      
      return $message;
    }
  };

})(jQuery, Drupal, drupalSettings, once);

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

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