announce_autosubmit-1.0.0-beta1/js/announce_autosubmit.js

js/announce_autosubmit.js
/**
 * @file
 * Announce that the form has been auto-submitted and restore focus.
 */
(function (Drupal, $) {
  'use strict';

  Drupal.behaviors.AnnounceFormSubmitBehavior = {
    attach: function (context, settings) {

      // For each form create a submit handler to store the form id.
      for (var formId in settings.announce_autosubmit.forms) {
        $(once('announce-' + formId, '#' + formId, context)).each(function () {
          $(this).submit(function(event) {
            window.localStorage.setItem('announce_autosubmit.submittedFormId', this.id);
          });

          // For each parameter in this form, store its label on value change,
          // so it can be used later to be announced when AJAX is complete.
          var nameLabel = {};
          for (var index in settings.announce_autosubmit.forms[formId].formParameters) {
            var formParameter = settings.announce_autosubmit.forms[formId].formParameters[index];
            $('[name="' + formParameter.name + '"]', this).each(function () {
              nameLabel[formParameter.name] = formParameter.label;
              $(this).change(function(event) {
                // Save changed item label to announce it on ajax complete.
                window.localStorage.setItem('announce_autosubmit.changedFilterLabel', nameLabel[this.name]);
              });
            });
          }
        });
      }

      $(once('announceFormSubmit', document.body)).each(function () {

        $(document).ajaxComplete(function(event, request, ajaxSettings) {
          var changedFilterLabel = window.localStorage.getItem('announce_autosubmit.changedFilterLabel');
          if (changedFilterLabel) {
            Drupal.announce('<p>' +
              Drupal.t('New "@label" filter value applied to results',
              {'@label': changedFilterLabel}) +
            '</p>');
          }
          else {
            Drupal.announce('<p>' +
              Drupal.t('The filters values have changed and applied to results.') +
              '</p>');
          }
          window.localStorage.removeItem('announce_autosubmit.changedFilterLabel');
        });

        var submittedFormId = window.localStorage.getItem('announce_autosubmit.submittedFormId');
        if (!submittedFormId ||
          settings.announce_autosubmit.forms[submittedFormId] === undefined) {
          return;
        }

        // Look for changes in form parameters in last submission.
        var referrerPath = document.referrer.split('?')[0];
        var currentPath = document.URL.split('?')[0];
        if (referrerPath !== currentPath) {
          return;
        }

        // submittedFormId could be old, we need to check URL and parameters.
        var referrerParameters = getParameters(document.referrer);
        var currentParameters = getParameters(document.URL);
        var formParameters = settings.announce_autosubmit.forms[submittedFormId].formParameters;

        for (var i in formParameters) {
          var name = formParameters[i].name;
          var announcement = '<p>' +
            Drupal.t('New "@label" filter value applied to results',
              {'@label': formParameters[i].label}) +
            '</p>';

          // Referrer page might not have query parameters.
          if (!referrerParameters) {
            // Then the parameter has changed if is not in its default value.
            if (currentParameters[name] !== undefined &&
              currentParameters[name] !== formParameters[i].defaultValue) {
              announceAndFocus(announcement, name, $('form#' + submittedFormId));
            }
          } else if (!currentParameters) {
            announceAndFocus('<p>' +
              Drupal.t('Filters have been cleared, and default values applied to results') +
              '</p>', name, $('form#' + submittedFormId));
            return;
          } else if (currentParameters[name] !== undefined &&
            currentParameters[name] !== referrerParameters[name]) {
            announceAndFocus(announcement, name, $('form#' + submittedFormId));
          }
        }

        function getParameters(url) {
          var paramString = url.split('?')[1];
          if (paramString) {
            paramString = paramString.split('#')[0];
            var paramsArray = paramString.split('&');
            var parameters = {};
            for (var i = 0; i < paramsArray.length; i++) {
              var pair = paramsArray[i].split('=');
              parameters[pair[0]] = pair[1];
            }
            return parameters;
          }
          return paramString;
        }

        function announceAndFocus(announcement, elementName, context) {
          Drupal.announce(announcement);
          var id = context.find('[name="' + elementName + '"]').first().attr('id');
          if (id) {
            // Ensure focus is triggered after all DOM elements positioning.
            $(document).ready(function() {
              $('#' + id, context).focus();
            });
          }
        }

      });

    }
  };
})(Drupal, jQuery);

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

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