All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.bower_components.angular-pretty-checkable.src.angular-pretty-checkable.js Maven / Gradle / Ivy

/* @preserve
 *
 * angular-pretty-checkable
 * https://github.com/itslenny/angular-pretty-checkable
 *
 * Version: 0.1.7 - 02/22/2015
 * License: MIT
 */

//init module
angular.module('pretty-checkable', [])
  
  //config
  .constant('prettyCheckableConfig', {
    activeClass: 'checked',
    disabledClass: 'disabled',
    toggleEvent: 'click'
  })

  //controller
  .controller('PrettyCheckableController', ['prettyCheckableConfig', function(prettyCheckableConfig) {
    this.activeClass = prettyCheckableConfig.activeClass || 'checked';
    this.disabledClass = prettyCheckableConfig.disabledClass || 'disabled';
    this.toggleEvent = prettyCheckableConfig.toggleEvent || 'click';
  }])

  //pretty radio directive
  .directive('prettyRadio', function () {
    return {
      restrict: 'E',
      require: ['prettyRadio', 'ngModel'],
      controller: 'PrettyCheckableController',
      link: function (scope, element, attrs, ctrls) {
        var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];

        //set element class
        element.addClass('prettyradio');
        
        //add anchor
        element.prepend(angular.element(''));        
        
        //add label if we need one
        if(attrs.label!=='false'){        
            //set label text to label if available otherwise default to value
            var labelText = scope.$eval(attrs.label ? attrs.label : attrs.value);
            var label = angular.element('');
        
            //add label before or after depending on label-left value 
            if(attrs.labelLeft){
              element.prepend(label);
            }else{
              element.append(label);
            }
        }

        // listen to changes on disabled attribute
        // support for disabled and ngDisabled
        attrs.$observe('disabled', function(value) {
          ngModelCtrl.$render();
        });        

        //model -> UI
        ngModelCtrl.$render = function () {
          var disabledAttr = (attrs.disabled === 'true' || attrs.disabled === 'false') ? attrs.disabled : scope.$eval(attrs.disabled);
          var ngDisabledAttr = (attrs.ngDisabled === 'true' || attrs.ngDisabled === 'false') ? attrs.ngDisabled : scope.$eval(attrs.ngDisabled);
          element.find('a').toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.value)));
          element.find('a').toggleClass(buttonsCtrl.disabledClass, (disabledAttr || ngDisabledAttr) ? true : false);
        };

        //ui->model
        element.bind(buttonsCtrl.toggleEvent, function () {
          if (!element.find('a').hasClass(buttonsCtrl.activeClass) && !element.find('a').hasClass(buttonsCtrl.disabledClass)) {
            scope.$apply(function () {
              ngModelCtrl.$setViewValue(scope.$eval(attrs.value));
              ngModelCtrl.$render();
            });
          }
        });
      },
      template:'
', replace: true, transclude: true }; }) //pretty checkbox diretive .directive('prettyCheckbox', function () { return { restrict: 'E', require: ['prettyCheckbox', 'ngModel'], controller: 'PrettyCheckableController', link: function (scope, element, attrs, ctrls) { var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; var isRequired = false; var isMultiple = false; //set element class element.addClass('prettycheckbox'); //add anchor element.prepend(angular.element('')); // listen to changes on required attribute // support for required and ngRequired attrs.$observe('required', function(value) { isRequired = !!value; validate(isChecked()); // revalidate when attribute "required" changed }); // listen to changes on disabled attribute // support for disabled and ngDisabled attrs.$observe('disabled', function(value) { ngModelCtrl.$render(); }); // multiple mode? if(angular.isDefined(attrs.multiple)) { isMultiple = true; } //add label if we need one if(attrs.label!=='false'){ //set label text to label if available otherwise default to value var labelText = scope.$eval(attrs.label ? attrs.label : attrs.value); var label = angular.element(''); //add label before or after depending on label-left value if(attrs.labelLeft){ element.prepend(label); }else{ element.append(label); } } function getTrueValue() { return getCheckboxValue(attrs.value, true); } function getCheckboxValue(attributeValue, defaultValue) { var val = scope.$eval(attributeValue); return angular.isDefined(val) ? val : defaultValue; } function validate(isChecked) { ngModelCtrl.$setValidity('require', (isChecked || !isRequired)); // should be checked or not required } function isChecked() { return element.find('a').hasClass(buttonsCtrl.activeClass); } function modelIsArray() { return angular.isArray(ngModelCtrl.$modelValue); } function modelIsChecked(trueValue) { if(modelIsArray()) { return (ngModelCtrl.$modelValue.indexOf(trueValue) > -1); } return angular.equals(ngModelCtrl.$modelValue, trueValue); } function updateViewValue(value, remove) { var model = ngModelCtrl.$modelValue; if(isMultiple) { // we have to create a new array, otherwise angular can't detect a model change var newModel = []; // copy data from existing model if(modelIsArray()) { angular.copy(model, newModel); } model = newModel; var index = model.indexOf(value); if(remove && index > -1) { model.splice(index, 1); } else if (!remove && index === -1) { model.push(value); } } else { model = remove ? false : value; } // update view value ngModelCtrl.$setViewValue(model); } //model -> UI ngModelCtrl.$render = function () { var disabledAttr = (attrs.disabled === 'true' || attrs.disabled === 'false') ? attrs.disabled : scope.$eval(attrs.disabled); var ngDisabledAttr = (attrs.ngDisabled === 'true' || attrs.ngDisabled === 'false') ? attrs.ngDisabled : scope.$eval(attrs.ngDisabled); element.find('a').toggleClass(buttonsCtrl.activeClass, modelIsChecked(getTrueValue())); element.find('a').toggleClass(buttonsCtrl.disabledClass, (disabledAttr || ngDisabledAttr) ? true : false); }; //ui->model element.bind(buttonsCtrl.toggleEvent, function () { if(!element.find('a').hasClass(buttonsCtrl.disabledClass)) { scope.$apply(function () { var wasChecked = isChecked(); updateViewValue(getTrueValue(), wasChecked); validate(!wasChecked); ngModelCtrl.$render(); }); } }); }, template:'
', replace: true, transclude: true }; });




© 2015 - 2025 Weber Informatics LLC | Privacy Policy