Skip to content

Commit 0facb12

Browse files
committed
feat(tab): allow html in tab title attribute
Closes #528
1 parent 2d39418 commit 0facb12

File tree

3 files changed

+34
-49
lines changed

3 files changed

+34
-49
lines changed

js/ext/angular/src/directive/ionicTabBar.js

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
angular.module('ionic.ui.tabs', ['ionic.service.view'])
1+
angular.module('ionic.ui.tabs', ['ionic.service.view', 'ionic.ui.bindHtml'])
22

33
/**
44
* @description
@@ -93,7 +93,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view'])
9393
$scope.tabsController = this;
9494

9595
}],
96-
96+
9797
template: '<div class="view"><tab-controller-bar></tab-controller-bar></div>',
9898

9999
compile: function(element, attr, transclude, tabsCtrl) {
@@ -245,8 +245,8 @@ angular.module('ionic.ui.tabs', ['ionic.service.view'])
245245
transclude: true,
246246
replace: true,
247247
scope: true,
248-
template: '<div class="tabs">' +
249-
'<tab-controller-item icon-title="{{c.title}}" icon="{{c.icon}}" icon-on="{{c.iconOn}}" icon-off="{{c.iconOff}}" badge="c.badge" active="c.isVisible" index="$index" ng-repeat="c in controllers"></tab-controller-item>' +
248+
template: '<div class="tabs">' +
249+
'<tab-controller-item icon-title="{{c.title}}" icon="{{c.icon}}" icon-on="{{c.iconOn}}" icon-off="{{c.iconOff}}" badge="c.badge" active="c.isVisible" index="$index" ng-repeat="c in controllers"></tab-controller-item>' +
250250
'</div>',
251251
link: function($scope, $element, $attr, tabsCtrl) {
252252
$element.addClass($scope.tabsType);
@@ -274,17 +274,18 @@ angular.module('ionic.ui.tabs', ['ionic.service.view'])
274274
if(attrs.icon) {
275275
scope.iconOn = scope.iconOff = attrs.icon;
276276
}
277-
277+
278278
scope.selectTab = function() {
279279
tabsCtrl.select(scope.index, true);
280280
};
281281
},
282-
template:
282+
template:
283283
'<a ng-class="{active:active, \'has-badge\':badge}" ng-click="selectTab()" class="tab-item">' +
284284
'<i class="badge" ng-if="badge">{{badge}}</i>' +
285285
'<i class="icon {{icon}}" ng-if="icon"></i>' +
286286
'<i class="{{iconOn}}" ng-if="active"></i>' +
287-
'<i class="{{iconOff}}" ng-if="!active"></i> {{iconTitle}}' +
287+
'<i class="{{iconOff}}" ng-if="!active"></i>' +
288+
'<span bind-html-unsafe="iconTitle"></span>' +
288289
'</a>'
289290
};
290291
}]);

js/ext/angular/test/directive/ionicTabBar.unit.js

+25-41
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ describe('Tab Bar Controller', function() {
22
var compile, element, scope, ctrl;
33

44
beforeEach(module('ionic.ui.tabs'));
5-
5+
66
beforeEach(inject(function($compile, $rootScope, $controller) {
77
compile = $compile;
88
scope = $rootScope;
@@ -63,20 +63,20 @@ describe('Tab Bar Controller', function() {
6363

6464
describe('Tabs directive', function() {
6565
var compile, element, scope;
66-
66+
6767
beforeEach(module('ionic.ui.tabs'));
6868

6969
beforeEach(inject(function($compile, $rootScope) {
7070
compile = $compile;
7171
scope = $rootScope;
7272
}));
73-
73+
7474
it('Has tab class', function() {
7575
element = compile('<tabs></tabs>')(scope);
7676
scope.$digest();
7777
expect(element.find('.tabs').hasClass('tabs')).toBe(true);
7878
});
79-
79+
8080
it('Has tab children', function() {
8181
element = compile('<tabs></tabs>')(scope);
8282
scope = element.scope();
@@ -90,18 +90,18 @@ describe('Tabs directive', function() {
9090
});
9191

9292
it('Has compiled children', function() {
93-
element = compile('<tabs>' +
94-
'<tab active="true" title="Item" icon="icon-default"></tab>' +
95-
'<tab active="true" title="Item" icon="icon-default"></tab>' +
93+
element = compile('<tabs>' +
94+
'<tab active="true" title="Item" icon="icon-default"></tab>' +
95+
'<tab active="true" title="Item" icon="icon-default"></tab>' +
9696
'</tabs>')(scope);
9797
scope.$digest();
9898
expect(element.find('a').length).toBe(2);
9999
});
100100

101101
it('Sets style on child tabs', function() {
102-
element = compile('<tabs tabs-type="tabs-positive" tabs-style="tabs-icon-bottom">' +
103-
'<tab active="true" title="Item" icon="icon-default"></tab>' +
104-
'<tab active="true" title="Item" icon="icon-default"></tab>' +
102+
element = compile('<tabs tabs-type="tabs-positive" tabs-style="tabs-icon-bottom">' +
103+
'<tab active="true" title="Item" icon="icon-default"></tab>' +
104+
'<tab active="true" title="Item" icon="icon-default"></tab>' +
105105
'</tabs>')(scope);
106106
scope.$digest();
107107
var tabs = element[0].querySelector('.tabs');
@@ -110,9 +110,9 @@ describe('Tabs directive', function() {
110110
});
111111

112112
it('Has nav-view', function() {
113-
element = compile('<tabs>' +
114-
'<tab active="true" title="Item 1" href="#/page1"><nav-view name="name1"></nav-view></tab>' +
115-
'<tab active="true" title="Item 2" href="/page2">content2</tab>' +
113+
element = compile('<tabs>' +
114+
'<tab active="true" title="Item 1" href="#/page1"><nav-view name="name1"></nav-view></tab>' +
115+
'<tab active="true" title="Item 2" href="/page2">content2</tab>' +
116116
'</tabs>')(scope);
117117
scope = element.scope();
118118
scope.$digest();
@@ -129,7 +129,7 @@ describe('Tabs directive', function() {
129129

130130
describe('Tab Item directive', function() {
131131
var compile, element, scope, ctrl;
132-
132+
133133
beforeEach(module('ionic.ui.tabs'));
134134

135135
beforeEach(inject(function($compile, $rootScope, $document, $controller) {
@@ -138,23 +138,16 @@ describe('Tab Item directive', function() {
138138

139139
scope.badgeValue = 3;
140140
element = compile('<tabs>' +
141-
'<tab title="Item" icon="icon-default" badge="badgeValue"></tab>' +
141+
'<tab title="Item" icon="icon-default" badge="badgeValue"></tab>' +
142142
'</tabs>')(scope);
143143
scope.$digest();
144144
$document[0].body.appendChild(element[0]);
145145
}));
146-
147-
it('Default text works', function() {
148-
var title = '';
149-
var a = element.find('a')[0];
150-
for(i = 0, j = a.childNodes.length; i < j; i++) {
151-
child = a.childNodes[i];
152146

153-
if (child.nodeName === "#text") {
154-
title += child.nodeValue.trim();
155-
}
156-
}
157-
expect(title).toEqual('Item');
147+
it('Title works', function() {
148+
//The badge's text gets in the way of just doing .text() on the element itself, so exclude it
149+
var notBadge = angular.element(element[0].querySelectorAll('a >:not(.badge)'));
150+
expect(notBadge.text().trim()).toEqual('Item');
158151
});
159152

160153
it('Default icon works', function() {
@@ -189,7 +182,7 @@ describe('Tab Item directive', function() {
189182

190183
describe('Tab Controller Item directive', function() {
191184
var compile, element, scope, ctrl;
192-
185+
193186
beforeEach(module('ionic.ui.tabs'));
194187

195188
beforeEach(inject(function($compile, $rootScope, $document, $controller) {
@@ -198,24 +191,15 @@ describe('Tab Controller Item directive', function() {
198191

199192
scope.badgeValue = 3;
200193
scope.isActive = false;
201-
element = compile('<tabs class="tabs">' +
202-
'<tab-controller-item icon-title="Icon title" icon="icon-class" icon-on="icon-on-class" icon-off="icon-off-class" badge="badgeValue" active="isActive" index="0"></tab-controller-item>' +
194+
element = compile('<tabs class="tabs">' +
195+
'<tab-controller-item icon-title="Icon <b>title</b>" icon="icon-class" icon-on="icon-on-class" icon-off="icon-off-class" badge="badgeValue" active="isActive" index="0"></tab-controller-item>' +
203196
'</tabs>')(scope);
204197
scope.$digest();
205198
$document[0].body.appendChild(element[0]);
206199
}));
207-
208-
it('Icon title works', function() {
209-
var title = '';
210-
var a = element.find('a')[0];
211-
for(var i = 0, j = a.childNodes.length; i < j; i++) {
212-
child = a.childNodes[i];
213-
214-
if (child.nodeName === "#text") {
215-
title += child.nodeValue.trim();
216-
}
217-
}
218-
expect(title).toEqual('Icon title');
200+
201+
it('Icon title works as html', function() {
202+
expect(element.find('a').find('span').html()).toEqual('Icon <b>title</b>');
219203
});
220204

221205
it('Icon classes works', function() {

js/ext/angular/test/tabs.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
tabs-style="tabs-top tabs-positive"
5959
controller-changed="onControllerChanged(oldController, oldIndex, newController, newIndex)">
6060

61-
<tab title="Tasks" icon-on="icon ion-ios7-filing" icon-off="icon ion-ios7-filing-outline" ng-controller="HomeCtrl">
61+
<tab title="<img src='http://placekitten.com/40/40'>" ng-controller="HomeCtrl">
6262
<header class="bar bar-header bar-positive">
6363
<button class="button button-icon icon ion-plus" ng-click="newTask()"></button>
6464
<h1 class="title">Tasks</h1>

0 commit comments

Comments
 (0)