bootstrap icon indicating copy to clipboard operation
bootstrap copied to clipboard

Fix uibUncheckable for uibBtnRadio

Open navarroaxel opened this issue 8 years ago • 3 comments

Fix #6532

navarroaxel avatar May 08 '17 18:05 navarroaxel

LGTM.

Does anyone have any idea how soon or not this will be pulled into a release? This bug is impacting a project that is approaching beta launch, so I need to evaluate whether it's worth implementing a hack to work around the bug vs waiting for this fix to be merged.

zacronos avatar Jun 05 '17 12:06 zacronos

@zacronos this is my hack by the moment...

gulp.task('fix:angular:bootstrap', () => {
    // fix https://github.com/angular-ui/bootstrap/issues/6532
    const path = './node_modules/angular-ui-bootstrap/src/buttons/';

    return gulp.src(`${path}buttons.js`)
        .pipe(require('gulp-replace')(
            'attrs.$set(\'uncheckable\', uncheckable ? \'\' : undefined);',
            'attrs.$set(\'disabled\', uncheckable ? \'disabled\' : undefined);'
        ))
        .pipe(gulp.dest(path));
});

this should run at clean stage, before the build.

navarroaxel avatar Jun 05 '17 13:06 navarroaxel

Thanks @navarroaxel for the fix. I could not use a solution modifying the source so I added a directive decorator:

  angular.module('ui.bootstrap.buttons')
    .decorator('uibBtnRadioDirective', [ '$delegate', '$parse',
      function uibBtnRadioDirectiveDecorator($delegate, $parse) {
        var directive = $delegate[0];

        // fixed link function
        var link = function (scope, element, attrs, ctrls) {
          var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];
          var uncheckableExpr = $parse(attrs.uibUncheckable);

          element.find('input').css({display: 'none'});

          //model -> UI
          ngModelCtrl.$render = function () {
            element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.uibBtnRadio)));
          };

          //ui->model
          element.on(buttonsCtrl.toggleEvent, function () {
            if (attrs.disabled) {
              return;
            }

            var isActive = element.hasClass(buttonsCtrl.activeClass);

            if (!isActive || angular.isDefined(attrs.uncheckable)) {
              scope.$apply(function () {
                ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.uibBtnRadio));
                ngModelCtrl.$render();
              });
            }
          });

          if (attrs.uibUncheckable) {
            scope.$watch(uncheckableExpr, function (uncheckable) {
              attrs.$set('disabled', uncheckable ? 'disabled' : undefined);
            });
          }
        };

        directive.compile = function() {
          return function(scope, element, attrs) {
            link.apply(this, arguments);
          };
        };

        return $delegate;
      }
    ]);

guillaume-brialon avatar Nov 17 '17 14:11 guillaume-brialon