From 0724bd91ff81b5eca0addce0c336c72b3ec10be5 Mon Sep 17 00:00:00 2001 From: fat Date: Thu, 7 May 2015 12:48:22 -0700 Subject: [PATCH] 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" + ] } }