Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit 24f33e2

Browse files
currensySplaktar
authored andcommitted
feat(navBar): add disabled attribute (#10992)
* Originally developed by: @maxjoehnk . I'm just resubmitting * Add disabled attribute to navitem * Update demo to showcase ng-disabled and disabled usage * Add tests * Ignore navbar specific button styling when disabled fixes #9667
1 parent e2d0623 commit 24f33e2

File tree

4 files changed

+68
-3
lines changed

4 files changed

+68
-3
lines changed

src/components/navBar/demoBasicUsage/index.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
<md-nav-item md-nav-click="goto('page1')" name="page1">
88
Page One
99
</md-nav-item>
10-
<md-nav-item md-nav-click="goto('page2')" name="page2">
10+
<md-nav-item md-nav-click="goto('page2')" name="page2" ng-disabled="secondTabDisabled">
1111
Page Two
1212
</md-nav-item>
1313
<md-nav-item md-nav-click="goto('page3')" name="page3">
1414
Page Three
1515
</md-nav-item>
16+
<md-nav-item md-nav-click="goto('page4')" name="page4" disabled>
17+
Page Four
18+
</md-nav-item>
1619
<!-- these require actual routing with ui-router or ng-route, so they
1720
won't work in the demo
1821
<md-nav-item md-nav-href="#page4" name="page5">Page Four</md-nav-item>
@@ -30,5 +33,9 @@
3033

3134
<md-checkbox ng-model="disableInkBar">Disable Ink Bar</md-checkbox>
3235

36+
<md-checkbox ng-model="secondTabDisabled" aria-label="Disable Second Tab" style="margin: 5px;">
37+
Disable Second Tab
38+
</md-checkbox>
39+
3340
</md-content>
3441
</div>

src/components/navBar/navBar.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ MdNavBarController.prototype.onKeydown = function(e) {
388388
/**
389389
* @ngInject
390390
*/
391-
function MdNavItem($mdAria, $$rAF) {
391+
function MdNavItem($mdAria, $$rAF, $mdUtil, $window) {
392392
return {
393393
restrict: 'E',
394394
require: ['mdNavItem', '^mdNavBar'],
@@ -429,6 +429,7 @@ function MdNavItem($mdAria, $$rAF) {
429429
'<md-button class="_md-nav-button md-accent" ' +
430430
'ng-class="ctrl.getNgClassMap()" ' +
431431
'ng-blur="ctrl.setFocused(false)" ' +
432+
'ng-disabled="ctrl.disabled"' +
432433
'tabindex="-1" ' +
433434
navigationOptions +
434435
navigationAttribute + '>' +
@@ -454,11 +455,11 @@ function MdNavItem($mdAria, $$rAF) {
454455
// When accessing the element's contents synchronously, they
455456
// may not be defined yet because of transclusion. There is a higher
456457
// chance that it will be accessible if we wait one frame.
458+
var disconnect;
457459
$$rAF(function() {
458460
var mdNavItem = controllers[0];
459461
var mdNavBar = controllers[1];
460462
var navButton = angular.element(element[0].querySelector('._md-nav-button'));
461-
462463
if (!mdNavItem.name) {
463464
mdNavItem.name = angular.element(element[0]
464465
.querySelector('._md-nav-button-text')).text().trim();
@@ -469,8 +470,30 @@ function MdNavItem($mdAria, $$rAF) {
469470
scope.$apply();
470471
});
471472

473+
if('MutationObserver' in $window) {
474+
var config = {attributes: true, attributeFilter: ['disabled']};
475+
var targetNode = element[0];
476+
var mutationCallback = function(mutationList) {
477+
$mdUtil.nextTick(function() {
478+
mdNavItem.disabled = $mdUtil.parseAttributeBoolean(attrs[mutationList[0].attributeName], false);
479+
});
480+
};
481+
var observer = new MutationObserver(mutationCallback);
482+
observer.observe(targetNode, config);
483+
disconnect = observer.disconnect.bind(observer);
484+
} else {
485+
attrs.$observe('disabled', function (value) {
486+
mdNavItem.disabled = $mdUtil.parseAttributeBoolean(value, false);
487+
});
488+
}
489+
490+
472491
$mdAria.expectWithText(element, 'aria-label');
473492
});
493+
494+
scope.$on('destroy', function() {
495+
disconnect();
496+
})
474497
}
475498
};
476499
}

src/components/navBar/navBar.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ $md-nav-bar-height: 48px;
3838
&:hover {
3939
background-color: inherit;
4040
}
41+
4142
}
4243

4344
md-nav-ink-bar {

src/components/navBar/navBar.spec.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,40 @@ describe('mdNavBar', function() {
176176
.toBe('{"reload":true,"notify":true}');
177177
});
178178

179+
it('should set the disabled attribute', function () {
180+
create('<md-nav-bar>' +
181+
' <md-nav-item md-nav-href="#1" name="tab1">' +
182+
' tab1' +
183+
' </md-nav-item>' +
184+
' <md-nav-item md-nav-href="#2" name="tab2" disabled>' +
185+
' tab2' +
186+
' </md-nav-item>' +
187+
'</md-nav-bar>');
188+
$timeout(function(){
189+
var tabCtrl = getTabCtrl('tab2');
190+
expect(tabCtrl.disabled).toBe(true);
191+
});
192+
});
193+
194+
it('should observe the disabled attribute', function () {
195+
$scope.tabDisabled = false;
196+
create('<md-nav-bar>' +
197+
' <md-nav-item md-nav-href="#1" name="tab1">' +
198+
' tab1' +
199+
' </md-nav-item>' +
200+
' <md-nav-item md-nav-href="#2" name="tab2" ng-disabled="tabDisabled">' +
201+
' tab2' +
202+
' </md-nav-item>' +
203+
'</md-nav-bar>');
204+
$timeout(function(){
205+
var tabCtrl = getTabCtrl('tab2');
206+
expect(tabCtrl.disabled).toBe(false);
207+
$scope.tabDisabled = true;
208+
$scope.$apply();
209+
expect(tabCtrl.disabled).toBe(true);
210+
});
211+
});
212+
179213
it('does not update tabs if tab controller is undefined', function() {
180214
$scope.selectedTabRoute = 'tab1';
181215

0 commit comments

Comments
 (0)