Files
ionic-framework/js/ext/angular/src/directive/ionicTabBar.js
2013-12-03 19:06:26 -06:00

238 lines
7.0 KiB
JavaScript

angular.module('ionic.ui.tabs', ['ngAnimate'])
/**
* @description
*
* The Tab Controller renders a set of pages that switch based on taps
* on a tab bar. Modelled off of UITabBarController.
*/
.directive('tabs', function() {
return {
restrict: 'E',
replace: true,
scope: true,
transclude: true,
controller: ['$scope', '$element', '$animate', function($scope, $element, $animate) {
var _this = this;
angular.extend(this, ionic.controllers.TabBarController.prototype);
ionic.controllers.TabBarController.call(this, {
controllerChanged: function(oldC, oldI, newC, newI) {
$scope.controllerChanged && $scope.controllerChanged({
oldController: oldC,
oldIndex: oldI,
newController: newC,
newIndex: newI
});
},
tabBar: {
tryTabSelect: function() {},
setSelectedItem: function(index) {},
addItem: function(item) {}
}
});
this.add = function(controller) {
this.addController(controller);
this.select(0);
};
this.select = function(controllerIndex) {
$scope.activeAnimation = $scope.animation;
_this.selectController(controllerIndex);
};
$scope.controllers = this.controllers;
$scope.tabsController = this;
}],
//templateUrl: 'ext/angular/tmpl/ionicTabBar.tmpl.html',
template: '<div class="view"><tab-controller-bar></tab-controller-bar></div>',
compile: function(element, attr, transclude, tabsCtrl) {
return function($scope, $element, $attr) {
var tabs = $element[0].querySelector('.tabs');
$scope.tabsType = $attr.tabsType || 'tabs-positive';
$scope.tabsStyle = $attr.tabsStyle;
$scope.animation = $attr.animation;
$scope.animateNav = $scope.$eval($attr.animateNav);
if($scope.animateNav !== false) {
$scope.animateNav = true;
}
$attr.$observe('tabsStyle', function(val) {
if(tabs) {
angular.element(tabs).addClass($attr.tabsStyle);
}
});
$attr.$observe('tabsType', function(val) {
if(tabs) {
angular.element(tabs).addClass($attr.tabsType);
}
});
$scope.$watch('activeAnimation', function(value) {
//$element.removeClass($scope.animation + ' ' + $scope.animation + '-reverse');
$element.addClass($scope.activeAnimation);
});
transclude($scope, function(cloned) {
$element.prepend(cloned);
});
};
}
};
})
// Generic controller directive
.directive('tab', ['$animate', '$parse', function($animate, $parse) {
return {
restrict: 'E',
require: '^tabs',
scope: true,
transclude: 'element',
compile: function(element, attr, transclude) {
return function($scope, $element, $attr, tabsCtrl) {
var childScope, childElement;
$scope.title = $attr.title;
$scope.icon = $attr.icon;
$scope.iconOn = $attr.iconOn;
$scope.iconOff = $attr.iconOff;
// Should we hide a back button when this tab is shown
$scope.hideBackButton = $scope.$eval($attr.hideBackButton);
if($scope.hideBackButton !== true) {
$scope.hideBackButton = false;
}
// Whether we should animate on tab change, also impacts whether we
// tell any parent nav controller to animate
$scope.animate = $scope.$eval($attr.animate);
// Grab whether we should update any parent nav router on tab changes
$scope.doesUpdateNavRouter = $scope.$eval($attr.doesUpdateNavRouter);
if($scope.doesUpdateNavRouter !== false) {
$scope.doesUpdateNavRouter = true;
}
var leftButtonsGet = $parse($attr.leftButtons);
$scope.$watch(leftButtonsGet, function(value) {
$scope.leftButtons = value;
if($scope.doesUpdateNavRouter) {
$scope.$emit('navRouter.leftButtonsChanged', $scope.rightButtons);
}
});
var rightButtonsGet = $parse($attr.rightButtons);
$scope.$watch(rightButtonsGet, function(value) {
$scope.rightButtons = value;
});
tabsCtrl.add($scope);
$scope.$watch('isVisible', function(value) {
if(childElement) {
$animate.leave(childElement);
$scope.$broadcast('tab.hidden');
childElement = undefined;
}
if(childScope) {
childScope.$destroy();
childScope = undefined;
}
if(value) {
childScope = $scope.$new();
transclude(childScope, function(clone) {
childElement = clone;
clone.addClass('pane');
$animate.enter(clone, $element.parent(), $element);
if($scope.title) {
// Send the title up in case we are inside of a nav controller
if($scope.doesUpdateNavRouter) {
$scope.$emit('navRouter.pageShown', {
title: $scope.title,
rightButtons: $scope.rightButtons,
leftButtons: $scope.leftButtons,
hideBackButton: $scope.hideBackButton,
animate: $scope.animateNav
});
}
//$scope.$emit('navRouter.titleChanged', $scope.title);
}
$scope.$broadcast('tab.shown');
});
}
});
}
}
};
}])
.directive('tabControllerBar', function() {
return {
restrict: 'E',
require: '^tabs',
transclude: true,
replace: true,
scope: true,
template: '<div class="tabs">' +
'<tab-controller-item title="{{controller.title}}" icon="{{controller.icon}}" icon-on="{{controller.iconOn}}" icon-off="{{controller.iconOff}}" active="controller.isVisible" index="$index" ng-repeat="controller in controllers"></tab-controller-item>' +
'</div>',
link: function($scope, $element, $attr, tabsCtrl) {
$element.addClass($scope.tabsType);
$element.addClass($scope.tabsStyle);
}
};
})
.directive('tabControllerItem', function() {
return {
restrict: 'E',
replace: true,
require: '^tabs',
scope: {
title: '@',
icon: '@',
iconOn: '@',
iconOff: '@',
active: '=',
tabSelected: '@',
index: '='
},
link: function(scope, element, attrs, tabsCtrl) {
if(attrs.icon) {
scope.iconOn = scope.iconOff = attrs.icon;
}
scope.selectTab = function(index) {
tabsCtrl.select(scope.index);
};
},
template:
'<a ng-class="{active:active}" ng-click="selectTab()" class="tab-item">' +
'<i class="{{icon}}" ng-if="icon"></i>' +
'<i class="{{iconOn}}" ng-if="active"></i>' +
'<i class="{{iconOff}}" ng-if="!active"></i> {{title}}' +
'</a>'
};
})
.directive('tabBar', function() {
return {
restrict: 'E',
replace: true,
transclude: true,
template: '<div class="tabs tabs-primary" ng-transclude>' +
'</div>'
}
});