collapse.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
  2. function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  3. 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); } }
  4. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  5. /**
  6. * --------------------------------------------------------------------------
  7. * Bootstrap (v4.1.1): collapse.js
  8. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  9. * --------------------------------------------------------------------------
  10. */
  11. var Collapse = function ($) {
  12. /**
  13. * ------------------------------------------------------------------------
  14. * Constants
  15. * ------------------------------------------------------------------------
  16. */
  17. var NAME = 'collapse';
  18. var VERSION = '4.1.1';
  19. var DATA_KEY = 'bs.collapse';
  20. var EVENT_KEY = "." + DATA_KEY;
  21. var DATA_API_KEY = '.data-api';
  22. var JQUERY_NO_CONFLICT = $.fn[NAME];
  23. var Default = {
  24. toggle: true,
  25. parent: ''
  26. };
  27. var DefaultType = {
  28. toggle: 'boolean',
  29. parent: '(string|element)'
  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. SHOW: 'show',
  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: '.show, .collapsing',
  50. DATA_TOGGLE: '[data-toggle="collapse"]'
  51. /**
  52. * ------------------------------------------------------------------------
  53. * Class Definition
  54. * ------------------------------------------------------------------------
  55. */
  56. };
  57. var Collapse =
  58. /*#__PURE__*/
  59. function () {
  60. function Collapse(element, config) {
  61. this._isTransitioning = false;
  62. this._element = element;
  63. this._config = this._getConfig(config);
  64. this._triggerArray = $.makeArray($("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
  65. var tabToggles = $(Selector.DATA_TOGGLE);
  66. for (var i = 0; i < tabToggles.length; i++) {
  67. var elem = tabToggles[i];
  68. var selector = Util.getSelectorFromElement(elem);
  69. if (selector !== null && $(selector).filter(element).length > 0) {
  70. this._selector = selector;
  71. this._triggerArray.push(elem);
  72. }
  73. }
  74. this._parent = this._config.parent ? this._getParent() : null;
  75. if (!this._config.parent) {
  76. this._addAriaAndCollapsedClass(this._element, this._triggerArray);
  77. }
  78. if (this._config.toggle) {
  79. this.toggle();
  80. }
  81. } // Getters
  82. var _proto = Collapse.prototype;
  83. // Public
  84. _proto.toggle = function toggle() {
  85. if ($(this._element).hasClass(ClassName.SHOW)) {
  86. this.hide();
  87. } else {
  88. this.show();
  89. }
  90. };
  91. _proto.show = function show() {
  92. var _this = this;
  93. if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
  94. return;
  95. }
  96. var actives;
  97. var activesData;
  98. if (this._parent) {
  99. actives = $.makeArray($(this._parent).find(Selector.ACTIVES).filter("[data-parent=\"" + this._config.parent + "\"]"));
  100. if (actives.length === 0) {
  101. actives = null;
  102. }
  103. }
  104. if (actives) {
  105. activesData = $(actives).not(this._selector).data(DATA_KEY);
  106. if (activesData && activesData._isTransitioning) {
  107. return;
  108. }
  109. }
  110. var startEvent = $.Event(Event.SHOW);
  111. $(this._element).trigger(startEvent);
  112. if (startEvent.isDefaultPrevented()) {
  113. return;
  114. }
  115. if (actives) {
  116. Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
  117. if (!activesData) {
  118. $(actives).data(DATA_KEY, null);
  119. }
  120. }
  121. var dimension = this._getDimension();
  122. $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
  123. this._element.style[dimension] = 0;
  124. if (this._triggerArray.length > 0) {
  125. $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
  126. }
  127. this.setTransitioning(true);
  128. var complete = function complete() {
  129. $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
  130. _this._element.style[dimension] = '';
  131. _this.setTransitioning(false);
  132. $(_this._element).trigger(Event.SHOWN);
  133. };
  134. var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
  135. var scrollSize = "scroll" + capitalizedDimension;
  136. var transitionDuration = Util.getTransitionDurationFromElement(this._element);
  137. $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
  138. this._element.style[dimension] = this._element[scrollSize] + "px";
  139. };
  140. _proto.hide = function hide() {
  141. var _this2 = this;
  142. if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
  143. return;
  144. }
  145. var startEvent = $.Event(Event.HIDE);
  146. $(this._element).trigger(startEvent);
  147. if (startEvent.isDefaultPrevented()) {
  148. return;
  149. }
  150. var dimension = this._getDimension();
  151. this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
  152. Util.reflow(this._element);
  153. $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
  154. if (this._triggerArray.length > 0) {
  155. for (var i = 0; i < this._triggerArray.length; i++) {
  156. var trigger = this._triggerArray[i];
  157. var selector = Util.getSelectorFromElement(trigger);
  158. if (selector !== null) {
  159. var $elem = $(selector);
  160. if (!$elem.hasClass(ClassName.SHOW)) {
  161. $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
  162. }
  163. }
  164. }
  165. }
  166. this.setTransitioning(true);
  167. var complete = function complete() {
  168. _this2.setTransitioning(false);
  169. $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
  170. };
  171. this._element.style[dimension] = '';
  172. var transitionDuration = Util.getTransitionDurationFromElement(this._element);
  173. $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
  174. };
  175. _proto.setTransitioning = function setTransitioning(isTransitioning) {
  176. this._isTransitioning = isTransitioning;
  177. };
  178. _proto.dispose = function dispose() {
  179. $.removeData(this._element, DATA_KEY);
  180. this._config = null;
  181. this._parent = null;
  182. this._element = null;
  183. this._triggerArray = null;
  184. this._isTransitioning = null;
  185. }; // Private
  186. _proto._getConfig = function _getConfig(config) {
  187. config = _objectSpread({}, Default, config);
  188. config.toggle = Boolean(config.toggle); // Coerce string values
  189. Util.typeCheckConfig(NAME, config, DefaultType);
  190. return config;
  191. };
  192. _proto._getDimension = function _getDimension() {
  193. var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
  194. return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
  195. };
  196. _proto._getParent = function _getParent() {
  197. var _this3 = this;
  198. var parent = null;
  199. if (Util.isElement(this._config.parent)) {
  200. parent = this._config.parent; // It's a jQuery object
  201. if (typeof this._config.parent.jquery !== 'undefined') {
  202. parent = this._config.parent[0];
  203. }
  204. } else {
  205. parent = $(this._config.parent)[0];
  206. }
  207. var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
  208. $(parent).find(selector).each(function (i, element) {
  209. _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
  210. });
  211. return parent;
  212. };
  213. _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
  214. if (element) {
  215. var isOpen = $(element).hasClass(ClassName.SHOW);
  216. if (triggerArray.length > 0) {
  217. $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
  218. }
  219. }
  220. }; // Static
  221. Collapse._getTargetFromElement = function _getTargetFromElement(element) {
  222. var selector = Util.getSelectorFromElement(element);
  223. return selector ? $(selector)[0] : null;
  224. };
  225. Collapse._jQueryInterface = function _jQueryInterface(config) {
  226. return this.each(function () {
  227. var $this = $(this);
  228. var data = $this.data(DATA_KEY);
  229. var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
  230. if (!data && _config.toggle && /show|hide/.test(config)) {
  231. _config.toggle = false;
  232. }
  233. if (!data) {
  234. data = new Collapse(this, _config);
  235. $this.data(DATA_KEY, data);
  236. }
  237. if (typeof config === 'string') {
  238. if (typeof data[config] === 'undefined') {
  239. throw new TypeError("No method named \"" + config + "\"");
  240. }
  241. data[config]();
  242. }
  243. });
  244. };
  245. _createClass(Collapse, null, [{
  246. key: "VERSION",
  247. get: function get() {
  248. return VERSION;
  249. }
  250. }, {
  251. key: "Default",
  252. get: function get() {
  253. return Default;
  254. }
  255. }]);
  256. return Collapse;
  257. }();
  258. /**
  259. * ------------------------------------------------------------------------
  260. * Data Api implementation
  261. * ------------------------------------------------------------------------
  262. */
  263. $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
  264. // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
  265. if (event.currentTarget.tagName === 'A') {
  266. event.preventDefault();
  267. }
  268. var $trigger = $(this);
  269. var selector = Util.getSelectorFromElement(this);
  270. $(selector).each(function () {
  271. var $target = $(this);
  272. var data = $target.data(DATA_KEY);
  273. var config = data ? 'toggle' : $trigger.data();
  274. Collapse._jQueryInterface.call($target, config);
  275. });
  276. });
  277. /**
  278. * ------------------------------------------------------------------------
  279. * jQuery
  280. * ------------------------------------------------------------------------
  281. */
  282. $.fn[NAME] = Collapse._jQueryInterface;
  283. $.fn[NAME].Constructor = Collapse;
  284. $.fn[NAME].noConflict = function () {
  285. $.fn[NAME] = JQUERY_NO_CONFLICT;
  286. return Collapse._jQueryInterface;
  287. };
  288. return Collapse;
  289. }($);
  290. //# sourceMappingURL=collapse.js.map