diff core/misc/collapse.js @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/misc/collapse.js	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,87 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function ($, Modernizr, Drupal) {
+  function CollapsibleDetails(node) {
+    this.$node = $(node);
+    this.$node.data('details', this);
+
+    var anchor = location.hash && location.hash !== '#' ? ', ' + location.hash : '';
+    if (this.$node.find('.error' + anchor).length) {
+      this.$node.attr('open', true);
+    }
+
+    this.setupSummary();
+
+    this.setupLegend();
+  }
+
+  $.extend(CollapsibleDetails, {
+    instances: []
+  });
+
+  $.extend(CollapsibleDetails.prototype, {
+    setupSummary: function setupSummary() {
+      this.$summary = $('<span class="summary"></span>');
+      this.$node.on('summaryUpdated', $.proxy(this.onSummaryUpdated, this)).trigger('summaryUpdated');
+    },
+    setupLegend: function setupLegend() {
+      var $legend = this.$node.find('> summary');
+
+      $('<span class="details-summary-prefix visually-hidden"></span>').append(this.$node.attr('open') ? Drupal.t('Hide') : Drupal.t('Show')).prependTo($legend).after(document.createTextNode(' '));
+
+      $('<a class="details-title"></a>').attr('href', '#' + this.$node.attr('id')).prepend($legend.contents()).appendTo($legend);
+
+      $legend.append(this.$summary).on('click', $.proxy(this.onLegendClick, this));
+    },
+    onLegendClick: function onLegendClick(e) {
+      this.toggle();
+      e.preventDefault();
+    },
+    onSummaryUpdated: function onSummaryUpdated() {
+      var text = $.trim(this.$node.drupalGetSummary());
+      this.$summary.html(text ? ' (' + text + ')' : '');
+    },
+    toggle: function toggle() {
+      var _this = this;
+
+      var isOpen = !!this.$node.attr('open');
+      var $summaryPrefix = this.$node.find('> summary span.details-summary-prefix');
+      if (isOpen) {
+        $summaryPrefix.html(Drupal.t('Show'));
+      } else {
+        $summaryPrefix.html(Drupal.t('Hide'));
+      }
+
+      setTimeout(function () {
+        _this.$node.attr('open', !isOpen);
+      }, 0);
+    }
+  });
+
+  Drupal.behaviors.collapse = {
+    attach: function attach(context) {
+      if (Modernizr.details) {
+        return;
+      }
+      var $collapsibleDetails = $(context).find('details').once('collapse').addClass('collapse-processed');
+      if ($collapsibleDetails.length) {
+        for (var i = 0; i < $collapsibleDetails.length; i++) {
+          CollapsibleDetails.instances.push(new CollapsibleDetails($collapsibleDetails[i]));
+        }
+      }
+    }
+  };
+
+  var handleFragmentLinkClickOrHashChange = function handleFragmentLinkClickOrHashChange(e, $target) {
+    $target.parents('details').not('[open]').find('> summary').trigger('click');
+  };
+
+  $('body').on('formFragmentLinkClickOrHashChange.details', handleFragmentLinkClickOrHashChange);
+
+  Drupal.CollapsibleDetails = CollapsibleDetails;
+})(jQuery, Modernizr, Drupal);
\ No newline at end of file