countdown-8.x-1.8/modules/countdown_field/js/countdown_field.integration.js

modules/countdown_field/js/countdown_field.integration.js
/**
 * @file
 * Bridge integration for countdown fields.
 *
 * This script handles field-specific initialization by preparing the DOM
 * and delegating to the main countdown integration system.
 */

(function (Drupal, drupalSettings, once) {
  'use strict';

  /**
   * Countdown field bridge behavior.
   *
   * @type {Drupal~behavior}
   */
  Drupal.behaviors.countdownFieldBridge = {
    attach: function (context, settings) {
      // Find all countdown fields that haven't been initialized yet.
      const fields = once('countdown-field-bridge', '.countdown-field', context);

      if (!fields.length) {
        return;
      }

      // Process each field.
      fields.forEach(function (element) {
        const fieldId = element.dataset.countdownFieldId;
        const delta = element.dataset.countdownDelta;
        const fullId = fieldId + '-' + delta;

        // Find the inner countdown element.
        const innerTimer = element.querySelector('.countdown-timer');

        if (!innerTimer) {
          console.warn('CountdownField: No inner timer element found for field', fullId);
          return;
        }

        // Skip if already initialized by main integration.
        if (innerTimer.classList.contains('countdown-initialized')) {
          return;
        }

        // Get field configuration from drupalSettings.
        const fieldConfig = settings.countdownField?.fields?.[fullId];

        if (!fieldConfig) {
          console.warn('CountdownField: No configuration found for field', fullId);
          return;
        }

        // Set data attributes from field configuration. These will be read
        // by the main integration system.
        innerTimer.dataset.countdownLibrary = fieldConfig.library;
        innerTimer.dataset.countdownTarget = fieldConfig.target;
        innerTimer.dataset.countdownSettings = JSON.stringify(fieldConfig.settings);
        innerTimer.dataset.fieldId = fieldId;
        innerTimer.dataset.fieldDelta = delta;

        // Add the correct library-specific class for styling.
        if (fieldConfig.library) {
          innerTimer.classList.add('countdown-' + fieldConfig.library);
        }

        // The main integration will handle initialization. We just ensure
        // the element is properly marked for processing.
        if (!innerTimer.hasAttribute('data-once')) {
          // Mark the element as ready for main integration processing.
          innerTimer.removeAttribute('data-once');
        }

        // If the main integration is already loaded, trigger it directly
        // for this specific element.
        if (Drupal.countdown && Drupal.countdown.initializeCountdown) {
          Drupal.countdown.initializeCountdown(innerTimer, settings);
        }
      });
    },

    detach: function (context, settings, trigger) {
      // Handle cleanup when fields are removed.
      if (trigger === 'unload') {
        const fields = context.querySelectorAll('.countdown-field');

        fields.forEach(function (element) {
          const innerTimer = element.querySelector('.countdown-timer');

          if (innerTimer && Drupal.countdown && Drupal.countdown.stop) {
            // Stop the countdown instance.
            Drupal.countdown.stop(innerTimer);
          }
        });
      }
    }
  };

})(Drupal, drupalSettings, once);

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

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