collapse.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  2. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4. /**
  5. * --------------------------------------------------------------------------
  6. * Bootstrap (v4.0.0-alpha.4): collapse.js
  7. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  8. * --------------------------------------------------------------------------
  9. */
  10. var Collapse = function ($) {
  11. /**
  12. * ------------------------------------------------------------------------
  13. * Constants
  14. * ------------------------------------------------------------------------
  15. */
  16. var NAME = 'collapse';
  17. var VERSION = '4.0.0-alpha.4';
  18. var DATA_KEY = 'bs.collapse';
  19. var EVENT_KEY = '.' + DATA_KEY;
  20. var DATA_API_KEY = '.data-api';
  21. var JQUERY_NO_CONFLICT = $.fn[NAME];
  22. var TRANSITION_DURATION = 600;
  23. var Default = {
  24. toggle: true,
  25. parent: ''
  26. };
  27. var DefaultType = {
  28. toggle: 'boolean',
  29. parent: 'string'
  30. };
  31. var Event = {
  32. SHOW: 'show' + EVENT_KEY,
  33. SHOWN: 'shown' + EVENT_KEY,
  34. HIDE: 'hide' + EVENT_KEY,
  35. HIDDEN: 'hidden' + EVENT_KEY,
  36. CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
  37. };
  38. var ClassName = {
  39. IN: 'in',
  40. COLLAPSE: 'collapse',
  41. COLLAPSING: 'collapsing',
  42. COLLAPSED: 'collapsed'
  43. };
  44. var Dimension = {
  45. WIDTH: 'width',
  46. HEIGHT: 'height'
  47. };
  48. var Selector = {
  49. ACTIVES: '.panel > .in, .panel > .collapsing',
  50. DATA_TOGGLE: '[data-toggle="collapse"]'
  51. };
  52. /**
  53. * ------------------------------------------------------------------------
  54. * Class Definition
  55. * ------------------------------------------------------------------------
  56. */
  57. var Collapse = function () {
  58. function Collapse(element, config) {
  59. _classCallCheck(this, Collapse);
  60. this._isTransitioning = false;
  61. this._element = element;
  62. this._config = this._getConfig(config);
  63. this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
  64. this._parent = this._config.parent ? this._getParent() : null;
  65. if (!this._config.parent) {
  66. this._addAriaAndCollapsedClass(this._element, this._triggerArray);
  67. }
  68. if (this._config.toggle) {
  69. this.toggle();
  70. }
  71. }
  72. // getters
  73. // public
  74. Collapse.prototype.toggle = function toggle() {
  75. if ($(this._element).hasClass(ClassName.IN)) {
  76. this.hide();
  77. } else {
  78. this.show();
  79. }
  80. };
  81. Collapse.prototype.show = function show() {
  82. var _this = this;
  83. if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {
  84. return;
  85. }
  86. var actives = void 0;
  87. var activesData = void 0;
  88. if (this._parent) {
  89. actives = $.makeArray($(Selector.ACTIVES));
  90. if (!actives.length) {
  91. actives = null;
  92. }
  93. }
  94. if (actives) {
  95. activesData = $(actives).data(DATA_KEY);
  96. if (activesData && activesData._isTransitioning) {
  97. return;
  98. }
  99. }
  100. var startEvent = $.Event(Event.SHOW);
  101. $(this._element).trigger(startEvent);
  102. if (startEvent.isDefaultPrevented()) {
  103. return;
  104. }
  105. if (actives) {
  106. Collapse._jQueryInterface.call($(actives), 'hide');
  107. if (!activesData) {
  108. $(actives).data(DATA_KEY, null);
  109. }
  110. }
  111. var dimension = this._getDimension();
  112. $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
  113. this._element.style[dimension] = 0;
  114. this._element.setAttribute('aria-expanded', true);
  115. if (this._triggerArray.length) {
  116. $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
  117. }
  118. this.setTransitioning(true);
  119. var complete = function complete() {
  120. $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);
  121. _this._element.style[dimension] = '';
  122. _this.setTransitioning(false);
  123. $(_this._element).trigger(Event.SHOWN);
  124. };
  125. if (!Util.supportsTransitionEnd()) {
  126. complete();
  127. return;
  128. }
  129. var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
  130. var scrollSize = 'scroll' + capitalizedDimension;
  131. $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
  132. this._element.style[dimension] = this._element[scrollSize] + 'px';
  133. };
  134. Collapse.prototype.hide = function hide() {
  135. var _this2 = this;
  136. if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {
  137. return;
  138. }
  139. var startEvent = $.Event(Event.HIDE);
  140. $(this._element).trigger(startEvent);
  141. if (startEvent.isDefaultPrevented()) {
  142. return;
  143. }
  144. var dimension = this._getDimension();
  145. var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';
  146. this._element.style[dimension] = this._element[offsetDimension] + 'px';
  147. Util.reflow(this._element);
  148. $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);
  149. this._element.setAttribute('aria-expanded', false);
  150. if (this._triggerArray.length) {
  151. $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
  152. }
  153. this.setTransitioning(true);
  154. var complete = function complete() {
  155. _this2.setTransitioning(false);
  156. $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
  157. };
  158. this._element.style[dimension] = '';
  159. if (!Util.supportsTransitionEnd()) {
  160. complete();
  161. return;
  162. }
  163. $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
  164. };
  165. Collapse.prototype.setTransitioning = function setTransitioning(isTransitioning) {
  166. this._isTransitioning = isTransitioning;
  167. };
  168. Collapse.prototype.dispose = function dispose() {
  169. $.removeData(this._element, DATA_KEY);
  170. this._config = null;
  171. this._parent = null;
  172. this._element = null;
  173. this._triggerArray = null;
  174. this._isTransitioning = null;
  175. };
  176. // private
  177. Collapse.prototype._getConfig = function _getConfig(config) {
  178. config = $.extend({}, Default, config);
  179. config.toggle = Boolean(config.toggle); // coerce string values
  180. Util.typeCheckConfig(NAME, config, DefaultType);
  181. return config;
  182. };
  183. Collapse.prototype._getDimension = function _getDimension() {
  184. var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
  185. return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
  186. };
  187. Collapse.prototype._getParent = function _getParent() {
  188. var _this3 = this;
  189. var parent = $(this._config.parent)[0];
  190. var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
  191. $(parent).find(selector).each(function (i, element) {
  192. _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
  193. });
  194. return parent;
  195. };
  196. Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
  197. if (element) {
  198. var isOpen = $(element).hasClass(ClassName.IN);
  199. element.setAttribute('aria-expanded', isOpen);
  200. if (triggerArray.length) {
  201. $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
  202. }
  203. }
  204. };
  205. // static
  206. Collapse._getTargetFromElement = function _getTargetFromElement(element) {
  207. var selector = Util.getSelectorFromElement(element);
  208. return selector ? $(selector)[0] : null;
  209. };
  210. Collapse._jQueryInterface = function _jQueryInterface(config) {
  211. return this.each(function () {
  212. var $this = $(this);
  213. var data = $this.data(DATA_KEY);
  214. var _config = $.extend({}, Default, $this.data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
  215. if (!data && _config.toggle && /show|hide/.test(config)) {
  216. _config.toggle = false;
  217. }
  218. if (!data) {
  219. data = new Collapse(this, _config);
  220. $this.data(DATA_KEY, data);
  221. }
  222. if (typeof config === 'string') {
  223. if (data[config] === undefined) {
  224. throw new Error('No method named "' + config + '"');
  225. }
  226. data[config]();
  227. }
  228. });
  229. };
  230. _createClass(Collapse, null, [{
  231. key: 'VERSION',
  232. get: function get() {
  233. return VERSION;
  234. }
  235. }, {
  236. key: 'Default',
  237. get: function get() {
  238. return Default;
  239. }
  240. }]);
  241. return Collapse;
  242. }();
  243. /**
  244. * ------------------------------------------------------------------------
  245. * Data Api implementation
  246. * ------------------------------------------------------------------------
  247. */
  248. $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
  249. event.preventDefault();
  250. var target = Collapse._getTargetFromElement(this);
  251. var data = $(target).data(DATA_KEY);
  252. var config = data ? 'toggle' : $(this).data();
  253. Collapse._jQueryInterface.call($(target), config);
  254. });
  255. /**
  256. * ------------------------------------------------------------------------
  257. * jQuery
  258. * ------------------------------------------------------------------------
  259. */
  260. $.fn[NAME] = Collapse._jQueryInterface;
  261. $.fn[NAME].Constructor = Collapse;
  262. $.fn[NAME].noConflict = function () {
  263. $.fn[NAME] = JQUERY_NO_CONFLICT;
  264. return Collapse._jQueryInterface;
  265. };
  266. return Collapse;
  267. }(jQuery);
  268. //# sourceMappingURL=collapse.js.map