123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /* ===========================================================
- * bootstrap-checkbox - v.1.0.1
- * ===========================================================
- * Copyright 2014 Roberto Montresor
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
- !function($) {
- var Checkbox = function(element, options, e) {
- if (e) {
- e.stopPropagation();
- e.preventDefault();
- }
- this.$element = $(element);
- this.$newElement = null;
- this.button = null;
- this.label = null;
- this.labelPrepend = null;
- this.options = $.extend({}, $.fn.checkbox.defaults, this.$element.data(), typeof options == 'object' && options);
- this.init();
- };
- Checkbox.prototype = {
- constructor: Checkbox,
- init: function (e) {
- this.$element.hide();
- this.$element.attr('autocomplete', 'off');
- this._createButtons();
- },
- _createButtons: function(){
- var classList = this.$element.attr('class') !== undefined ? this.$element.attr('class').split(/\s+/) : '';
- var template = this.getTemplate();
- this.$element.after(template);
- this.$newElement = this.$element.next('.bootstrap-checkbox');
- this.button = this.$newElement.find('button');
- this.label = this.$newElement.find('span.label-checkbox');
- this.labelPrepend = this.$newElement.find('span.label-prepend-checkbox');
- for (var i = 0; i < classList.length; i++) {
- if(classList[i] != 'checkbox') {
- this.$newElement.addClass(classList[i]);
- }
- }
- this.button.addClass(this.options.buttonStyle);
- if (this.$element.data('default-state') != undefined){
- this.options.defaultState = this.$element.data('default-state');
- }
- if (this.$element.data('default-enabled') != undefined){
- this.options.defaultEnabled = this.$element.data('default-enabled');
- }
- if (this.$element.data('display-as-button') != undefined){
- this.options.displayAsButton = this.$element.data('display-as-button');
- }
- if (this.options.indeterminate)
- this.$element.prop('indeterminate', true);
- this.checkEnabled();
- this.checkChecked();
- this.checkTabIndex();
- this.clickListener();
- },
- getTemplate: function() {
- var additionalButtonStyle = this.options.displayAsButton ? ' displayAsButton' : '',
- label = this.$element.data('label') ? '<span class="label-checkbox">'+this.$element.data('label')+'</span>' : '',
- labelPrepend = this.$element.data('label-prepend') ? '<span class="label-prepend-checkbox">'+this.$element.data('label-prepend')+'</span>' : '';
- var template =
- '<span class="button-checkbox bootstrap-checkbox">' +
- '<button type="button" class="btn clearfix'+additionalButtonStyle+'">' +
- ((this.$element.data('label-prepend') && this.options.displayAsButton) ? labelPrepend : '')+
- '<span class="icon '+this.options.checkedClass+'" style="display:none;"></span>' +
- '<span class="icon '+this.options.uncheckedClass+'"></span>' +
- '<span class="icon '+this.options.indeterminateClass+'" style="display:none;"></span>' +
- ((this.$element.data('label') && this.options.displayAsButton) ? label : '')+
- '</button>' +
- '</span>';
- if (!this.options.displayAsButton && (this.$element.data('label') || this.$element.data('label-prepend'))) {
- template =
- '<label class="'+this.options.labelClass+'">' +
- labelPrepend + template + label+
- '</label>';
- }
- return template;
- },
- checkEnabled: function() {
- this.button.attr('disabled', this.$element.is(':disabled'));
- this.$newElement.toggleClass('disabled', this.$element.is(':disabled'));
- },
- checkTabIndex: function() {
- if (this.$element.is('[tabindex]')) {
- var tabindex = this.$element.attr("tabindex");
- this.button.attr('tabindex', tabindex);
- }
- },
- checkChecked: function() {
- var whitePattern = /\s/g, replaceChar = '.';
- if (this.$element.prop('indeterminate') == true){
- this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).hide();
- this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).hide();
- this.button.find('span.'+this.options.indeterminateClass.replace(whitePattern, replaceChar)).show();
- } else {
- if (this.$element.is(':checked')) {
- this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).show();
- this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).hide();
- } else {
- this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).hide();
- this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).show();
- }
- this.button.find('span.'+this.options.indeterminateClass.replace(whitePattern, replaceChar)).hide();
- }
- if (this.$element.is(':checked')) {
- if (this.options.buttonStyleChecked){
- this.button.removeClass(this.options.buttonStyle);
- this.button.addClass(this.options.buttonStyleChecked);
- }
- } else {
- if (this.options.buttonStyleChecked){
- this.button.removeClass(this.options.buttonStyleChecked);
- this.button.addClass(this.options.buttonStyle);
- }
- }
- if (this.$element.is(':checked')) {
- if (this.options.labelClassChecked){
- $(this.$element).next("label").addClass(this.options.labelClassChecked);
- }
- } else {
- if (this.options.labelClassChecked){
- $(this.$element).next("label").removeClass(this.options.labelClassChecked);
- }
- }
- },
- clickListener: function() {
- var _this = this;
- this.button.on('click', function(e){
- e.preventDefault();
- _this.$element.prop("indeterminate", false);
- _this.$element[0].click();
- _this.checkChecked();
- });
- this.$element.on('change', function(e) {
- _this.checkChecked();
- });
- this.$element.parents('form').on('reset', function(e) {
- if (_this.options.defaultState == null){
- _this.$element.prop('indeterminate', true);
- } else {
- _this.$element.prop('checked', _this.options.defaultState);
- }
- _this.$element.prop('disabled', !_this.options.defaultEnabled);
- _this.checkEnabled();
- _this.checkChecked();
- e.preventDefault();
- });
- },
- setOptions: function(option, event){
- if (option.checked != undefined) {
- this.setChecked(option.checked);
- }
- if (option.enabled != undefined) {
- this.setEnabled(option.enabled);
- }
- if (option.indeterminate != undefined) {
- this.setIndeterminate(option.indeterminate);
- }
- },
- setChecked: function(checked){
- this.$element.prop("checked", checked);
- this.$element.prop("indeterminate", false);
- this.checkChecked();
- },
- setIndeterminate: function(indeterminate){
- this.$element.prop("indeterminate", indeterminate);
- this.checkChecked();
- },
- click: function(event){
- this.$element.prop("indeterminate", false);
- this.$element[0].click();
- this.checkChecked();
- },
- change: function(event){
- this.$element.change();
- },
- setEnabled: function(enabled){
- this.$element.attr('disabled', !enabled);
- this.checkEnabled();
- },
- toggleEnabled: function(event){
- this.$element.attr('disabled', !this.$element.is(':disabled'));
- this.checkEnabled();
- },
- refresh: function(event){
- this.checkEnabled();
- this.checkChecked();
- },
- update: function(options){
- if (!this.$element.next().find('.bootstrap-checkbox'))
- return;
- this.options = $.extend({}, this.options, options);
- this.$element.next().remove();
- this._createButtons();
- }
- };
- $.fn.checkbox = function(option, event) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data('checkbox'),
- options = typeof option == 'object' && option;
- if (!data) {
- $this.data('checkbox', (data = new Checkbox(this, options, event)));
- if (data.options.constructorCallback != undefined){
- data.options.constructorCallback(data.$element, data.button, data.label, data.labelPrepend);
- }
- } else {
- if (typeof option == 'string') {
- data[option](event);
- } else if (typeof option != 'undefined') {
- data.setOptions(option, event);
- }
- }
- });
- };
- $.fn.checkbox.defaults = {
- displayAsButton: false,
- indeterminate: false,
- buttonStyle: 'btn-link',
- buttonStyleChecked: null,
- checkedClass: 'cb-icon-check',
- uncheckedClass: 'cb-icon-check-empty',
- indeterminateClass: 'cb-icon-check-indeterminate',
- defaultState: false,
- defaultEnabled: true,
- constructorCallback: null,
- labelClass: "checkbox bootstrap-checkbox",
- labelClassChecked: "active"
- };
- }(window.jQuery);
|