Files
sogo/UI/WebServerResources/scss/components/tabs/js/tabsController.js

139 lines
3.5 KiB
JavaScript

(function() {
'use strict';
angular.module('material.components.tabs')
.controller('$mdTabs', MdTabsController);
function MdTabsController($scope, $element, $mdUtil, $timeout) {
var tabsList = $mdUtil.iterator([], false);
var self = this;
// Properties
self.$element = $element;
self.scope = $scope;
// The section containing the tab content $elements
var contentArea = self.contentArea = angular.element($element[0].querySelector('.md-tabs-content'));
// Methods from iterator
var inRange = self.inRange = tabsList.inRange;
var indexOf = self.indexOf = tabsList.indexOf;
var itemAt = self.itemAt = tabsList.itemAt;
self.count = tabsList.count;
self.getSelectedItem = getSelectedItem;
self.getSelectedIndex = getSelectedIndex;
self.add = add;
self.remove = remove;
self.move = move;
self.select = select;
self.focus = focus;
self.deselect = deselect;
self.next = next;
self.previous = previous;
$scope.$on('$destroy', function() {
deselect(getSelectedItem());
for (var i = tabsList.count() - 1; i >= 0; i--) {
remove(tabsList[i], true);
}
});
// Get the selected tab
function getSelectedItem() {
return itemAt($scope.selectedIndex);
}
function getSelectedIndex() {
return $scope.selectedIndex;
}
// Add a new tab.
// Returns a method to remove the tab from the list.
function add(tab, index) {
tabsList.add(tab, index);
// Select the new tab if we don't have a selectedIndex, or if the
// selectedIndex we've been waiting for is this tab
if ($scope.selectedIndex === -1 || !angular.isNumber($scope.selectedIndex) ||
$scope.selectedIndex === self.indexOf(tab)) {
tab.onAdd(self.contentArea, false);
self.select(tab);
} else {
tab.onAdd(self.contentArea, true);
}
$scope.$broadcast('$mdTabsChanged');
}
function remove(tab, noReselect) {
if (!tabsList.contains(tab)) return;
if (noReselect) return;
var isSelectedItem = getSelectedItem() === tab,
newTab = previous() || next();
deselect(tab);
tabsList.remove(tab);
tab.onRemove();
$scope.$broadcast('$mdTabsChanged');
if (isSelectedItem) { select(newTab); }
}
// Move a tab (used when ng-repeat order changes)
function move(tab, toIndex) {
var isSelected = getSelectedItem() === tab;
tabsList.remove(tab);
tabsList.add(tab, toIndex);
if (isSelected) select(tab);
$scope.$broadcast('$mdTabsChanged');
}
function select(tab, rightToLeft) {
if (!tab || tab.isSelected || tab.isDisabled()) return;
if (!tabsList.contains(tab)) return;
if (!angular.isDefined(rightToLeft)) {
rightToLeft = indexOf(tab) < $scope.selectedIndex;
}
deselect(getSelectedItem(), rightToLeft);
$scope.selectedIndex = indexOf(tab);
tab.isSelected = true;
tab.onSelect(rightToLeft);
$scope.$broadcast('$mdTabsChanged');
}
function focus(tab) {
// this variable is watched by pagination
self.tabToFocus = tab;
}
function deselect(tab, rightToLeft) {
if (!tab || !tab.isSelected) return;
if (!tabsList.contains(tab)) return;
$scope.selectedIndex = -1;
tab.isSelected = false;
tab.onDeselect(rightToLeft);
}
function next(tab, filterFn) {
return tabsList.next(tab || getSelectedItem(), filterFn || isTabEnabled);
}
function previous(tab, filterFn) {
return tabsList.previous(tab || getSelectedItem(), filterFn || isTabEnabled);
}
function isTabEnabled(tab) {
return tab && !tab.isDisabled();
}
}
})();