button.js 5.3 KB
Newer Older
Mark Otto's avatar
grunt    
Mark Otto committed
1
2
3
4
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"); } }

fat's avatar
fat committed
5
6
/**
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
7
 * Bootstrap (v4.0.0-beta): button.js
fat's avatar
fat committed
8
9
10
11
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

Mark Otto's avatar
grunt    
Mark Otto committed
12
var Button = function ($) {
fat's avatar
fat committed
13
14
15
16
17
18
19
20

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'button';
Mark Otto's avatar
Mark Otto committed
21
  var VERSION = '4.0.0-beta';
fat's avatar
fat committed
22
  var DATA_KEY = 'bs.button';
fat's avatar
fat committed
23
24
  var EVENT_KEY = '.' + DATA_KEY;
  var DATA_API_KEY = '.data-api';
fat's avatar
fat committed
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  var JQUERY_NO_CONFLICT = $.fn[NAME];

  var ClassName = {
    ACTIVE: 'active',
    BUTTON: 'btn',
    FOCUS: 'focus'
  };

  var Selector = {
    DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
    DATA_TOGGLE: '[data-toggle="buttons"]',
    INPUT: 'input',
    ACTIVE: '.active',
    BUTTON: '.btn'
  };

  var Event = {
Jacob Thornton's avatar
Jacob Thornton committed
42
43
    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
    FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
Mark Otto's avatar
dist    
Mark Otto committed
44
  };
fat's avatar
fat committed
45

Mark Otto's avatar
dist    
Mark Otto committed
46
47
48
49
50
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
51

Mark Otto's avatar
grunt    
Mark Otto committed
52
  var Button = function () {
fat's avatar
fat committed
53
54
55
    function Button(element) {
      _classCallCheck(this, Button);

fat's avatar
fat committed
56
      this._element = element;
fat's avatar
fat committed
57
58
    }

Jacob Thornton's avatar
Jacob Thornton committed
59
60
    // getters

Mark Otto's avatar
grunt    
Mark Otto committed
61
    // public
fat's avatar
fat committed
62

Mark Otto's avatar
grunt    
Mark Otto committed
63
64
    Button.prototype.toggle = function toggle() {
      var triggerChangeEvent = true;
Mark Otto's avatar
grunt    
Mark Otto committed
65
      var addAriaPressed = true;
Mark Otto's avatar
grunt    
Mark Otto committed
66
      var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
fat's avatar
fat committed
67

Mark Otto's avatar
grunt    
Mark Otto committed
68
69
      if (rootElement) {
        var input = $(this._element).find(Selector.INPUT)[0];
fat's avatar
fat committed
70

Mark Otto's avatar
grunt    
Mark Otto committed
71
72
73
74
75
76
        if (input) {
          if (input.type === 'radio') {
            if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
              triggerChangeEvent = false;
            } else {
              var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
fat's avatar
fat committed
77

Mark Otto's avatar
grunt    
Mark Otto committed
78
79
              if (activeElement) {
                $(activeElement).removeClass(ClassName.ACTIVE);
fat's avatar
fat committed
80
81
              }
            }
Mark Otto's avatar
grunt    
Mark Otto committed
82
          }
fat's avatar
fat committed
83

Mark Otto's avatar
grunt    
Mark Otto committed
84
          if (triggerChangeEvent) {
Johann-S's avatar
build    
Johann-S committed
85
86
87
            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
              return;
            }
Mark Otto's avatar
grunt    
Mark Otto committed
88
            input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
Mark Otto's avatar
grunt    
Mark Otto committed
89
            $(input).trigger('change');
fat's avatar
fat committed
90
91
          }

Mark Otto's avatar
grunt    
Mark Otto committed
92
          input.focus();
Mark Otto's avatar
grunt    
Mark Otto committed
93
          addAriaPressed = false;
fat's avatar
fat committed
94
95
        }
      }
Mark Otto's avatar
grunt    
Mark Otto committed
96

Mark Otto's avatar
grunt    
Mark Otto committed
97
98
99
      if (addAriaPressed) {
        this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
      }
Mark Otto's avatar
grunt    
Mark Otto committed
100

Mark Otto's avatar
grunt    
Mark Otto committed
101
102
      if (triggerChangeEvent) {
        $(this._element).toggleClass(ClassName.ACTIVE);
fat's avatar
fat committed
103
      }
Mark Otto's avatar
grunt    
Mark Otto committed
104
    };
fat's avatar
fat committed
105

Mark Otto's avatar
grunt    
Mark Otto committed
106
107
108
109
    Button.prototype.dispose = function dispose() {
      $.removeData(this._element, DATA_KEY);
      this._element = null;
    };
fat's avatar
fat committed
110

Mark Otto's avatar
grunt    
Mark Otto committed
111
    // static
fat's avatar
fat committed
112

Mark Otto's avatar
grunt    
Mark Otto committed
113
114
115
    Button._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $(this).data(DATA_KEY);
fat's avatar
fat committed
116

Mark Otto's avatar
grunt    
Mark Otto committed
117
118
119
120
121
122
123
124
125
126
127
128
        if (!data) {
          data = new Button(this);
          $(this).data(DATA_KEY, data);
        }

        if (config === 'toggle') {
          data[config]();
        }
      });
    };

    _createClass(Button, null, [{
Jacob Thornton's avatar
Jacob Thornton committed
129
130
131
132
      key: 'VERSION',
      get: function get() {
        return VERSION;
      }
fat's avatar
fat committed
133
134
135
    }]);

    return Button;
Mark Otto's avatar
grunt    
Mark Otto committed
136
137
138
139
140
141
142
  }();

  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
143

fat's avatar
fat committed
144
  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
fat's avatar
fat committed
145
146
147
148
149
150
151
152
153
    event.preventDefault();

    var button = event.target;

    if (!$(button).hasClass(ClassName.BUTTON)) {
      button = $(button).closest(Selector.BUTTON);
    }

    Button._jQueryInterface.call($(button), 'toggle');
fat's avatar
fat committed
154
  }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
fat's avatar
fat committed
155
156
    var button = $(event.target).closest(Selector.BUTTON)[0];
    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
Mark Otto's avatar
Mark Otto committed
157
  });
fat's avatar
fat committed
158
159
160
161
162
163
164

  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

Mark Otto's avatar
Mark Otto committed
165
  $.fn[NAME] = Button._jQueryInterface;
fat's avatar
fat committed
166
167
168
169
170
171
172
  $.fn[NAME].Constructor = Button;
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Button._jQueryInterface;
  };

  return Button;
Mark Otto's avatar
grunt    
Mark Otto committed
173
}(jQuery);
Mark Otto's avatar
build    
Mark Otto committed
174
//# sourceMappingURL=button.js.map