Skip to content
This repository has been archived by the owner on May 29, 2019. It is now read-only.

Commit

Permalink
fix(tabs): fire deselect before select callback
Browse files Browse the repository at this point in the history
Closes #1557
Closes #1566
  • Loading branch information
jroxendal authored and bekos committed Jan 19, 2014
1 parent a33bac9 commit 7474c47
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 10 deletions.
19 changes: 12 additions & 7 deletions src/tabs/tabs.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,24 @@ angular.module('ui.bootstrap.tabs', [])
var ctrl = this,
tabs = ctrl.tabs = $scope.tabs = [];

ctrl.select = function(tab) {
ctrl.select = function(selectedTab) {
angular.forEach(tabs, function(tab) {
tab.active = false;
if (tab.active && tab !== selectedTab) {
tab.active = false;
tab.onDeselect();
}
});
tab.active = true;
selectedTab.active = true;
selectedTab.onSelect();
};

ctrl.addTab = function addTab(tab) {
tabs.push(tab);
if (tabs.length === 1 || tab.active) {
// we can't run the select function on the first tab
// since that would select it twice
if (tabs.length === 1) {
tab.active = true;
} else if (tab.active) {
ctrl.select(tab);
}
};
Expand Down Expand Up @@ -206,9 +214,6 @@ angular.module('ui.bootstrap.tabs', [])
setActive(scope.$parent, active);
if (active) {
tabsetCtrl.select(scope);
scope.onSelect();
} else {
scope.onDeselect();
}
});

Expand Down
51 changes: 48 additions & 3 deletions src/tabs/test/tabs.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ describe('tabs', function() {
expect(titles().eq(0)).toHaveClass('active');
expect(titles().eq(1)).not.toHaveClass('active');
expect(scope.actives.one).toBe(true);
expect(scope.actives.two).toBe(false);
expect(scope.actives.two).toBeFalsy();
});

it('should change active on click', function() {
Expand All @@ -99,7 +99,6 @@ describe('tabs', function() {
titles().eq(1).find('a').click();
expect(scope.deselectFirst).toHaveBeenCalled();
});

});

describe('basics with initial active tab', function() {
Expand Down Expand Up @@ -153,6 +152,48 @@ describe('tabs', function() {
});
});

describe('tab callback order', function() {
var execOrder;
beforeEach(inject(function($compile, $rootScope) {
scope = $rootScope.$new();
execOrder = [];
scope.actives = {};

scope.execute = function(id) {
execOrder.push(id);
};

elm = $compile([
'<div>',
' <tabset class="hello" data-pizza="pepperoni">',
' <tab heading="First Tab" active="actives.one" select="execute(\'select1\')" deselect="execute(\'deselect1\')"></tab>',
' <tab select="execute(\'select2\')" deselect="execute(\'deselect2\')"></tab>',
' </tabset>',
'</div>'
].join('\n'))(scope);
scope.$apply();
return elm;
}));

it('should call select for the first tab', function() {
expect(execOrder).toEqual([ 'select1' ]);
});

it('should call deselect, then select', function() {
execOrder = [];

// Select second tab
titles().eq(1).find('a').click();
expect(execOrder).toEqual([ 'deselect1', 'select2' ]);

execOrder = [];

// Select again first tab
titles().eq(0).find('a').click();
expect(execOrder).toEqual([ 'deselect2', 'select1' ]);
});
});

describe('ng-repeat', function() {

beforeEach(inject(function($compile, $rootScope) {
Expand Down Expand Up @@ -346,7 +387,11 @@ describe('tabs', function() {

describe('tabset controller', function() {
function mockTab(isActive) {
return { active: !!isActive };
return {
active: !!isActive,
onSelect : angular.noop,
onDeselect : angular.noop
};
}

var ctrl;
Expand Down

0 comments on commit 7474c47

Please sign in to comment.