countdown-8.x-1.8/js/integrations/countdown.flipdown.integration.js

js/integrations/countdown.flipdown.integration.js
/**
 * @file
 * Integration for the FlipDown.js library.
 *
 * Handles initialization of FlipDown countdown instances with configuration
 * from drupalSettings and element data attributes.
 */

(function (Drupal) {
  'use strict';

  /**
   * Initialize a FlipDown timer.
   *
   * @param {Element} element
   *   The DOM element to initialize as a timer.
   * @param {Object} settings
   *   The settings object from drupalSettings.
   */
  function initializeFlipDown(element, settings) {
    // Validate library availability.
    if (typeof FlipDown === 'undefined') {
      Drupal.countdown.utils.handleError(element, 'FlipDown library not loaded', 'flipdown');
      return;
    }

    // Resolve settings using shared utility.
    const config = Drupal.countdown.utils.resolveCountdownSettings(element, settings, 'flipdown');

    // Get target date.
    const targetDate = config.target_date || element.dataset.countdownTarget;
    if (!targetDate) {
      Drupal.countdown.utils.handleError(element, 'No target date specified', 'flipdown');
      return;
    }

    // Convert to Unix timestamp in seconds.
    const timestamp = Math.floor(new Date(targetDate).getTime() / 1000);
    const now = Math.floor(Date.now() / 1000);

    // Check if already expired.
    if (timestamp <= now) {
      Drupal.countdown.utils.showExpiredMessage(element, config, 'flipdown');
      return;
    }

    // Create inner container for FlipDown
    const innerContainer = document.createElement('div');
    innerContainer.id = 'flipdown-' + Math.random().toString(36).substr(2, 9);

    // Add theme class
    const theme = config.theme || 'dark';
    innerContainer.classList.add('flipdown');
    innerContainer.classList.add('flipdown__theme-' + theme);

    // Add custom class if specified
    if (config.custom_class) {
      innerContainer.classList.add(config.custom_class);
    }

    // Append to countdown display area
    const displayArea = element.querySelector('.countdown-display');
    if (displayArea) {
      // Clear any loading message
      displayArea.innerHTML = '';
      displayArea.appendChild(innerContainer);
    } else {
      // Fallback if display area doesn't exist
      element.appendChild(innerContainer);
    }

    // Build FlipDown configuration
    const flipdownConfig = {};

    // Set headings if specified
    if (config.headings && Array.isArray(config.headings)) {
      flipdownConfig.headings = config.headings;
    }

    try {
      // Create and start FlipDown
      const flipdown = new FlipDown(timestamp, innerContainer.id, flipdownConfig);
      flipdown.start();

      // Handle completion
      flipdown.ifEnded(function () {
        Drupal.countdown.utils.showExpiredMessage(element, config, 'flipdown');
      });

      // Store instance for cleanup
      Drupal.countdown.storeInstance(element, {
        instance: flipdown,
        innerContainer: innerContainer,
        stop: function () {
          if (flipdown.countdown) {
            clearInterval(flipdown.countdown);
          }
          // Remove the inner container
          if (innerContainer.parentNode) {
            innerContainer.parentNode.removeChild(innerContainer);
          }
        }
      });

      // Mark as initialized
      element.classList.add('countdown-initialized');

      // Debug output if enabled
      if (config.debug_mode || config.debug) {
        console.log('FlipDown initialized:', {
          element: element,
          timestamp: timestamp,
          config: flipdownConfig,
          settings: config
        });
      }

      // Dispatch initialization event
      Drupal.countdown.utils.dispatchEvent(element, 'initialized', {
        library: 'flipdown',
        element: element,
        settings: config,
        instance: flipdown
      });
    }
    catch (error) {
      console.error('Countdown: Failed to create FlipDown', error);
      Drupal.countdown.utils.handleError(element, 'Failed to create FlipDown: ' + error.message, 'flipdown');
    }
  }

  // Register loader with countdown system
  Drupal.countdown.registerLoader('flipdown', initializeFlipDown);

})(Drupal);

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

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