From 0724bd91ff81b5eca0addce0c336c72b3ec10be5 Mon Sep 17 00:00:00 2001 From: fat Date: Thu, 7 May 2015 12:48:22 -0700 Subject: [PATCH 01/21] es6 alert :| --- Gruntfile.js | 50 +++++------ js/.jscsrc | 1 + js/.jshintrc | 15 ---- js/alert.js | 94 -------------------- js/dist/alert.js | 170 +++++++++++++++++++++++++++++++++++++ js/dist/alert.js.map | Bin 0 -> 6686 bytes js/dist/util.js | 124 +++++++++++++++++++++++++++ js/dist/util.js.map | Bin 0 -> 5049 bytes js/src/alert.js | 168 ++++++++++++++++++++++++++++++++++++ js/src/util.js | 118 +++++++++++++++++++++++++ js/tests/index.html | 8 +- js/tests/unit/alert.js | 3 +- js/tests/visual/alert.html | 4 +- package.json | 7 +- 14 files changed, 617 insertions(+), 145 deletions(-) delete mode 100644 js/.jshintrc delete mode 100644 js/alert.js create mode 100644 js/dist/alert.js create mode 100644 js/dist/alert.js.map create mode 100644 js/dist/util.js create mode 100644 js/dist/util.js.map create mode 100644 js/src/alert.js create mode 100644 js/src/util.js diff --git a/Gruntfile.js b/Gruntfile.js index f3c3af8f8..09268ecb1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -56,27 +56,16 @@ module.exports = function (grunt) { docs: 'docs/dist' }, - jshint: { + babel: { options: { - jshintrc: 'js/.jshintrc' + sourceMap: true, + modules: 'ignore' }, - grunt: { - options: { - jshintrc: 'grunt/.jshintrc' - }, - src: ['Gruntfile.js', 'grunt/*.js'] - }, - core: { - src: 'js/*.js' - }, - test: { - options: { - jshintrc: 'js/tests/unit/.jshintrc' - }, - src: 'js/tests/unit/*.js' - }, - assets: { - src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js'] + dist: { + files: { + 'js/dist/util.js': 'js/src/util.js', + 'js/dist/alert.js': 'js/src/alert.js' + } } }, @@ -85,19 +74,22 @@ module.exports = function (grunt) { config: 'js/.jscsrc' }, grunt: { - src: '<%= jshint.grunt.src %>' + src: ['Gruntfile.js', 'grunt/*.js'] }, core: { - src: '<%= jshint.core.src %>' + src: 'js/*.js' + }, + es6: { + src: 'js/src/*.js' }, test: { - src: '<%= jshint.test.src %>' + src: 'js/tests/unit/*.js' }, assets: { options: { requireCamelCaseOrUpperCaseIdentifiers: null }, - src: '<%= jshint.assets.src %>' + src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js'] } }, @@ -301,12 +293,12 @@ module.exports = function (grunt) { watch: { src: { - files: '<%= jshint.core.src %>', - tasks: ['jshint:core', 'qunit', 'concat'] + files: '<%= jscs.core.src %>', + tasks: ['qunit', 'concat'] }, test: { - files: '<%= jshint.test.src %>', - tasks: ['jshint:test', 'qunit'] + files: '<%= jscs.test.src %>', + tasks: ['qunit'] }, sass: { files: 'scss/**/*.scss', @@ -398,7 +390,7 @@ module.exports = function (grunt) { testSubtasks.push('saucelabs-qunit'); } grunt.registerTask('test', testSubtasks); - grunt.registerTask('test-js', ['jshint:core', 'jshint:test', 'jshint:grunt', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']); + grunt.registerTask('test-js', ['jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']); // JS distribution task. grunt.registerTask('dist-js', ['concat', 'uglify:core', 'commonjs']); @@ -434,7 +426,7 @@ module.exports = function (grunt) { // Docs task. grunt.registerTask('docs-css', ['autoprefixer:docs', 'autoprefixer:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']); grunt.registerTask('docs-js', ['uglify:docsJs']); - grunt.registerTask('lint-docs-js', ['jshint:assets', 'jscs:assets']); + grunt.registerTask('lint-docs-js', ['jscs:assets']); grunt.registerTask('docs', ['docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs']); grunt.registerTask('docs-github', ['jekyll:github']); diff --git a/js/.jscsrc b/js/.jscsrc index 9544d2d2b..8d5ef3e56 100644 --- a/js/.jscsrc +++ b/js/.jscsrc @@ -1,4 +1,5 @@ { + "esnext": true, "disallowEmptyBlocks": true, "disallowKeywords": ["with"], "disallowMixedSpacesAndTabs": true, diff --git a/js/.jshintrc b/js/.jshintrc deleted file mode 100644 index a59e1d00a..000000000 --- a/js/.jshintrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "asi" : true, - "browser" : true, - "eqeqeq" : false, - "eqnull" : true, - "es3" : true, - "expr" : true, - "jquery" : true, - "latedef" : true, - "laxbreak" : true, - "nonbsp" : true, - "strict" : true, - "undef" : true, - "unused" : true -} diff --git a/js/alert.js b/js/alert.js deleted file mode 100644 index 1925ef011..000000000 --- a/js/alert.js +++ /dev/null @@ -1,94 +0,0 @@ -/* ======================================================================== - * Bootstrap: alert.js v3.3.4 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.3.4' - - Alert.TRANSITION_DURATION = 150 - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.closest('.alert') - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(Alert.TRANSITION_DURATION) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); diff --git a/js/dist/alert.js b/js/dist/alert.js new file mode 100644 index 000000000..0dbfe767b --- /dev/null +++ b/js/dist/alert.js @@ -0,0 +1,170 @@ +'use strict'; + +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; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +/** + * -------------------------------------------------------------------------- + * Constants + * -------------------------------------------------------------------------- + */ + +var NAME = 'alert'; +var VERSION = '4.0.0'; +var DATA_KEY = 'bs.alert'; +var JQUERY_NO_CONFLICT = $.fn[NAME]; +var TRANSITION_DURATION = 150; + +var Selector = { + DISMISS: '[data-dismiss="alert"]' +}; + +var Event = { + CLOSE: 'close.bs.alert', + CLOSED: 'closed.bs.alert', + CLICK: 'click.bs.alert.data-api' +}; + +var ClassName = { + ALERT: 'alert', + FADE: 'fade', + IN: 'in' +}; + +/** + * -------------------------------------------------------------------------- + * Class Definition + * -------------------------------------------------------------------------- + */ + +var Alert = (function () { + function Alert(element) { + _classCallCheck(this, Alert); + + if (element) { + this.element = element; + } + } + + _createClass(Alert, [{ + key: 'close', + + // public + + value: function close(element) { + var rootElement = this._getRootElement(element); + var customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent.isDefaultPrevented()) { + return; + } + + this._removeElement(rootElement); + } + }, { + key: '_getRootElement', + + // private + + value: function _getRootElement(element) { + var parent = false; + var selector = Util.getSelectorFromElement(element); + + if (selector) { + parent = $(selector)[0]; + } + + if (!parent) { + parent = $(element).closest('.' + ClassName.ALERT)[0]; + } + + return parent; + } + }, { + key: '_triggerCloseEvent', + value: function _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE); + $(element).trigger(closeEvent); + return closeEvent; + } + }, { + key: '_removeElement', + value: function _removeElement(element) { + $(element).removeClass(ClassName.IN); + + if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element); + return; + } + + $(element).one(Util.TRANSITION_END, this._destroyElement.bind(this, element)).emulateTransitionEnd(TRANSITION_DURATION); + } + }, { + key: '_destroyElement', + value: function _destroyElement(element) { + $(element).detach().trigger(Event.CLOSED).remove(); + } + }], [{ + key: '_jQueryInterface', + + // static + + value: function _jQueryInterface(config) { + return this.each(function () { + var $element = $(this); + var data = $element.data(DATA_KEY); + + if (!data) { + data = new Alert(this); + $element.data(DATA_KEY, data); + } + + if (config === 'close') { + data[config](this); + } + }); + } + }, { + key: '_handleDismiss', + value: function _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + } + }]); + + return Alert; +})(); + +/** + * -------------------------------------------------------------------------- + * Data Api implementation + * -------------------------------------------------------------------------- + */ + +$(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); + +/** + * -------------------------------------------------------------------------- + * jQuery + * -------------------------------------------------------------------------- + */ + +$.fn[NAME] = Alert._jQueryInterface; +$.fn[NAME].Constructor = Alert; +$.fn[NAME].noConflict = function () { + $.fn[NAME] = Alert._JQUERY_NO_CONFLICT; + return Alert._jQueryInterface; +}; +/** + * -------------------------------------------------------------------------- + * Bootstrap (v4.0.0): alert.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ +//# sourceMappingURL=alert.js.map \ No newline at end of file diff --git a/js/dist/alert.js.map b/js/dist/alert.js.map new file mode 100644 index 0000000000000000000000000000000000000000..d2d9be6b6d2d7caa3f2c30a1e916deed7a6cd5fd GIT binary patch literal 6686 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 { + if (!called) { + $(this).trigger(transition.end) + } + }, duration) + + return this +} + +function setTransitionEndSupport() { + transition = transitionEndTest() + + $.fn.emulateTransitionEnd = transitionEndEmulator + + if (Util.supportsTransitionEnd()) { + $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent() + } +} + +setTransitionEndSupport() diff --git a/js/tests/index.html b/js/tests/index.html index fab2ebc16..536e34c74 100644 --- a/js/tests/index.html +++ b/js/tests/index.html @@ -129,9 +129,11 @@ })(); - - - + + + + + diff --git a/js/tests/unit/alert.js b/js/tests/unit/alert.js index 6be990a51..97818960a 100644 --- a/js/tests/unit/alert.js +++ b/js/tests/unit/alert.js @@ -38,7 +38,8 @@ $(function () { + '×' + '

Holy guacamole! Best check yo self, you\'re not looking too good.

' + '' - var $alert = $(alertHTML).bootstrapAlert() + + var $alert = $(alertHTML).bootstrapAlert().appendTo($('#qunit-fixture')) $alert.find('.close').trigger('click') diff --git a/js/tests/visual/alert.html b/js/tests/visual/alert.html index 0070315a2..9e6a939e9 100644 --- a/js/tests/visual/alert.html +++ b/js/tests/visual/alert.html @@ -41,8 +41,8 @@ - - + + diff --git a/package.json b/package.json index 107325a25..5e062297f 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "glob": "~5.0.3", "grunt": "~0.4.5", "grunt-autoprefixer": "~2.2.0", + "grunt-babel": "^5.0.0", "grunt-banner": "~0.3.1", "grunt-contrib-clean": "~0.6.0", "grunt-contrib-compress": "~0.13.0", @@ -85,6 +86,10 @@ "exports": "$" } }, - "files": ["css", "fonts", "js"] + "files": [ + "css", + "fonts", + "js" + ] } } From c3a79b1a8c2fa8d7fc8edcd3e626dad8b45d5dc3 Mon Sep 17 00:00:00 2001 From: fat Date: Thu, 7 May 2015 16:34:28 -0700 Subject: [PATCH 02/21] change the export pattern to protect against leaking globals --- js/dist/alert.js | 320 +++++++++++++++++++++--------------------- js/dist/alert.js.map | Bin 6686 -> 7082 bytes js/dist/util.js | 175 ++++++++++++----------- js/dist/util.js.map | Bin 5049 -> 5162 bytes js/script-compiled.js | 305 ++++++++++++++++++++++++++++++++++++++++ js/src/alert.js | 278 ++++++++++++++++++------------------ js/src/util.js | 180 ++++++++++++------------ 7 files changed, 792 insertions(+), 466 deletions(-) create mode 100644 js/script-compiled.js diff --git a/js/dist/alert.js b/js/dist/alert.js index 0dbfe767b..76b280a0c 100644 --- a/js/dist/alert.js +++ b/js/dist/alert.js @@ -4,167 +4,173 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -/** - * -------------------------------------------------------------------------- - * Constants - * -------------------------------------------------------------------------- - */ - -var NAME = 'alert'; -var VERSION = '4.0.0'; -var DATA_KEY = 'bs.alert'; -var JQUERY_NO_CONFLICT = $.fn[NAME]; -var TRANSITION_DURATION = 150; - -var Selector = { - DISMISS: '[data-dismiss="alert"]' -}; - -var Event = { - CLOSE: 'close.bs.alert', - CLOSED: 'closed.bs.alert', - CLICK: 'click.bs.alert.data-api' -}; - -var ClassName = { - ALERT: 'alert', - FADE: 'fade', - IN: 'in' -}; - -/** - * -------------------------------------------------------------------------- - * Class Definition - * -------------------------------------------------------------------------- - */ - -var Alert = (function () { - function Alert(element) { - _classCallCheck(this, Alert); - - if (element) { - this.element = element; - } - } - - _createClass(Alert, [{ - key: 'close', - - // public - - value: function close(element) { - var rootElement = this._getRootElement(element); - var customEvent = this._triggerCloseEvent(rootElement); - - if (customEvent.isDefaultPrevented()) { - return; - } - - this._removeElement(rootElement); - } - }, { - key: '_getRootElement', - - // private - - value: function _getRootElement(element) { - var parent = false; - var selector = Util.getSelectorFromElement(element); - - if (selector) { - parent = $(selector)[0]; - } - - if (!parent) { - parent = $(element).closest('.' + ClassName.ALERT)[0]; - } - - return parent; - } - }, { - key: '_triggerCloseEvent', - value: function _triggerCloseEvent(element) { - var closeEvent = $.Event(Event.CLOSE); - $(element).trigger(closeEvent); - return closeEvent; - } - }, { - key: '_removeElement', - value: function _removeElement(element) { - $(element).removeClass(ClassName.IN); - - if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { - this._destroyElement(element); - return; - } - - $(element).one(Util.TRANSITION_END, this._destroyElement.bind(this, element)).emulateTransitionEnd(TRANSITION_DURATION); - } - }, { - key: '_destroyElement', - value: function _destroyElement(element) { - $(element).detach().trigger(Event.CLOSED).remove(); - } - }], [{ - key: '_jQueryInterface', - - // static - - value: function _jQueryInterface(config) { - return this.each(function () { - var $element = $(this); - var data = $element.data(DATA_KEY); - - if (!data) { - data = new Alert(this); - $element.data(DATA_KEY, data); - } - - if (config === 'close') { - data[config](this); - } - }); - } - }, { - key: '_handleDismiss', - value: function _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault(); - } - - alertInstance.close(this); - }; - } - }]); - - return Alert; -})(); - -/** - * -------------------------------------------------------------------------- - * Data Api implementation - * -------------------------------------------------------------------------- - */ - -$(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); - -/** - * -------------------------------------------------------------------------- - * jQuery - * -------------------------------------------------------------------------- - */ - -$.fn[NAME] = Alert._jQueryInterface; -$.fn[NAME].Constructor = Alert; -$.fn[NAME].noConflict = function () { - $.fn[NAME] = Alert._JQUERY_NO_CONFLICT; - return Alert._jQueryInterface; -}; /** * -------------------------------------------------------------------------- * Bootstrap (v4.0.0): alert.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ + +var Alert = (function () { + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'alert'; + var VERSION = '4.0.0'; + var DATA_KEY = 'bs.alert'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var TRANSITION_DURATION = 150; + + var Selector = { + DISMISS: '[data-dismiss="alert"]' + }; + + var Event = { + CLOSE: 'close.bs.alert', + CLOSED: 'closed.bs.alert', + CLICK: 'click.bs.alert.data-api' + }; + + var ClassName = { + ALERT: 'alert', + FADE: 'fade', + IN: 'in' + }; + + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Alert = (function () { + function Alert(element) { + _classCallCheck(this, Alert); + + if (element) { + this.element = element; + } + } + + _createClass(Alert, [{ + key: 'close', + + // public + + value: function close(element) { + var rootElement = this._getRootElement(element); + var customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent.isDefaultPrevented()) { + return; + } + + this._removeElement(rootElement); + } + }, { + key: '_getRootElement', + + // private + + value: function _getRootElement(element) { + var parent = false; + var selector = Util.getSelectorFromElement(element); + + if (selector) { + parent = $(selector)[0]; + } + + if (!parent) { + parent = $(element).closest('.' + ClassName.ALERT)[0]; + } + + return parent; + } + }, { + key: '_triggerCloseEvent', + value: function _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE); + $(element).trigger(closeEvent); + return closeEvent; + } + }, { + key: '_removeElement', + value: function _removeElement(element) { + $(element).removeClass(ClassName.IN); + + if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element); + return; + } + + $(element).one(Util.TRANSITION_END, this._destroyElement.bind(this, element)).emulateTransitionEnd(TRANSITION_DURATION); + } + }, { + key: '_destroyElement', + value: function _destroyElement(element) { + $(element).detach().trigger(Event.CLOSED).remove(); + } + }], [{ + key: '_jQueryInterface', + + // static + + value: function _jQueryInterface(config) { + return this.each(function () { + var $element = $(this); + var data = $element.data(DATA_KEY); + + if (!data) { + data = new Alert(this); + $element.data(DATA_KEY, data); + } + + if (config === 'close') { + data[config](this); + } + }); + } + }, { + key: '_handleDismiss', + value: function _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + } + }]); + + return Alert; + })(); + + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + $(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); + + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Alert._jQueryInterface; + $.fn[NAME].Constructor = Alert; + $.fn[NAME].noConflict = function () { + $.fn[NAME] = Alert._JQUERY_NO_CONFLICT; + return Alert._jQueryInterface; + }; + + return Alert; +})(); //# sourceMappingURL=alert.js.map \ No newline at end of file diff --git a/js/dist/alert.js.map b/js/dist/alert.js.map index d2d9be6b6d2d7caa3f2c30a1e916deed7a6cd5fd..f3bc7ad7fcb0e300cd27e3737628201b4be8429e 100644 GIT binary patch literal 7082 zcmcIoZExE~68OBgwYpa}wJyC~9TXkw}%KoTP33d*@}B zOHtC{KEx{EP~3TWX6BjMQU7YasJuwBv~}{6(<-uc9;>2ta@%??Iz=9LqJ_#!_qk}@ zJFPTY(iuE1qtz-&A3?I!t$(DvmQE<;z&V%l-04f%cYG;*=L5Vmf>MrC&l#W;h=wTj z$#X_hj!;&1K|b~QoL<7Y+I@T}qrk?d#VK2aI^1yCY;i$YalsA8d=3nZ zbcmWE)^AHs(}xH`=k!#SwCvSf(veocAUPG_VC6el#6fo~{R?7{RwIoVxl2zC2ateg zpA#R+^Vq?PHzI!V*grKAkd%v4MYht%6;Zj_$XNl_3U6mlu(+v)NUEk}ABm#_PA*xY zKO|$nZahg0`ir*}H6b>3-|x1&Q7Rod8K-unKSXqTM{Tv?nkuZz3?Ry$1_4|caVvtj z>_VDn#Hk?h93XBp$Ix{|R2na45NO-h>8>X-5B72&`&O&$4a$r!jTjVu^^oMF+F%2$ z3&R^RQ(vdbn73&0d0tXOy;tL;nMKz~4D{_u#>KqCJa%^aKXMqHK? z)|<6v3jf7-;%W#$tb2PD{B5<+?wtA;HF{c);3hWc&D60DtsFg3S{ecQkov&MAPt$0 zU0)C;1;nIZuwkJ(`?_^6=Bgi{9R5{x)%j+;0)0qCd-HRB2N6_wN!~wJ(*ipCn5bOY zh1ynxYJ^KRq39n_<|mI!VrPa4(63Do@(9vExEKpa7NI#tc&%JArK}hGj`WabaLbY+ zywG+r5(F@zVL&TEpY7V-vL?w81HhW>c1g);=-gl$^dukzlp%6K6*n*-GQ5!W1y#?z z0Zh;d2iQzK9CT;3W`bV*jmZFn!HvLoA}OQlR)GCRRozYgYpw~|#>)vcz&SgBW6fsc zAFfJFYtLDOr--HY<_(a-R3lYD3HNLFM*ezMyI_$=uwL}vV=w7(vQb2zdkMJuvBpph z7_N3Jtdojch{Z$r!M`qj6{ty{ztB?E|2qtmy`DOlyCbKG{IkXvXG05sYY6zpbz3t;n3 z+QTcx%E~TmWK%lEO7ZgAa$56bp z`sdm}5`U`BT|yMCl5Gh7A}Wd@{5H2RiYGs~0KC0YDZ*{vD>ik=h317Z8R(do)u6K z-OqSyxsW~6;%9Jy8C)Pm^)`;V-bQ&NUhNHLOuIV2J-#%`$zUQV3t&gu$K2Wf%RvF-7HmY0$sb3f??0mEwky(ohA?n z;&9A#IjYhvgsYb81+>g&+%?1IuG2b}A)9Whpe#LhVxOrpil5qb1cnYZ*7WMGe?JVSP;^Fynt@5uSOq+Zj#i|XXd7eDhnn=@(s-qCke4WO4YX~U0zPPd8 zI06nd$zVJjP#$a8@EosDl*Mx`O4n-JEFmCoi$_h3DjR+TTR9b}`pj!y)05a^+#$^x zq^dv&iKa0HFHTQk0iwP-+~N9`Q*_^S3)avMTtV7JW!~iaDN1Jx)#Ih6O`AbTTVt$h zesscZniXCKH35A?ZoL(PB;6HXANn#eWFTbq^ltd)skj-E4oHVV|6qu(wwCme9deZj z`0c~(4}^W)?c|_6%i=ZNM=&bdTtU-Zum|cD&D>+I-ca>x+G^Z~&9Yir^6Vf=ziQsN zg$esBEpc|oCxV+lr`&&TbBG`mtK$0j(}=e{XnaaqLn6&UW)7PgtQN3YY!4V~%~)_B pwttRL3iOurKcHzs>ps(X?$U2Z*eZ9a`a-|FXS|CUysi6h{{SJ1h;{$~ delta 2007 zcmZ`&&rcgi6xISJ81u`&jR|HAHW+8Ip+Ti!C1iG4yN)p~F)jf?)5TsAr^W_*ApwMt zdPu7tBBFO}RkczMRiyp_jZ{UswN;fKqh2aSs@k4e7^jQQ<00V+E>5rm?h2mq{vk&CnZTza+^n2~;rEKPxPf zIAL1^$=4Y&av7}AqRU6z2hk&?TE1ik>atKO6GD#7M5Ei zi#G)op=T4?v!-J;xrZKL~7;%L*ojR)f zhUE+FDsoX2#<6GTYGY4xFkm8F29BEg;UkmtGGjmyxf6yG7DYE?g$>d<1`XSbxgPl4 z6dq>Ualj4r6)>=0$=MVoCK>D z9=>n&u~jdaEPcjGw0OA$o?hj$@R`MH!lyPV!mpOgrf4|4QU-rl3LdomU@LBHR;n7G z(~2d2y;|Aehu~7%nnkLVYnoElY6etpx5678eUR-4!d^!R9^?N-$ABYGaeP)Ssd=qZ z<*)Gjm|*S-0T zTCc+2)~L0rYTH#-#-M;}wvhh}S+%&MXsXV3>$a-hs8lp~-{EnURE^(Ms?;YQomy8) zHH5))+cY%T-Oyw2HQXY0FRa>Q#_mhI(^x&T2jMsSC9pdJUR?;Er*fJ1CzpanhadJF z0(|8Nz)Qy{n4Q7@(apJBuR*$0DSHC+E^Qq zuucoF+!3&P{4nlu!K}x};JcnaOTA`0{?qEeYH5otCl zrP#0?4{&5AnN26NSq#EA-9c`c&REOc`E9kjiy?e8mQ%#=*gFO7%g5Z2mp4DoMFa1$qSo=Zdh^U{x^7>!zvYS|$+(9LI^bv7F$n zNeK$Qa78Mb69*263#!BkaR3SRz=cC7H^dRdfddCr1P5-+ytiwIwY}W!AnA{(yhdcLKL|ngu&M_mUk{8svVuLg3miQxk|aax)8g%%+6!-k$HvLwEA`atKq@T+%DTL*1~?x~R#kEKI<#7tF%VHfgi!dS_d@upf} zx0OMkrz7##Dm1b{o3=wG4DX&1%cTKB8-8Zk*;MjLnYr$8( z%N!dX8M33>=l>AMz=f#8#OPVA0#`@pv@+C3MV-`FW=LDyo?B{a`IAIiQ6fsl(l8{u zP4bjfqMU~$qbc6tRrquC6+aSdBQZGdPfnA%%6W;2oHksx@RmQWHQ~^oLQWt1FCo7Z z|Gc&afBB0Kaemv(D-qR_ppOO8uQXgFiF8jcOH&y~`(f!ae%~OTs}vV}2jhlP-(|bW ztF()90;vHW7z(8%KKgcJSvn$*2kJP~FCyB3?jTET)@V!@c}eFrxTjr1w?5P+Jv%zA zYqRj3Hb<|&X*bg-&^rYOOLoECsHnBUx!a0=0YS>1B!b-c+?*#p+>&>({o77^3){;D zwQ+^uN6+MK%-lzWBAF+NlaB>XMSWRh4#W7rLJ>|IWC(LZp3^kNFKf@0wR6qA?t#r} zw$)+FES=7<5>&%4KhM~)lk|RgAYw7OgHOL!W73eUs8;d3w@$w49VdQuju z97LcO`Eb#mMC0&9BzT1}Yn!DH5oPc2LZ#NV?933{X|~x%15zp$w8mR$|*O&v8&S>cr8sv=Q?9q^k%1J*Gh%-ey_D{J#eS^eC!hZJhq4; zIBKe6*^(V|M}%Y`17_elJPagoJ#Gcg!Z(2lI0@W1wE&Ue8C;q{2@g(z5zL1)F!LYchSX~S delta 1537 zcmZ8gO>7%g5Z2mBY{h@IlR6m=T+NPvPX;Hiilor<3DAhK|bp>-o!!t4PXed1Xu}Z3xmRX$g5|xzQZw+y3 zi&P*w=FDzVS`ir)E7uBC?Qnda+=TDP=EF!*WK31UB){~Zg{NcjB#$D1i&VL|AZ?$n zT=6BOHq?Aq(*hFYE`OQsw;{1=ShvFE+OL5iH@VPaD_3v#|VU5 zq|T_Y+xOMujt&$)sBNa89T%MBFDop_N2>A4Iw?_F;^mBfAM*gxx}?J+Nt>^51JU_) zHdWUeY3(Y^rUbEe|c7=CZxTup@w=(~AswqeOx8J?Xf#k2AUgO+Ku<+@{-GVK|sQp*ji zVeL0-VC0HkAg|~JeYyI!5sV@jJP0wCD%?WSq!9XThvSv320`1Qr( zuwxGpgH##8)z_U3 { -/** - * -------------------------------------------------------------------------- - * Constants - * -------------------------------------------------------------------------- - */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ -const NAME = 'alert' -const VERSION = '4.0.0' -const DATA_KEY = 'bs.alert' -const JQUERY_NO_CONFLICT = $.fn[NAME] -const TRANSITION_DURATION = 150 + const NAME = 'alert' + const VERSION = '4.0.0' + const DATA_KEY = 'bs.alert' + const JQUERY_NO_CONFLICT = $.fn[NAME] + const TRANSITION_DURATION = 150 -const Selector = { - DISMISS : '[data-dismiss="alert"]' -} + const Selector = { + DISMISS : '[data-dismiss="alert"]' + } -const Event = { - CLOSE : 'close.bs.alert', - CLOSED : 'closed.bs.alert', - CLICK : 'click.bs.alert.data-api' -} + const Event = { + CLOSE : 'close.bs.alert', + CLOSED : 'closed.bs.alert', + CLICK : 'click.bs.alert.data-api' + } -const ClassName = { - ALERT : 'alert', - FADE : 'fade', - IN : 'in' -} - - -/** - * -------------------------------------------------------------------------- - * Class Definition - * -------------------------------------------------------------------------- - */ - -export class Alert { - - constructor(element) { - if (element) { - this.element = element - } + const ClassName = { + ALERT : 'alert', + FADE : 'fade', + IN : 'in' } - // public + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ - close(element) { - let rootElement = this._getRootElement(element) - let customEvent = this._triggerCloseEvent(rootElement) + class Alert { - if (customEvent.isDefaultPrevented()) { - return + constructor(element) { + if (element) { + this.element = element + } } - this._removeElement(rootElement) - } + // public - // private + close(element) { + let rootElement = this._getRootElement(element) + let customEvent = this._triggerCloseEvent(rootElement) - _getRootElement(element) { - let parent = false - let selector = Util.getSelectorFromElement(element) - - if (selector) { - parent = $(selector)[0] - } - - if (!parent) { - parent = $(element).closest('.' + ClassName.ALERT)[0] - } - - return parent - } - - _triggerCloseEvent(element) { - var closeEvent = $.Event(Event.CLOSE) - $(element).trigger(closeEvent) - return closeEvent - } - - _removeElement(element) { - $(element).removeClass(ClassName.IN) - - if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { - this._destroyElement(element) - return - } - - $(element) - .one(Util.TRANSITION_END, this._destroyElement.bind(this, element)) - .emulateTransitionEnd(TRANSITION_DURATION) - } - - _destroyElement(element) { - $(element) - .detach() - .trigger(Event.CLOSED) - .remove() - } - - - // static - - static _jQueryInterface(config) { - return this.each(function () { - let $element = $(this) - let data = $element.data(DATA_KEY) - - if (!data) { - data = new Alert(this) - $element.data(DATA_KEY, data) + if (customEvent.isDefaultPrevented()) { + return } - if (config === 'close') { - data[config](this) - } - }) - } - - static _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault() - } - - alertInstance.close(this) + this._removeElement(rootElement) } + + + // private + + _getRootElement(element) { + let parent = false + let selector = Util.getSelectorFromElement(element) + + if (selector) { + parent = $(selector)[0] + } + + if (!parent) { + parent = $(element).closest('.' + ClassName.ALERT)[0] + } + + return parent + } + + _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE) + $(element).trigger(closeEvent) + return closeEvent + } + + _removeElement(element) { + $(element).removeClass(ClassName.IN) + + if (!Util.supportsTransitionEnd() || + !$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element) + return + } + + $(element) + .one(Util.TRANSITION_END, this._destroyElement.bind(this, element)) + .emulateTransitionEnd(TRANSITION_DURATION) + } + + _destroyElement(element) { + $(element) + .detach() + .trigger(Event.CLOSED) + .remove() + } + + + // static + + static _jQueryInterface(config) { + return this.each(function () { + let $element = $(this) + let data = $element.data(DATA_KEY) + + if (!data) { + data = new Alert(this) + $element.data(DATA_KEY, data) + } + + if (config === 'close') { + data[config](this) + } + }) + } + + static _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault() + } + + alertInstance.close(this) + } + } + } -} + + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + $(document).on( + Event.CLICK, + Selector.DISMISS, + Alert._handleDismiss(new Alert()) + ) -/** - * -------------------------------------------------------------------------- - * Data Api implementation - * -------------------------------------------------------------------------- - */ + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ -$(document).on( - Event.CLICK, - Selector.DISMISS, - Alert._handleDismiss(new Alert()) -) + $.fn[NAME] = Alert._jQueryInterface + $.fn[NAME].Constructor = Alert + $.fn[NAME].noConflict = function () { + $.fn[NAME] = Alert._JQUERY_NO_CONFLICT + return Alert._jQueryInterface + } + return Alert -/** - * -------------------------------------------------------------------------- - * jQuery - * -------------------------------------------------------------------------- - */ +})() -$.fn[NAME] = Alert._jQueryInterface -$.fn[NAME].Constructor = Alert -$.fn[NAME].noConflict = function () { - $.fn[NAME] = Alert._JQUERY_NO_CONFLICT - return Alert._jQueryInterface -} +export default Alert diff --git a/js/src/util.js b/js/src/util.js index e9542149e..68205edef 100644 --- a/js/src/util.js +++ b/js/src/util.js @@ -5,114 +5,120 @@ * -------------------------------------------------------------------------- */ +const Util = (() => { -/** - * -------------------------------------------------------------------------- - * Public Util Api - * -------------------------------------------------------------------------- - */ -var Util = { + /** + * ------------------------------------------------------------------------ + * Private TransitionEnd Helpers + * ------------------------------------------------------------------------ + */ - TRANSITION_END: 'bsTransitionEnd', + let transition = false - getUID(prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - }, - - getSelectorFromElement(element) { - let selector = element.getAttribute('data-target') - - if (!selector) { - selector = element.getAttribute('href') || '' - selector = /^#[a-z]/i.test(selector) ? selector : null - } - - return selector - }, - - reflow(element) { - new Function('bs', 'return bs')(element.offsetHeight) - }, - - supportsTransitionEnd() { - return !!transition + const TransitionEndEvent = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' } -} - -export default Util - - -/** - * -------------------------------------------------------------------------- - * Private TransitionEnd Helpers - * -------------------------------------------------------------------------- - */ - -let transition = false - -const TransitionEndEvent = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' -} - -function getSpecialTransitionEndEvent() { - return { - bindType: transition.end, - delegateType: transition.end, - handle: function (event) { - if ($(event.target).is(this)) { - return event.handleObj.handler.apply(this, arguments) + function getSpecialTransitionEndEvent() { + return { + bindType: transition.end, + delegateType: transition.end, + handle: function (event) { + if ($(event.target).is(this)) { + return event.handleObj.handler.apply(this, arguments) + } } } } -} -function transitionEndTest() { - if (window.QUnit) { + function transitionEndTest() { + if (window.QUnit) { + return false + } + + let el = document.createElement('bootstrap') + + for (var name in TransitionEndEvent) { + if (el.style[name] !== undefined) { + return { end: TransitionEndEvent[name] } + } + } + return false } - let el = document.createElement('bootstrap') + function transitionEndEmulator(duration) { + let called = false - for (var name in TransitionEndEvent) { - if (el.style[name] !== undefined) { - return { end: TransitionEndEvent[name] } + $(this).one(Util.TRANSITION_END, function () { + called = true + }) + + setTimeout(() => { + if (!called) { + $(this).trigger(transition.end) + } + }, duration) + + return this + } + + function setTransitionEndSupport() { + transition = transitionEndTest() + + $.fn.emulateTransitionEnd = transitionEndEmulator + + if (Util.supportsTransitionEnd()) { + $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent() } } - return false -} -function transitionEndEmulator(duration) { - let called = false + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ - $(this).one(Util.TRANSITION_END, function () { - called = true - }) + let Util = { - setTimeout(() => { - if (!called) { - $(this).trigger(transition.end) + TRANSITION_END: 'bsTransitionEnd', + + getUID(prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + }, + + getSelectorFromElement(element) { + let selector = element.getAttribute('data-target') + + if (!selector) { + selector = element.getAttribute('href') || '' + selector = /^#[a-z]/i.test(selector) ? selector : null + } + + return selector + }, + + reflow(element) { + new Function('bs', 'return bs')(element.offsetHeight) + }, + + supportsTransitionEnd() { + return !!transition } - }, duration) - return this -} - -function setTransitionEndSupport() { - transition = transitionEndTest() - - $.fn.emulateTransitionEnd = transitionEndEmulator - - if (Util.supportsTransitionEnd()) { - $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent() } -} -setTransitionEndSupport() + setTransitionEndSupport() + + return Util + +})() + +export default Util From 660505188241418ffda53b5eb848defecd5f57e1 Mon Sep 17 00:00:00 2001 From: fat Date: Thu, 7 May 2015 17:07:38 -0700 Subject: [PATCH 03/21] button -> es6 --- Gruntfile.js | 3 +- js/dist/alert.js | 8 +- js/dist/alert.js.map | Bin 7082 -> 7182 bytes js/dist/button.js | 158 +++++++++++++++++++ js/dist/button.js.map | Bin 0 -> 7577 bytes js/dist/util.js | 4 +- js/dist/util.js.map | Bin 5162 -> 5189 bytes js/script-compiled.js | 305 ------------------------------------ js/src/alert.js | 8 +- js/src/button.js | 158 +++++++++++++++++++ js/src/util.js | 4 +- js/tests/index.html | 2 +- js/tests/unit/button.js | 58 ------- js/tests/visual/button.html | 8 +- 14 files changed, 335 insertions(+), 381 deletions(-) create mode 100644 js/dist/button.js create mode 100644 js/dist/button.js.map delete mode 100644 js/script-compiled.js create mode 100644 js/src/button.js diff --git a/Gruntfile.js b/Gruntfile.js index 09268ecb1..c32f79f0e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -64,7 +64,8 @@ module.exports = function (grunt) { dist: { files: { 'js/dist/util.js': 'js/src/util.js', - 'js/dist/alert.js': 'js/src/alert.js' + 'js/dist/alert.js': 'js/src/alert.js', + 'js/dist/button.js': 'js/src/button.js', } } }, diff --git a/js/dist/alert.js b/js/dist/alert.js index 76b280a0c..4226dd61a 100644 --- a/js/dist/alert.js +++ b/js/dist/alert.js @@ -11,7 +11,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons * -------------------------------------------------------------------------- */ -var Alert = (function () { +var Alert = (function ($) { /** * ------------------------------------------------------------------------ @@ -62,6 +62,8 @@ var Alert = (function () { // public value: function close(element) { + element = element || this.element; + var rootElement = this._getRootElement(element); var customEvent = this._triggerCloseEvent(rootElement); @@ -167,10 +169,10 @@ var Alert = (function () { $.fn[NAME] = Alert._jQueryInterface; $.fn[NAME].Constructor = Alert; $.fn[NAME].noConflict = function () { - $.fn[NAME] = Alert._JQUERY_NO_CONFLICT; + $.fn[NAME] = JQUERY_NO_CONFLICT; return Alert._jQueryInterface; }; return Alert; -})(); +})(jQuery); //# sourceMappingURL=alert.js.map \ No newline at end of file diff --git a/js/dist/alert.js.map b/js/dist/alert.js.map index f3bc7ad7fcb0e300cd27e3737628201b4be8429e..aa106df1e8a16ce4b0677f1cb539872cac5717da 100644 GIT binary patch delta 226 zcmZ2w-e)l(Ln_qK(OJhCM7TOSdRs$*qhoNv#)@Dj-Bd?Me;s#6M|T~65X;li(Gx;| zwSdKdEJtf=M@QGJ$&Ad>lRMaCHZilYi)6UF>v$s>2~=UUS&A!_Q83%d(J|WzWT_)i z&{^MU@+@vQJ|Nds$Jf!(7wnqNPq=Fs8C5nX@G7$?r{<*QrskC>*ebwSH8lz)8JWd; dP<~9_=4!$1oRcl3gW0kIOH+#~C-+Fp0RUFSK{5aU delta 138 zcmeCPSY#@V(ODwHx~1-@79z z(z3Je9U2#KW%BO1yXQVgwSTo9MOkG<-a35cx2j@YrlM*cUbXJ4PF1Fz+qINM9^6;0 zYrmBzOWK6TWwKgj`3yu`UH8NJg!==|&-^p|>T}-rBhDj#f?xC$bADn}IKL=EB??Ld zlz#~Q3s^>3-UX#qr1poL4{=}k^klYky-hl>o%$a*|4?f`>g|V+kU?OeyfCiB>L*#J zH3KZQ<`OiQp^605DIDGf&*F~ue8l;P_R-yWh@qbO5M`eN!Nq%b@dV?C#XBDqPf&0` zA$9vCNcIuFr{Xq&^-*W)S1J&K{{qinLR^0v`2xd+<%z$sY;4RzWdwv@TWpFi{{WmhAZLK{6#XC{A9_H155eX{HBhHMXMA)*5n`;7pYV6@ zRlpICW0hk7h`T?B{2lN|E`ezO68Y6hG&Rw8YT|@Pk72i)h5Wd$wZLG)FOGdI0;2J~ z{}C~4QS`B936yH?O{fH@luXif`5M8fwy8ICSw;}PDd5NyV+2(WOlnEzXFXFkwBVCL#?Q9Q0(YypH?_Sb)huxiCTTuHf-2T^c~zsb7%S3FnEDv>uqDu$4sX zfwgPZ%#+I0tDbAYcn8IaGeRSiaidn}A9i;I2yz@NHR?nVOY{!P6uz(_dO8ETM2#(} zY@H}>iOfcMlIefRH@O3mK%Alu=t(S_O3NW3KoE)$NhTJ2W$BWdI^Q2A3(7p)@^-(*aX&~#FNs`73)93_F zJGKifBmsdxkD(9cy~WZl2he~M5g|ZDyn)F~)tzD`kS*$Fa@sfrX4Lp0VCxWJ8llLa8(YVa{)@nOmtgoCPXFqrt(NOtkgolfJ4`?SW>JHlC!K?-|U(-2V8yDRSJtxDCz^3w_~TW z3A}*|wI)=j(S}VK#W3%EL!Fc;8Y)^-7NiUpVB1x@Y?Csj5ab3}iZs{Y&Tfg@rAMZ8 zngPQY12=|GgaZ74HzcbD40MH+uOtiUosu0f&)aLWqhHuxxW||xj(tb!5EbAcca=>a(n>EpI#rRG^jwLMN(Dg z@WKyUkRNn_N8`b-F*{`YNh-5PvG1$(a55eP1gzi6+$_EuMw1c4#c7eQD~jo>YhWZ6 zB9%pH@hRBxu-`w8Zz6tqIUJ+<)m3_tOxST3MRu5%%U>6%ZmMmpevfrMfw1z(vLqH z&rPp1*_bC4jUBHZK7ne%_7*(kWEcC>WKjYAn})tZnk!*zz?jGMs9tsxRi-82Aq;?HEEvH9#)@(APG~ zb4?wJC_)CjsvYbY-|A|(IlgO9t7(qG`c%?-#uuk}LiHa~ z%{B?rWU=sSM4#=Ono=01R4jY;I`yw9d`wD9(Vpj$WRLb{Omupv`mNm!l(WqtLN5BO z^E+Lk;Y4o#XRi}TyfA26a0<6g6Hx9j+Gi_&HJXUfXS&ka*A>N({yx&fCupV}eX%-0 zgfDvP?gvGyN~Ix^7a%l+yPd?>BikNzXIMDc-+rm0=$W3uPZT4{=#t$K#LoHJ_7shj TF7cWEDdA4FU+r=0`s@Dyg>LUZ literal 0 HcmV?d00001 diff --git a/js/dist/util.js b/js/dist/util.js index 4c8c4e639..4f25e200d 100644 --- a/js/dist/util.js +++ b/js/dist/util.js @@ -7,7 +7,7 @@ 'use strict'; -var Util = (function () { +var Util = (function ($) { /** * ------------------------------------------------------------------------ @@ -119,5 +119,5 @@ var Util = (function () { setTransitionEndSupport(); return Util; -})(); +})(jQuery); //# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/js/dist/util.js.map b/js/dist/util.js.map index 71ad2163a154791a73e09aae29bb7a6bed853550..5f640b50e359900c933bfc49526d48785379055c 100644 GIT binary patch delta 75 zcmZ3baa3bMvQ(&}qqB}Ph;Vgu^tOfqN5|m2jm0_~d_Wmj9bZRBU$C0Zi#ehg8C5p_ TGcU~zSHbl<$4BZ`qtQ^D3wp?Y$+K-6SELAK2m MT&p-IYlz4K06>-z{r~^~ diff --git a/js/script-compiled.js b/js/script-compiled.js deleted file mode 100644 index 2a50eb3b3..000000000 --- a/js/script-compiled.js +++ /dev/null @@ -1,305 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -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; }; })(); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -/** - * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0): alert.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * -------------------------------------------------------------------------- - */ - -var _util = require('util'); - -var _util2 = _interopRequireDefault(_util); - -/** - * -------------------------------------------------------------------------- - * Constants - * -------------------------------------------------------------------------- - */ - -var NAME = 'alert'; -var VERSION = '4.0.0'; -var DATA_KEY = 'bs.alert'; -var JQUERY_NO_CONFLICT = $.fn[NAME]; -var TRANSITION_DURATION = 150; - -var Selector = { - DISMISS: '[data-dismiss="alert"]' -}; - -var Event = { - CLOSE: 'close.bs.alert', - CLOSED: 'closed.bs.alert', - CLICK: 'click.bs.alert.data-api' -}; - -var ClassName = { - ALERT: 'alert', - FADE: 'fade', - IN: 'in' -}; - -/** - * -------------------------------------------------------------------------- - * Class Definition - * -------------------------------------------------------------------------- - */ - -var Alert = (function () { - function Alert(element) { - _classCallCheck(this, Alert); - - if (element) { - this.element = element; - } - } - - _createClass(Alert, [{ - key: 'close', - - // public - - value: function close(element) { - var rootElement = this._getRootElement(element); - var customEvent = this._triggerCloseEvent(rootElement); - - if (customEvent.isDefaultPrevented()) { - return; - } - - this._removeElement(rootElement); - } - }, { - key: '_getRootElement', - - // private - - value: function _getRootElement(element) { - var parent = false; - var selector = _util2['default'].getSelectorFromElement(element); - - if (selector) { - parent = $(selector)[0]; - } - - if (!parent) { - parent = $(element).closest('.' + ClassName.ALERT)[0]; - } - - return parent; - } - }, { - key: '_triggerCloseEvent', - value: function _triggerCloseEvent(element) { - var closeEvent = $.Event(Event.CLOSE); - $(element).trigger(closeEvent); - return closeEvent; - } - }, { - key: '_removeElement', - value: function _removeElement(element) { - $(element).removeClass(ClassName.IN); - - if (!_util2['default'].supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { - this._destroyElement(element); - return; - } - - $(element).one(_util2['default'].TRANSITION_END, this._destroyElement.bind(this, element)).emulateTransitionEnd(TRANSITION_DURATION); - } - }, { - key: '_destroyElement', - value: function _destroyElement(element) { - $(element).detach().trigger(Event.CLOSED).remove(); - } - }], [{ - key: '_jQueryInterface', - - // static - - value: function _jQueryInterface(config) { - return this.each(function () { - var $element = $(this); - var data = $element.data(DATA_KEY); - - if (!data) { - data = new Alert(this); - $element.data(DATA_KEY, data); - } - - if (config === 'close') { - data[config](this); - } - }); - } - }, { - key: '_handleDismiss', - value: function _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault(); - } - - alertInstance.close(this); - }; - } - }]); - - return Alert; -})(); - -exports.Alert = Alert; - -/** - * -------------------------------------------------------------------------- - * Data Api implementation - * -------------------------------------------------------------------------- - */ - -$(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); - -/** - * -------------------------------------------------------------------------- - * jQuery - * -------------------------------------------------------------------------- - */ - -$.fn[NAME] = Alert._jQueryInterface; -$.fn[NAME].Constructor = Alert; -$.fn[NAME].noConflict = function () { - $.fn[NAME] = Alert._JQUERY_NO_CONFLICT; - return Alert._jQueryInterface; -}; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); -/** - * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0): util.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * -------------------------------------------------------------------------- - */ - -/** - * -------------------------------------------------------------------------- - * Public Util Api - * -------------------------------------------------------------------------- - */ - -var Util = { - - TRANSITION_END: 'bsTransitionEnd', - - getUID: function getUID(prefix) { - do prefix += ~ ~(Math.random() * 1000000); while (document.getElementById(prefix)); - return prefix; - }, - - getSelectorFromElement: function getSelectorFromElement(element) { - var selector = element.getAttribute('data-target'); - - if (!selector) { - selector = element.getAttribute('href') || ''; - selector = /^#[a-z]/i.test(selector) ? selector : null; - } - - return selector; - }, - - reflow: function reflow(element) { - new Function('bs', 'return bs')(element.offsetHeight); - }, - - supportsTransitionEnd: function supportsTransitionEnd() { - return !!transition; - } - -}; - -exports['default'] = Util; - -/** - * -------------------------------------------------------------------------- - * Private TransitionEnd Helpers - * -------------------------------------------------------------------------- - */ - -var transition = false; - -var TransitionEndEvent = { - WebkitTransition: 'webkitTransitionEnd', - MozTransition: 'transitionend', - OTransition: 'oTransitionEnd otransitionend', - transition: 'transitionend' -}; - -function getSpecialTransitionEndEvent() { - return { - bindType: transition.end, - delegateType: transition.end, - handle: function handle(event) { - if ($(event.target).is(this)) { - return event.handleObj.handler.apply(this, arguments); - } - } - }; -} - -function transitionEndTest() { - if (window.QUnit) { - return false; - } - - var el = document.createElement('bootstrap'); - - for (var name in TransitionEndEvent) { - if (el.style[name] !== undefined) { - return { end: TransitionEndEvent[name] }; - } - } - - return false; -} - -function transitionEndEmulator(duration) { - var _this = this; - - var called = false; - - $(this).one(Util.TRANSITION_END, function () { - called = true; - }); - - setTimeout(function () { - if (!called) { - $(_this).trigger(transition.end); - } - }, duration); - - return this; -} - -function setTransitionEndSupport() { - transition = transitionEndTest(); - - $.fn.emulateTransitionEnd = transitionEndEmulator; - - if (Util.supportsTransitionEnd()) { - $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); - } -} - -setTransitionEndSupport(); -module.exports = exports['default']; diff --git a/js/src/alert.js b/js/src/alert.js index d69ad8910..67a1ceda4 100644 --- a/js/src/alert.js +++ b/js/src/alert.js @@ -8,7 +8,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Alert = (() => { +const Alert = (($) => { /** @@ -58,6 +58,8 @@ const Alert = (() => { // public close(element) { + element = element || this.element + let rootElement = this._getRootElement(element) let customEvent = this._triggerCloseEvent(rootElement) @@ -167,12 +169,12 @@ const Alert = (() => { $.fn[NAME] = Alert._jQueryInterface $.fn[NAME].Constructor = Alert $.fn[NAME].noConflict = function () { - $.fn[NAME] = Alert._JQUERY_NO_CONFLICT + $.fn[NAME] = JQUERY_NO_CONFLICT return Alert._jQueryInterface } return Alert -})() +})(jQuery) export default Alert diff --git a/js/src/button.js b/js/src/button.js new file mode 100644 index 000000000..7e9344923 --- /dev/null +++ b/js/src/button.js @@ -0,0 +1,158 @@ +/** + * -------------------------------------------------------------------------- + * Bootstrap (v4.0.0): button.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + +const Button = (($) => { + + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME = 'button' + const VERSION = '4.0.0' + const DATA_KEY = 'bs.button' + const JQUERY_NO_CONFLICT = $.fn[NAME] + const TRANSITION_DURATION = 150 + + const ClassName = { + ACTIVE : 'active', + BUTTON : 'btn', + FOCUS : 'focus' + } + + const Selector = { + DATA_TOGGLE_CARROT : '[data-toggle^="button"]', + DATA_TOGGLE : '[data-toggle="buttons"]', + INPUT : 'input', + ACTIVE : '.active', + BUTTON : '.btn' + } + + const Event = { + CLICK : 'click.bs.button.data-api', + FOCUS_BLUR : 'focus.bs.button.data-api blur.bs.button.data-api' + } + + + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Button { + + constructor(element) { + this.element = element + } + + // public + + toggle() { + let triggerChangeEvent = true + let rootElement = $(this.element).closest( + Selector.DATA_TOGGLE + )[0] + + if (rootElement) { + let input = $(this.element).find(Selector.INPUT)[0] + + if (input) { + if (input.type === 'radio') { + if (input.checked && + $(this.element).hasClass(ClassName.ACTIVE)) { + triggerChangeEvent = false + + } else { + let activeElement = $(rootElement).find(Selector.ACTIVE)[0] + + if (activeElement) { + $(activeElement).removeClass(ClassName.ACTIVE) + } + } + } + + if (triggerChangeEvent) { + input.checked = !$(this.element).hasClass(ClassName.ACTIVE) + $(this.element).trigger('change') + } + } + } else { + this.element.setAttribute('aria-pressed', + !$(this.element).hasClass(ClassName.ACTIVE)) + } + + if (triggerChangeEvent) { + $(this.element).toggleClass(ClassName.ACTIVE) + } + } + + + // static + + static _jQueryInterface(config) { + return this.each(function () { + let data = $(this).data(DATA_KEY) + + if (!data) { + data = new Button(this) + $(this).data(DATA_KEY, data) + } + + if (config === 'toggle') { + data[config]() + } + }) + } + + } + + + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + $(document) + .on(Event.CLICK, Selector.DATA_TOGGLE_CARROT, function (event) { + event.preventDefault() + + let button = event.target + + if (!$(button).hasClass(ClassName.BUTTON)) { + button = $(button).closest(Selector.BUTTON) + } + + Button._jQueryInterface.call($(button), 'toggle') + }) + .on(Event.FOCUS_BLUR, Selector.DATA_TOGGLE_CARROT, function (event) { + var button = $(event.target).closest(Selector.BUTTON)[0] + $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type)) + }) + + + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Button._jQueryInterface + $.fn[NAME].Constructor = Button + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT + return Button._jQueryInterface + } + + return Button + +})(jQuery) + +export default Button diff --git a/js/src/util.js b/js/src/util.js index 68205edef..abc548a45 100644 --- a/js/src/util.js +++ b/js/src/util.js @@ -5,7 +5,7 @@ * -------------------------------------------------------------------------- */ -const Util = (() => { +const Util = (($) => { /** @@ -119,6 +119,6 @@ const Util = (() => { return Util -})() +})(jQuery) export default Util diff --git a/js/tests/index.html b/js/tests/index.html index 536e34c74..29c84e2cc 100644 --- a/js/tests/index.html +++ b/js/tests/index.html @@ -132,9 +132,9 @@ + - diff --git a/js/tests/unit/button.js b/js/tests/unit/button.js index 691796c42..5648506cf 100644 --- a/js/tests/unit/button.js +++ b/js/tests/unit/button.js @@ -32,64 +32,6 @@ $(function () { assert.strictEqual($button[0], $el[0], 'collection contains element') }) - QUnit.test('should return set state to loading', function (assert) { - assert.expect(4) - var $btn = $('') - assert.strictEqual($btn.html(), 'mdo', 'btn text equals mdo') - $btn.bootstrapButton('loading') - var done = assert.async() - setTimeout(function () { - assert.strictEqual($btn.html(), 'fat', 'btn text equals fat') - assert.ok($btn[0].hasAttribute('disabled'), 'btn is disabled') - assert.ok($btn.hasClass('disabled'), 'btn has disabled class') - done() - }, 0) - }) - - QUnit.test('should return reset state', function (assert) { - assert.expect(7) - var $btn = $('') - assert.strictEqual($btn.html(), 'mdo', 'btn text equals mdo') - $btn.bootstrapButton('loading') - var doneOne = assert.async() - setTimeout(function () { - assert.strictEqual($btn.html(), 'fat', 'btn text equals fat') - assert.ok($btn[0].hasAttribute('disabled'), 'btn is disabled') - assert.ok($btn.hasClass('disabled'), 'btn has disabled class') - doneOne() - var doneTwo = assert.async() - $btn.bootstrapButton('reset') - setTimeout(function () { - assert.strictEqual($btn.html(), 'mdo', 'btn text equals mdo') - assert.ok(!$btn[0].hasAttribute('disabled'), 'btn is not disabled') - assert.ok(!$btn.hasClass('disabled'), 'btn does not have disabled class') - doneTwo() - }, 0) - }, 0) - }) - - QUnit.test('should work with an empty string as reset state', function (assert) { - assert.expect(7) - var $btn = $('') diff --git a/js/tests/visual/button.html b/js/tests/visual/button.html index d92a08329..a6eed7e05 100644 --- a/js/tests/visual/button.html +++ b/js/tests/visual/button.html @@ -22,10 +22,6 @@

Button Bootstrap Visual Test

- -
@@ -56,8 +52,8 @@ - - + + + - diff --git a/js/tests/unit/carousel.js b/js/tests/unit/carousel.js index 39d250598..a8a36ad32 100644 --- a/js/tests/unit/carousel.js +++ b/js/tests/unit/carousel.js @@ -56,13 +56,13 @@ $(function () { + '
  • ' + '' + '